10 REM > lcd/s v1.20
   20 REM Redirect VDU to 40x4 LCD display
   30 REM Syntax: lcd (ON|OFF)
   40 :
   50 REM Sends characters to existing VDU driver, then if in MODE 7 and
   60 REM VPOS is in top four lines physical lines, copies display to LCD.
   70 :
   80 base%=&FC80:load%=&FFFF0A40:DIM mcode% 255
   90 FOR P=0 TO 1
  100   P%=load%:O%=mcode%
  110   [OPT P*3+4
  120   .go%
  130   LDA #1:LDX #&A8:LDY #0:JSR &FFDA
  140   LDA (&A8),Y:CMP #13:BEQ lcd_on
  150   INY:LDA (&A8),Y:AND #&DF
  160   CMP #ASC"F":BNE lcd_on
  170   LDA &FFB7:STA &A8          :\ &A8=>default vectors
  180   LDA &FFB8:STA &A9          :\ &A8=>default vectors
  190   LDY #14
  200   .lcd_off
  210   LDA (&A8),Y:STA &200,Y     :\ Reset WRCHV
  220   INY:CPY #16:BNE lcd_off:RTS
  230   :
  240   .lcd_on
  250   LDX #reset_end-reset
  260   .reset_lp
  270   LDA reset,X                 :\ Get byte from reset sequence
  280   .wait1:BIT base%+0:BMI wait1:STA base%+1
  290   .wait2:BIT base%+2:BMI wait2:STA base%+3
  300   DEX:BPL reset_lp
  310   LDA &20E:STA old+1          :\ Copy WRCHV
  320   LDA &20F:STA old+2
  330   LDA #start AND 255:STA &20E :\ Redirect WRCHV
  340   LDA #start DIV 256:STA &20F
  350   RTS
  360   :
  370   :
  380   .reset
  390   EQUB 1:EQUB 13:EQUB 16      :\ CLSON, RESET
  400   .reset_end
  410   :
  420   .start
  430   .old
  440   JSR &FFFF:PHA              :\ Send to old WRCH
  450   LDA &355:CMP #7:BNE ignore :\ Not mode 7
  460   LDA &319:CMP #4:BCS ignore :\ Not top four lines
  470   TYA:PHA:TXA:PHA
  480   :
  490   LDX #0                     :\ First controller
  500   LDY #0                     :\ Start of screen memory
  510   .loop
  520   LDA #&80+0+0*64            :\ Set address to (0,0)
  530   .home
  540   BIT base%+0,X:BMI home:STA base%+0,X
  550   .char
  560   BIT base%+0,X:BMI char     :\ Wait until not busy
  570   \ Need to translate #_`
  580   LDA &7C00,Y:STA base%+1,X  :\ Write character
  590   INY                        :\ Step to next character
  600   CPY #40:BEQ line1          :\ Move to next line, first controller
  610   CPY #120:BEQ line1         :\ Move to next line, second controller
  620   CPY #80:BNE next           :\ Set to next character
  630   LDX #2:BNE loop            :\ Step to second controller
  640   .line1
  650   LDA #&80+0+1*64            :\ Set address to (0,1)
  660   .wait
  670   BIT base%+0,X:BMI wait:STA base%+0,X
  680   .next
  690   CPY #160:BNE char          :\ Loop back to do next character
  700   PLA:TAX:PLA:TAY
  710   .ignore
  720   PLA:RTS
  730 ]NEXT
  740 PRINT"*SAVE lcd ";~mcode%;" ";~O%;" ";~go%OR&FFFF0000;" ";~load%