; GraphText (C) 1987 S J WOOLHAM

; install split screen
1102 B6FF03     LDA   $FF03		; disable vsync irq
1105 84FE       ANDA  #$FE		;
1107 B7FF03     STA   $FF03		;
110A 8601       LDA   #$01
110C 97B6       STA   <$B6      ; current PMODE
110E 8620       LDA   #$20
1110 97B9       STA   <$B9      ; bytes per line in current graphics mode 
1112 CC0808     LDD   #$0808	; check break at 1/8 normal duty
1115 DD76       STD   <$76		; counter values to reduce time spent scanning for break & pause
1117 8E8250     LDX   #$8250	; BASIC function jump table
111A 108E1415   LDY   #$1415	; copy BASIC function table
111E EC81       LDD   ,X++		;  to RAM so it can be modified
1120 EDA1       STD   ,Y++		;
1122 8C8293     CMPX  #$8293	; end of BASIC function jump table
1125 25F7       BCS   $111E		;
1127 8E1415     LDX   #$1415	; point to copy of table
112A BF0128     STX   $0128     ; BASIC function despatch table pointer
112D 108E13F7   LDY   #$13F7	; new inkey$ handler
1131 10AF8834   STY   52,X		;
1135 BD1380     JSR   $1380		; select text/CSS0 for upper part of display
1138 BD138C     JSR   $138C		; select PMODE3/CSS0 for lower part of display
113B BD13A4     JSR   $13A4		; set non-inverse video
113E BD13BA     JSR   $13BA		; clear graphics
1141 8E1407     LDX   #$1407	; new reset handler
1144 9F72       STX   <$72		; soft reset vector
1146 8E11C9     LDX   #$11C9	; new irq handler
1149 BF010D     STX   $010D		; irq handler
114C 8E12A2     LDX   #$12A2
114F BF016B     STX   $016B		; PATCH - input character from DEVN
1152 8E12FB     LDX   #$12FB
1155 BF0180     STX   $0180		; PATCH - check break & pause
1158 8E12DF     LDX   #$12DF
115B BF019B     STX   $019B		; PATCH - get command
115E 8E131F     LDX   #$131F
1161 BF01A1     STX   $01A1		; PATCH - CLS GET PUT ???
1164 8E1207     LDX   #$1207
1167 BF0168     STX   $0168		; PATCH - output character to DEVN
116A 867E       LDA   #$7E		; enable patches with jmp
116C B70167     STA   $0167		;
116F B7016A     STA   $016A		;
1172 B7017F     STA   $017F		;
1175 B7019A     STA   $019A		;
1178 B701A0     STA   $01A0		;
117B BD13C2     JSR   $13C2		; display GraphText sign on message
117E B6FF03     LDA   $FF03		; enable vsync irq on rising edge
1181 8A03       ORA   #$03		;
1183 B7FF03     STA   $FF03		;
1186 39         RTS

; uninstall
1187 1A50       ORCC  #$50		; disable irqs
1189 8E9D3D     LDX   #$9D3D	; BASIC irq handler
118C BF010D     STX   $010D		; irq handler
118F 8EB44F     LDX   #$B44F	; BASIC soft reset handler
1192 9F72       STX   <$72		; soft reset vector
1194 8E8250     LDX   #$8250	; BASIC function despatch table
1197 BF0128     STX   $0128     ; BASIC function despatch table pointer
119A 8E3939     LDX   #$3939	; disable patches
119D BF0168     STX   $0168		;
11A0 BF016B     STX   $016B		;
11A3 BF0180     STX   $0180		;
11A6 BF019B     STX   $019B		;
11A9 BF01A1     STX   $01A1		;
11AC 8639       LDA   #$39		;
11AE B70167     STA   $0167		;
11B1 B7016A     STA   $016A		;
11B4 B7017F     STA   $017F		;
11B7 B7019A     STA   $019A		;
11BA B701A0     STA   $01A0		;
11BD 0FB6       CLR   <$B6      ; current PMODE
11BF 8610       LDA   #$10
11C1 97B9       STA   <$B9      ; bytes per line in current graphics mode 
11C3 BDBA77     JSR   $BA77		; clear text screen
11C6 1CAF       ANDCC #$AF		; enable irqs
11C8 39         RTS

; irq handler
11C9 B60114     LDA   $0114		; soft reset flag (unused by BASIC)
11CC 2703       BEQ   $11D1
11CE 7E9D3D     JMP   $9D3D		; BASIC irq handler
11D1 8607       LDA   #$07		; mode for upper part of screen
11D3 B7FF22     STA   $FF22		;
11D6 B7FFC2     STA   $FFC2		;
11D9 B7FFC4     STA   $FFC4		;
11DC 8E0465     LDX   #$0465	; delay 9000 cycles
11DF 301F       LEAX  -1,X		; to get to middle of display
11E1 26FC       BNE   $11DF		;
11E3 86E7       LDA   #$E7		; mode for lower part of screen
11E5 B7FF22     STA   $FF22		;
11E8 B7FFC3     STA   $FFC3		;
11EB B7FFC5     STA   $FFC5		;
11EE B6FF02     LDA   $FF02		; clear vsync flag
11F1 FC0112     LDD   $0112		; increment TIMER
11F4 C30001     ADDD  #$0001	;
11F7 FD0112     STD   $0112		;
11FA 96E4       LDA   <$E4		; PLAY duration counter
11FC 10269DD9  LBNE   $AFD9		; complete irq tasks for PLAY
1200 968E       LDA   <$8E		; SOUND duration counter
1202 1026A8FC  LBNE   $BB02		; complete irq tasks for SOUND
1206 3B         RTI

;PATCH 0167 - output character to DEVN
1207 0D6F       TST   <$6F		; DEVN
1209 2701       BEQ   $120C		; output to VDU
120B 39         RTS				; not VDU so let BASIC handle it

; output character to VDU
120C 7D0114     TST   $0114		; soft reset flag (unused by BASIC)
120F 2717       BEQ   $1228		; not resetting
1211 3417       PSHS  CC,A,B,X
1213 7F0114     CLR   $0114		; soft reset flag (unused by BASIC)
1216 BD1187     JSR   $1187		; uninstall split screen
1219 9E95       LDX   <$95		; cassette motor on delay constant
121B BDB482     JSR   $B482		; delay approx X*8 cycles
121E BD110A     JSR   $110A		; install split screen
1221 8652       LDA   #$52		; displays 'R' after reset
1223 B70460     STA   $0460
1226 3517       PULS  CC,A,B,X
1228 3262       LEAS  2,S
122A 3456       PSHS  A,B,X,U
122C 9E88       LDX   <$88      ; text cursor address
122E 8108       CMPA  #$08		; backspace?
1230 260C       BNE   $123E
1232 8C0400     CMPX  #$0400	; at top left?
1235 2758       BEQ   $128F		; can't backspace
1237 B61411     LDA   $1411		; space character
123A A782       STA   ,-X
123C 2020       BRA   $125E
123E 810D       CMPA  #$0D		; enter key?
1240 2604       BNE   $1246
1242 8D4D       BSR   $1291		; clear to end of line
1244 2018       BRA   $125E
1246 8120       CMPA  #$20		; check for printable character
1248 2545       BCS   $128F		; not printable
124A 4D         TSTA			; check for semigraphics character
124B 2B0F       BMI   $125C		; store it unmodified
124D 8140       CMPA  #$40   @
124F 2506       BCS   $1257
1251 8160       CMPA  #$60   `
1253 2504       BCS   $1259
1255 84DF       ANDA  #$DF
1257 8840       EORA  #$40   @
1259 B81413     EORA  $1413		; inverse video modifier
125C A780       STA   ,X+
125E 9F88       STX   <$88      ; text cursor address
1260 8C04FF     CMPX  #$04FF	; end of text screen?
1263 232A       BLS   $128F
1265 8E0400     LDX   #$0400	; scroll text screen
1268 EE8820     LDU   32,X
126B EC8822     LDD   34,X
126E EF81       STU   ,X++
1270 ED81       STD   ,X++
1272 EE8820     LDU   32,X
1275 EC8822     LDD   34,X
1278 EF81       STU   ,X++
127A ED81       STD   ,X++
127C 8C04E0     CMPX  #$04E0
127F 25E7       BCS   $1268
1281 9F88       STX   <$88      ; text cursor address
1283 FC1411     LDD   $1411		; space character
1286 ED81       STD   ,X++
1288 ED81       STD   ,X++
128A 8C04FF     CMPX  #$04FF
128D 25F7       BCS   $1286
128F 35D6       PULS  A,B,X,U,PC

; clear to end of line
1291 B61411     LDA   $1411		; space character
1294 A780       STA   ,X+
1296 1F10       TFR   X,D
1298 C41F       ANDB  #$1F
129A 26F5       BNE   $1291
129C 39         RTS

; unused code. Should this have been part of 016A patch code?
129D 0D6F       TST   <$6F		; DEVN
129F 2701       BEQ   $12A2
12A1 39         RTS

;PATCH 016A - input character from DEVN
12A2 3262       LEAS  2,S
12A4 0F70       CLR   <$70		; EOF flag
12A6 3414       PSHS  B,X
12A8 13         SYNC			; avoid irq during keyboard scan
12A9 740151     LSR   $0151		; force full keyboard scan
12AC BD12C7     JSR   $12C7		; flash cursor
12AF BD8006     JSR   $8006		; scan keyboard
12B2 27F4       BEQ   $12A8
12B4 810C       CMPA  #$0C		; clear key?
12B6 2706       BEQ   $12BE		;
12B8 F61411     LDB   $1411		; space character
12BB 7EB544     JMP   $B544		; continue input char in ROM

; handle clear key
12BE BD134F     JSR   $134F		; clear text screen
12C1 BD8434     JSR   $8434		; reset stack & bits & pieces
12C4 7E837A     JMP   $837A     ; command mode without 'OK'

; flash cursor
12C7 0A8F       DEC   <$8F		; cursor flash counter
12C9 260C       BNE   $12D7
12CB 8619       LDA   #$19
12CD 978F       STA   <$8F		; cursor flash counter
12CF 9E88       LDX   <$88      ; text cursor address
12D1 A684       LDA   ,X
12D3 8840       EORA  #$40
12D5 A784       STA   ,X
12D7 8E022F     LDX   #$022F
12DA 301F       LEAX  -1,X
12DC 26FC       BNE   $12DA
12DE 39         RTS

;PATCH 019A - get command
12DF ECE4       LDD   ,S		; modify return address to skip
12E1 CB04       ADDB  #$04		; over scan for break & pause
12E3 EDE4       STD   ,S		;
12E5 1CAF       ANDCC #$AF
12E7 0A77       DEC   <$77		; break/pause scan counter
12E9 2607       BNE   $12F2		; don't check for break/pause
12EB 9676       LDA   <$76		; break/pause scan counter start value
12ED 9777       STA   <$77		; break/pause scan counter
12EF BD1304     JSR   $1304		; check break & pause
12F2 8611       LDA   #$11
12F4 97B7       STA   <$B7      ; 1st byte after current graphics display
12F6 8605       LDA   #$05
12F8 97BA       STA   <$BA		; start of current graphics display
12FA 39         RTS

;PATCH 017F - check break & pause (shift @)
12FB 0D6F       TST   <$6F		; DEVN
12FD 2701       BEQ   $1300
12FF 39         RTS
1300 3262       LEAS  2,S
1302 1CAF       ANDCC #$AF
1304 13         SYNC			; avoid irq during keyboard scan
1305 BD8006     JSR   $8006		; scan keyboard
1308 270C       BEQ   $1316
130A 8103       CMPA  #$03
130C 10277229  LBEQ   $8539		; break
1310 8113       CMPA  #$13
1312 2703       BEQ   $1317		; pause
1314 9787       STA   <$87		; last key pressed
1316 39         RTS

; wait for key while BASIC paused
1317 13         SYNC			; avoid irq during keyboard scan
1318 BD8006     JSR   $8006		; scan keyboard
131B 27FA       BEQ   $1317
131D 20EB       BRA   $130A		; check for break

;PATCH 01A0 - CLS GET PUT ???
131F 3411       PSHS  CC,X
1321 AE63       LDX   3,S
1323 8CBA62     CMPX  #$BA62	; called by CLS?
1326 2702       BEQ   $132A
1328 3591       PULS  CC,X,PC
132A 3511       PULS  CC,X
132C 3262       LEAS  2,S
132E 271F       BEQ   $134F		; clear text screen
1330 BD8E51     JSR   $8E51		; read 8 bit value into B
1333 C108       CMPB  #$08		;
1335 221D       BHI   $1354		; CLS 9 - 255
1337 5D         TSTB			;
1338 2706       BEQ   $1340		; CLS 0
133A 5A         DECB
133B 8610       LDA   #$10
133D 3D         MUL
133E CA0F       ORB   #$0F
1340 CA80       ORB   #$80
1342 8E0400     LDX   #$0400
1345 9F88       STX   <$88      ; text cursor address
1347 E780       STB   ,X+
1349 8C04FF     CMPX  #$04FF
134C 23F9       BLS   $1347
134E 39         RTS

; clear text screen
134F F61411     LDB   $1411		; space character
1352 20EE       BRA   $1342

; CLS 9 - 255
1354 C1FF       CMPB  #$FF		; CLS 255 ?
1356 2725       BEQ   $137D		; uninstall split screen
1358 C110       CMPB  #$10		; > CLS 16 ?
135A 2266       BHI   $13C2		; display GraphText sign on message
135C C109       CMPB  #$09		; CLS 9 ?
135E 2720       BEQ   $1380
1360 C10A       CMPB  #$0A		; CLS 10 ?
1362 2722       BEQ   $1386
1364 C10B       CMPB  #$0B		; CLS 11 ?
1366 2724       BEQ   $138C
1368 C10C       CMPB  #$0C		; CLS 12 ?
136A 2726       BEQ   $1392
136C C10D       CMPB  #$0D		; CLS 13 ?
136E 2728       BEQ   $1398
1370 C10E       CMPB  #$0E		; CLS 14 ?
1372 272A       BEQ   $139E
1374 C10F       CMPB  #$0F		; CLS 15 ?
1376 272C       BEQ   $13A4		; set non-inverse video
1378 C110       CMPB  #$10		; CLS 16 ?
137A 2732       BEQ   $13AE		; set inverse video
137C 39         RTS

137D 7E1187     JMP   $1187		; uninstall

1380 C607       LDB   #$07		; text / CSS0
1382 F711D2     STB   $11D2		; VDG mode for upper part of display
1385 39         RTS

1386 C60F       LDB   #$0F		; text / CSS1
1388 F711D2     STB   $11D2		; VDG mode for upper part of display
138B 39         RTS

138C C6E7       LDB   #$E7		; PMODE3 / CSS0
138E F711E4     STB   $11E4		; VDG mode for lower part of display
1391 39         RTS

1392 C6EF       LDB   #$EF		; PMODE3 / CSS1
1394 F711E4     STB   $11E4		; VDG mode for lower part of display
1397 39         RTS

1398 C6F7       LDB   #$F7		; PMODE4 / CSS0
139A F711E4     STB   $11E4		; VDG mode for lower part of display
139D 39         RTS

139E C6FF       LDB   #$FF		; PMODE4 / CSS1
13A0 F711E4     STB   $11E4		; VDG mode for lower part of display
13A3 39         RTS

; set non-inverse video
13A4 CC6060     LDD   #$6060
13A7 FD1411     STD   $1411		; space character
13AA 7F1413     CLR   $1413		; inverse video modifier
13AD 39         RTS

; set inverse video
13AE CC2020     LDD   #$2020
13B1 FD1411     STD   $1411		; space character
13B4 C640       LDB   #$40
13B6 F71413     STB   $1413		; inverse video modifier
13B9 39         RTS

; clear graphics
13BA 5F         CLRB
13BB BD12F2     JSR   $12F2		; set up graphics display addresses
13BE BDA8C7     JSR   $A8C7		; clear graphics screen
13C1 39         RTS

; display GraphText sign on message
13C2 BD134F     JSR   $134F		; clear text screen
13C5 8E13CB     LDX   #$13CB	; sign on message
13C8 7E99E6     JMP   $99E6		; output ASCIIZ string to DEVN

13CB			FCC /*GRAPHTEXT* V1.1/,$0D
13DC			FCC / (C) 1987 BY S J WOOLHAM./,$0D,$00

; new inkey$ handler
13F7 9687		LDA   <$87		; last key pressed
13F9 0F87       CLR   <$87		; last key pressed
13FB 9753       STA   <$53
13FD 4D         TSTA
13FE 102679D3  LBNE   $8DD5     ; set up character & put on varptr stack
1402 9756       STA   <$56		; string length
1404 7E8DE1     JMP   $8DE1     ; leas 2,s & put temp string on varptr stack

; new soft reset handler

1407 12         NOP
1408 7C0114     INC   $0114		; soft reset flag (unused by BASIC)
140B BDA93A     JSR   $A93A		; reset VDU
140E 7EB44F     JMP   $B44F		; normal soft reset routine

1411 			RMB 2			; 2 x space characters
1413			RMB 1			; inverse video modifier

; replacement function despatch table gets copied here ($1415)
