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 Date: Fri, 21 Feb 2014 19:51:38 +0000 (UTC) Organization: bbs-scene usenet news Lines: 298 Message-ID: References: NNTP-Posting-Host: rigel.serv14.eiu.edu X-Trace: technocratmedia-w1.news.bbs-scene.org 1393012298 29999 139.67.14.58 (21 Feb 2014 19:51:38 GMT) X-Complaints-To: abuse@bbs-scene.org NNTP-Posting-Date: Fri, 21 Feb 2014 19:51:38 +0000 (UTC) Xref: csiph.com comp.sys.apple2.programmer:1160 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 SPKR EQU $C030 2 PRBYTE EQU $FDDA 3 DOSWARM EQU $3D0 4 IRQLOC EQU $3FE 5 COUT EQU $FDF0 6 VBLINT EQU $09 7 MOUIDLOC1 EQU $05 8 MOUIDLOC2 EQU $07 9 MOUIDLOC3 EQU $0B 10 MOUIDLOC4 EQU $0C 11 MOUIDLOC5 EQU $FB 12 MOUID1 EQU $38 13 MOUID2 EQU $18 14 MOUID3 EQU $01 15 MOUID4 EQU $20 16 MOUID5 EQU $D6 17 BASEADDR EQU $06 ; 2-BYTES FOR INDEXED ADDRESSING 18 MSLOT EQU $08 19 CTR EQU $09 ; IRQ COUNTER 20 ACT EQU $19 ; ACTIVE PROCESS 21 MAXP EQU $03 22 * 8000: A9 00 23 FINDMOUSE LDA #$00 8002: 85 06 24 STA BASEADDR 8004: A9 C8 25 LDA #$C8 8006: 85 07 26 STA BASEADDR+1 8008: A2 08 27 LDX #$08 800A: CA 28 :LOOP1 DEX 800B: F0 3D 29 BEQ :NOMOUSE 800D: C6 07 30 DEC BASEADDR+1 800F: A0 05 31 LDY #MOUIDLOC1 8011: B1 06 32 LDA (BASEADDR),Y 8013: C9 38 33 CMP #MOUID1 8015: D0 F3 34 BNE :LOOP1 8017: A0 07 35 LDY #MOUIDLOC2 8019: B1 06 36 LDA (BASEADDR),Y 801B: C9 18 37 CMP #MOUID2 801D: D0 EB 38 BNE :LOOP1 801F: A0 0B 39 LDY #MOUIDLOC3 8021: B1 06 40 LDA (BASEADDR),Y 8023: C9 01 41 CMP #MOUID3 8025: D0 E3 42 BNE :LOOP1 8027: A0 0C 43 LDY #MOUIDLOC4 8029: B1 06 44 LDA (BASEADDR),Y 802B: C9 20 45 CMP #MOUID4 802D: D0 DB 46 BNE :LOOP1 802F: A0 FB 47 LDY #MOUIDLOC5 8031: B1 06 48 LDA (BASEADDR),Y 8033: C9 D6 49 CMP #MOUID5 8035: D0 D3 50 BNE :LOOP1 8037: 8A 51 TXA 8038: 0A 52 ASL 8039: 0A 53 ASL 803A: 0A 54 ASL 803B: 0A 55 ASL 803C: 85 08 56 STA MSLOT 803E: 8A 57 TXA 803F: 20 DA FD 58 JSR PRBYTE 8042: A9 8D 59 LDA #$8D ===== Page 2 ===== 8044: 20 F0 FD 60 JSR COUT 8047: 4C 7A 80 61 JMP CREATEALL 804A: A9 CE 62 :NOMOUSE LDA #$CE 804C: 20 F0 FD 63 JSR COUT 804F: A9 CF 64 LDA #$CF 8051: 20 F0 FD 65 JSR COUT 8054: A9 A0 66 LDA #$A0 8056: 20 F0 FD 67 JSR COUT 8059: A9 CD 68 LDA #$CD 805B: 20 F0 FD 69 JSR COUT 805E: A9 CF 70 LDA #$CF 8060: 20 F0 FD 71 JSR COUT 8063: A9 D5 72 LDA #$D5 8065: 20 F0 FD 73 JSR COUT 8068: A9 D3 74 LDA #$D3 806A: 20 F0 FD 75 JSR COUT 806D: A9 C5 76 LDA #$C5 806F: 20 F0 FD 77 JSR COUT 8072: A9 8D 78 LDA #$8D 8074: 20 F0 FD 79 JSR COUT 8077: 4C D0 03 80 JMP DOSWARM 81 * 807A: 58 82 CREATEALL CLI 807B: 08 83 PHP 807C: 78 84 SEI 807D: A9 00 85 LDA #$00 807F: 8D 74 81 86 STA STKTAB 8082: A8 87 TAY 8083: A9 E0 88 LDA #$E0 ; INITIAL SP 8085: 99 75 81 89 STA STKTAB+1,Y 8088: A9 C2 90 LDA #$C2 808A: C8 91 INY 808B: 99 75 81 92 STA STKTAB+1,Y 808E: A9 A4 93 LDA #$A4 8090: C8 94 INY 8091: 99 75 81 95 STA STKTAB+1,Y 8094: A0 00 96 LDY #$00 8096: A9 78 97 LDA #PROC1 809A: 20 BE 80 99 JSR NEWPROC 809D: A0 01 100 LDY #$01 809F: A9 8B 101 LDA #PROC2 80A3: 20 BE 80 103 JSR NEWPROC 80A6: A0 02 104 LDY #$02 80A8: A9 9D 105 LDA #PROC3 80AC: 20 BE 80 107 JSR NEWPROC 80AF: 20 EC 80 108 JSR VBLON 80B2: A9 FF 109 LDA #$FF 80B4: 85 19 110 STA ACT 80B6: A9 13 111 LDA #$13 80B8: 85 09 112 STA CTR 80BA: 28 113 PLP ; ENABLE IRQ 80BB: 4C BB 80 114 :IDLE JMP :IDLE 115 * 80BE: C0 03 116 NEWPROC CPY #MAXP ===== Page 3 ===== 80C0: F0 29 117 BEQ :DONE 80C2: EE 74 81 118 INC STKTAB 80C5: 48 119 PHA 80C6: 8A 120 TXA 80C7: 48 121 PHA 80C8: BE 75 81 122 LDX STKTAB+1,Y 80CB: 68 123 PLA ; HI-BYTE OF START ADDR 80CC: 9D 00 01 124 STA $0100,X 80CF: CA 125 DEX 80D0: 68 126 PLA 80D1: 9D 00 01 127 STA $0100,X 80D4: A9 00 128 LDA #$00 ; INITIAL PROCESSOR STATUS 80D6: CA 129 DEX 80D7: 9D 00 01 130 STA $0100,X 80DA: CA 131 DEX 80DB: 9D 00 01 132 STA $0100,X ; INITIAL REGISTERS 80DE: CA 133 DEX 80DF: 9D 00 01 134 STA $0100,X 80E2: CA 135 DEX 80E3: 9D 00 01 136 STA $0100,X 80E6: CA 137 DEX 80E7: 8A 138 TXA 80E8: 99 75 81 139 STA STKTAB+1,Y 80EB: 60 140 :DONE RTS 141 * 80EC: A9 01 142 VBLON LDA #$01 80EE: 20 10 81 143 JSR SETMOUSE 80F1: 20 04 81 144 JSR INITMOUSE 80F4: A9 3B 145 LDA #IRQ 80FB: 8D FF 03 148 STA IRQLOC+1 80FE: A9 09 149 LDA #VBLINT 8100: 20 10 81 150 JSR SETMOUSE ; TURN ON MOUSE VBL INTERRUPTS 8103: 60 151 RTS 152 * 8104: A0 19 153 INITMOUSE LDY #$19 8106: A9 00 154 LDA #$00 8108: 85 06 155 STA BASEADDR 810A: B1 06 156 LDA (BASEADDR),Y 810C: 85 06 157 STA BASEADDR 810E: D0 24 158 BNE MOUSEJMP 159 * 8110: A0 12 160 SETMOUSE LDY #$12 8112: AA 161 TAX 8113: A9 00 162 LDA #$00 8115: 85 06 163 STA BASEADDR 8117: B1 06 164 LDA (BASEADDR),Y 8119: 85 06 165 STA BASEADDR 811B: 8A 166 TXA 811C: 10 16 167 BPL MOUSEJMP 168 * 811E: A0 13 169 SERVEMOUSE LDY #$13 8120: A9 00 170 LDA #$00 8122: 85 06 171 STA BASEADDR 8124: B1 06 172 LDA (BASEADDR),Y 8126: 85 06 173 STA BASEADDR ===== Page 4 ===== 8128: D0 0A 174 BNE MOUSEJMP 175 * 812A: A0 14 176 READMOUSE LDY #$14 812C: A9 00 177 LDA #$00 812E: 85 06 178 STA BASEADDR 8130: B1 06 179 LDA (BASEADDR),Y 8132: 85 06 180 STA BASEADDR 181 * 8134: A6 07 182 MOUSEJMP LDX BASEADDR+1 8136: A4 08 183 LDY MSLOT 8138: 6C 06 00 184 JMP (BASEADDR) 185 * 813B: 48 186 IRQ PHA 813C: 8A 187 TXA 813D: 48 188 PHA 813E: 98 189 TYA 813F: 48 190 PHA 8140: 20 1E 81 191 JSR SERVEMOUSE 8143: B0 29 192 BCS :DONE 8145: A6 09 193 LDX CTR 8147: E8 194 INX 8148: E0 14 195 CPX #$14 814A: 86 09 196 STX CTR 814C: D0 20 197 BNE :DONE 814E: A9 00 198 LDA #$00 8150: 85 09 199 STA CTR 8152: A4 19 200 LDY ACT 8154: 30 05 201 BMI :NEXT ; BOOTSTRAP INITIAL PROCESS 8156: BA 202 TSX 8157: 8A 203 TXA 8158: 99 75 81 204 STA STKTAB+1,Y 815B: C8 205 :NEXT INY 815C: C0 03 206 CPY #MAXP 815E: D0 02 207 BNE :CTXSW 8160: A0 00 208 LDY #$00 ; LOOP BACK TO PROCESS 0 8162: BE 75 81 209 :CTXSW LDX STKTAB+1,Y 8165: 9A 210 TXS 8166: 84 19 211 STY ACT 8168: AD 30 C0 212 LDA SPKR 816B: AD 30 C0 213 LDA SPKR 816E: 68 214 :DONE PLA 816F: A8 215 TAY 8170: 68 216 PLA 8171: AA 217 TAX 8172: 68 218 PLA 8173: 40 219 RTI 220 * 8174: 00 00 00 221 STKTAB DS MAXP+1 8177: 00 222 * 8178: A2 01 223 PROC1 LDX #$01 817A: E0 01 224 :LOOP CPX #$01 817C: D0 0A 225 BNE :QUIT 817E: A9 AE 226 LDA #$AE 8180: 08 227 PHP 8181: 78 228 SEI 8182: 20 F0 FD 229 JSR COUT ===== Page 5 ===== 8185: 28 230 PLP 8186: D0 F2 231 BNE :LOOP 8188: 4C 88 81 232 :QUIT JMP :QUIT 233 * 818B: A0 00 234 PROC2 LDY #$00 818D: C8 235 :LOOP INY 818E: C0 55 236 CPY #$55 8190: D0 FB 237 BNE :LOOP 8192: A9 C0 238 LDA #$C0 8194: 08 239 PHP 8195: 78 240 SEI 8196: 20 F0 FD 241 JSR COUT 8199: 28 242 PLP 819A: 4C 8B 81 243 JMP PROC2 244 * 819D: 4C A2 81 245 PROC3 JMP :START 81A0: 00 00 246 ]SUM DW $0000 81A2: 18 247 :START CLC 81A3: AD A0 81 248 LDA ]SUM 81A6: 69 01 249 ADC #$01 81A8: 8D A0 81 250 STA ]SUM 81AB: 90 08 251 BCC :NEXT 81AD: AD A1 81 252 LDA ]SUM+1 81B0: 69 00 253 ADC #$00 81B2: 8D A1 81 254 STA ]SUM+1 81B5: 4C A2 81 255 :NEXT JMP :START --End assembly, 440 bytes, Errors: 0 Symbol table - alphabetical order: ACT =$19 BASEADDR=$06 COUT =$FDF0 CREATEALL=$807A CTR =$09 DOSWARM =$03D0 ? FINDMOUSE=$8000 INITMOUSE=$8104 IRQ =$813B IRQLOC =$03FE MAXP =$03 MOUID1 =$38 MOUID2 =$18 MOUID3 =$01 MOUID4 =$20 MOUID5 =$D6 MOUIDLOC1=$05 MOUIDLOC2=$07 MOUIDLOC3=$0B MOUIDLOC4=$0C MOUIDLOC5=$FB MOUSEJMP=$8134 MSLOT =$08 NEWPROC =$80BE PRBYTE =$FDDA PROC1 =$8178 PROC2 =$818B PROC3 =$819D ? READMOUSE=$812A SERVEMOUSE=$811E SETMOUSE=$8110 SPKR =$C030 STKTAB =$8174 VBLINT =$09 VBLON =$80EC V ]SUM =$81A0 Symbol table - numerical order: MOUID3 =$01 MAXP =$03 MOUIDLOC1=$05 BASEADDR=$06 MOUIDLOC2=$07 MSLOT =$08 VBLINT =$09 CTR =$09 MOUIDLOC3=$0B MOUIDLOC4=$0C MOUID2 =$18 ACT =$19 MOUID4 =$20 MOUID1 =$38 MOUID5 =$D6 MOUIDLOC5=$FB DOSWARM =$03D0 IRQLOC =$03FE ? FINDMOUSE=$8000 CREATEALL=$807A NEWPROC =$80BE VBLON =$80EC INITMOUSE=$8104 SETMOUSE=$8110 SERVEMOUSE=$811E ? READMOUSE=$812A MOUSEJMP=$8134 IRQ =$813B STKTAB =$8174 PROC1 =$8178 PROC2 =$818B PROC3 =$819D V ]SUM =$81A0 SPKR =$C030 PRBYTE =$FDDA COUT =$FDF0