Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.sys.apple2.programmer > #1227 > unrolled thread
| Started by | D. Finnigan <dog_cow@macgui.com> |
|---|---|
| First post | 2014-06-10 00:52 +0000 |
| Last post | 2014-06-10 20:07 +0000 |
| Articles | 3 — 2 participants |
Back to article view | Back to comp.sys.apple2.programmer
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
| From | D. Finnigan <dog_cow@macgui.com> |
|---|---|
| Date | 2014-06-10 00:52 +0000 |
| Subject | Multitasking Mouse Draw Demo v1.2 |
| Message-ID | <multitasking-mouse-draw-demo-v1.2-06jun14@macgui.com> |
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 ==
[toc] | [next] | [standalone]
| From | D. Finnigan <dog_cow@macgui.com> |
|---|---|
| Date | 2014-06-10 00:53 +0000 |
| Subject | Multitasking Mouse Draw Demo v1.2 Changes |
| Message-ID | <multitasking-mouse-draw-demo-changes-v1.2-06jun14@macgui.com> |
| In reply to | #1227 |
Changes to system since version 1.1: - Parent Process ID table - Process status table - Process exit status table - CREATEALL renamed SYSINIT - NEWPROC records process creation hierarchy: parent and child - New WAIT system call allows a parent to collect the exit status of a child process - New EXIT system call allows a process to terminate and return status to parent - New WAKEUP system call allows a process to terminate a process's sleep status Changes to processes since version 1.1: - There are now 5 total processes - New process 4 is called as a child process to clear white blocks - Process 0 spawns process 4 and waits for it to terminate - Process 0 prints the process ID and exit status of its child process "The entire world is changing around them, and yet these user-land programs are completely unfazed." Most of the work for version 1.2 was completed around the first few days of March. Then I took a break from it until June.
[toc] | [prev] | [next] | [standalone]
| From | D Finnigan <dog_cow@macgui.com> |
|---|---|
| Date | 2014-06-10 20:07 +0000 |
| Subject | Re: Multitasking Mouse Draw Demo v1.2 Changes |
| Message-ID | <dog_cow-1402430819@macgui.com> |
| In reply to | #1228 |
As with last time, if you want a disk image with the source and binary, just email me. I am aware of some problems with the code. NEWPROC needs to be rewritten to work with EXIT, because now processes can be created and destroyed out of order, thus affecting the 6502 hardware stack. The EXIT syscall could also use some cleanup. I left an LDX in there from a previous incarnation that I had scrapped. But since it runs my demo as it is, I let this stay. There are probably more bugs to be uncovered. These fixes and more to come in the next version. :-) -- ]DF$ Apple II Book: http://macgui.com/newa2guide/ Usenet: http://macgui.com/usenet/ <-- get posts by email! Apple II Web & Blog hosting: http://a2hq.com/
[toc] | [prev] | [standalone]
Back to top | Article view | comp.sys.apple2.programmer
csiph-web