10
20
30
40 :
50
60
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 :\ CLS, ON, 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%