; gpac.c000 - fast graphics package for C64, in 6502 Assembler ; author Neil Franklin, last modification unknown (estimated 1985) ; this disassembly/source reconstruction 2000.06.04 ; extracted from C64 with: ; load "gpac.c000",8,1 ; 5 k = 49152 : rem or 49408 (C100) , or 49664 (C200) ; 10 for i = k to k+240 step 16 ; 15 print i ; 20 for j = i to i+15 ; 30 print peek (j) ; 40 next j ; 50 input a$ ; 60 next i ; decimal dump | hex listing | disassembly ; comments *= $C000 ; entry jump table, 49152 = C000, call with SYS xxxxx[,xx,xx] ; these two calls need no parameters, JMP directly to code 49152: 76 12 192 | C000: 4C 0C C0 | JMP $C00C ; graphics mode on 76 31 192 | C003: 4C 19 C0 | JMP $C019 ; graphics mode off ; these two calls need parameters, JMP first to BASIC parameter parsing 76 146 194 | C006: 4C 92 C2 | JMP $C292 ; clear graphics screen 76 184 194 | C009: 4C B8 C4 | JMP $C2B8 ; invert pixel ; graphics mode on 169 187 | C00C: A9 BB | LDA #$BB ; 9->B standard bitmap mode 141 17 49168: 208 | 8D 11 D0 | STA $D011 ; VIC Control Reg I 169 120 | A9 78 | LDA #$78 ; bitmap $E000, Colors $DC00 141 24 208 | 8D 18 D0 | STA $D018 ; VIC base video RAM 173 0 221 | AD 00 DD | LDA $DD00 41 252 | 29 FC | AND #$FC ; CIA2 video RAM in top 16k 141 0 221 | 8D 00 DD | STA $DD00 96 | 60 | RTS ; graphics mode off 169 | C019: 49184: 155 | A9 9B | LDA #$98 ; as set by C64 Kernal ROM 141 17 208 | 8D 11 D0 | STA $D011 ; from table at $ECB9 169 20 | A9 14 | LDA #$14 141 24 208 | 8D 18 D0 | STA $D018 173 0 221 | AD 00 DD | LDA $DD00 9 3 | 09 03 | ORA #$03 141 0 49200: 221 | 8D 00 DD | STA $DD00 96 | 60 | RTS ; clear graphics, reg Y = colour code (foreground*16+background) 169 0 | C032: A9 00 | LDA #0 170 | AA | TAX 157 0 224 | C035: 9D 00 E0 | STA $E000,X ; 32 times store in loop 157 0 225 | 9D 00 E1 | STA $E100,X ; so only 256 loops 157 0 226 | 9D 00 E2 | STA $E200,X 157 0 49216: 227 | 9D 00 E3 | STA $E300,X 157 0 228 | 9D 00 E4 | STA $E400,X 157 0 229 | 9D 00 E5 | STA $E500,X 157 0 230 | 9D 00 E6 | STA $E600,X 157 0 231 | 9D 00 E7 | STA $E700,X 157 0 232 | 9D 00 E8 | STA $E800,X 49232: 157 0 233 | 9D 00 E9 | STA $E900,X 157 0 234 | 9D 00 EA | STA $EA00,X 157 0 235 | 9D 00 EB | STA $EB00,X 157 0 236 | 9D 00 EC | STA $EC00,X 157 0 237 | 9D 00 ED | STA $ED00,X 157 49248: 0 238 | 9D 00 EE | STA $EE00,X 157 0 239 | 9D 00 EF | STA $EF00,X 157 0 240 | 9D 00 F0 | STA $F000,X 157 0 241 | 9D 00 F1 | STA $F100,X 157 0 242 | 9D 00 F2 | STA $F200,X 157 0 49264: 243 | 9D 00 F3 | STA $F300,X 157 0 244 | 9D 00 F4 | STA $F400,X 157 0 245 | 9D 00 F5 | STA $F500,X 157 0 246 | 9D 00 F6 | STA $F600,X 157 0 247 | 9D 00 F7 | STA $F700,X 157 0 248 | 9D 00 F8 | STA $F800,X 49280: 157 0 249 | 9D 00 F9 | STA $F900,X 157 0 250 | 9D 00 FA | STA $FA00,X 157 0 251 | 9D 00 FB | STA $FB00,X 157 0 252 | 9D 00 FC | STA $FC00,X 157 0 253 | 9D 00 FD | STA $FD00,X 157 49296: 0 254 | 9D 00 FE | STA $FE00,X 157 0 255 | 9D 00 FF | STA $FF00,X 232 | E8 | INX 208 157 | B0 9D | BCS $C035 120 | 78 | SEI ; no IO, block interrupts 165 1 | A5 01 | LDA $01 ; switch Dxxx IO -> RAM 41 251 | 29 FB | AND #$FB 133 1 | 85 01 | STA $01 152 | 98 | TYA 49312: 157 0 220 | C0A0: 9D 00 DC | STA $DC00,X ; 4 times store in loop 157 0 221 | 9D 00 DD | STA $DD00,X 157 0 222 | 9D 00 DE | STA $DE00,X 157 0 223 | 9D 00 DF | STA $DF00,X 232 | E8 | INX 208 241 | B0 F1 | BCS $C0A0 165 49328: 1 | A5 01 | LDA $01 ; switch Dxxx RAM -> IO 9 4 | 09 04 | ORA #$04 133 1 | 85 01 | STA $01 88 | 58 | CLI 96 | 60 | RTS ; invert pixel, reg X/A x coord (0/0..0/255+1/0..1/63), reg Y y coord (0..199) 192 200 | C0B7: C0 C8 | CPY #200 176 43 | B0 2B | BCS $C0E6 ; Y > 200, no pixel, exit 224 1 | E0 01 | CPX #1 176 40 | B0 28 | BCS $C0E7 ; X >= 256, do special case 190 49344: 2 193 | BE 02 C1 | LDX $C102,Y ; set video line address 134 20 | 86 14 | STX $14 190 202 193 | BE CA C1 | LDX $C1CA,Y 134 21 | 86 15 | STX $15 170 | C0C9: AA | TAX ; save x for pixel pattern 41 248 | 29 F8 | EOR #$F8 ; x coord byte 168 | A8 | TAY ; x coord for indexing to Y 120 | 78 | SEI ; no ROM, block interrupts 165 1 | A5 01 | LDA $01 ; switch [EF]xxx ROM->RAM 49360: 41 253 | 29 FD | EOR #$FD 133 1 | 85 01 | STA $01 138 | 8A | TXA ; x coord for pixel pattern 41 7 | 29 07 | EOR #$07 ; x coord modulo 8 170 | AA | TAX 189 250 192 | BD FA C0 | LDA $C0FA,X ; get pixel pattern to invert 81 20 | 51 14 | EOR ($14,Y) ; invert the pixel 145 20 | 91 14 | STA ($14,Y) ; and modify video memory 15 49376: 1 | A5 01 | LDA $01 ; switch [EF]xxx RAM->ROM 9 2 | 09 02 | ORA #$02 133 1 | 85 01 | STA $02 88 | 58 | CLI 96 | C0E6: 60 | RTS 208 253 | C0E7: D0 FD | BNE $C0E6 ; X >= 512, no pixel, exit 190 2 193 | BE 02 C1 | LDX $C102,Y ; get video line address 134 20 | 86 14 | STX $14 190 202 49392: 193 | BE CA C1 | LDX $C1CA, Y 232 | E8 | INX ; video address add 256 bytes 134 21 | 86 15 | STX $15 201 64 | C9 40 | CMP #64 144 209 | 90 D1 | BCC $C0C9 ; X < 64 (= 320), do pixel 176 236 | B0 EC | BCS $C0E6 ; no pixel, exit C0FA: ; pixel pattern table 128 | *DB 80 64 32 16 8 | 40 20 10 08 4 | 04 49408: 2 1 02 01 C102: | ; video line addresses, low 0 | *DB 00 1 2 3 4 | 01 02 03 04 5 6 7 64 | 05 06 07 40 65 66 67 68 | 41 42 43 44 69 | 45 49424: 70 71 128 46 47 80 129 130 131 132 | 81 82 83 84 133 134 135 192 | 85 86 87 C0 193 194 195 196 | C1 C2 C3 C4 197 | C5 49440: 198 199 0 C6 C7 00 1 2 3 4 | 01 02 03 04 5 6 7 64 | 05 06 07 40 65 66 67 68 | 41 42 43 44 69 | 45 49456: 70 71 128 46 47 80 129 130 131 132 | 81 82 83 84 133 134 135 192 | 85 86 87 C0 193 194 195 196 | C1 C2 C3 C4 197 | C5 49472: 198 199 0 C6 C7 00 1 2 3 4 | 01 02 03 04 5 6 7 64 | 05 06 07 40 65 66 67 68 | 41 42 43 44 69 | 45 49488: 70 71 128 46 47 80 129 130 131 132 | 81 82 83 84 133 134 135 192 | 85 86 87 C0 193 194 195 196 | C1 C2 C3 C4 197 | C5 49504: 198 199 0 C6 C7 00 1 2 3 4 | 01 02 03 04 5 6 7 64 | 05 06 07 40 65 66 67 68 | 41 42 43 44 69 | 45 49520: 70 71 128 46 47 80 129 130 131 132 | 81 82 83 84 133 134 135 192 | 85 86 87 C0 193 194 195 196 | C1 C2 C3 C4 197 | C5 49536: 198 199 0 C6 C7 00 1 2 3 4 | 01 02 03 04 5 6 7 64 | 05 06 07 40 65 66 67 68 | 41 42 43 44 69 | 45 49552: 70 71 128 46 47 80 129 130 131 132 | 81 82 83 84 133 134 135 192 | 85 86 87 C0 193 194 195 196 | C1 C2 C3 C4 197 | C5 49568: 198 199 0 C6 C7 00 1 2 3 4 | 01 02 03 04 5 6 7 64 | 05 06 07 40 65 66 67 68 | 41 42 43 44 69 | 45 49584: 70 71 128 46 47 80 129 130 131 132 | 81 82 83 84 133 134 135 192 | 85 86 87 C0 193 194 195 196 | C1 C2 C3 C4 197 | C5 49600: 198 199 0 C6 C7 00 1 2 3 4 | 01 02 03 04 5 6 7 | 05 06 07 C1CA: ; video line addresses, high 224 | *DB E0 224 224 224 224 | E0 E0 E0 E0 244 | E0 49612: 224 224 225 E0 E0 E1 225 225 225 225 | E1 E1 E1 E1 225 225 225 226 | E1 E1 E1 E2 226 226 226 226 | E2 E2 E2 E2 226 | E2 49532: 226 226 227 E2 E2 E3 227 227 227 227 | E3 E3 E3 E3 227 227 227 229 | E3 E3 E3 E5 229 229 229 229 | E5 E5 E5 E5 229 | E5 49648: 229 229 230 E5 E5 E6 230 230 230 230 | E6 E6 E6 E6 230 230 230 231 | E6 E6 E6 E7 231 231 231 231 | E7 E7 E7 E7 231 | E7 49664: 231 231 232 E7 E7 E8 232 232 232 232 | E8 E8 E8 E8 232 232 232 234 | E8 E8 E8 EA 234 234 234 234 | EA EA EA EA 234 | EA 49680: 234 234 235 EA EA EB 235 235 235 235 | EB EB EB EB 235 235 235 236 | EB EB EB EC 236 236 236 236 | EC EC EC EC 236 | EC 49696: 236 236 237 EC EC ED 237 237 237 237 | ED ED ED ED 237 237 237 239 | ED ED ED EF 239 239 239 239 | EF EF EF EF 239 | EF 49712: 239 239 240 EF EF F0 240 240 240 240 | F0 F0 F0 F0 240 240 240 241 | F0 F0 F0 F1 241 241 241 241 | F1 F1 F1 F1 241 | F1 49728: 241 241 242 F1 F1 F2 242 242 242 242 | F2 F2 F2 F2 242 242 242 244 | F2 F2 F2 F4 244 244 244 244 | F4 F4 F4 F4 244 | F4 49744: 244 244 245 F4 F4 F5 245 245 245 245 | F5 F5 F5 F5 245 245 245 246 | F5 F5 F5 F6 246 246 246 246 | F6 F6 F6 F6 246 | F6 49760: 246 246 247 F6 F6 F7 247 247 247 247 | F7 F7 F7 F7 247 247 247 249 | F7 F7 F7 F9 249 249 249 249 | F9 F9 F9 F9 249 | F9 49776: 249 249 250 F9 F9 FA 250 250 250 250 | FA FA FA FA 250 250 250 251 | FA FA FA FB 251 251 251 251 | FB FB FB FB 251 | FB 49792: 251 251 252 FB FB FC 252 252 252 252 | FC FC FC FC 252 252 252 254 | FC FC FC FE 254 254 254 254 | FE FE FE FE 254 | FE 49808: 254 254 FE FE ; clear graphics screen, call with SYS xxxxx,ff,bb (ff = fore, bb = back) 32 253 174 | C292: 20 FD AE | JSR $AEFD ; BASIC check for comma 32 138 173 | 20 8A AD | JSR $AD8A ; BASIC get numeric argument 32 191 177 | 20 BF B1 | JSR $B1BF ; BASIC numeric to integer 165 101 | A5 65 | LDA $65 10 | 0A | ASL A 10 | 0A | ASL A 10 | 0A | ASL A 49824: 10 | 0A | ASL A 141 12 3 | 8D 0C 03 | STA $030C 32 253 174 | 20 FD AE | JSR $AEFD ; BASIC 32 138 173 | 20 8A AD | JSR $AD8A 32 191 177 | 20 BF B1 | JSR $B1BF 165 101 | A5 65 | LDA $65 41 49840: 15 | 29 0F | AND #$0F 13 12 3 | 0D 0C 03 | ORA $030C 168 | A8 | TAY 76 50 192 | 4C 32 C0 | JMP $C032 ; and off to actual routine ; invert pixel, call with SYS xxxxx,xx,yy (xx = x coord, yy = y coord) 32 253 174 | C2B8: 20 FD AE | JSR $AEFD ; BASIC 32 138 173 | 20 8A AD | JSR $AD8A 32 191 49856: 177 | 20 BF B1 | JSR $B1BF 165 101 | A5 65 | LDA $65 166 100 | A6 64 | LDX $64 141 12 3 | 8D 0C 03 | STA $030C 142 13 3 | 89 0D 03 | STX $030D 32 253 174 | 20 FD AE | JSR $AEFD ; BASIC 32 138 49872: 173 | 20 8A AD | JSR $AD8A 32 191 177 | 20 BF B1 | JSR $B1BF 173 12 3 | AD 0C 03 | LDA $030C 174 13 3 | DE 0D 0C | LDX $030D 164 100 | A4 64 | LDY $64 208 5 | D0 05 | BNE $C2E3 ; Y >= 256, no pixel, exit 164 101 | A4 65 | LDY $65 49888: 76 183 192 | 4C B7 C0 | JMP $C0B7 ; and off to actual routine 96 | C2E3: 60 | RTS | C3E4: |