Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.sys.apple2.programmer > #1227
| From | D. Finnigan <dog_cow@macgui.com> |
|---|---|
| Newsgroups | comp.sys.apple2.programmer |
| Subject | Multitasking Mouse Draw Demo v1.2 |
| Date | 2014-06-10 00:52 +0000 |
| Organization | bbs-scene usenet news |
| Message-ID | <multitasking-mouse-draw-demo-v1.2-06jun14@macgui.com> (permalink) |
Multitasking Mouse Draw Demo v1.2 - 06 June 2014
by D. Finnigan
The source code is in the public domain for the benefit of all
Apple II users. I claim absolutely no copyright on the source code.
The 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 COUT EQU $FDED
9 VBLINT EQU $09
10 MOUIDLOC1 EQU $05 ; LOCATIONS OF MOUSE ID BYTES
11 MOUIDLOC2 EQU $07
12 MOUIDLOC3 EQU $0B
13 MOUIDLOC4 EQU $0C
14 MOUIDLOC5 EQU $FB
15 MOUID1 EQU $38 ; MOUSE ID BYTES
16 MOUID2 EQU $18
17 MOUID3 EQU $01
18 MOUID4 EQU $20
19 MOUID5 EQU $D6
20 BASEADDR EQU $06 ; 2-BYTES FOR INDEXED ADDRESSING
21 MOUSLOT EQU $08 ; MOUSE CARD SLOT
22 CTR EQU $09 ; IRQ COUNTER
23 ACT EQU $19 ; ACTIVE PROCESS
24 NEWPROCTMP EQU $0A ; TEMP HOLDER FOR NEW PROCESS ID
25 MAXP EQU $06 ; MAXIMUM NUMBER OF PROCESSES
26 MOUXPOS EQU $1A ; 2 BYTES FOR MOUSE X-POSITION
27 MOUYPOS EQU $1C
28 MOUSTAT EQU $1E
29 *
30 PFREE EQU $FF ; PROCESS SLOT FREE - CHANGE WITH CARE
31 PRUN EQU $01 ; RUNNING PROCESS
32 PZOMB EQU $02 ; ZOMBIE PROCESS
33 PSLEEP EQU $03 ; SLEEPING PROCESS
34 *
35 CLRTOP EQU $F836
36 SETCOL EQU $F864
37 PLOT EQU $F800
38 SCRN EQU $F871
39 GR EQU $C050
40 MIX EQU $C053
41 RED EQU $01
42 BLUE EQU $02
43 BLACK EQU $00
44 WHITE EQU $0F
45 *
8000: A9 9B 46 LDA #$9B
8002: 20 ED FD 47 JSR COUT
8005: A9 91 48 LDA #$91 ; KILL 80-COLS FIRMWARE
8007: 20 ED FD 49 JSR COUT
800A: A2 14 50 LDX #$14
800C: 86 22 51 STX $22 ; TOP OF TEXT WINDOW
800E: CA 52 DEX
800F: 86 25 53 STX $25
54 *
8011: A9 00 55 FINDMOUSE LDA #$00
8013: 85 06 56 STA BASEADDR
8015: A9 C8 57 LDA #$C8
8017: 85 07 58 STA BASEADDR+1
===== Page 2 =====
8019: A2 08 59 LDX #$08
801B: CA 60 :LOOP1 DEX
801C: F0 42 61 BEQ :NOMOUSE
801E: C6 07 62 DEC BASEADDR+1
8020: A0 05 63 LDY #MOUIDLOC1
8022: B1 06 64 LDA (BASEADDR),Y
8024: C9 38 65 CMP #MOUID1
8026: D0 F3 66 BNE :LOOP1
8028: A0 07 67 LDY #MOUIDLOC2
802A: B1 06 68 LDA (BASEADDR),Y
802C: C9 18 69 CMP #MOUID2
802E: D0 EB 70 BNE :LOOP1
8030: A0 0B 71 LDY #MOUIDLOC3
8032: B1 06 72 LDA (BASEADDR),Y
8034: C9 01 73 CMP #MOUID3
8036: D0 E3 74 BNE :LOOP1
8038: A0 0C 75 LDY #MOUIDLOC4
803A: B1 06 76 LDA (BASEADDR),Y
803C: C9 20 77 CMP #MOUID4
803E: D0 DB 78 BNE :LOOP1
8040: A0 FB 79 LDY #MOUIDLOC5
8042: B1 06 80 LDA (BASEADDR),Y
8044: C9 D6 81 CMP #MOUID5
8046: D0 D3 82 BNE :LOOP1
8048: 8A 83 TXA
8049: 0A 84 ASL
804A: 0A 85 ASL
804B: 0A 86 ASL
804C: 0A 87 ASL
804D: 85 08 88 STA MOUSLOT
804F: A9 8D 89 LDA #$8D
8051: 20 ED FD 90 JSR COUT
8054: 8A 91 TXA
8055: 20 DA FD 92 JSR PRBYTE
8058: A9 8D 93 LDA #$8D
805A: 20 ED FD 94 JSR COUT
805D: 4C 7B 80 95 JMP SYSINIT ; SYSTEM INITIALIZATION
8060: A0 00 96 :NOMOUSE LDY #$00
8062: B9 70 80 97 :LOOP LDA NOMOUMSG,Y
8065: F0 06 98 BEQ :DONE
8067: 20 ED FD 99 JSR COUT
806A: C8 100 INY
806B: D0 F5 101 BNE :LOOP
806D: 4C D0 03 102 :DONE JMP DOSWARM
8070: 8D CE CF 103 NOMOUMSG HEX 8DCECFA0CDCFD5D3C58D00
8073: A0 CD CF D5 D3 C5 8D 00
104 *
807B: 58 105 SYSINIT CLI ; CREATE INITIAL PROCESS 0
807C: 08 106 PHP
807D: 78 107 SEI
807E: A9 FF 108 LDA #PFREE
8080: 8D BE 82 109 STA STKTAB
8083: 85 19 110 STA ACT
8085: A0 05 111 LDY #MAXP-1 ; CLEAR PROCESS TABLES
8087: 99 D7 82 112 :L1 STA PSTATTAB,Y
808A: 99 DD 82 113 STA ESTATTAB,Y
808D: 99 D1 82 114 STA PPIDTAB,Y
===== Page 3 =====
8090: 88 115 DEY
8091: 10 F4 116 BPL :L1
8093: A0 16 117 LDY #$16 ; PRIORITY IN Y-REG
8095: A9 9D 118 LDA #<PROC0
8097: A2 83 119 LDX #>PROC0
8099: 20 A3 80 120 JSR NEWPROC
809C: 20 0C 81 121 JSR VBLON ; ENABLE MOUSE CARD VBL INTERRUPTS
809F: 28 122 PLP ; ENABLE IRQ
80A0: 4C A0 80 123 :IDLE JMP :IDLE
124 *
125 * CREATE A NEW PROCESS IN THE SYSTEM
126 * THIS MUST BE CALLED DIRECTLY UNTIL FORK AND EXEC
127 * CALLS ARE ADDED.
128 * Y-REG = PROCESS PRIORITY
129 * A-REG = LOW BYTE OF STARTING ADDRESS
130 * X-REG = HIGH BYTE OF "" ""
131 *
132 * RETURNS WITH NEW PROCESS ID IN Y-REG
133 *
80A3: 08 134 NEWPROC PHP
80A4: 78 135 SEI
80A5: 48 136 PHA
80A6: 8A 137 TXA
80A7: 48 138 PHA
80A8: 98 139 TYA
80A9: 48 140 PHA
80AA: A0 00 141 LDY #$00 ; FIND A FREE PROCESS ID
80AC: B9 D7 82 142 :L1 LDA PSTATTAB,Y ; CHECK PROCESS STATUS
80AF: C9 FF 143 CMP #PFREE ; IS IT FREE?
80B1: F0 08 144 BEQ :FREE ; YES!
80B3: C8 145 INY ; NO, SO MOVE ON TO NEXT ONE
80B4: C0 06 146 CPY #MAXP ; REACHED OUR LIMIT?
80B6: D0 F4 147 BNE :L1 ; NO, SO CARRY ON
80B8: 38 148 SEC ; ERROR, NO FREE PROCESS SLOTS
80B9: B0 50 149 BCS :DONE ; EXIT WITH ERROR CONDITION
80BB: EE BE 82 150 :FREE INC STKTAB ; INCREMENT PROCESS COUNT
80BE: 84 0A 151 STY NEWPROCTMP
80C0: F0 0F 152 BEQ :TSX ; OFFSET FROM CURRENT SP
80C2: 88 153 DEY ; OFFSET FROM LAST PROC SP
80C3: C4 19 154 CPY ACT ; CURRENT PROCESS?
80C5: F0 0A 155 BEQ :TSX
80C7: BE BF 82 156 LDX STKTAB+1,Y
80CA: 8A 157 TXA
80CB: 38 158 SEC
80CC: E9 20 159 SBC #$20 ; NEW PROC SP
80CE: C8 160 INY
80CF: D0 07 161 BNE :STORSP
80D1: BA 162 :TSX TSX
80D2: 8A 163 TXA
80D3: 38 164 SEC
80D4: E9 20 165 SBC #$20
80D6: A4 0A 166 LDY NEWPROCTMP ; RELOAD NEW PROCESS ID
80D8: AA 167 :STORSP TAX
80D9: 99 BF 82 168 STA STKTAB+1,Y
80DC: 68 169 PLA ; PROCESS PRIORITY
80DD: 99 C5 82 170 STA PRIOTAB,Y
===== Page 4 =====
80E0: 68 171 PLA ; HI-BYTE OF START ADDR
80E1: 9D 00 01 172 STA $0100,X
80E4: CA 173 DEX
80E5: 68 174 PLA ; LO-BYTE OF START ADDR
80E6: 9D 00 01 175 STA $0100,X
80E9: A9 00 176 LDA #$00 ; INITIAL PROCESSOR STATUS
80EB: CA 177 DEX
80EC: 9D 00 01 178 STA $0100,X
80EF: CA 179 DEX
80F0: 9D 00 01 180 STA $0100,X ; INITIAL REGISTERS
80F3: CA 181 DEX
80F4: 9D 00 01 182 STA $0100,X
80F7: CA 183 DEX
80F8: 9D 00 01 184 STA $0100,X
80FB: CA 185 DEX
80FC: 8A 186 TXA
80FD: 99 BF 82 187 STA STKTAB+1,Y
8100: A5 19 188 LDA ACT ; GET PARENT PROCESS ID
8102: 99 D1 82 189 STA PPIDTAB,Y ; STORE IN PPID TABLE
8105: A9 01 190 LDA #PRUN ; PROCESS STATUS
8107: 99 D7 82 191 STA PSTATTAB,Y
810A: 28 192 PLP
810B: 60 193 :DONE RTS
194 *
810C: A9 01 195 VBLON LDA #$01
810E: 20 30 81 196 JSR SETMOUSE
8111: 20 24 81 197 JSR INITMOUSE
8114: A9 32 198 LDA #<IRQ
8116: 8D FE 03 199 STA IRQLOC
8119: A9 82 200 LDA #>IRQ
811B: 8D FF 03 201 STA IRQLOC+1
811E: A9 09 202 LDA #VBLINT
8120: 20 30 81 203 JSR SETMOUSE ; TURN ON MOUSE VBL INTERRUPTS
8123: 60 204 RTS
205 *
8124: A0 19 206 INITMOUSE LDY #$19
8126: A9 00 207 LDA #$00
8128: 85 06 208 STA BASEADDR
812A: B1 06 209 LDA (BASEADDR),Y
812C: 85 06 210 STA BASEADDR
812E: D0 3E 211 BNE MOUSEJMP
212 *
8130: A0 12 213 SETMOUSE LDY #$12
8132: AA 214 TAX
8133: A9 00 215 LDA #$00
8135: 85 06 216 STA BASEADDR
8137: B1 06 217 LDA (BASEADDR),Y
8139: 85 06 218 STA BASEADDR
813B: 8A 219 TXA
813C: 10 30 220 BPL MOUSEJMP
221 *
813E: A0 13 222 SERVEMOUSE LDY #$13
8140: A9 00 223 LDA #$00
8142: 85 06 224 STA BASEADDR
8144: B1 06 225 LDA (BASEADDR),Y
8146: 85 06 226 STA BASEADDR
8148: D0 24 227 BNE MOUSEJMP
===== Page 5 =====
228 *
814A: AA 229 CLAMPMOUSE TAX
814B: A0 17 230 LDY #$17
814D: A9 00 231 LDA #$00
814F: 85 06 232 STA BASEADDR
8151: B1 06 233 LDA (BASEADDR),Y
8153: 85 06 234 STA BASEADDR
8155: 8A 235 TXA
8156: 10 16 236 BPL MOUSEJMP
237 *
8158: A0 18 238 HOMEMOUSE LDY #$18
815A: A9 00 239 LDA #$00
815C: 85 06 240 STA BASEADDR
815E: B1 06 241 LDA (BASEADDR),Y
8160: 85 06 242 STA BASEADDR
8162: D0 0A 243 BNE MOUSEJMP
244 *
8164: A0 14 245 READMOUSE LDY #$14
8166: A9 00 246 LDA #$00
8168: 85 06 247 STA BASEADDR
816A: B1 06 248 LDA (BASEADDR),Y
816C: 85 06 249 STA BASEADDR
250 *
816E: A6 07 251 MOUSEJMP LDX BASEADDR+1
8170: A4 08 252 LDY MOUSLOT
8172: 6C 06 00 253 JMP (BASEADDR)
254 *
255 * TERMINATE A PROCESS AND RETURN A STATUS CODE
256 * TO THE PARENT PROCESS
257 * A-REG HOLDS THE STATUS CODE
258 *
8175: A4 19 259 EXIT LDY ACT ; GET PROCESS ID
8177: 99 DD 82 260 STA ESTATTAB,Y ; STORE EXIT STATUS
817A: A9 02 261 LDA #PZOMB
817C: 99 D7 82 262 STA PSTATTAB,Y ; BECOME A ZOMBIE
817F: A2 00 263 LDX #$00 ; USED AS ANY CHILD FOUND FLAG
8181: A4 19 264 :L0 LDY ACT ; SEARCH PROCESS TABLE FOR OUR PARENT
8183: B9 D1 82 265 LDA PPIDTAB,Y ; GET OUR PARENT PROCESS ID
8186: C9 FF 266 CMP #PFREE ; CHECK IF THE PROCESS STILL EXISTS
8188: F0 22 267 BEQ :NOPARENT ; NO PARENT PROCESS
818A: 98 268 :PARENT TYA ; FOUND PARENT; SAVE ITS PID
818B: 48 269 PHA
818C: A0 01 270 LDY #$01 ; PROCESS 1 (INIT)
818E: 20 EF 81 271 JSR WAKEUP
8191: 68 272 PLA
8192: A8 273 TAY ; RESTORE SAVED PID
8193: 20 EF 81 274 JSR WAKEUP ; NOW WAKE UP THE PARENT PROCESS
275 * SEARCH FOR CHILDREN
8196: A0 00 276 LDY #$00 ; INITIALIZE PROCESS ID FOR LOOP
8198: B9 D1 82 277 :CL1 LDA PPIDTAB,Y ; GET THE PARENT PROCESS ID
819B: C5 19 278 CMP ACT ; IS IT OUR PROCESS ID?
819D: D0 05 279 BNE :CNEXT ; NO, SO MOVE ON
819F: A9 01 280 LDA #$01 ; NEW PARENT PID IS 1 (INIT)
81A1: 99 D1 82 281 STA PPIDTAB,Y ; SET THE NEW PPID
282 * TODO: CHECK FOR STOPPED PROCESS
===== Page 6 =====
81A4: C8 283 :CNEXT INY ; POINT TO NEXT PROCESS ID
81A5: C9 06 284 CMP #MAXP ; AT PROCESS LIMIT?
81A7: D0 EF 285 BNE :CL1 ; NO, SO CONTINUE
81A9: 4C 73 82 286 JMP RESETCTR ; RUN NEXT PROCESS
81AC: A9 01 287 :NOPARENT LDA #$01 ; PARENT IS NOW PID 1 (INIT)
81AE: 99 D1 82 288 STA PPIDTAB,Y ; UPDATE OUR PROCESS PARENT
81B1: D0 CE 289 BNE :L0 ; DO THE PARENT CHECK AGAIN (ALWAYS TAKEN)
290 *
291 * WAIT FOREVER FOR A CHILD PROCESS TO TERMINATE
292 * AND COLLECT ITS TERMINATION STATUS
293 * A-REG = TERMINATION STATUS
294 * Y-REG = CHILD PROCESS ID
295 * CARRY SET = ERROR: NO CHILD PROCESSES EXIST
296 *
81B3: A2 00 297 WAIT LDX #$00 ; USED AS ANY CHILD FOUND FLAG
81B5: A0 00 298 :L1 LDY #00 ; SEARCH PROCESS TABLE FOR OUR CHILDREN
81B7: B9 D1 82 299 :L2 LDA PPIDTAB,Y ; GET CHILD STATUS
81BA: C5 19 300 CMP ACT ; OUR CHILD?
81BC: D0 08 301 BNE :NEXT ; NO
81BE: E8 302 INX ; FOUND AT LEAST ONE CHILD
81BF: B9 D7 82 303 LDA PSTATTAB,Y ; GET PROCESS STATUS
81C2: C9 02 304 CMP #PZOMB ; IS A ZOMBIE?
81C4: F0 10 305 BEQ :COLL ; YES, SO COLLECT STATUS
81C6: C8 306 :NEXT INY
81C7: C0 06 307 CPY #MAXP ; SEARCHED THE ENTIRE PROCESS TABLE?
81C9: D0 EC 308 BNE :L2
81CB: 8A 309 TXA ; CHECK OUR CHILD FLAG
81CC: F0 1D 310 BEQ :NOCHILD ; NO CHILDREN, SO RETURN ERROR
81CE: A0 7F 311 LDY #$7F ; SLEEP TIME
81D0: 20 00 82 312 JSR SLEEP ; GO TO SLEEP
81D3: 4C B5 81 313 JMP :L1 ; LOOK FOR CHILDREN AGAIN
81D6: B9 DD 82 314 :COLL LDA ESTATTAB,Y ; EXIT STATUS OF CHILD PROCESS
81D9: 48 315 PHA
81DA: A9 FF 316 LDA #PFREE ; CLEAR PROCESS SLOT
81DC: 99 D7 82 317 STA PSTATTAB,Y
81DF: 99 D1 82 318 STA PPIDTAB,Y
81E2: 99 DD 82 319 STA ESTATTAB,Y
81E5: CE BE 82 320 DEC STKTAB ; DECREMENT PROCESS COUNT
81E8: 68 321 PLA ; GET EXIT STATUS BACK
81E9: 18 322 CLC ; NO ERROR
81EA: 60 323 RTS
81EB: 68 324 :NOCHILD PLA
81EC: AA 325 TAX
81ED: 38 326 SEC ; ERROR FLAG
81EE: 60 327 RTS
328 *
329 * FORCIBLY WAKE A SLEEPING PROCESS
330 * IF PROCESS IS NOT ASLEEP, NOTHING HAPPENS
331 * Y-REG HOLDS PROCESS ID
332 *
81EF: C0 06 333 WAKEUP CPY #MAXP
81F1: F0 0C 334 BEQ :DONE ; OVER LIMIT
81F3: B9 D7 82 335 LDA PSTATTAB,Y ; GET PROCESS STATUS
81F6: C9 03 336 CMP #PSLEEP ; IS IT SLEEPING?
===== Page 7 =====
81F8: D0 05 337 BNE :DONE ; NO, SO EXIT NOW
81FA: A9 01 338 LDA #PRUN ; RUN STATUS
81FC: 99 D7 82 339 STA PSTATTAB,Y ; SET NEW STATUS
81FF: 60 340 :DONE RTS
341 *
342 * PUT A PROCESS TO SLEEP FOR A TIME
343 * Y-REG HOLDS SLEEPING TIME
344 *
8200: 08 345 SLEEP PHP
8201: 78 346 SEI
8202: 48 347 PHA
8203: 8A 348 TXA
8204: 48 349 PHA
8205: 98 350 TYA
8206: 48 351 PHA
8207: A4 19 352 LDY ACT
8209: BA 353 TSX
820A: E8 354 INX
820B: E8 355 INX
820C: E8 356 INX
820D: BD 00 01 357 LDA $0100,X
8210: 99 CB 82 358 STA SLPTAB,Y ; STORE SLEEP DURATION
8213: A9 03 359 LDA #PSLEEP
8215: 99 D7 82 360 STA PSTATTAB,Y ; SET PROCESS STATUS TO SLEEPING
8218: D0 07 361 BNE YIELD2 ; ALWAYS TAKEN
362 *
363 * GIVE UP REMAINING CPU TIME FOR THIS PROCESS
364 *
821A: 08 365 YIELD PHP
821B: 78 366 SEI
821C: 48 367 PHA
821D: 8A 368 TXA
821E: 48 369 PHA
821F: 98 370 TYA
8220: 48 371 PHA
8221: BA 372 YIELD2 TSX ; FIX JSR RETURN FOR RTI
8222: 8A 373 TXA
8223: 18 374 CLC
8224: 69 05 375 ADC #$05
8226: AA 376 TAX
8227: FE 00 01 377 INC $0100,X
822A: D0 47 378 BNE RESETCTR
822C: E8 379 INX
822D: FE 00 01 380 INC $0100,X
8230: D0 41 381 BNE RESETCTR
382 *
383 * THE MAIN INTERRUPT HANDLER
384 *
8232: A5 45 385 IRQ LDA $45
8234: 48 386 PHA
8235: 8A 387 TXA
8236: 48 388 PHA
8237: 98 389 TYA
8238: 48 390 PHA
8239: 20 3E 81 391 JSR SERVEMOUSE
823C: B0 7A 392 BCS IRQDONE
823E: 20 64 81 393 JSR READMOUSE
===== Page 8 =====
8241: A5 07 394 LDA BASEADDR+1
8243: 29 0F 395 AND #$F
8245: AA 396 TAX
8246: BD 78 04 397 LDA $478,X
8249: 85 1A 398 STA MOUXPOS
824B: BD F8 04 399 LDA $4F8,X
824E: 85 1C 400 STA MOUYPOS
8250: BD 78 05 401 LDA $578,X
8253: 85 1B 402 STA MOUXPOS+1
8255: BD F8 05 403 LDA $5F8,X
8258: 85 1D 404 STA MOUYPOS+1
825A: BD 78 07 405 LDA $778,X
825D: 85 1E 406 STA MOUSTAT
825F: A4 19 407 LDY ACT ; CURRENT PROCESS ID
8261: 30 1B 408 BMI IRQNEXT ; BOOTSTRAP INITIAL PROCESS
8263: AD BE 82 409 LDA STKTAB ; RUNNING PROCESS COUNT
8266: F0 50 410 BEQ IRQDONE ; ONLY 1 PROCESS
8268: A5 09 411 :CTR LDA CTR
826A: D9 C5 82 412 CMP PRIOTAB,Y ; HAS PROCESS REACHED ITS TIME LIMIT?
826D: F0 04 413 BEQ RESETCTR ; YES, SO PREPARE TO SWITCH
826F: E6 09 414 INC CTR
8271: D0 45 415 BNE IRQDONE ; PROCESS NOT SWITCHED
8273: A9 00 416 RESETCTR LDA #$00
8275: 85 09 417 STA CTR
8277: A4 19 418 LDY ACT
8279: BA 419 TSX
827A: 8A 420 TXA
827B: 99 BF 82 421 STA STKTAB+1,Y
827E: C8 422 IRQNEXT INY ; SWITCH TO NEXT PROCESS
827F: C0 06 423 CPY #MAXP
8281: F0 13 424 BEQ :L2 ; GO BACK TO START OF PROCESS TABLE
8283: B9 D7 82 425 :L1 LDA PSTATTAB,Y ; GET PRCESS STATUS
8286: C9 01 426 CMP #PRUN ; IS THIS A RUNNABLE PROCESS?
8288: F0 22 427 BEQ :CTXSW ; YES, SO SWITCH IT IN
828A: C9 FF 428 CMP #PFREE ; IS THIS PROCESS SLOT ACTIVE?
828C: F0 F0 429 BEQ IRQNEXT ; YES, SO SKIP IT
828E: C9 03 430 CMP #PSLEEP ; IS PROCESS ASLEEP?
8290: F0 08 431 BEQ :SLEEP ; YES, SO DECREMENT ITS SLEEP TIMER
8292: C9 02 432 CMP #PZOMB ; IS THIS PROCESS A ZOMBIE?
8294: F0 E8 433 BEQ IRQNEXT ; YES, SO SKIP IT
8296: A0 00 434 :L2 LDY #$00 ; LOOP BACK TO PROCESS 0
8298: F0 E9 435 BEQ :L1 ; ALWAYS TAKEN
829A: B9 CB 82 436 :SLEEP LDA SLPTAB,Y
829D: F0 0D 437 BEQ :CTXSW ; PROCESS IS NOT ASLEEP
829F: AA 438 TAX
82A0: CA 439 DEX
82A1: 8A 440 TXA
82A2: 99 CB 82 441 STA SLPTAB,Y
82A5: D0 D7 442 BNE IRQNEXT ; PROCESS STILL HAS SLEEP TIME
82A7: A9 01 443 LDA #PRUN ; PROCESS IS NOW RUNNABLE
82A9: 99 D7 82 444 STA PSTATTAB,Y ; SET THIS NEW STATUS
82AC: BE BF 82 445 :CTXSW LDX STKTAB+1,Y
82AF: 9A 446 TXS ; RESTORE THE PROCESS STACK POINTER
===== Page 9 =====
82B0: 84 19 447 STY ACT ; ACTIVE PROCESS ID
82B2: AD 30 C0 448 LDA SPKR
82B5: AD 30 C0 449 LDA SPKR
82B8: 68 450 IRQDONE PLA
82B9: A8 451 TAY
82BA: 68 452 PLA
82BB: AA 453 TAX
82BC: 68 454 PLA
82BD: 40 455 RTI
456 *
82BE: 00 00 00 457 STKTAB DS MAXP+1
82C1: 00 00 00 00
82C5: 00 00 00 458 PRIOTAB DS MAXP ; PROCESS PRIORITIES TABLE
82C8: 00 00 00
82CB: 00 00 00 459 SLPTAB DS MAXP ; SLEEPING PROCESSES TABLE
82CE: 00 00 00
82D1: 00 00 00 460 PPIDTAB DS MAXP ; PARENT PROCESS ID TABLE
82D4: 00 00 00
82D7: 00 00 00 461 PSTATTAB DS MAXP ; PROCESS STATUS TABLE
82DA: 00 00 00
82DD: 00 00 00 462 ESTATTAB DS MAXP ; PROCESS EXIT STATUS TABLE
82E0: 00 00 00
463 *
82E3: 2C 10 C0 464 PROC4 BIT KBDSTRB
82E6: A0 00 465 LDY #$00
82E8: A2 00 466 LDX #$00
82EA: 8A 467 :L1 TXA
82EB: 08 468 PHP
82EC: 78 469 SEI
82ED: 20 71 F8 470 JSR SCRN
82F0: 28 471 PLP
82F1: 48 472 PHA
82F2: 68 473 PLA
82F3: C9 0F 474 CMP #WHITE
82F5: D0 0C 475 BNE :L2
82F7: A9 00 476 LDA #BLACK
82F9: 08 477 PHP
82FA: 78 478 SEI
82FB: 20 64 F8 479 JSR SETCOL
82FE: 8A 480 TXA ; VERTICAL POSITION IN A-REG
82FF: 20 00 F8 481 JSR PLOT
8302: 28 482 PLP
8303: C8 483 :L2 INY
8304: C0 28 484 CPY #$28
8306: D0 E2 485 BNE :L1
8308: A0 00 486 LDY #$00
830A: E8 487 INX
830B: E0 28 488 CPX #$28
830D: D0 DB 489 BNE :L1
830F: A0 00 490 LDY #$00
8311: B9 26 83 491 :MSGL LDA CLRMSG,Y
8314: F0 0B 492 BEQ :MSGDONE
8316: 09 80 493 ORA #$80
8318: 08 494 PHP
8319: 78 495 SEI
831A: 20 ED FD 496 JSR COUT
831D: 28 497 PLP
===== Page 10 =====
831E: C8 498 INY
831F: D0 F0 499 BNE :MSGL
8321: A9 01 500 :MSGDONE LDA #$01 ; EXIT CODE
8323: 20 75 81 501 JSR EXIT ; TERMINATE THIS PROCESS
8326: 43 4C 45 502 CLRMSG ASC B4CLEARB4
8329: 41 52
832B: 8D 00 503 HEX 8D00
832D: A5 1E 504 PROC3 LDA MOUSTAT
832F: 10 17 505 BPL :NEXT
8331: A5 1A 506 LDA MOUXPOS
8333: 08 507 PHP
8334: 78 508 SEI
8335: 20 DA FD 509 JSR PRBYTE
8338: A9 A0 510 LDA #$A0
833A: 20 ED FD 511 JSR COUT
833D: A5 1C 512 LDA MOUYPOS
833F: 20 DA FD 513 JSR PRBYTE
8342: A9 8D 514 LDA #$8D
8344: 20 ED FD 515 JSR COUT
8347: 28 516 PLP
8348: 20 1A 82 517 :NEXT JSR YIELD
834B: 4C 2D 83 518 JMP PROC3
519 *
834E: A2 27 520 PROC2 LDX #$27
8350: A0 27 521 LDY #$27
8352: A9 03 522 LDA #$03
8354: 20 00 82 523 JSR SLEEP
8357: 08 524 :L1 PHP
8358: 78 525 SEI
8359: A9 02 526 LDA #BLUE
835B: 20 64 F8 527 JSR SETCOL
835E: 8A 528 TXA
835F: 20 00 F8 529 JSR PLOT
8362: 28 530 PLP
8363: 20 1A 82 531 JSR YIELD
8366: 88 532 DEY
8367: 10 EE 533 BPL :L1
8369: A0 27 534 LDY #$27
836B: CA 535 DEX
836C: 10 E9 536 BPL :L1
836E: A2 27 537 LDX #$27
8370: D0 E5 538 BNE :L1
539 *
8372: A0 00 540 PROC1 LDY #$00
8374: A2 00 541 LDX #$00
8376: 08 542 :L1 PHP
8377: 78 543 SEI
8378: A9 01 544 LDA #RED
837A: 20 64 F8 545 JSR SETCOL
837D: 8A 546 TXA
837E: 20 00 F8 547 JSR PLOT
8381: 28 548 PLP
8382: 20 1A 82 549 JSR YIELD
8385: C8 550 INY
8386: C0 28 551 CPY #$28
8388: D0 EC 552 BNE :L1
838A: A0 00 553 LDY #$00
===== Page 11 =====
838C: A9 07 554 LDA #$07
838E: 20 00 82 555 JSR SLEEP
8391: E8 556 INX
8392: E0 28 557 CPX #$28
8394: D0 E0 558 BNE :L1
8396: A2 00 559 LDX #$00
8398: F0 DC 560 BEQ :L1
839A: 4C 72 83 561 JMP PROC1
562 *
839D: 08 563 PROC0 PHP
839E: 78 564 SEI
839F: A9 00 565 LDA #$00
83A1: A2 27 566 LDX #$27 ; MAX X CLAMP
83A3: 8D 78 04 567 STA $478
83A6: 8E F8 04 568 STX $4F8
83A9: 8D 78 05 569 STA $578
83AC: 8D F8 05 570 STA $5F8
83AF: 20 4A 81 571 JSR CLAMPMOUSE
83B2: A0 00 572 LDY #$00
83B4: A9 01 573 LDA #$01
83B6: A2 27 574 LDX #$27
83B8: 8C 78 04 575 STY $478
83BB: 8E F8 04 576 STX $4F8
83BE: 8C 78 05 577 STY $578
83C1: 8C F8 05 578 STY $5F8
83C4: 20 4A 81 579 JSR CLAMPMOUSE
83C7: 20 58 81 580 JSR HOMEMOUSE
83CA: 28 581 PLP
83CB: AD 53 C0 582 LDA MIX
83CE: AD 50 C0 583 LDA GR
83D1: 08 584 PHP
83D2: 78 585 SEI
83D3: 20 36 F8 586 JSR CLRTOP
83D6: 28 587 PLP
83D7: A0 0B 588 LDY #$0B ; PROCESS PRIORITY
83D9: A9 72 589 LDA #<PROC1
83DB: A2 83 590 LDX #>PROC1
83DD: 20 A3 80 591 JSR NEWPROC
83E0: A0 06 592 LDY #$06
83E2: A9 4E 593 LDA #<PROC2
83E4: A2 83 594 LDX #>PROC2
83E6: 20 A3 80 595 JSR NEWPROC
83E9: A0 0B 596 LDY #$0B
83EB: A9 2D 597 LDA #<PROC3
83ED: A2 83 598 LDX #>PROC3
83EF: 20 A3 80 599 JSR NEWPROC
83F2: 2C 00 C0 600 :NEXT BIT KBD
83F5: 30 16 601 BMI :CLRIT
83F7: 08 602 PHP
83F8: 78 603 SEI
83F9: A5 1E 604 LDA MOUSTAT ; CHECK BUTTON STATUS
83FB: 10 0C 605 BPL :PULL
83FD: A9 0F 606 LDA #WHITE
83FF: 20 64 F8 607 JSR SETCOL
8402: A5 1C 608 LDA MOUYPOS
8404: A4 1A 609 LDY MOUXPOS
8406: 20 00 F8 610 JSR PLOT
===== Page 12 =====
8409: 28 611 :PULL PLP
840A: 4C F2 83 612 JMP :NEXT
840D: A0 04 613 :CLRIT LDY #$04 ; PROCESS PRIORITY
840F: A9 E3 614 LDA #<PROC4
8411: A2 82 615 LDX #>PROC4
8413: 20 A3 80 616 JSR NEWPROC ; SPAWN THE CHILD PROCESS
8416: 20 B3 81 617 JSR WAIT ; AND WAIT FOR IT TO COMPLETE
8419: 08 618 PHP
841A: 78 619 SEI
841B: AA 620 TAX ; MOVE TERM STATUS TO X-REG
841C: 98 621 TYA ; MOVE PROC ID TO A-REG
841D: 20 41 F9 622 JSR PRNTAX
8420: A9 8D 623 LDA #$8D
8422: 20 ED FD 624 JSR COUT
8425: 28 625 PLP
8426: 4C F2 83 626 JMP :NEXT
--End assembly, 1065 bytes, Errors: 0
Symbol table - alphabetical order:
ACT =$19 BASEADDR=$06 BLACK =$00 BLUE =$02
CLAMPMOUSE=$814A CLRMSG =$8326 CLRTOP =$F836 COUT =$FDED
CTR =$09 DOSWARM =$03D0 ESTATTAB=$82DD EXIT =$8175
? FINDMOUSE=$8011 GR =$C050 HOMEMOUSE=$8158 INITMOUSE=$8124
IRQ =$8232 IRQDONE =$82B8 IRQLOC =$03FE IRQNEXT =$827E
KBD =$C000 KBDSTRB =$C010 MAXP =$06 MIX =$C053
MOUID1 =$38 MOUID2 =$18 MOUID3 =$01 MOUID4 =$20
MOUID5 =$D6 MOUIDLOC1=$05 MOUIDLOC2=$07 MOUIDLOC3=$0B
MOUIDLOC4=$0C MOUIDLOC5=$FB MOUSEJMP=$816E MOUSLOT =$08
MOUSTAT =$1E MOUXPOS =$1A MOUYPOS =$1C NEWPROC =$80A3
NEWPROCTMP=$0A NOMOUMSG=$8070 PFREE =$FF PLOT =$F800
PPIDTAB =$82D1 PRBYTE =$FDDA PRIOTAB =$82C5 PRNTAX =$F941
PROC0 =$839D PROC1 =$8372 PROC2 =$834E PROC3 =$832D
PROC4 =$82E3 PRUN =$01 PSLEEP =$03 PSTATTAB=$82D7
PZOMB =$02 READMOUSE=$8164 RED =$01 RESETCTR=$8273
SCRN =$F871 SERVEMOUSE=$813E SETCOL =$F864 SETMOUSE=$8130
SLEEP =$8200 SLPTAB =$82CB SPKR =$C030 STKTAB =$82BE
SYSINIT =$807B VBLINT =$09 VBLON =$810C WAIT =$81B3
WAKEUP =$81EF WHITE =$0F YIELD =$821A YIELD2 =$8221
Symbol table - numerical order:
BLACK =$00 MOUID3 =$01 PRUN =$01 RED =$01
PZOMB =$02 BLUE =$02 PSLEEP =$03 MOUIDLOC1=$05
BASEADDR=$06 MAXP =$06 MOUIDLOC2=$07 MOUSLOT =$08
VBLINT =$09 CTR =$09 NEWPROCTMP=$0A MOUIDLOC3=$0B
MOUIDLOC4=$0C WHITE =$0F MOUID2 =$18 ACT =$19
MOUXPOS =$1A MOUYPOS =$1C MOUSTAT =$1E MOUID4 =$20
MOUID1 =$38 MOUID5 =$D6 MOUIDLOC5=$FB PFREE =$FF
DOSWARM =$03D0 IRQLOC =$03FE ? FINDMOUSE=$8011 NOMOUMSG=$8070
SYSINIT =$807B NEWPROC =$80A3 VBLON =$810C INITMOUSE=$8124
SETMOUSE=$8130 SERVEMOUSE=$813E CLAMPMOUSE=$814A HOMEMOUSE=$81
===== Page 13 =====
58
READMOUSE=$8164 MOUSEJMP=$816E EXIT =$8175 WAIT =$81B3
WAKEUP =$81EF SLEEP =$8200 YIELD =$821A YIELD2 =$8221
IRQ =$8232 RESETCTR=$8273 IRQNEXT =$827E IRQDONE =$82B8
STKTAB =$82BE PRIOTAB =$82C5 SLPTAB =$82CB PPIDTAB =$82D1
PSTATTAB=$82D7 ESTATTAB=$82DD PROC4 =$82E3 CLRMSG =$8326
PROC3 =$832D PROC2 =$834E PROC1 =$8372 PROC0 =$839D
KBD =$C000 KBDSTRB =$C010 SPKR =$C030 GR =$C050
MIX =$C053 PLOT =$F800 CLRTOP =$F836 SETCOL =$F864
SCRN =$F871 PRNTAX =$F941 PRBYTE =$FDDA COUT =$FDED
== END ==
Back to comp.sys.apple2.programmer | Previous | Next — Next in thread | Find similar | Unroll thread
Multitasking Mouse Draw Demo v1.2 D. Finnigan <dog_cow@macgui.com> - 2014-06-10 00:52 +0000
Multitasking Mouse Draw Demo v1.2 Changes D. Finnigan <dog_cow@macgui.com> - 2014-06-10 00:53 +0000
Re: Multitasking Mouse Draw Demo v1.2 Changes D Finnigan <dog_cow@macgui.com> - 2014-06-10 20:07 +0000
csiph-web