home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / MBUG / MBUG062.ARC / FLASH2.ASC < prev    next >
Text File  |  1979-12-31  |  3KB  |  89 lines

  1. ; FLASH.BEE v3.12 by Alan Sheehan B.E. 23/2/86
  2. ; routine to flash characters in INVERSE or UNDERLINE mode
  3. ; in MicroWorld Basic.
  4. ; Rewritten to patch into the keyboard scan routine
  5. ; Modified to execute at 0900H and block move to top of 32K memory
  6. ;
  7. BASIC    EQU    8021H    ;warm boot BASIC
  8. KEYIN    EQU    0A3E9H    ;address of keyboard scan
  9. TMEM    EQU    0A0H    ;BASIC top of memory pointer
  10. IVECT    EQU    0C2H    ;keyboard scan vector
  11. PCG    EQU    0F800H    ;start of PCG ram
  12. BYTES    EQU    7FFH    ;number of bytes to invert
  13. ;
  14. ; block move routine
  15. ;
  16.     ORG    900H
  17.     LD    SP,START-2    ;temporarily move stack
  18.     LD    HL,BSTART    ;point to start of block to move
  19.     LD    DE,START    ;point to destination
  20.     LD    BC,ACOUNT-START+2    ;number of bytes to move
  21.     LDIR            ;block move
  22.     JP    START        ;initialise flash routine
  23. BSTART    EQU    $    ;move program to here with monitor
  24. ;
  25. ; Start of program proper: move top of memory pointer to
  26. ; protect the program from being over-written by BASIC.
  27. ;
  28.     ORG    07FA0H    
  29. START    CALL    INIT    ;set up pointers to key scan patch
  30.     LD    HL,START    ;protect program
  31.     LD    (TMEM),HL    ;move T.O.M. below program
  32.     JP    BASIC    ;jump to BASIC
  33. ;
  34. ; Enable flash routine
  35. ;
  36. INIT    LD    HL,PATCH    ;point to key scan patch
  37.     LD    (IVECT),HL    ;set up patched scan
  38.     RET
  39. ;
  40. ; This is the patch in the keyboard scan routine.
  41. ;
  42. PATCH    CALL    KEYIN    ;scan keyboard
  43.     PUSH    AF    ; save accumulator
  44.     EXX        ;swap for new registers
  45.     LD    BC,(ACOUNT)    ;get loop counter
  46.     DEC    BC    ;count down
  47.     LD    (ACOUNT),BC    ;save loop counter again
  48.     XOR    A    ;clear the accumulator
  49.     CP    B    ;test if counter = zero
  50.     JR    NZ,SKIP    ;skip if not ready to flash
  51.     CP    C    ;test if really ready
  52.     CALL    Z,FLASH    ;flash characters if ready
  53. SKIP    EXX        ;swap back to old registers
  54.     POP    AF    ;restore accumulator
  55.     RET        ;done!
  56. ;
  57. ; Disable the flash routine (so graphics don't flash too!!).
  58. ;
  59. DFLASH    LD    HL,KEYIN    ;set up ordinary key scan
  60.     LD    (IVECT),HL
  61.     RET
  62. ;
  63. ; "Invert" every byte in PCG RAM: change from light to dark or
  64. ; dark to light.
  65. ;
  66. FLASH    LD    HL,(DCOUNT)    ;get init. loop count
  67.     LD    (ACOUNT),HL    ;restore loop counter
  68.     LD    HL,PCG    ;point to PCG ram
  69.     LD    BC,BYTES    ;use BC as counter
  70. LOOP    LD    A,(HL)    ;get byte of character
  71.     CPL        ;complement accumulator
  72.     LD    (HL),A    ;store inverted byte back in memory
  73.     INC    HL    ;point to next byte
  74.     DEC    BC    ;count down characters inverted
  75.     XOR    A    ;zero accumulator
  76.     CP    B    ;test if <FF to go
  77.     JR    NZ,LOOP    ;go if more than FF bytes left
  78.     CP    C    ;test if finished
  79.     JR    NZ,LOOP    ;go if not finished
  80.     RET
  81. ;
  82. ; Key scan counter storage
  83. ; DCOUNT holds number of times key-scan is called between flashes.
  84. ; ACOUNT holds the actual counter used.
  85. ;
  86. DCOUNT    DW    400H    ;delay counter initial value
  87. ACOUNT    DW    400H    ;actual counter storage
  88.     END
  89.