Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.sys.apple2.programmer > #1414
| 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 <dog_cow@macgui.com> |
| 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 | <dog_cow-multitasking-sourcev1.3-17dec14@macgui.com> (permalink) |
| References | <dog_cow-1418932376@macgui.com> |
| 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 |
Show key headers only | View raw
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
6187: 85 56 287 STA SBUFPTR
6189: A9 90 288 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
61C4: A2 66 318 LDX #>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
6254: 8D FE 03 406 STA IRQLOC
6257: A9 63 407 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
667F: A2 66 970 LDX #>PROC1
6681: 20 E1 61 971 JSR NEWPROC
6684: A0 06 972 LDY #$06
6686: A9 F2 973 LDA #<PROC2
6688: A2 65 974 LDX #>PROC2
668A: 20 E1 61 975 JSR NEWPROC
668D: A0 0B 976 LDY #$0B
668F: A9 D1 977 LDA #<PROC3
6691: A2 65 978 LDX #>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
669A: A2 65 982 LDX #>PROC5
669C: 20 E1 61 983 JSR NEWPROC
669F: A0 0E 984 LDY #$0E ; PRIO FOR SSC READER
66A1: A9 22 985 LDA #<PROC6
66A3: A2 65 986 LDX #>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
66CB: A2 65 1005 LDX #>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
Back to comp.sys.apple2.programmer | Previous | Next — Previous in thread | Next in thread | Find similar
Multitasking Mouse Draw Demo v1.3 D Finnigan <dog_cow@macgui.com> - 2014-12-18 19:52 +0000
Source Code for Multitasking Mouse Draw Demo v1.3 D Finnigan <dog_cow@macgui.com> - 2014-12-18 19:56 +0000
Re: Source Code for Multitasking Mouse Draw Demo v1.3 gids.rs@sasktel.net - 2014-12-19 15:24 -0800
Re: Source Code for Multitasking Mouse Draw Demo v1.3 wssimms@gmail.com - 2014-12-27 14:09 -0800
Re: Source Code for Multitasking Mouse Draw Demo v1.3 Michael J. Mahon <mjmahon@aol.com> - 2014-12-27 17:36 -0600
Re: Source Code for Multitasking Mouse Draw Demo v1.3 D Finnigan <dog_cow@macgui.com> - 2014-12-28 13:38 +0000
Re: Source Code for Multitasking Mouse Draw Demo v1.3 gids.rs@sasktel.net - 2014-12-28 10:45 -0800
Re: Source Code for Multitasking Mouse Draw Demo v1.3 wssimms@gmail.com - 2014-12-28 15:14 -0800
Re: Source Code for Multitasking Mouse Draw Demo v1.3 D Finnigan <dog_cow@macgui.com> - 2014-12-29 18:13 +0000
Re: Source Code for Multitasking Mouse Draw Demo v1.3 gids.rs@sasktel.net - 2014-12-29 13:14 -0800
Re: Source Code for Multitasking Mouse Draw Demo v1.3 D Finnigan <dog_cow@macgui.com> - 2014-12-30 09:25 +0000
Re: Source Code for Multitasking Mouse Draw Demo v1.3 "Bill Garber" <willy46pa@comcast.net> - 2014-12-30 05:44 -0500
Re: Source Code for Multitasking Mouse Draw Demo v1.3 D Finnigan <dog_cow@macgui.com> - 2014-12-30 12:25 +0000
Re: Source Code for Multitasking Mouse Draw Demo v1.3 Hugh Hood <hughhood@earthlink.net> - 2014-12-30 08:03 -0600
Re: Source Code for Multitasking Mouse Draw Demo v1.3 D Finnigan <dog_cow@macgui.com> - 2014-12-30 16:57 +0000
Re: Source Code for Multitasking Mouse Draw Demo v1.3 "Bill Garber" <willy46pa@comcast.net> - 2014-12-30 11:48 -0500
Re: Source Code for Multitasking Mouse Draw Demo v1.3 Martin Doherty <martindoherty377@gmail.com> - 2014-12-30 10:22 -0800
Re: Source Code for Multitasking Mouse Draw Demo v1.3 D Finnigan <dog_cow@macgui.com> - 2014-12-30 18:55 +0000
Re: Source Code for Multitasking Mouse Draw Demo v1.3 Michael J. Mahon <mjmahon@aol.com> - 2014-12-30 17:54 -0600
Re: Source Code for Multitasking Mouse Draw Demo v1.3 D Finnigan <dog_cow@macgui.com> - 2014-12-31 10:31 +0000
Re: Source Code for Multitasking Mouse Draw Demo v1.3 D Finnigan <dog_cow@macgui.com> - 2015-01-26 22:48 +0000
csiph-web