Path: csiph.com!v102.xanadu-bbs.net!xanadu-bbs.net!eternal-september.org!feeder.eternal-september.org!mx02.eternal-september.org!.POSTED!not-for-mail From: D Finnigan Newsgroups: comp.sys.apple2.programmer Subject: Source Code for Multitasking Mouse Draw Demo v1.3 Date: Thu, 18 Dec 2014 19:56:49 +0000 (UTC) Organization: A noiseless patient Spider Lines: 1109 Message-ID: References: Injection-Date: Thu, 18 Dec 2014 19:56:49 +0000 (UTC) Injection-Info: mx02.eternal-september.org; posting-host="e90d4fdf2805160ea3981f9dc9fde7c9"; logging-data="14877"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX18I4RNKLgW4UZA4wzi664pA" Cancel-Lock: sha1:O6aXJp2iU2gY3pRnism8TxA/wlA= Xref: csiph.com comp.sys.apple2.programmer:1414 For the benefit of all Apple II users, the source code is hereby surrendered into the public domain. I claim no copyright on the source code. Assembler used is Merlin. 1 KBD EQU $C000 2 KBDSTRB EQU $C010 3 SPKR EQU $C030 4 PRBYTE EQU $FDDA 5 PRNTAX EQU $F941 6 DOSWARM EQU $3D0 7 IRQLOC EQU $3FE 8 IN EQU $0200 ; KEYBOARD INPUT BUFFER 9 COUT EQU $FDED 10 VBLINT EQU $09 11 MOUIDLOC1 EQU $05 ; LOCATIONS OF MOUSE ID BYTES 12 MOUIDLOC2 EQU $07 13 MOUIDLOC3 EQU $0B 14 MOUIDLOC4 EQU $0C 15 MOUIDLOC5 EQU $FB 16 MOUID1 EQU $38 ; MOUSE ID BYTES 17 MOUID2 EQU $18 18 MOUID3 EQU $01 19 MOUID4 EQU $20 20 MOUID5 EQU $D6 21 CLKIDLOC1 EQU $00 ; LOCATIONS OF CLOCK ID BYTES 22 CLKIDLOC2 EQU $01 23 CLKIDLOC3 EQU $0C 24 CLKIDLOC4 EQU $FE 25 CLKID1 EQU $08 ; CLOCK ID BYTES 26 CLKID2 EQU $78 27 CLKID3 EQU $B8 28 CLKID4 EQU $B2 29 BASEADDR EQU $06 ; 2-BYTES FOR INDEXED ADDRESSING 30 MOUSLOT EQU $08 ; MOUSE CARD SLOT 31 CTR EQU $09 ; IRQ COUNTER 32 ACT EQU $19 ; ACTIVE PROCESS 33 NEWPROCTMP EQU $0A ; TEMP HOLDER FOR NEW PROCESS ID 34 MAXP EQU $07 ; MAXIMUM NUMBER OF PROCESSES 35 MOUXPOS EQU $1A ; 2 BYTES FOR MOUSE X-POSITION 36 MOUYPOS EQU $1C 37 MOUSTAT EQU $1E 38 CLKSLOT EQU $1F ; CLOCK CARD SLOT 39 KINPTR EQU $4A ; KBD BUFFER INCOMING POINTER 40 KOUTPTR EQU $4B ; KBD BUFFER OUTGOING POINTER 41 KBUFCNT EQU $4C ; KBD BUFFER CHARACTER COUNTER 42 * 43 * SSC SUPPORT 44 * 45 SBUFLOC EQU $9000 ; MEMORY LOCATION OF FIFO BUFFER 46 SBUFPTR EQU $56 ; TWO BYTES BASE ADDRESS 47 SINPTR EQU $58 ; INCOMING DATA POINTER (FOR WRITES) 48 SOUTPTR EQU $59 ; OUTGOING DATA POINTER (FOR READS) 49 SBUFCNT EQU $5A ; BUFFER CHARACTER COUNTER 50 SSCSLOT EQU $5B ; SSC SLOT AS $N0 51 * 52 SRDREG EQU $C088 ; READ DATA REGISTER (READ) 53 SSTREG EQU $C089 ; STATUS REGISTER (READ) 54 SRESET EQU $C089 ; SOFTWARE RESET (WRITE) 55 SCMDREG EQU $C08A ; COMMAND REGISTER (R/W) 56 SCTLREG EQU $C08B ; CONTROL REGISTER (R/W) 57 * 58 SSCID1 EQU $38 59 SSCID2 EQU $18 60 SSCID3 EQU $01 61 SSCID4 EQU $31 62 SSCID5 EQU $08 63 SSCLOC1 EQU $05 64 SSCLOC2 EQU $07 65 SSCLOC3 EQU $0B 66 SSCLOC4 EQU $0C 67 SSCLOC5 EQU $FF 68 * 69 PFREE EQU $FF ; PROCESS SLOT FREE - CHANGE WITH CARE 70 PRUN EQU $01 ; RUNNING PROCESS 71 PZOMB EQU $02 ; ZOMBIE PROCESS 72 PSLEEP EQU $03 ; SLEEPING PROCESS 73 * 74 CLRTOP EQU $F836 75 SETCOL EQU $F864 76 PLOT EQU $F800 77 SCRN EQU $F871 78 GR EQU $C050 79 MIX EQU $C053 80 RED EQU $01 81 BLUE EQU $02 82 BLACK EQU $00 83 WHITE EQU $0F 84 * 85 ORG $6000 86 * 6000: A9 9B 87 LDA #$9B 6002: 20 ED FD 88 JSR COUT 6005: A9 91 89 LDA #$91 ; KILL 80-COLS FIRMWARE 6007: 20 ED FD 90 JSR COUT 600A: A2 14 91 LDX #$14 600C: 86 22 92 STX $22 ; TOP OF TEXT WINDOW 600E: CA 93 DEX 600F: 86 25 94 STX $25 95 * FIND MOUSE 6011: A9 00 96 LDA #$00 6013: 85 06 97 STA BASEADDR 6015: A9 C8 98 LDA #$C8 6017: 85 07 99 STA BASEADDR+1 6019: A2 08 100 LDX #$08 601B: CA 101 :LOOP1 DEX 601C: F0 48 102 BEQ :NOMOUSE 601E: C6 07 103 DEC BASEADDR+1 6020: A0 05 104 LDY #MOUIDLOC1 6022: B1 06 105 LDA (BASEADDR),Y 6024: C9 38 106 CMP #MOUID1 6026: D0 F3 107 BNE :LOOP1 6028: A0 07 108 LDY #MOUIDLOC2 602A: B1 06 109 LDA (BASEADDR),Y 602C: C9 18 110 CMP #MOUID2 602E: D0 EB 111 BNE :LOOP1 6030: A0 0B 112 LDY #MOUIDLOC3 6032: B1 06 113 LDA (BASEADDR),Y 6034: C9 01 114 CMP #MOUID3 6036: D0 E3 115 BNE :LOOP1 6038: A0 0C 116 LDY #MOUIDLOC4 603A: B1 06 117 LDA (BASEADDR),Y 603C: C9 20 118 CMP #MOUID4 603E: D0 DB 119 BNE :LOOP1 6040: A0 FB 120 LDY #MOUIDLOC5 6042: B1 06 121 LDA (BASEADDR),Y 6044: C9 D6 122 CMP #MOUID5 6046: D0 D3 123 BNE :LOOP1 6048: 8A 124 TXA 6049: 0A 125 ASL 604A: 0A 126 ASL 604B: 0A 127 ASL 604C: 0A 128 ASL 604D: 85 08 129 STA MOUSLOT 604F: A9 8D 130 LDA #$8D 6051: 20 ED FD 131 JSR COUT 6054: 8A 132 TXA 6055: 20 DA FD 133 JSR PRBYTE 6058: A9 8D 134 LDA #$8D 605A: 20 ED FD 135 JSR COUT 605D: 20 85 60 136 JSR FINDCLOCK 6060: 20 1B 61 137 JSR FINDSSC 6063: 4C A8 61 138 JMP SYSINIT ; SYSTEM INITIALIZATION 6066: A0 00 139 :NOMOUSE LDY #$00 6068: B9 7A 60 140 :LOOP LDA NOMOUMSG,Y 606B: F0 06 141 BEQ :DONE 606D: 20 ED FD 142 JSR COUT 6070: C8 143 INY 6071: D0 F5 144 BNE :LOOP 6073: A9 00 145 :DONE LDA #$00 6075: 85 22 146 STA $22 ; RESTORE TEXT WINDOW 6077: 4C D0 03 147 JMP DOSWARM 607A: 8D CE CF 148 NOMOUMSG HEX 8DCECFA0CDCFD5D3C58D00 607D: A0 CD CF D5 D3 C5 8D 00 149 * 150 * FINDCLOCK 151 * 152 * CURRENTLY TRAINED TO LOOK FOR AN A.E. 153 * TIMEMASTER II H.O. 154 * THIS USES A 6821 PIA AND M5832 CLOCK CHIP 155 * 6085: A9 00 156 FINDCLOCK LDA #$00 6087: 85 06 157 STA BASEADDR 6089: 85 1F 158 STA CLKSLOT 608B: A5 07 159 LDA BASEADDR+1 ; SAVE MOUSE BASEADDR 608D: 48 160 PHA 608E: A9 C8 161 LDA #$C8 6090: 85 07 162 STA BASEADDR+1 6092: A2 08 163 LDX #$08 6094: CA 164 :LOOP1 DEX 6095: F0 3B 165 BEQ :NOCLOCK 6097: C6 07 166 DEC BASEADDR+1 6099: A0 00 167 LDY #CLKIDLOC1 609B: B1 06 168 LDA (BASEADDR),Y 609D: C9 08 169 CMP #CLKID1 609F: D0 F3 170 BNE :LOOP1 60A1: A0 01 171 LDY #CLKIDLOC2 60A3: B1 06 172 LDA (BASEADDR),Y 60A5: C9 78 173 CMP #CLKID2 60A7: D0 EB 174 BNE :LOOP1 60A9: A0 0C 175 LDY #CLKIDLOC3 60AB: B1 06 176 LDA (BASEADDR),Y 60AD: C9 B8 177 CMP #CLKID3 60AF: D0 E3 178 BNE :LOOP1 60B1: A0 FE 179 LDY #CLKIDLOC4 60B3: B1 06 180 LDA (BASEADDR),Y 60B5: C9 B2 181 CMP #CLKID4 60B7: D0 DB 182 BNE :LOOP1 60B9: 8A 183 TXA 60BA: 0A 184 ASL 60BB: 0A 185 ASL 60BC: 0A 186 ASL 60BD: 0A 187 ASL 60BE: 85 1F 188 STA CLKSLOT 60C0: A9 8D 189 LDA #$8D 60C2: 20 ED FD 190 JSR COUT 60C5: 8A 191 TXA 60C6: 20 DA FD 192 JSR PRBYTE 60C9: A9 8D 193 LDA #$8D 60CB: 20 ED FD 194 JSR COUT 60CE: 68 195 PLA ; RESTORE MOUSE BASEADDR 60CF: 85 07 196 STA BASEADDR+1 60D1: 60 197 RTS 60D2: A0 00 198 :NOCLOCK LDY #$00 60D4: B9 10 61 199 :LOOP LDA NOCLKMSG,Y 60D7: F0 06 200 BEQ :DONE 60D9: 20 ED FD 201 JSR COUT 60DC: C8 202 INY 60DD: D0 F5 203 BNE :LOOP 60DF: 68 204 :DONE PLA ; RESTORE MOUSE BASEADDR 60E0: 85 07 205 STA BASEADDR+1 60E2: 60 206 RTS 207 * SETUP 1 SECOND CLOCK INTERRUPTS 60E3: A6 1F 208 INITCLK LDX CLKSLOT 60E5: F0 28 209 BEQ :DONE ; NO CLOCK INSTALLED? 60E7: A9 00 210 LDA #$00 ; POINT AT DIRECTION REGISTERS 60E9: 8D 1C 65 211 STA TIMESTOR ; ZERO-OUT OUR TIME 60EC: 9D 81 C0 212 STA $C081,X ; CONTROL REGISTER A 60EF: 9D 83 C0 213 STA $C083,X ; CONTROL REGISTER B 60F2: 9D 80 C0 214 STA $C080,X ; PORT A - ALL INPUT 60F5: A9 FF 215 LDA #$FF 60F7: 9D 82 C0 216 STA $C082,X ; PORT B - ALL OUTPUT 60FA: A9 0C 217 LDA #$0C ; 1 IRQ/SEC 60FC: 9D 81 C0 218 STA $C081,X 60FF: A9 04 219 LDA #$04 ; 1 IRQ/SEC 6101: 9D 83 C0 220 STA $C083,X 6104: A9 2F 221 LDA #$2F ; ENABLE PIA INTERRUPTS 6106: 9D 82 C0 222 STA $C082,X 6109: BD 80 C0 223 LDA $C080,X ; CLEAR ANY PENDING IRQ 610C: BD 82 C0 224 LDA $C082,X 610F: 60 225 :DONE RTS 6110: 8D CE CF 226 NOCLKMSG HEX 8DCECFA0C3CCCFC3CB8D00 6113: A0 C3 CC CF C3 CB 8D 00 227 * 228 * FIND A SUPER SERIAL CARD 229 * THE SYSTEM WILL COMMUNICATE DIRECTLY TO THE ACIA 230 * IMPORTANT: SWITCH 2-6 FOR INTERRUPTS MUST BE ON! 231 * 232 FINDSSC 611B: A9 00 233 LDA #$00 611D: 85 56 234 STA SBUFPTR 611F: 85 5B 235 STA SSCSLOT 6121: A9 C8 236 LDA #$C8 6123: 85 57 237 STA SBUFPTR+1 6125: A2 08 238 LDX #$08 6127: CA 239 :LOOP1 DEX 6128: F0 40 240 BEQ :NOSSC 612A: C6 57 241 DEC SBUFPTR+1 612C: A0 05 242 LDY #SSCLOC1 612E: B1 56 243 LDA (SBUFPTR),Y 6130: C9 38 244 CMP #SSCID1 6132: D0 F3 245 BNE :LOOP1 6134: A0 07 246 LDY #SSCLOC2 6136: B1 56 247 LDA (SBUFPTR),Y 6138: C9 18 248 CMP #SSCID2 613A: D0 EB 249 BNE :LOOP1 613C: A0 0B 250 LDY #SSCLOC3 613E: B1 56 251 LDA (SBUFPTR),Y 6140: C9 01 252 CMP #SSCID3 6142: D0 E3 253 BNE :LOOP1 6144: A0 0C 254 LDY #SSCLOC4 6146: B1 56 255 LDA (SBUFPTR),Y 6148: C9 31 256 CMP #SSCID4 614A: D0 DB 257 BNE :LOOP1 614C: A0 FF 258 LDY #SSCLOC5 614E: B1 56 259 LDA (SBUFPTR),Y 6150: C9 08 260 CMP #SSCID5 6152: D0 D3 261 BNE :LOOP1 6154: 8A 262 TXA ; SLOT NUMBER IN X 6155: 0A 263 ASL 6156: 0A 264 ASL 6157: 0A 265 ASL 6158: 0A 266 ASL 6159: 85 5B 267 STA SSCSLOT 615B: A9 8D 268 LDA #$8D 615D: 20 ED FD 269 JSR COUT 6160: 8A 270 TXA 6161: 20 DA FD 271 JSR PRBYTE 6164: A9 8D 272 LDA #$8D 6166: 20 ED FD 273 JSR COUT 6169: 60 274 RTS 616A: A0 00 275 :NOSSC LDY #$00 616C: B9 78 61 276 :LOOP LDA :NOSSCM,Y 616F: F0 06 277 BEQ :DONE 6171: 20 ED FD 278 JSR COUT 6174: C8 279 INY 6175: D0 F5 280 BNE :LOOP 6177: 60 281 :DONE RTS 6178: 8D CE CF 282 :NOSSCM HEX 8DCECFA0D3D3C38D00 617B: A0 D3 D3 C3 8D 00 283 * SETUP THE SSC PARAMETERS 6181: A6 5B 284 INITSSC LDX SSCSLOT 6183: F0 22 285 BEQ :DONE ; NO SSC INSTALLED? 6185: A9 00 286 LDA #SBUFLOC 618B: 85 57 289 STA SBUFPTR+1 618D: A9 00 290 LDA #$00 618F: 85 58 291 STA SINPTR 6191: 85 59 292 STA SOUTPTR 6193: 85 5A 293 STA SBUFCNT 6195: A4 5B 294 LDY SSCSLOT ; GET SLOT $N0 6197: 99 89 C0 295 STA SRESET,Y 619A: A9 1E 296 LDA #$1E ; 1 STOP, 8 DATA, 9600 BAUD 619C: 99 8B C0 297 STA SCTLREG,Y 619F: A9 09 298 LDA #$09 ; ENABLE IRQ, NO PARITY 61A1: 99 8A C0 299 STA SCMDREG,Y 61A4: B9 88 C0 300 LDA SRDREG,Y 61A7: 60 301 :DONE RTS 302 * 303 * 61A8: 58 304 SYSINIT CLI ; CREATE INITIAL PROCESS 0 61A9: 08 305 PHP 61AA: 78 306 SEI 61AB: A9 FF 307 LDA #PFREE 61AD: 8D F1 64 308 STA STKTAB 61B0: 85 19 309 STA ACT 61B2: A0 06 310 LDY #MAXP-1 ; CLEAR PROCESS TABLES 61B4: 99 0E 65 311 :L1 STA PSTATTAB,Y 61B7: 99 15 65 312 STA ESTATTAB,Y 61BA: 99 07 65 313 STA PPIDTAB,Y 61BD: 88 314 DEY 61BE: 10 F4 315 BPL :L1 61C0: A0 16 316 LDY #$16 ; PRIORITY IN Y-REG 61C2: A9 41 317 LDA #PROC0 61C6: 20 E1 61 319 JSR NEWPROC 61C9: 20 4A 62 320 JSR VBLON ; ENABLE MOUSE CARD VBL INTERRUPTS 61CC: 20 E3 60 321 JSR INITCLK ; ENABLE CLOCK CARD INTERRUPTS 61CF: 20 81 61 322 JSR INITSSC ; ENABLE SUPER SERIAL CARD INTERRUPTS 323 * PREPARE KEYBOARD BUFFER 61D2: A9 00 324 LDA #$00 61D4: 85 4A 325 STA KINPTR 61D6: 85 4B 326 STA KOUTPTR 61D8: 85 4C 327 STA KBUFCNT 61DA: 8D 00 02 328 STA IN 61DD: 28 329 PLP ; ENABLE IRQ 61DE: 4C DE 61 330 :IDLE JMP :IDLE 331 * 332 * CREATE A NEW PROCESS IN THE SYSTEM 333 * THIS MUST BE CALLED DIRECTLY UNTIL FORK AND EXEC 334 * CALLS ARE ADDED. 335 * Y-REG = PROCESS PRIORITY 336 * A-REG = LOW BYTE OF STARTING ADDRESS 337 * X-REG = HIGH BYTE OF "" "" 338 * 339 * RETURNS WITH NEW PROCESS ID IN Y-REG 340 * 61E1: 08 341 NEWPROC PHP 61E2: 78 342 SEI 61E3: 48 343 PHA 61E4: 8A 344 TXA 61E5: 48 345 PHA 61E6: 98 346 TYA 61E7: 48 347 PHA 61E8: A0 00 348 LDY #$00 ; FIND A FREE PROCESS ID 61EA: B9 0E 65 349 :L1 LDA PSTATTAB,Y ; CHECK PROCESS STATUS 61ED: C9 FF 350 CMP #PFREE ; IS IT FREE? 61EF: F0 08 351 BEQ :FREE ; YES! 61F1: C8 352 INY ; NO, SO MOVE ON TO NEXT ONE 61F2: C0 07 353 CPY #MAXP ; REACHED OUR LIMIT? 61F4: D0 F4 354 BNE :L1 ; NO, SO CARRY ON 61F6: 38 355 SEC ; ERROR, NO FREE PROCESS SLOTS 61F7: B0 50 356 BCS :DONE ; EXIT WITH ERROR CONDITION 61F9: EE F1 64 357 :FREE INC STKTAB ; INCREMENT PROCESS COUNT 61FC: 84 0A 358 STY NEWPROCTMP 61FE: F0 0F 359 BEQ :TSX ; OFFSET FROM CURRENT SP 6200: 88 360 DEY ; OFFSET FROM LAST PROC SP 6201: C4 19 361 CPY ACT ; CURRENT PROCESS? 6203: F0 0A 362 BEQ :TSX 6205: BE F2 64 363 LDX STKTAB+1,Y 6208: 8A 364 TXA 6209: 38 365 SEC 620A: E9 20 366 SBC #$20 ; NEW PROC SP 620C: C8 367 INY 620D: D0 07 368 BNE :STORSP 620F: BA 369 :TSX TSX 6210: 8A 370 TXA 6211: 38 371 SEC 6212: E9 20 372 SBC #$20 6214: A4 0A 373 LDY NEWPROCTMP ; RELOAD NEW PROCESS ID 6216: AA 374 :STORSP TAX 6217: 99 F2 64 375 STA STKTAB+1,Y 621A: 68 376 PLA ; PROCESS PRIORITY 621B: 99 F9 64 377 STA PRIOTAB,Y 621E: 68 378 PLA ; HI-BYTE OF START ADDR 621F: 9D 00 01 379 STA $0100,X 6222: CA 380 DEX 6223: 68 381 PLA ; LO-BYTE OF START ADDR 6224: 9D 00 01 382 STA $0100,X 6227: A9 00 383 LDA #$00 ; INITIAL PROCESSOR STATUS 6229: CA 384 DEX 622A: 9D 00 01 385 STA $0100,X 622D: CA 386 DEX 622E: 9D 00 01 387 STA $0100,X ; INITIAL REGISTERS 6231: CA 388 DEX 6232: 9D 00 01 389 STA $0100,X 6235: CA 390 DEX 6236: 9D 00 01 391 STA $0100,X 6239: CA 392 DEX 623A: 8A 393 TXA 623B: 99 F2 64 394 STA STKTAB+1,Y 623E: A5 19 395 LDA ACT ; GET PARENT PROCESS ID 6240: 99 07 65 396 STA PPIDTAB,Y ; STORE IN PPID TABLE 6243: A9 01 397 LDA #PRUN ; PROCESS STATUS 6245: 99 0E 65 398 STA PSTATTAB,Y 6248: 28 399 PLP 6249: 60 400 :DONE RTS 401 * 624A: A9 01 402 VBLON LDA #$01 624C: 20 6E 62 403 JSR SETMOUSE 624F: 20 62 62 404 JSR INITMOUSE 6252: A9 8D 405 LDA #IRQ 6259: 8D FF 03 408 STA IRQLOC+1 625C: A9 09 409 LDA #VBLINT 625E: 20 6E 62 410 JSR SETMOUSE ; TURN ON MOUSE VBL INTERRUPTS 6261: 60 411 RTS 412 * 413 * ON APPLE II AND II PLUS, THIS WILL CLEAR HGR PAGE 1 ($2000) 6262: A0 19 414 INITMOUSE LDY #$19 6264: A9 00 415 LDA #$00 6266: 85 06 416 STA BASEADDR 6268: B1 06 417 LDA (BASEADDR),Y 626A: 85 06 418 STA BASEADDR 626C: D0 3E 419 BNE MOUSEJMP 420 * 626E: A0 12 421 SETMOUSE LDY #$12 6270: AA 422 TAX 6271: A9 00 423 LDA #$00 6273: 85 06 424 STA BASEADDR 6275: B1 06 425 LDA (BASEADDR),Y 6277: 85 06 426 STA BASEADDR 6279: 8A 427 TXA 627A: 10 30 428 BPL MOUSEJMP 429 * 627C: A0 13 430 SERVEMOUSE LDY #$13 627E: A9 00 431 LDA #$00 6280: 85 06 432 STA BASEADDR 6282: B1 06 433 LDA (BASEADDR),Y 6284: 85 06 434 STA BASEADDR 6286: D0 24 435 BNE MOUSEJMP 436 * 6288: AA 437 CLAMPMOUSE TAX 6289: A0 17 438 LDY #$17 628B: A9 00 439 LDA #$00 628D: 85 06 440 STA BASEADDR 628F: B1 06 441 LDA (BASEADDR),Y 6291: 85 06 442 STA BASEADDR 6293: 8A 443 TXA 6294: 10 16 444 BPL MOUSEJMP 445 * 6296: A0 18 446 HOMEMOUSE LDY #$18 6298: A9 00 447 LDA #$00 629A: 85 06 448 STA BASEADDR 629C: B1 06 449 LDA (BASEADDR),Y 629E: 85 06 450 STA BASEADDR 62A0: D0 0A 451 BNE MOUSEJMP 452 * 62A2: A0 14 453 READMOUSE LDY #$14 62A4: A9 00 454 LDA #$00 62A6: 85 06 455 STA BASEADDR 62A8: B1 06 456 LDA (BASEADDR),Y 62AA: 85 06 457 STA BASEADDR 458 * 62AC: A6 07 459 MOUSEJMP LDX BASEADDR+1 62AE: A4 08 460 LDY MOUSLOT 62B0: 6C 06 00 461 JMP (BASEADDR) 462 * 463 * RETURN A SINGLE CHARACTER FROM THE KEYBOARD BUFFER 464 * CARRY FLAG SET IF THE BUFFER IS EMPTY, ELSE CHAR 465 * IS IN A-REG WITH CARRY CLEAR 466 * X-REG IS NOT SAVED! 467 GETCH 62B3: 38 468 SEC 62B4: A5 4C 469 LDA KBUFCNT 62B6: F0 0A 470 BEQ :DONE 62B8: A6 4B 471 LDX KOUTPTR 62BA: BD 00 02 472 LDA IN,X 62BD: C6 4C 473 DEC KBUFCNT 62BF: E6 4B 474 INC KOUTPTR 62C1: 18 475 CLC 62C2: 60 476 :DONE RTS 477 * 478 * RETURN A SINGLE CHARACTER FROM THE SSC BUFFER 479 * CARRY FLAG IS SET IF THE BUFFER IS EMPTY, ELSE CHAR 480 * IS IN A-REG WITH CARRY CLEAR 481 * Y-REG IS NOT SAVED! 482 GETSSC 62C3: 38 483 SEC 62C4: A5 5A 484 LDA SBUFCNT 62C6: F0 09 485 BEQ :DONE 62C8: A4 59 486 LDY SOUTPTR 62CA: B1 56 487 LDA (SBUFPTR),Y 62CC: C6 5A 488 DEC SBUFCNT 62CE: E6 59 489 INC SOUTPTR 62D0: 18 490 CLC 62D1: 60 491 :DONE RTS 492 * 493 * 494 * TERMINATE A PROCESS AND RETURN A STATUS CODE 495 * TO THE PARENT PROCESS 496 * A-REG HOLDS THE STATUS CODE 497 * 62D2: A4 19 498 EXIT LDY ACT ; GET PROCESS ID 62D4: 99 15 65 499 STA ESTATTAB,Y ; STORE EXIT STATUS 62D7: A9 02 500 LDA #PZOMB 62D9: 99 0E 65 501 STA PSTATTAB,Y ; BECOME A ZOMBIE 62DC: A4 19 502 :L0 LDY ACT ; SEARCH PROCESS TABLE FOR OUR PARENT 62DE: B9 07 65 503 LDA PPIDTAB,Y ; GET OUR PARENT PROCESS ID 62E1: C9 FF 504 CMP #PFREE ; CHECK IF THE PROCESS STILL EXISTS 62E3: F0 22 505 BEQ :NOPARENT ; NO PARENT PROCESS 62E5: 98 506 :PARENT TYA ; FOUND PARENT; SAVE ITS PID 62E6: 48 507 PHA 62E7: A0 01 508 LDY #$01 ; PROCESS 1 (INIT) 62E9: 20 4A 63 509 JSR WAKEUP 62EC: 68 510 PLA 62ED: A8 511 TAY ; RESTORE SAVED PID 62EE: 20 4A 63 512 JSR WAKEUP ; NOW WAKE UP THE PARENT PROCESS 513 * SEARCH FOR CHILDREN 62F1: A0 00 514 LDY #$00 ; INITIALIZE PROCESS ID FOR LOOP 62F3: B9 07 65 515 :CL1 LDA PPIDTAB,Y ; GET THE PARENT PROCESS ID 62F6: C5 19 516 CMP ACT ; IS IT OUR PROCESS ID? 62F8: D0 05 517 BNE :CNEXT ; NO, SO MOVE ON 62FA: A9 01 518 LDA #$01 ; NEW PARENT PID IS 1 (INIT) 62FC: 99 07 65 519 STA PPIDTAB,Y ; SET THE NEW PPID 520 * TODO: CHECK FOR STOPPED PROCESS 62FF: C8 521 :CNEXT INY ; POINT TO NEXT PROCESS ID 6300: C9 07 522 CMP #MAXP ; AT PROCESS LIMIT? 6302: D0 EF 523 BNE :CL1 ; NO, SO CONTINUE 6304: 4C E5 63 524 JMP RESETCTR ; RUN NEXT PROCESS 6307: A9 01 525 :NOPARENT LDA #$01 ; PARENT IS NOW PID 1 (INIT) 6309: 99 07 65 526 STA PPIDTAB,Y ; UPDATE OUR PROCESS PARENT 630C: D0 CE 527 BNE :L0 ; DO THE PARENT CHECK AGAIN (ALWAYS TAKEN) 528 * 529 * WAIT FOREVER FOR A CHILD PROCESS TO TERMINATE 530 * AND COLLECT ITS TERMINATION STATUS 531 * A-REG = TERMINATION STATUS 532 * Y-REG = CHILD PROCESS ID 533 * CARRY SET = ERROR: NO CHILD PROCESSES EXIST 534 * 630E: A2 00 535 WAIT LDX #$00 ; USED AS ANY CHILD FOUND FLAG 6310: A0 00 536 :L1 LDY #00 ; SEARCH PROCESS TABLE FOR OUR CHILDREN 6312: B9 07 65 537 :L2 LDA PPIDTAB,Y ; GET CHILD STATUS 6315: C5 19 538 CMP ACT ; OUR CHILD? 6317: D0 08 539 BNE :NEXT ; NO 6319: E8 540 INX ; FOUND AT LEAST ONE CHILD 631A: B9 0E 65 541 LDA PSTATTAB,Y ; GET PROCESS STATUS 631D: C9 02 542 CMP #PZOMB ; IS A ZOMBIE? 631F: F0 10 543 BEQ :COLL ; YES, SO COLLECT STATUS 6321: C8 544 :NEXT INY 6322: C0 07 545 CPY #MAXP ; SEARCHED THE ENTIRE PROCESS TABLE? 6324: D0 EC 546 BNE :L2 6326: 8A 547 TXA ; CHECK OUR CHILD FLAG 6327: F0 1D 548 BEQ :NOCHILD ; NO CHILDREN, SO RETURN ERROR 6329: A9 7F 549 LDA #$7F ; SLEEP TIME 632B: 20 5B 63 550 JSR SLEEP ; GO TO SLEEP 632E: 4C 10 63 551 JMP :L1 ; LOOK FOR CHILDREN AGAIN 6331: B9 15 65 552 :COLL LDA ESTATTAB,Y ; EXIT STATUS OF CHILD PROCESS 6334: 48 553 PHA 6335: A9 FF 554 LDA #PFREE ; CLEAR PROCESS SLOT 6337: 99 0E 65 555 STA PSTATTAB,Y 633A: 99 07 65 556 STA PPIDTAB,Y 633D: 99 15 65 557 STA ESTATTAB,Y 6340: CE F1 64 558 DEC STKTAB ; DECREMENT PROCESS COUNT 6343: 68 559 PLA ; GET EXIT STATUS BACK 6344: 18 560 CLC ; NO ERROR 6345: 60 561 RTS 6346: 68 562 :NOCHILD PLA 6347: AA 563 TAX 6348: 38 564 SEC ; ERROR FLAG 6349: 60 565 RTS 566 * 567 * FORCIBLY WAKE A SLEEPING PROCESS 568 * IF PROCESS IS NOT ASLEEP, NOTHING HAPPENS 569 * Y-REG HOLDS PROCESS ID 570 * 634A: C0 07 571 WAKEUP CPY #MAXP 634C: F0 0C 572 BEQ :DONE ; OVER LIMIT 634E: B9 0E 65 573 LDA PSTATTAB,Y ; GET PROCESS STATUS 6351: C9 03 574 CMP #PSLEEP ; IS IT SLEEPING? 6353: D0 05 575 BNE :DONE ; NO, SO EXIT NOW 6355: A9 01 576 LDA #PRUN ; RUN STATUS 6357: 99 0E 65 577 STA PSTATTAB,Y ; SET NEW STATUS 635A: 60 578 :DONE RTS 579 * 580 * PUT A PROCESS TO SLEEP FOR A TIME 581 * A-REG HOLDS SLEEPING TIME 582 * 635B: 08 583 SLEEP PHP 635C: 78 584 SEI 635D: 48 585 PHA 635E: 8A 586 TXA 635F: 48 587 PHA 6360: 98 588 TYA 6361: 48 589 PHA 6362: A4 19 590 LDY ACT 6364: BA 591 TSX ; GET SLEEP DURATION... 6365: E8 592 INX ; ...OUT OF THE STACK 6366: E8 593 INX 6367: E8 594 INX 6368: BD 00 01 595 LDA $0100,X 636B: 99 00 65 596 STA SLPTAB,Y ; STORE SLEEP DURATION 636E: A9 03 597 LDA #PSLEEP 6370: 99 0E 65 598 STA PSTATTAB,Y ; SET PROCESS STATUS TO SLEEPING 6373: D0 07 599 BNE YIELD2 ; ALWAYS TAKEN 600 * 601 * GIVE UP REMAINING CPU TIME FOR THIS PROCESS 602 * 6375: 08 603 YIELD PHP 6376: 78 604 SEI 6377: 48 605 PHA 6378: 8A 606 TXA 6379: 48 607 PHA 637A: 98 608 TYA 637B: 48 609 PHA 637C: BA 610 YIELD2 TSX ; FIX JSR RETURN FOR RTI 637D: 8A 611 TXA 637E: 18 612 CLC 637F: 69 05 613 ADC #$05 6381: AA 614 TAX 6382: FE 00 01 615 INC $0100,X 6385: D0 5E 616 BNE RESETCTR 6387: E8 617 INX 6388: FE 00 01 618 INC $0100,X 638B: D0 58 619 BNE RESETCTR 620 * 621 * THE MAIN INTERRUPT HANDLER 622 * 638D: A5 45 623 IRQ LDA $45 638F: 48 624 PHA 6390: 8A 625 TXA 6391: 48 626 PHA 6392: 98 627 TYA 6393: 48 628 PHA 6394: 20 7C 62 629 JSR SERVEMOUSE ; DID THE MOUSE CAUSE THE IRQ? 6397: 90 03 630 BCC :DOMOU ; OR SEE IF THE CLOCK DID IT 6399: 4C 30 64 631 JMP CHECKCLK 639C: 20 A2 62 632 :DOMOU JSR READMOUSE ; GET CURRENT MOUSE COORDS 639F: A5 07 633 LDA BASEADDR+1 63A1: 29 0F 634 AND #$F 63A3: AA 635 TAX 63A4: BD 78 04 636 LDA $478,X 63A7: 85 1A 637 STA MOUXPOS 63A9: BD F8 04 638 LDA $4F8,X 63AC: 85 1C 639 STA MOUYPOS 63AE: BD 78 05 640 LDA $578,X 63B1: 85 1B 641 STA MOUXPOS+1 63B3: BD F8 05 642 LDA $5F8,X 63B6: 85 1D 643 STA MOUYPOS+1 63B8: BD 78 07 644 LDA $778,X 63BB: 85 1E 645 STA MOUSTAT 646 * CHECK KEYBOARD 63BD: 2C 00 C0 647 BIT KBD 63C0: 10 0F 648 BPL :NEXT ; NO KEY PRESSED 63C2: AD 00 C0 649 LDA KBD 63C5: A6 4A 650 LDX KINPTR 63C7: 9D 00 02 651 STA IN,X 63CA: E6 4C 652 INC KBUFCNT 63CC: E6 4A 653 INC KINPTR 63CE: 8D 10 C0 654 STA KBDSTRB 63D1: A4 19 655 :NEXT LDY ACT ; CURRENT PROCESS ID 63D3: 30 1B 656 BMI IRQNEXT ; BOOTSTRAP INITIAL PROCESS 63D5: AD F1 64 657 LDA STKTAB ; RUNNING PROCESS COUNT 63D8: F0 50 658 BEQ IRQDONE ; ONLY 1 PROCESS 63DA: A5 09 659 :CTR LDA CTR 63DC: D9 F9 64 660 CMP PRIOTAB,Y ; HAS PROCESS REACHED ITS TIME LIMIT? 63DF: F0 04 661 BEQ RESETCTR ; YES, SO PREPARE TO SWITCH 63E1: E6 09 662 INC CTR 63E3: D0 45 663 BNE IRQDONE ; PROCESS NOT SWITCHED 63E5: A9 00 664 RESETCTR LDA #$00 63E7: 85 09 665 STA CTR 63E9: A4 19 666 LDY ACT 63EB: BA 667 TSX 63EC: 8A 668 TXA 63ED: 99 F2 64 669 STA STKTAB+1,Y 63F0: C8 670 IRQNEXT INY ; SWITCH TO NEXT PROCESS 63F1: C0 07 671 CPY #MAXP 63F3: F0 13 672 BEQ :L2 ; GO BACK TO START OF PROCESS TABLE 63F5: B9 0E 65 673 :L1 LDA PSTATTAB,Y ; GET PRCESS STATUS 63F8: C9 01 674 CMP #PRUN ; IS THIS A RUNNABLE PROCESS? 63FA: F0 22 675 BEQ :CTXSW ; YES, SO SWITCH IT IN 63FC: C9 FF 676 CMP #PFREE ; IS THIS PROCESS SLOT ACTIVE? 63FE: F0 F0 677 BEQ IRQNEXT ; YES, SO SKIP IT 6400: C9 03 678 CMP #PSLEEP ; IS PROCESS ASLEEP? 6402: F0 08 679 BEQ :SLEEP ; YES, SO DECREMENT ITS SLEEP TIMER 6404: C9 02 680 CMP #PZOMB ; IS THIS PROCESS A ZOMBIE? 6406: F0 E8 681 BEQ IRQNEXT ; YES, SO SKIP IT 6408: A0 00 682 :L2 LDY #$00 ; LOOP BACK TO PROCESS 0 640A: F0 E9 683 BEQ :L1 ; ALWAYS TAKEN 640C: B9 00 65 684 :SLEEP LDA SLPTAB,Y 640F: F0 0D 685 BEQ :CTXSW ; PROCESS IS NOT ASLEEP 6411: AA 686 TAX 6412: CA 687 DEX 6413: 8A 688 TXA 6414: 99 00 65 689 STA SLPTAB,Y 6417: D0 D7 690 BNE IRQNEXT ; PROCESS STILL HAS SLEEP TIME 6419: A9 01 691 LDA #PRUN ; PROCESS IS NOW RUNNABLE 641B: 99 0E 65 692 STA PSTATTAB,Y ; SET THIS NEW STATUS 641E: BE F2 64 693 :CTXSW LDX STKTAB+1,Y 6421: 9A 694 TXS ; RESTORE THE PROCESS STACK POINTER 6422: 84 19 695 STY ACT ; ACTIVE PROCESS ID 6424: AD 30 C0 696 LDA SPKR 6427: AD 30 C0 697 LDA SPKR 642A: 68 698 IRQDONE PLA 642B: A8 699 TAY 642C: 68 700 PLA 642D: AA 701 TAX 642E: 68 702 PLA 642F: 40 703 RTI 6430: A6 1F 704 CHECKCLK LDX CLKSLOT ; GET SLOT NUMBER OF CLOCK 6432: F0 7E 705 BEQ CHECKSSC ; NO CLOCK INSTALLED? 6434: BD 81 C0 706 LDA $C081,X ; IRQ FROM CLOCK? 6437: 10 79 707 BPL CHECKSSC ; NO, SO MOVE ON 6439: BD 80 C0 708 LDA $C080,X ; CLEAR THE IRQ FLAG 709 * READ CLOCK DIGITS- HH:MM:SS 643C: A9 10 710 LDA #$10 643E: 9D 82 C0 711 STA $C082,X ; HOLD CLOCK 6441: A9 35 712 LDA #$35 ; ADDRESS H10 DIGIT 6443: 9D 82 C0 713 STA $C082,X 6446: BD 80 C0 714 LDA $C080,X ; READ DIGIT 6449: 29 03 715 AND #$03 ; MASK OUT BITS 644B: 09 B0 716 ORA #$B0 ; CONVERT TO ASCII 644D: 8D 1C 65 717 STA TIMESTOR ; SAVE IT 6450: A9 34 718 LDA #$34 ; H01 6452: 9D 82 C0 719 STA $C082,X 6455: BD 80 C0 720 LDA $C080,X ; READ DIGIT 6458: 29 0F 721 AND #$0F ; MASK OUT BITS 645A: 09 B0 722 ORA #$B0 ; CONVERT TO ASCII 645C: 8D 1D 65 723 STA TIMESTOR+1 ; SAVE IT 645F: A9 33 724 LDA #$33 6461: 9D 82 C0 725 STA $C082,X 6464: BD 80 C0 726 LDA $C080,X 6467: 29 07 727 AND #$07 6469: 09 B0 728 ORA #$B0 646B: 8D 1E 65 729 STA TIMESTOR+2 646E: A9 32 730 LDA #$32 6470: 9D 82 C0 731 STA $C082,X 6473: BD 80 C0 732 LDA $C080,X 6476: 29 0F 733 AND #$0F 6478: 09 B0 734 ORA #$B0 647A: 8D 1F 65 735 STA TIMESTOR+3 647D: A9 31 736 LDA #$31 ; S10 DIGIT 647F: 9D 82 C0 737 STA $C082,X 6482: BD 80 C0 738 LDA $C080,X 6485: 29 07 739 AND #$07 6487: 09 B0 740 ORA #$B0 6489: 8D 20 65 741 STA TIMESTOR+4 648C: A9 30 742 LDA #$30 ; S01 DIGIT 648E: 9D 82 C0 743 STA $C082,X 6491: BD 80 C0 744 LDA $C080,X 6494: 29 0F 745 AND #$0F 6496: 09 B0 746 ORA #$B0 6498: 8D 21 65 747 STA TIMESTOR+5 649B: A9 2F 748 LDA #$2F 649D: 9D 82 C0 749 STA $C082,X ; RELEASE CLOCK HOLD 750 * 64A0: A9 0C 751 LDA #$0C 64A2: 9D 81 C0 752 STA $C081,X 64A5: A9 04 753 LDA #$04 64A7: 9D 83 C0 754 STA $C083,X 64AA: A9 2F 755 LDA #$2F ; REPRIME THE CLOCK FOR IRQ 64AC: 9D 82 C0 756 STA $C082,X 64AF: 4C 2A 64 757 JMP IRQDONE 758 * SERVICE AN IRQ FROM THE SSC 64B2: A4 5B 759 CHECKSSC LDY SSCSLOT 64B4: F0 33 760 BEQ NOIRQ ; NO SSC INSTALLED? 64B6: B9 89 C0 761 LDA SSTREG,Y ; BIT 7 SET ON IRQ 64B9: 10 2E 762 BPL NOIRQ ; WASN'T SSC, SO MOVE ON 64BB: A8 763 TAY 64BC: 29 08 764 AND #$08 64BE: F0 29 765 BEQ NOIRQ 64C0: 98 766 TYA 64C1: 29 07 767 AND #$07 ; ANY ERROR? 64C3: F0 0B 768 BEQ :GET2 64C5: A4 5B 769 LDY SSCSLOT ; BRANCH HERE ON ERROR 64C7: B9 88 C0 770 LDA SRDREG,Y 64CA: 20 E0 64 771 JSR SSCWRITE 64CD: 4C 2A 64 772 JMP IRQDONE 64D0: A4 5B 773 :GET2 LDY SSCSLOT ; NO RECEIVE ERROR 64D2: B9 88 C0 774 LDA SRDREG,Y 64D5: A4 58 775 LDY SINPTR 64D7: 91 56 776 STA (SBUFPTR),Y 64D9: E6 5A 777 INC SBUFCNT 64DB: E6 58 778 INC SINPTR 64DD: 4C 2A 64 779 JMP IRQDONE 780 SSCWRITE 64E0: A4 58 781 LDY SINPTR 64E2: 91 56 782 STA (SBUFPTR),Y 64E4: E6 5A 783 INC SBUFCNT 64E6: E6 58 784 INC SINPTR 64E8: 60 785 RTS 64E9: A9 BF 786 NOIRQ LDA #$BF ; SPURIOUS INTERRUPT? 64EB: 20 ED FD 787 JSR COUT 64EE: 4C 2A 64 788 JMP IRQDONE 789 * 64F1: 00 00 00 790 STKTAB DS MAXP+1 64F4: 00 00 00 00 00 64F9: 00 00 00 791 PRIOTAB DS MAXP ; PROCESS PRIORITIES TABLE 64FC: 00 00 00 00 6500: 00 00 00 792 SLPTAB DS MAXP ; SLEEPING PROCESSES TABLE 6503: 00 00 00 00 6507: 00 00 00 793 PPIDTAB DS MAXP ; PARENT PROCESS ID TABLE 650A: 00 00 00 00 650E: 00 00 00 794 PSTATTAB DS MAXP ; PROCESS STATUS TABLE 6511: 00 00 00 00 6515: 00 00 00 795 ESTATTAB DS MAXP ; PROCESS EXIT STATUS TABLE 6518: 00 00 00 00 796 * 651C: 00 00 00 797 TIMESTOR DS 6 ; SYSTEM TIME- HH:MM:SS 651F: 00 00 00 798 * 6522: A6 5B 799 PROC6 LDX SSCSLOT ; IS THE SSC INSTALLED? 6524: F0 16 800 BEQ :DONE ; NO, SO EXIT 6526: 20 C3 62 801 :L JSR GETSSC 6529: B0 0B 802 BCS :L2 ; NO NEW DATA 652B: 09 80 803 ORA #$80 ; SET HI-BIT FOR COUT 652D: 08 804 PHP 652E: 78 805 SEI 652F: 20 ED FD 806 JSR COUT 6532: 28 807 PLP 6533: 4C 26 65 808 JMP :L 6536: 20 75 63 809 :L2 JSR YIELD ; ALLOW NEXT PROC TO RUN 6539: 4C 26 65 810 JMP :L 653C: A9 01 811 :DONE LDA #$01 ; EXIT IF NO SSC 653E: 20 D2 62 812 JSR EXIT 813 * 6541: A6 1F 814 PROC5 LDX CLKSLOT ; IS THE CLOCK INSTALLED? 6543: F0 40 815 BEQ :DONE ; NO, SO EXIT 6545: 08 816 :PRINTIT PHP 6546: 78 817 SEI ; NO IRQ WHILE WE PRINT TIME 6547: AD 1C 65 818 LDA TIMESTOR ; GET HOURS DIGIT 654A: F0 31 819 BEQ :SLEEP ; NO CLOCK TIME YET? 654C: 20 ED FD 820 JSR COUT 654F: AD 1D 65 821 LDA TIMESTOR+1 ; HOURS DIGIT 6552: 20 ED FD 822 JSR COUT 6555: A9 BA 823 LDA #$BA ; COLON 6557: 20 ED FD 824 JSR COUT 655A: AD 1E 65 825 LDA TIMESTOR+2 ; MINUTES 655D: 20 ED FD 826 JSR COUT 6560: AD 1F 65 827 LDA TIMESTOR+3 ; MINUTES 6563: 20 ED FD 828 JSR COUT 6566: A9 BA 829 LDA #$BA ; COLON 6568: 20 ED FD 830 JSR COUT 656B: AD 20 65 831 LDA TIMESTOR+4 ; SECONDS 656E: 20 ED FD 832 JSR COUT 6571: AD 21 65 833 LDA TIMESTOR+5 ; SECONDS 6574: 20 ED FD 834 JSR COUT 6577: A9 8D 835 LDA #$8D ; CR 6579: 20 ED FD 836 JSR COUT 657C: 28 837 PLP ; RE-ENABLE IRQ 657D: A9 40 838 :SLEEP LDA #$40 ; SLEEP FOR 64 TICKS 657F: 20 5B 63 839 JSR SLEEP 6582: 4C 45 65 840 JMP :PRINTIT ; PRINT TIME AGAIN 6585: A9 01 841 :DONE LDA #$01 ; EXIT IF NO CLOCK 6587: 20 D2 62 842 JSR EXIT 843 * 844 PROC4 658A: A0 00 845 LDY #$00 658C: A2 00 846 LDX #$00 658E: 8A 847 :L1 TXA 658F: 08 848 PHP 6590: 78 849 SEI 6591: 20 71 F8 850 JSR SCRN 6594: 28 851 PLP 6595: 48 852 PHA 6596: 68 853 PLA 6597: C9 0F 854 CMP #WHITE 6599: D0 0C 855 BNE :L2 659B: A9 00 856 LDA #BLACK 659D: 08 857 PHP 659E: 78 858 SEI 659F: 20 64 F8 859 JSR SETCOL 65A2: 8A 860 TXA ; VERTICAL POSITION IN A-REG 65A3: 20 00 F8 861 JSR PLOT 65A6: 28 862 PLP 65A7: C8 863 :L2 INY 65A8: C0 28 864 CPY #$28 65AA: D0 E2 865 BNE :L1 65AC: A0 00 866 LDY #$00 65AE: E8 867 INX 65AF: E0 28 868 CPX #$28 65B1: D0 DB 869 BNE :L1 65B3: A0 00 870 LDY #$00 65B5: B9 CA 65 871 :MSGL LDA CLRMSG,Y 65B8: F0 0B 872 BEQ :MSGDONE 65BA: 09 80 873 ORA #$80 65BC: 08 874 PHP 65BD: 78 875 SEI 65BE: 20 ED FD 876 JSR COUT 65C1: 28 877 PLP 65C2: C8 878 INY 65C3: D0 F0 879 BNE :MSGL 65C5: A9 01 880 :MSGDONE LDA #$01 ; EXIT CODE 65C7: 20 D2 62 881 JSR EXIT ; TERMINATE THIS PROCESS 65CA: 43 4C 45 882 CLRMSG ASC 'CLEAR' 65CD: 41 52 65CF: 8D 00 883 HEX 8D00 65D1: A5 1E 884 PROC3 LDA MOUSTAT 65D3: 10 17 885 BPL :NEXT 65D5: A5 1A 886 LDA MOUXPOS 65D7: 08 887 PHP 65D8: 78 888 SEI 65D9: 20 DA FD 889 JSR PRBYTE 65DC: A9 A0 890 LDA #$A0 65DE: 20 ED FD 891 JSR COUT 65E1: A5 1C 892 LDA MOUYPOS 65E3: 20 DA FD 893 JSR PRBYTE 65E6: A9 8D 894 LDA #$8D 65E8: 20 ED FD 895 JSR COUT 65EB: 28 896 PLP 65EC: 20 75 63 897 :NEXT JSR YIELD 65EF: 4C D1 65 898 JMP PROC3 899 * 65F2: A2 27 900 PROC2 LDX #$27 65F4: A0 27 901 LDY #$27 65F6: A9 03 902 LDA #$03 65F8: 20 5B 63 903 JSR SLEEP 65FB: 08 904 :L1 PHP 65FC: 78 905 SEI 65FD: A9 02 906 LDA #BLUE 65FF: 20 64 F8 907 JSR SETCOL 6602: 8A 908 TXA 6603: 20 00 F8 909 JSR PLOT 6606: 28 910 PLP 6607: 20 75 63 911 JSR YIELD 660A: 88 912 DEY 660B: 10 EE 913 BPL :L1 660D: A0 27 914 LDY #$27 660F: CA 915 DEX 6610: 10 E9 916 BPL :L1 6612: A2 27 917 LDX #$27 6614: D0 E5 918 BNE :L1 919 * 6616: A0 00 920 PROC1 LDY #$00 6618: A2 00 921 LDX #$00 661A: 08 922 :L1 PHP 661B: 78 923 SEI 661C: A9 01 924 LDA #RED 661E: 20 64 F8 925 JSR SETCOL 6621: 8A 926 TXA 6622: 20 00 F8 927 JSR PLOT 6625: 28 928 PLP 6626: 20 75 63 929 JSR YIELD 6629: C8 930 INY 662A: C0 28 931 CPY #$28 662C: D0 EC 932 BNE :L1 662E: A0 00 933 LDY #$00 6630: A9 07 934 LDA #$07 6632: 20 5B 63 935 JSR SLEEP 6635: E8 936 INX 6636: E0 28 937 CPX #$28 6638: D0 E0 938 BNE :L1 663A: A2 00 939 LDX #$00 663C: F0 DC 940 BEQ :L1 663E: 4C 16 66 941 JMP PROC1 942 * 6641: 08 943 PROC0 PHP 6642: 78 944 SEI 6643: A9 00 945 LDA #$00 6645: A2 27 946 LDX #$27 ; MAX X CLAMP 6647: 8D 78 04 947 STA $478 664A: 8E F8 04 948 STX $4F8 664D: 8D 78 05 949 STA $578 6650: 8D F8 05 950 STA $5F8 6653: 20 88 62 951 JSR CLAMPMOUSE 6656: A0 00 952 LDY #$00 6658: A9 01 953 LDA #$01 665A: A2 27 954 LDX #$27 665C: 8C 78 04 955 STY $478 665F: 8E F8 04 956 STX $4F8 6662: 8C 78 05 957 STY $578 6665: 8C F8 05 958 STY $5F8 6668: 20 88 62 959 JSR CLAMPMOUSE 666B: 20 96 62 960 JSR HOMEMOUSE 666E: 28 961 PLP 666F: AD 53 C0 962 LDA MIX 6672: AD 50 C0 963 LDA GR 6675: 08 964 PHP 6676: 78 965 SEI 6677: 20 36 F8 966 JSR CLRTOP 667A: 28 967 PLP 667B: A0 0B 968 LDY #$0B ; PROCESS PRIORITY 667D: A9 16 969 LDA #PROC1 6681: 20 E1 61 971 JSR NEWPROC 6684: A0 06 972 LDY #$06 6686: A9 F2 973 LDA #PROC2 668A: 20 E1 61 975 JSR NEWPROC 668D: A0 0B 976 LDY #$0B 668F: A9 D1 977 LDA #PROC3 6693: 20 E1 61 979 JSR NEWPROC 6696: A0 01 980 LDY #$01 ; LOW PRIO FOR CLOCK PRINT 6698: A9 41 981 LDA #PROC5 669C: 20 E1 61 983 JSR NEWPROC 669F: A0 0E 984 LDY #$0E ; PRIO FOR SSC READER 66A1: A9 22 985 LDA #PROC6 66A5: 20 E1 61 987 JSR NEWPROC 66A8: 20 B3 62 988 :NEXT JSR GETCH 66AB: B0 04 989 BCS :PUSH 66AD: C9 9B 990 CMP #$9B ; ESCAPE 66AF: F0 16 991 BEQ :CLRIT 66B1: 08 992 :PUSH PHP 66B2: 78 993 SEI 66B3: A5 1E 994 LDA MOUSTAT ; CHECK BUTTON STATUS 66B5: 10 0C 995 BPL :PULL 66B7: A9 0F 996 LDA #WHITE 66B9: 20 64 F8 997 JSR SETCOL 66BC: A5 1C 998 LDA MOUYPOS 66BE: A4 1A 999 LDY MOUXPOS 66C0: 20 00 F8 1000 JSR PLOT 66C3: 28 1001 :PULL PLP 66C4: 4C A8 66 1002 JMP :NEXT 66C7: A0 04 1003 :CLRIT LDY #$04 ; PROCESS PRIORITY 66C9: A9 8A 1004 LDA #PROC4 66CD: 20 E1 61 1006 JSR NEWPROC ; SPAWN THE CHILD PROCESS 66D0: 20 0E 63 1007 JSR WAIT ; AND WAIT FOR IT TO COMPLETE 66D3: 08 1008 PHP 66D4: 78 1009 SEI 66D5: AA 1010 TAX ; MOVE TERM STATUS TO X-REG 66D6: 98 1011 TYA ; MOVE PROC ID TO A-REG 66D7: 20 41 F9 1012 JSR PRNTAX 66DA: A9 8D 1013 LDA #$8D 66DC: 20 ED FD 1014 JSR COUT 66DF: 28 1015 PLP 66E0: 4C A8 66 1016 JMP :NEXT --End assembly, 1763 bytes, Errors: 0 Symbol table - alphabetical order: ACT =$19 BASEADDR=$06 BLACK =$00 BLUE =$02 CHECKCLK=$6430 CHECKSSC=$64B2 CLAMPMOUSE=$6288 CLKID1 =$08 CLKID2 =$78 CLKID3 =$B8 CLKID4 =$B2 CLKIDLOC1=$00 CLKIDLOC2=$01 CLKIDLOC3=$0C CLKIDLOC4=$FE CLKSLOT =$1F CLRMSG =$65CA CLRTOP =$F836 COUT =$FDED CTR =$09 DOSWARM =$03D0 ESTATTAB=$6515 EXIT =$62D2 FINDCLOCK=$6085 FINDSSC =$611B GETCH =$62B3 GETSSC =$62C3 GR =$C050 HOMEMOUSE=$6296 IN =$0200 INITCLK =$60E3 INITMOUSE=$6262 INITSSC =$6181 IRQ =$638D IRQDONE =$642A IRQLOC =$03FE IRQNEXT =$63F0 KBD =$C000 KBDSTRB =$C010 KBUFCNT =$4C KINPTR =$4A KOUTPTR =$4B MAXP =$07 MIX =$C053 MOUID1 =$38 MOUID2 =$18 MOUID3 =$01 MOUID4 =$20 MOUID5 =$D6 MOUIDLOC1=$05 MOUIDLOC2=$07 MOUIDLOC3=$0B MOUIDLOC4=$0C MOUIDLOC5=$FB MOUSEJMP=$62AC MOUSLOT =$08 MOUSTAT =$1E MOUXPOS =$1A MOUYPOS =$1C NEWPROC =$61E1 NEWPROCTMP=$0A NOCLKMSG=$6110 NOIRQ =$64E9 NOMOUMSG=$607A PFREE =$FF PLOT =$F800 PPIDTAB =$6507 PRBYTE =$FDDA PRIOTAB =$64F9 PRNTAX =$F941 PROC0 =$6641 PROC1 =$6616 PROC2 =$65F2 PROC3 =$65D1 PROC4 =$658A PROC5 =$6541 PROC6 =$6522 PRUN =$01 PSLEEP =$03 PSTATTAB=$650E PZOMB =$02 READMOUSE=$62A2 RED =$01 RESETCTR=$63E5 SBUFCNT =$5A SBUFLOC =$9000 SBUFPTR =$56 SCMDREG =$C08A SCRN =$F871 SCTLREG =$C08B SERVEMOUSE=$627C SETCOL =$F864 SETMOUSE=$626E SINPTR =$58 SLEEP =$635B SLPTAB =$6500 SOUTPTR =$59 SPKR =$C030 SRDREG =$C088 SRESET =$C089 SSCID1 =$38 SSCID2 =$18 SSCID3 =$01 SSCID4 =$31 SSCID5 =$08 SSCLOC1 =$05 SSCLOC2 =$07 SSCLOC3 =$0B SSCLOC4 =$0C SSCLOC5 =$FF SSCSLOT =$5B SSCWRITE=$64E0 SSTREG =$C089 STKTAB =$64F1 SYSINIT =$61A8 TIMESTOR=$651C VBLINT =$09 VBLON =$624A WAIT =$630E WAKEUP =$634A WHITE =$0F YIELD =$6375 YIELD2 =$637C Symbol table - numerical order: CLKIDLOC1=$00 BLACK =$00 MOUID3 =$01 CLKIDLOC2=$01 SSCID3 =$01 PRUN =$01 RED =$01 PZOMB =$02 BLUE =$02 PSLEEP =$03 MOUIDLOC1=$05 SSCLOC1 =$05 BASEADDR=$06 MOUIDLOC2=$07 MAXP =$07 SSCLOC2 =$07 CLKID1 =$08 MOUSLOT =$08 SSCID5 =$08 VBLINT =$09 CTR =$09 NEWPROCTMP=$0A MOUIDLOC3=$0B SSCLOC3 =$0B MOUIDLOC4=$0C CLKIDLOC3=$0C SSCLOC4 =$0C WHITE =$0F MOUID2 =$18 SSCID2 =$18 ACT =$19 MOUXPOS =$1A MOUYPOS =$1C MOUSTAT =$1E CLKSLOT =$1F MOUID4 =$20 SSCID4 =$31 MOUID1 =$38 SSCID1 =$38 KINPTR =$4A KOUTPTR =$4B KBUFCNT =$4C SBUFPTR =$56 SINPTR =$58 SOUTPTR =$59 SBUFCNT =$5A SSCSLOT =$5B CLKID2 =$78 CLKID4 =$B2 CLKID3 =$B8 MOUID5 =$D6 MOUIDLOC5=$FB CLKIDLOC4=$FE SSCLOC5 =$FF PFREE =$FF IN =$0200 DOSWARM =$03D0 IRQLOC =$03FE NOMOUMSG=$607A FINDCLOCK=$6085 INITCLK =$60E3 NOCLKMSG=$6110 FINDSSC =$611B INITSSC =$6181 SYSINIT =$61A8 NEWPROC =$61E1 VBLON =$624A INITMOUSE=$6262 SETMOUSE=$626E SERVEMOUSE=$627C CLAMPMOUSE=$6288 HOMEMOUSE=$6296 READMOUSE=$62A2 MOUSEJMP=$62AC GETCH =$62B3 GETSSC =$62C3 EXIT =$62D2 WAIT =$630E WAKEUP =$634A SLEEP =$635B YIELD =$6375 YIELD2 =$637C IRQ =$638D RESETCTR=$63E5 IRQNEXT =$63F0 IRQDONE =$642A CHECKCLK=$6430 CHECKSSC=$64B2 SSCWRITE=$64E0 NOIRQ =$64E9 STKTAB =$64F1 PRIOTAB =$64F9 SLPTAB =$6500 PPIDTAB =$6507 PSTATTAB=$650E ESTATTAB=$6515 TIMESTOR=$651C PROC6 =$6522 PROC5 =$6541 PROC4 =$658A CLRMSG =$65CA PROC3 =$65D1 PROC2 =$65F2 PROC1 =$6616 PROC0 =$6641 SBUFLOC =$9000 KBD =$C000 KBDSTRB =$C010 SPKR =$C030 GR =$C050 MIX =$C053 SRDREG =$C088 SSTREG =$C089 SRESET =$C089 SCMDREG =$C08A SCTLREG =$C08B PLOT =$F800 CLRTOP =$F836 SETCOL =$F864 SCRN =$F871 PRNTAX =$F941 PRBYTE =$FDDA COUT =$FDED