10
20
30
40 :
50
60
70 :
80 base%=&FC80
90 FOR P=0 TO 1
100 P%=&900
110 [OPT P*3
120 .start
130 JSR old:PHA :\ Send to old WRCH
140 LDA &355:CMP #7:BNE ignore :\ Not mode 7
150 LDA &319:CMP #4:BCS ignore :\ Not top four lines
160 TYA:PHA:TXA:PHA
170 :
180 LDX #0 :\ First controller
190 LDY #0 :\ Start of screen memory
200 .loop
210 LDA #&80+0+0*64 :\ Set address to (0,0)
220 .home
230 BIT base%+0,X:BMI home:STA base%+0,X
240 .char
250 BIT base%+0,X:BMI char :\ Wait until not busy
260 \ Need to translate #_`
270 LDA &7C00,Y:STA base%+1,X :\ Write character
280 INY :\ Step to next character
290 CPY #40:BEQ line1 :\ Move to next line, first controller
300 CPY #120:BEQ line1 :\ Move to next line, second controller
310 CPY #80:BNE next :\ Set to next character
320 LDX #2:BNE loop :\ Step to second controller
330 .line1
340 LDA #&80+0+1*64 :\ Set address to (0,1)
350 .wait
360 BIT base%+0,X:BMI wait:STA base%+0,X
370 .next
380 CPY #160:BNE char :\ Loop back to do next character
390 PLA:TAX:PLA:TAY
400 .ignore
410 PLA:RTS
420 :
430 .old
440 JMP (oldv)
450 :
460 .go%
470 LDA #1:LDX #&A8:LDY #0:JSR &FFDA
480 LDA (&A8),Y:CMP #13:BEQ link_on
490 INY:LDA (&A8),Y:AND #&DF
500 CMP #ASC"F":BNE link_on
510 LDA oldv+0:STA &20E
520 LDA oldv+1:STA &20F
530 RTS
540 .link_on
550 LDA &20E:STA oldv+0
560 LDA &20F:STA oldv+1
570 LDA #start AND 255:STA &20E
580 LDA #start DIV 256:STA &20F
590 RTS
600 .oldv
610 ]NEXT
620 PRINT"*SAVE lcd FFFF0900 ";~P%OR&FFFF0000;" ";~go%OR&FFFF0000