Path: csiph.com!v102.xanadu-bbs.net!xanadu-bbs.net!news.glorb.com!xmission!news.bbs-scene.org!not-for-mail From: D Finnigan Newsgroups: comp.sys.apple2.programmer Subject: Source Code for Multitasking Mouse Draw Demo 2 Date: Fri, 21 Feb 2014 19:55:34 +0000 (UTC) Organization: bbs-scene usenet news Lines: 473 Message-ID: References: NNTP-Posting-Host: rigel.serv14.eiu.edu X-Trace: technocratmedia-w1.news.bbs-scene.org 1393012534 30375 139.67.14.58 (21 Feb 2014 19:55:34 GMT) X-Complaints-To: abuse@bbs-scene.org NNTP-Posting-Date: Fri, 21 Feb 2014 19:55:34 +0000 (UTC) Xref: csiph.com comp.sys.apple2.programmer:1161 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 COUT EQU $FDED 9 VBLINT EQU $09 10 MOUIDLOC1 EQU $05 11 MOUIDLOC2 EQU $07 12 MOUIDLOC3 EQU $0B 13 MOUIDLOC4 EQU $0C 14 MOUIDLOC5 EQU $FB 15 MOUID1 EQU $38 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 MSLOT EQU $08 22 CTR EQU $09 ; IRQ COUNTER 23 ACT EQU $19 ; ACTIVE PROCESS 24 MAXP EQU $03 25 MOUXPOS EQU $1A ; 2 BYTES FOR MOUSE X-POSITION 26 MOUYPOS EQU $1C 27 MOUSTAT EQU $1E 28 CLRTOP EQU $F836 29 SETCOL EQU $F864 30 PLOT EQU $F800 31 SCRN EQU $F871 32 GR EQU $C050 33 MIX EQU $C053 34 RED EQU $01 35 BLUE EQU $02 36 BLACK EQU $00 37 WHITE EQU $0F 38 * 8000: A9 9B 39 LDA #$9B 8002: 20 ED FD 40 JSR COUT 8005: A9 91 41 LDA #$91 ; KILL 80-COLS FIRMWARE 8007: 20 ED FD 42 JSR COUT 800A: A9 14 43 LDA #$14 800C: 85 22 44 STA $22 ; TOP OF TEXT WINDOW 800E: 85 25 45 STA $25 46 * 8010: A9 00 47 FINDMOUSE LDA #$00 8012: 85 06 48 STA BASEADDR 8014: A9 C8 49 LDA #$C8 8016: 85 07 50 STA BASEADDR+1 8018: A2 08 51 LDX #$08 801A: CA 52 :LOOP1 DEX 801B: F0 42 53 BEQ :NOMOUSE 801D: C6 07 54 DEC BASEADDR+1 801F: A0 05 55 LDY #MOUIDLOC1 8021: B1 06 56 LDA (BASEADDR),Y 8023: C9 38 57 CMP #MOUID1 8025: D0 F3 58 BNE :LOOP1 8027: A0 07 59 LDY #MOUIDLOC2 ===== Page 2 ===== 8029: B1 06 60 LDA (BASEADDR),Y 802B: C9 18 61 CMP #MOUID2 802D: D0 EB 62 BNE :LOOP1 802F: A0 0B 63 LDY #MOUIDLOC3 8031: B1 06 64 LDA (BASEADDR),Y 8033: C9 01 65 CMP #MOUID3 8035: D0 E3 66 BNE :LOOP1 8037: A0 0C 67 LDY #MOUIDLOC4 8039: B1 06 68 LDA (BASEADDR),Y 803B: C9 20 69 CMP #MOUID4 803D: D0 DB 70 BNE :LOOP1 803F: A0 FB 71 LDY #MOUIDLOC5 8041: B1 06 72 LDA (BASEADDR),Y 8043: C9 D6 73 CMP #MOUID5 8045: D0 D3 74 BNE :LOOP1 8047: 8A 75 TXA 8048: 0A 76 ASL 8049: 0A 77 ASL 804A: 0A 78 ASL 804B: 0A 79 ASL 804C: 85 08 80 STA MSLOT 804E: A9 8D 81 LDA #$8D 8050: 20 ED FD 82 JSR COUT 8053: 8A 83 TXA 8054: 20 DA FD 84 JSR PRBYTE 8057: A9 8D 85 LDA #$8D 8059: 20 ED FD 86 JSR COUT 805C: 4C 7C 80 87 JMP CREATEALL 805F: A0 00 88 :NOMOUSE LDY #$00 8061: B9 71 80 89 :LOOP LDA NOMOUMSG,Y 8064: F0 08 90 BEQ :DONE 8066: 09 80 91 ORA #$80 8068: 20 ED FD 92 JSR COUT 806B: C8 93 INY 806C: D0 F3 94 BNE :LOOP 806E: 4C D0 03 95 :DONE JMP DOSWARM 8071: 8D CE CF 96 NOMOUMSG HEX 8DCECFA0CDCFD5D3C58D00 8074: A0 CD CF D5 D3 C5 8D 00 97 * 807C: 58 98 CREATEALL CLI 807D: 08 99 PHP 807E: 78 100 SEI 807F: A9 00 101 LDA #$00 8081: 8D CB 81 102 STA STKTAB 8084: A8 103 TAY 8085: A9 D0 104 LDA #$D0 ; INITIAL SP 8087: 99 CC 81 105 STA STKTAB+1,Y 808A: A9 B2 106 LDA #$B2 808C: C8 107 INY 808D: 99 CC 81 108 STA STKTAB+1,Y 8090: A9 94 109 LDA #$94 8092: C8 110 INY 8093: 99 CC 81 111 STA STKTAB+1,Y 8096: A0 00 112 LDY #$00 8098: A9 14 113 LDA #PROC0 809C: 20 C0 80 115 JSR NEWPROC ===== Page 3 ===== 809F: A0 01 116 LDY #$01 80A1: A9 EE 117 LDA #PROC1 80A5: 20 C0 80 119 JSR NEWPROC 80A8: A0 02 120 LDY #$02 80AA: A9 CF 121 LDA #PROC2 80AE: 20 C0 80 123 JSR NEWPROC 80B1: 20 EE 80 124 JSR VBLON 80B4: A9 FF 125 LDA #$FF 80B6: 85 19 126 STA ACT 80B8: A9 13 127 LDA #$13 80BA: 85 09 128 STA CTR 80BC: 28 129 PLP ; ENABLE IRQ 80BD: 4C BD 80 130 :IDLE JMP :IDLE 131 * 80C0: C0 03 132 NEWPROC CPY #MAXP 80C2: F0 29 133 BEQ :DONE 80C4: EE CB 81 134 INC STKTAB 80C7: 48 135 PHA 80C8: 8A 136 TXA 80C9: 48 137 PHA 80CA: BE CC 81 138 LDX STKTAB+1,Y 80CD: 68 139 PLA ; HI-BYTE OF START ADDR 80CE: 9D 00 01 140 STA $0100,X 80D1: CA 141 DEX 80D2: 68 142 PLA 80D3: 9D 00 01 143 STA $0100,X 80D6: A9 00 144 LDA #$00 ; INITIAL PROCESSOR STATUS 80D8: CA 145 DEX 80D9: 9D 00 01 146 STA $0100,X 80DC: CA 147 DEX 80DD: 9D 00 01 148 STA $0100,X ; INITIAL REGISTERS 80E0: CA 149 DEX 80E1: 9D 00 01 150 STA $0100,X 80E4: CA 151 DEX 80E5: 9D 00 01 152 STA $0100,X 80E8: CA 153 DEX 80E9: 8A 154 TXA 80EA: 99 CC 81 155 STA STKTAB+1,Y 80ED: 60 156 :DONE RTS 157 * 80EE: A9 01 158 VBLON LDA #$01 80F0: 20 12 81 159 JSR SETMOUSE 80F3: 20 06 81 160 JSR INITMOUSE 80F6: A9 6F 161 LDA #IRQ 80FD: 8D FF 03 164 STA IRQLOC+1 8100: A9 09 165 LDA #VBLINT 8102: 20 12 81 166 JSR SETMOUSE ; TURN ON MOUSE VBL INTERRUPTS 8105: 60 167 RTS 168 * 8106: A0 19 169 INITMOUSE LDY #$19 8108: A9 00 170 LDA #$00 810A: 85 06 171 STA BASEADDR 810C: B1 06 172 LDA (BASEADDR),Y ===== Page 4 ===== 810E: 85 06 173 STA BASEADDR 8110: D0 3E 174 BNE MOUSEJMP 175 * 8112: A0 12 176 SETMOUSE LDY #$12 8114: AA 177 TAX 8115: A9 00 178 LDA #$00 8117: 85 06 179 STA BASEADDR 8119: B1 06 180 LDA (BASEADDR),Y 811B: 85 06 181 STA BASEADDR 811D: 8A 182 TXA 811E: 10 30 183 BPL MOUSEJMP 184 * 8120: A0 13 185 SERVEMOUSE LDY #$13 8122: A9 00 186 LDA #$00 8124: 85 06 187 STA BASEADDR 8126: B1 06 188 LDA (BASEADDR),Y 8128: 85 06 189 STA BASEADDR 812A: D0 24 190 BNE MOUSEJMP 191 * 812C: AA 192 CLAMPMOUSE TAX 812D: A0 17 193 LDY #$17 812F: A9 00 194 LDA #$00 8131: 85 06 195 STA BASEADDR 8133: B1 06 196 LDA (BASEADDR),Y 8135: 85 06 197 STA BASEADDR 8137: 8A 198 TXA 8138: 10 16 199 BPL MOUSEJMP 200 * 813A: A0 18 201 HOMEMOUSE LDY #$18 813C: A9 00 202 LDA #$00 813E: 85 06 203 STA BASEADDR 8140: B1 06 204 LDA (BASEADDR),Y 8142: 85 06 205 STA BASEADDR 8144: D0 0A 206 BNE MOUSEJMP 207 * 8146: A0 14 208 READMOUSE LDY #$14 8148: A9 00 209 LDA #$00 814A: 85 06 210 STA BASEADDR 814C: B1 06 211 LDA (BASEADDR),Y 814E: 85 06 212 STA BASEADDR 213 * 8150: A6 07 214 MOUSEJMP LDX BASEADDR+1 8152: A4 08 215 LDY MSLOT 8154: 6C 06 00 216 JMP (BASEADDR) 217 * 8157: 08 218 YIELD PHP 8158: 78 219 SEI 8159: 48 220 PHA 815A: 8A 221 TXA 815B: 48 222 PHA 815C: 98 223 TYA 815D: 48 224 PHA 815E: BA 225 TSX ; FIX JSR RETURN FOR RTI 815F: 8A 226 TXA 8160: 18 227 CLC 8161: 69 05 228 ADC #$05 8163: AA 229 TAX ===== Page 5 ===== 8164: FE 00 01 230 INC $0100,X 8167: D0 3C 231 BNE RESETCTR 8169: E8 232 INX 816A: FE 00 01 233 INC $0100,X 816D: D0 36 234 BNE RESETCTR 235 236 * 816F: A5 45 237 IRQ LDA $45 8171: 48 238 PHA 8172: 8A 239 TXA 8173: 48 240 PHA 8174: 98 241 TYA 8175: 48 242 PHA 8176: 20 20 81 243 JSR SERVEMOUSE 8179: B0 4A 244 BCS IRQDONE 817B: 20 46 81 245 JSR READMOUSE 817E: A5 07 246 LDA BASEADDR+1 8180: 29 0F 247 AND #$F 8182: AA 248 TAX 8183: BD 78 04 249 LDA $478,X 8186: 85 1A 250 STA MOUXPOS 8188: BD F8 04 251 LDA $4F8,X 818B: 85 1C 252 STA MOUYPOS 818D: BD 78 05 253 LDA $578,X 8190: 85 1B 254 STA MOUXPOS+1 8192: BD F8 05 255 LDA $5F8,X 8195: 85 1D 256 STA MOUYPOS+1 8197: BD 78 07 257 LDA $778,X 819A: 85 1E 258 STA MOUSTAT 819C: A6 09 259 LDX CTR 819E: E8 260 INX 819F: E0 14 261 CPX #$14 81A1: 86 09 262 STX CTR 81A3: D0 20 263 BNE IRQDONE 81A5: A9 00 264 RESETCTR LDA #$00 81A7: 85 09 265 STA CTR 81A9: A4 19 266 LDY ACT 81AB: 30 05 267 BMI :NEXT ; BOOTSTRAP INITIAL PROCESS 81AD: BA 268 TSX 81AE: 8A 269 TXA 81AF: 99 CC 81 270 STA STKTAB+1,Y 81B2: C8 271 :NEXT INY 81B3: C0 03 272 CPY #MAXP 81B5: D0 02 273 BNE :CTXSW 81B7: A0 00 274 LDY #$00 ; LOOP BACK TO PROCESS 0 81B9: BE CC 81 275 :CTXSW LDX STKTAB+1,Y 81BC: 9A 276 TXS 81BD: 84 19 277 STY ACT 81BF: AD 30 C0 278 LDA SPKR 81C2: AD 30 C0 279 LDA SPKR 81C5: 68 280 IRQDONE PLA 81C6: A8 281 TAY 81C7: 68 282 PLA 81C8: AA 283 TAX 81C9: 68 284 PLA 81CA: 40 285 RTI 286 * ===== Page 6 ===== 81CB: 00 00 00 287 STKTAB DS MAXP+1 81CE: 00 288 * 81CF: A2 27 289 PROC2 LDX #$27 81D1: A0 27 290 LDY #$27 81D3: 08 291 :L1 PHP 81D4: 78 292 SEI 81D5: A9 02 293 LDA #BLUE 81D7: 20 64 F8 294 JSR SETCOL 81DA: 8A 295 TXA 81DB: 20 00 F8 296 JSR PLOT 81DE: 28 297 PLP 81DF: 20 57 81 298 JSR YIELD 81E2: 88 299 DEY 81E3: 10 EE 300 BPL :L1 81E5: A0 27 301 LDY #$27 81E7: CA 302 DEX 81E8: 10 E9 303 BPL :L1 81EA: A2 27 304 LDX #$27 81EC: D0 E5 305 BNE :L1 306 * 81EE: A0 00 307 PROC1 LDY #$00 81F0: A2 00 308 LDX #$00 81F2: 08 309 :L1 PHP 81F3: 78 310 SEI 81F4: A9 01 311 LDA #RED 81F6: 20 64 F8 312 JSR SETCOL 81F9: 8A 313 TXA 81FA: 20 00 F8 314 JSR PLOT 81FD: 28 315 PLP 81FE: C8 316 INY 81FF: C0 28 317 CPY #$28 8201: D0 EF 318 BNE :L1 8203: A0 00 319 LDY #$00 8205: 20 57 81 320 JSR YIELD 8208: E8 321 INX 8209: E0 28 322 CPX #$28 820B: D0 E5 323 BNE :L1 820D: A2 00 324 LDX #$00 820F: F0 E1 325 BEQ :L1 8211: 4C EE 81 326 JMP PROC1 327 * 8214: 08 328 PROC0 PHP 8215: 78 329 SEI 8216: A9 00 330 LDA #$00 8218: A2 27 331 LDX #$27 ; MAX X CLAMP 821A: 8D 78 04 332 STA $478 821D: 8E F8 04 333 STX $4F8 8220: 8D 78 05 334 STA $578 8223: 8D F8 05 335 STA $5F8 8226: 20 2C 81 336 JSR CLAMPMOUSE 8229: A0 00 337 LDY #$00 822B: A9 01 338 LDA #$01 822D: A2 27 339 LDX #$27 822F: 8C 78 04 340 STY $478 8232: 8E F8 04 341 STX $4F8 8235: 8C 78 05 342 STY $578 ===== Page 7 ===== 8238: 8C F8 05 343 STY $5F8 823B: 20 2C 81 344 JSR CLAMPMOUSE 823E: 20 3A 81 345 JSR HOMEMOUSE 8241: 28 346 PLP 8242: AD 53 C0 347 LDA MIX 8245: AD 50 C0 348 LDA GR 8248: 08 349 PHP 8249: 78 350 SEI 824A: 20 36 F8 351 JSR CLRTOP 824D: 28 352 PLP 824E: 2C 00 C0 353 :NEXT BIT KBD 8251: 30 16 354 BMI :CLRIT 8253: 08 355 PHP 8254: 78 356 SEI 8255: A5 1E 357 LDA MOUSTAT ; CHECK BUTTON STATUS 8257: 10 0C 358 BPL :PULL 8259: A9 0F 359 LDA #WHITE 825B: 20 64 F8 360 JSR SETCOL 825E: A5 1C 361 LDA MOUYPOS 8260: A4 1A 362 LDY MOUXPOS 8262: 20 00 F8 363 JSR PLOT 8265: 28 364 :PULL PLP 8266: 4C 4E 82 365 JMP :NEXT 8269: 2C 10 C0 366 :CLRIT BIT KBDSTRB 826C: A0 00 367 LDY #$00 826E: A2 00 368 LDX #$00 8270: 8A 369 :L1 TXA 8271: 08 370 PHP 8272: 78 371 SEI 8273: 20 71 F8 372 JSR SCRN 8276: 28 373 PLP 8277: 48 374 PHA 8278: 68 375 PLA 8279: C9 0F 376 CMP #WHITE 827B: D0 0C 377 BNE :L2 827D: A9 00 378 LDA #BLACK 827F: 08 379 PHP 8280: 78 380 SEI 8281: 20 64 F8 381 JSR SETCOL 8284: 8A 382 TXA ; VERTICAL POSITION IN A-REG 8285: 20 00 F8 383 JSR PLOT 8288: 28 384 PLP 8289: C8 385 :L2 INY 828A: C0 28 386 CPY #$28 828C: D0 E2 387 BNE :L1 828E: A0 00 388 LDY #$00 8290: E8 389 INX 8291: E0 28 390 CPX #$28 8293: D0 DB 391 BNE :L1 8295: A0 00 392 LDY #$00 8297: B9 AA 82 393 :MSGL LDA CLRMSG,Y 829A: F0 0B 394 BEQ :MSGDONE 829C: 09 80 395 ORA #$80 829E: 08 396 PHP 829F: 78 397 SEI 82A0: 20 ED FD 398 JSR COUT 82A3: 28 399 PLP ===== Page 8 ===== 82A4: C8 400 INY 82A5: D0 F0 401 BNE :MSGL 82A7: 4C 4E 82 402 :MSGDONE JMP :NEXT 82AA: 43 4C 45 403 CLRMSG ASC B4CLEARB4 82AD: 41 52 82AF: 8D 00 404 HEX 8D00 --End assembly, 689 bytes, Errors: 0 Symbol table - alphabetical order: ACT =$19 BASEADDR=$06 BLACK =$00 BLUE =$02 CLAMPMOUSE=$812C CLRMSG =$82AA CLRTOP =$F836 COUT =$FDED CREATEALL=$807C CTR =$09 DOSWARM =$03D0 ? FINDMOUSE=$8010 GR =$C050 HOMEMOUSE=$813A INITMOUSE=$8106 IRQ =$816F IRQDONE =$81C5 IRQLOC =$03FE KBD =$C000 KBDSTRB =$C010 MAXP =$03 MIX =$C053 MOUID1 =$38 MOUID2 =$18 MOUID3 =$01 MOUID4 =$20 MOUID5 =$D6 MOUIDLOC1=$05 MOUIDLOC2=$07 MOUIDLOC3=$0B MOUIDLOC4=$0C MOUIDLOC5=$FB MOUSEJMP=$8150 MOUSTAT =$1E MOUXPOS =$1A MOUYPOS =$1C MSLOT =$08 NEWPROC =$80C0 NOMOUMSG=$8071 PLOT =$F800 PRBYTE =$FDDA ? PRNTAX =$F941 PROC0 =$8214 PROC1 =$81EE PROC2 =$81CF READMOUSE=$8146 RED =$01 RESETCTR=$81A5 SCRN =$F871 SERVEMOUSE=$8120 SETCOL =$F864 SETMOUSE=$8112 SPKR =$C030 STKTAB =$81CB VBLINT =$09 VBLON =$80EE WHITE =$0F YIELD =$8157 Symbol table - numerical order: BLACK =$00 MOUID3 =$01 RED =$01 BLUE =$02 MAXP =$03 MOUIDLOC1=$05 BASEADDR=$06 MOUIDLOC2=$07 MSLOT =$08 VBLINT =$09 CTR =$09 MOUIDLOC3=$0B MOUIDLOC4=$0C WHITE =$0F MOUID2 =$18 ACT =$19 MOUXPOS =$1A MOUYPOS =$1C MOUSTAT =$1E MOUID4 =$20 MOUID1 =$38 MOUID5 =$D6 MOUIDLOC5=$FB DOSWARM =$03D0 IRQLOC =$03FE ? FINDMOUSE=$8010 NOMOUMSG=$8071 CREATEALL=$807C NEWPROC =$80C0 VBLON =$80EE INITMOUSE=$8106 SETMOUSE=$8112 SERVEMOUSE=$8120 CLAMPMOUSE=$812C HOMEMOUSE=$813A READMOUSE=$8146 MOUSEJMP=$8150 YIELD =$8157 IRQ =$816F RESETCTR=$81A5 IRQDONE =$81C5 STKTAB =$81CB PROC2 =$81CF PROC1 =$81EE PROC0 =$8214 CLRMSG =$82AA KBD =$C000 KBDSTRB =$C010 SPKR =$C030 GR =$C050 MIX =$C053 PLOT =$F800 CLRTOP =$F836 SETCOL =$F864 SCRN =$F871 ? PRNTAX =$F941 PRBYTE =$FDDA COUT =$FDED