AppleIISd/AppleIISd.lst
2017-10-17 00:06:33 +02:00

1205 lines
44 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

1 ********************************
2 *
3 * Apple][Sd Firmware
4 * Version 0.7
5 *
6 * (c) Florian Reitz, 2017
7 *
8 * X register usually contains SLOT16
9 * Y register is used for counting or SLOT
10 *
11 ********************************
12
16-OCT-17 23:58
14
15 XC ; enable 65C02 code
16 DEBUG = 0
17 DO DEBUG
18 ORG $8000
19 ELSE
20 ORG $C800 ; Expansion ROM
21 FIN
22
23 * Memory defines
24
25 SLOT16 = $2B ; $s0 -> slot * 16
26 WORK = $3C
27 SLOT = $3D ; $0s
28 CMDLO = $40
29 CMDHI = $41
30
31 DCMD = $42 ; Command code
32 BUFFER = $44 ; Buffer address
33 BLOCK = $46 ; Block number
34
35 CURSLOT = $07F8 ; $Cs
36 DATA = $C080
37 CTRL = DATA+1
38 DIV = DATA+2
39 SS = DATA+3
40 R30 = $0478
41 R31 = $04F8
42 R32 = $0578
43 R33 = $05F8
44
45 * Constants
46
47 DUMMY = $FF
48 FRX = $10 ; CTRL register
49 ECE = $04
50 SS0 = $01 ; SS register
51 WP = $20
52 CD = $40
53 INITED = $80
54
55
56 ********************************
57 *
58 * Initialize SD card
59 *
60 * C Clear - No error
61 * Set - Error
62 * A $00 - No error
63 * $27 - I/O error - Init failed
64 * $2F - No card inserted
65 *
66 ********************************
67
C800: D8 68 INIT CLD
C801: A9 03 69 LDA #$03 ; set SPI mode 3
C803: 9D 81 C0 70 STA CTRL,X
C806: BD 83 C0 71 LDA SS,X
C809: 09 01 72 ORA #SS0 ; set CS high
C80B: 9D 83 C0 73 STA SS,X
C80E: A9 07 74 LDA #7
C810: 9D 82 C0 75 STA DIV,X
C813: A0 0A 76 LDY #10
C815: A9 FF 77 LDA #DUMMY
78
C817: 9D 80 C0 79 :LOOP STA DATA,X
C81A: 3C 81 C0 80 :WAIT BIT CTRL,X
C81D: 10 FB 81 BPL :WAIT
C81F: 88 82 DEY
C820: D0 F5 83 BNE :LOOP ; do 10 times
C822: BD 83 C0 84 LDA SS,X
C825: 29 FE 85 AND #$FF!SS0 ; set CS low
C827: 9D 83 C0 86 STA SS,X
87
C82A: A9 C5 88 LDA #<CMD0 ; send CMD0
C82C: 85 40 89 STA CMDLO
C82E: A9 CA 90 LDA #>CMD0
C830: 85 41 91 STA CMDHI
C832: 20 F0 C8 92 JSR CMD
C835: 20 04 C9 93 JSR GETR1 ; get response
C838: C9 01 94 CMP #$01
C83A: D0 39 95 BNE :ERROR1 ; error!
96
C83C: A9 D1 97 LDA #<CMD8 ; send CMD8
C83E: 85 40 98 STA CMDLO
C840: A9 CA 99 LDA #>CMD8
C842: 85 41 100 STA CMDHI
C844: 20 F0 C8 101 JSR CMD
C847: 20 1F C9 102 JSR GETR3
C84A: C9 01 103 CMP #$01
C84C: D0 2A 104 BNE :SDV1 ; may be SD Ver. 1
105
106 * check for $01aa match!
C84E: A9 DD 107 :SDV2 LDA #<CMD55
C850: 85 40 108 STA CMDLO
C852: A9 CA 109 LDA #>CMD55
C854: 85 41 110 STA CMDHI
C856: 20 F0 C8 111 JSR CMD
C859: 20 04 C9 112 JSR GETR1
C85C: A9 E3 113 LDA #<ACMD4140
C85E: 85 40 114 STA CMDLO
C860: A9 CA 115 LDA #>ACMD4140
C862: 85 41 116 STA CMDHI
C864: 20 F0 C8 117 JSR CMD
C867: 20 04 C9 118 JSR GETR1
C86A: C9 01 119 CMP #$01
C86C: F0 E0 120 BEQ :SDV2 ; wait for ready
C86E: C9 00 121 CMP #$00
C870: D0 03 122 BNE :ERROR1 ; error!
123 * send CMD58
124 * SD Ver. 2 initialized!
C872: 4C B2 C8 125 JMP :BLOCKSZ
126
C875: 4C DE C8 127 :ERROR1 JMP :IOERROR ; needed for far jump
128
C878: A9 DD 129 :SDV1 LDA #<CMD55
C87A: 85 40 130 STA CMDLO
C87C: A9 CA 131 LDA #>CMD55
C87E: 85 41 132 STA CMDHI
C880: 20 F0 C8 133 JSR CMD ; ignore response
C883: A9 E9 134 LDA #<ACMD410
C885: 85 40 135 STA CMDLO
C887: A9 CA 136 LDA #>ACMD410
C889: 85 41 137 STA CMDHI
C88B: 20 F0 C8 138 JSR CMD
C88E: 20 04 C9 139 JSR GETR1
C891: C9 01 140 CMP #$01
C893: F0 E3 141 BEQ :SDV1 ; wait for ready
C895: C9 00 142 CMP #$00
C897: D0 03 143 BNE :MMC ; may be MMC card
144 * SD Ver. 1 initialized!
C899: 4C B2 C8 145 JMP :BLOCKSZ
146
C89C: A9 CB 147 :MMC LDA #<CMD1
C89E: 85 40 148 STA CMDLO
C8A0: A9 CA 149 LDA #>CMD1
C8A2: 85 41 150 STA CMDHI
C8A4: 20 F0 C8 151 :LOOP1 JSR CMD
C8A7: 20 04 C9 152 JSR GETR1
C8AA: C9 01 153 CMP #$01
C8AC: F0 F6 154 BEQ :LOOP1 ; wait for ready
C8AE: C9 00 155 CMP #$00
C8B0: D0 2C 156 BNE :IOERROR ; error!
157 * MMC Ver. 3 initialized!
158
C8B2: A9 D7 159 :BLOCKSZ LDA #<CMD16
C8B4: 85 40 160 STA CMDLO
C8B6: A9 CA 161 LDA #>CMD16
C8B8: 85 41 162 STA CMDHI
C8BA: 20 F0 C8 163 JSR CMD
C8BD: 20 04 C9 164 JSR GETR1
C8C0: C9 00 165 CMP #$00
C8C2: D0 1A 166 BNE :IOERROR ; error!
167
C8C4: BD 83 C0 168 :END LDA SS,X
C8C7: 09 80 169 ORA #INITED ; initialized
C8C9: 9D 83 C0 170 STA SS,X
C8CC: BD 81 C0 171 LDA CTRL,X
C8CF: 09 04 172 ORA #ECE ; enable 7MHz
C8D1: 9D 81 C0 173 STA CTRL,X
C8D4: 18 174 CLC ; all ok
C8D5: A0 00 175 LDY #0
C8D7: 90 08 176 BCC :END1
C8D9: 38 177 :CDERROR SEC
C8DA: A0 2F 178 LDY #$2F ; no card error
C8DC: B0 03 179 BCS :END1
C8DE: 38 180 :IOERROR SEC
C8DF: A0 27 181 LDY #$27 ; init error
C8E1: BD 83 C0 182 :END1 LDA SS,X ; set CS high
C8E4: 09 01 183 ORA #SS0
C8E6: 9D 83 C0 184 STA SS,X
C8E9: A9 00 185 LDA #0 ; set div to 2
C8EB: 9D 82 C0 186 STA DIV,X
C8EE: 98 187 TYA ; retval in A
C8EF: 60 188 RTS
189
190
191 ********************************
192 *
193 * Send SD command
194 * Call with command in CMDHI and CMDLO
195 *
196 ********************************
197
C8F0: 5A 198 CMD PHY
C8F1: A0 00 199 LDY #0
C8F3: B1 40 200 :LOOP LDA (CMDLO),Y
C8F5: 9D 80 C0 201 STA DATA,X
C8F8: 3C 81 C0 202 :WAIT BIT CTRL,X ; TC is in N
C8FB: 10 FB 203 BPL :WAIT
C8FD: C8 204 INY
C8FE: C0 06 205 CPY #6
C900: 90 F1 206 BCC :LOOP
C902: 7A 207 PLY
C903: 60 208 RTS
209
210
211 ********************************
212 *
213 * Get R1
214 * R1 is in A
215 *
216 ********************************
217
C904: A9 FF 218 GETR1 LDA #DUMMY
C906: 9D 80 C0 219 STA DATA,X
C909: 3C 81 C0 220 :WAIT BIT CTRL,X
C90C: 10 FB 221 BPL :WAIT
C90E: BD 80 C0 222 LDA DATA,X ; get response
C911: 85 3C 223 STA WORK ; save R1
C913: 29 80 224 AND #$80
C915: D0 ED 225 BNE GETR1 ; wait for MSB=0
C917: A9 FF 226 LDA #DUMMY
C919: 9D 80 C0 227 STA DATA,X ; send another dummy
C91C: A5 3C 228 LDA WORK ; restore R1
C91E: 60 229 RTS
230
231
232 ********************************
233 *
234 * Get R3
235 * R1 is in A
236 * R3 is in scratchpad ram
237 *
238 ********************************
239
C91F: 20 04 C9 240 GETR3 JSR GETR1 ; get R1 first
C922: 48 241 PHA ; save R1
C923: 5A 242 PHY ; save Y
C924: A0 04 243 LDY #04 ; load counter
C926: A9 FF 244 :LOOP LDA #DUMMY ; send dummy
C928: 9D 80 C0 245 STA DATA,X
C92B: 3C 81 C0 246 :WAIT BIT CTRL,X
C92E: 10 FB 247 BPL :WAIT
C930: BD 80 C0 248 LDA DATA,X
C933: 48 249 PHA
C934: 88 250 DEY
C935: D0 EF 251 BNE :LOOP ; do 4 times
C937: A4 3D 252 LDY SLOT
C939: 68 253 PLA
C93A: 99 F8 05 254 STA R33,Y ; save R3
C93D: 68 255 PLA
C93E: 99 78 05 256 STA R32,Y
C941: 68 257 PLA
C942: 99 F8 04 258 STA R31,Y
C945: 68 259 PLA
C946: 99 78 04 260 STA R30,Y
C949: 7A 261 PLY ; restore Y
C94A: A9 FF 262 LDA #DUMMY
C94C: 9D 80 C0 263 STA DATA,X ; send another dummy
C94F: 68 264 PLA ; restore R1
C950: 60 265 RTS
266
267
268 ********************************
269 *
270 * Calculate block address
271 * Unit number is in $43 DSSS0000
272 * Block no is in $46-47
273 * Address is in R30-R33
274 *
275 ********************************
276
C951: DA 277 GETBLOCK PHX ; save X
C952: 5A 278 PHY ; save Y
C953: A6 3D 279 LDX SLOT
C955: A5 46 280 LDA BLOCK ; store block num
C957: 9D F8 05 281 STA R33,X ; in R30-R33
C95A: A5 47 282 LDA BLOCK+1
C95C: 9D 78 05 283 STA R32,X
C95F: A9 00 284 LDA #0
C961: 9D F8 04 285 STA R31,X
C964: 9D 78 04 286 STA R30,X
287
C967: A9 80 288 LDA #$80 ; drive number
C969: 24 43 289 BIT $43
C96B: F0 05 290 BEQ :SHIFT ; D1
C96D: A9 01 291 LDA #1 ; D2
C96F: 9D F8 04 292 STA R31,X
293
C972: A0 09 294 :SHIFT LDY #9 ; ASL can't be used with Y
C974: 1E F8 05 295 :LOOP ASL R33,X ; mul block num
C977: 3E 78 05 296 ROL R32,X ; by 512 to get
C97A: 3E F8 04 297 ROL R31,X ; real address
C97D: 3E 78 04 298 ROL R30,X
C980: 88 299 DEY
C981: D0 F1 300 BNE :LOOP
C983: 7A 301 PLY ; restore Y
C984: FA 302 PLX ; restore X
C985: 60 303 RTS
304
305
306 ********************************
307 *
308 * Send SD command
309 * Cmd is in A
310 *
311 ********************************
312
C986: 5A 313 COMMAND PHY ; save Y
C987: A4 3D 314 LDY SLOT
C989: 9D 80 C0 315 STA DATA,X ; send command
C98C: B9 78 04 316 LDA R30,Y ; get arg from R30 on
C98F: 9D 80 C0 317 STA DATA,X
C992: B9 F8 04 318 LDA R31,Y
C995: 9D 80 C0 319 STA DATA,X
C998: B9 78 05 320 LDA R32,Y
C99B: 9D 80 C0 321 STA DATA,X
C99E: B9 F8 05 322 LDA R33,Y
C9A1: 9D 80 C0 323 STA DATA,X
C9A4: A9 FF 324 LDA #DUMMY
C9A6: 9D 80 C0 325 STA DATA,X ; dummy crc
C9A9: 20 04 C9 326 JSR GETR1
C9AC: 7A 327 PLY ; restore Y
C9AD: 60 328 RTS
329
330
331 ********************************
332 *
333 * Check for card detect
334 *
335 * C Clear - card in slot
336 * Set - no card in slot
337 *
338 ********************************
339
C9AE: 48 340 CARDDET PHA
C9AF: A9 40 341 LDA #CD ; 0: card in
C9B1: 3C 83 C0 342 BIT SS,X ; 1: card out
C9B4: 18 343 CLC
C9B5: F0 01 344 BEQ :DONE ; card is in
C9B7: 38 345 SEC ; card is out
C9B8: 68 346 :DONE PLA
C9B9: 60 347 RTS
348
349
350 ********************************
351 *
352 * Check for write protect
353 *
354 * C Clear - card not protected
355 * Set - card write protected
356 *
357 ********************************
358
C9BA: 48 359 WRPROT PHA
C9BB: A9 20 360 LDA #WP ; 0: write enabled
C9BD: 3C 83 C0 361 BIT SS,X ; 1: write disabled
C9C0: 18 362 CLC
C9C1: F0 01 363 BEQ :DONE
C9C3: 38 364 SEC
C9C4: 68 365 :DONE PLA
C9C5: 60 366 RTS
367
368
369 ********************************
370 *
371 * Status request
372 * $43 Unit number DSSS000
373 * $44-45 Unused
374 * $46-47 Unused
375 *
376 * C Clear - No error
377 * Set - Error
378 * A $00 - No error
379 * $2B - Card write protected
380 * $2F - No card inserted
381 * X - Blocks avail (low byte)
382 * Y - Blocks avail (high byte)
383 *
384 ********************************
385
C9C6: A9 00 386 STATUS LDA #0 ; no error
C9C8: A2 FF 387 LDX #$FF ; 32 MB partition
C9CA: A0 FF 388 LDY #$FF
389
C9CC: 20 AE C9 390 JSR CARDDET
C9CF: 90 04 391 BCC :WRPROT
C9D1: A9 2F 392 LDA #$2F ; no card inserted
C9D3: 80 07 393 BRA :DONE
394
C9D5: 20 BA C9 395 :WRPROT JSR WRPROT
C9D8: 90 02 396 BCC :DONE
C9DA: A9 2B 397 LDA #$2B ; card write protected
398
C9DC: 60 399 :DONE RTS
400
401
402 ********************************
403 *
404 * Read 512 byte block
405 * $43 Unit number DSSS0000
406 * $44-45 Address (LO/HI) of buffer
407 * $46-47 Block number (LO/HI)
408 *
409 * C Clear - No error
410 * Set - Error
411 * A $00 - No error
412 * $27 - Bad block number
413 * $28 - No card inserted
414 *
415 ********************************
416
C9DD: 20 AE C9 417 READ JSR CARDDET
C9E0: B0 64 418 BCS :ERROR ; no card inserted
419
C9E2: 20 51 C9 420 JSR GETBLOCK ; calc block address
421
C9E5: BD 83 C0 422 LDA SS,X ; enable /CS
C9E8: 29 FE 423 AND #$FF!SS0
C9EA: 9D 83 C0 424 STA SS,X
C9ED: A9 51 425 LDA #$51 ; send CMD17
C9EF: 20 86 C9 426 JSR COMMAND ; send command
427
C9F2: C9 00 428 CMP #0 ; check for error
C9F4: D0 50 429 BNE :ERROR
430
C9F6: A9 FF 431 :GETTOK LDA #DUMMY ; get data token
C9F8: 9D 80 C0 432 STA DATA,X
C9FB: BD 80 C0 433 LDA DATA,X ; get response
C9FE: C9 FE 434 CMP #$FE
CA00: D0 F4 435 BNE :GETTOK ; wait for $FE
436
CA02: A0 02 437 LDY #2 ; read data from card
CA04: BD 81 C0 438 LDA CTRL,X ; enable FRX
CA07: 09 10 439 ORA #FRX
CA09: 9D 81 C0 440 STA CTRL,X
CA0C: A9 FF 441 LDA #DUMMY
CA0E: 9D 80 C0 442 STA DATA,X
CA11: 64 3C 443 :LOOPY STZ WORK
CA13: BD 80 C0 444 :LOOPW LDA DATA,X
CA16: 92 44 445 STA (BUFFER)
CA18: E6 44 446 INC BUFFER
CA1A: D0 02 447 BNE :INW
CA1C: E6 45 448 INC BUFFER+1 ; inc msb on page boundary
CA1E: E6 3C 449 :INW INC WORK
CA20: D0 F1 450 BNE :LOOPW
CA22: 88 451 DEY
CA23: D0 EC 452 BNE :LOOPY
453
CA25: BD 80 C0 454 :CRC LDA DATA,X ; read two bytes crc
CA28: BD 80 C0 455 LDA DATA,X ; and ignore
CA2B: BD 80 C0 456 LDA DATA,X ; read a dummy byte
457
CA2E: BD 81 C0 458 LDA CTRL,X ; disable FRX
CA31: 29 EF 459 AND #$FF!FRX
CA33: 9D 81 C0 460 STA CTRL,X
CA36: 18 461 CLC ; no error
CA37: A9 00 462 LDA #0
463
CA39: 08 464 :DONE PHP
CA3A: 48 465 PHA
CA3B: BD 83 C0 466 LDA SS,X
CA3E: 09 01 467 ORA #SS0
CA40: 9D 83 C0 468 STA SS,X ; disable /CS
CA43: 68 469 PLA
CA44: 28 470 PLP
CA45: 60 471 RTS
472
CA46: 38 473 :ERROR SEC ; an error occured
CA47: A9 27 474 LDA #$27
CA49: 80 EE 475 BRA :DONE
476
477
478 ********************************
479 *
480 * Write 512 byte block
481 * $43 Unit number DSSS0000
482 * $44-45 Address (LO/HI) of buffer
483 * $46-47 Block number (LO/HI)
484 *
485 * C Clear - No error
486 * Set - Error
487 * A $00 - No error
488 * $27 - I/O error or bad block number
489 * $2B - Card write protected
490 *
491 ********************************
492
CA4B: 20 AE C9 493 WRITE JSR CARDDET
CA4E: B0 67 494 BCS :IOERROR ; no card inserted
495
CA50: 20 BA C9 496 JSR WRPROT
CA53: B0 67 497 BCS :WPERROR ; card write protected
498
CA55: 20 51 C9 499 JSR GETBLOCK ; calc block address
500
CA58: BD 83 C0 501 LDA SS,X ; enable /CS
CA5B: 29 FE 502 AND #$FF!SS0
CA5D: 9D 83 C0 503 STA SS,X
CA60: A9 58 504 LDA #$58 ; send CMD24
CA62: 20 86 C9 505 JSR COMMAND ; send command
506
CA65: C9 00 507 CMP #0 ; check for error
CA67: D0 4E 508 BNE :IOERROR
509
CA69: A9 FF 510 LDA #DUMMY
CA6B: 9D 80 C0 511 STA DATA,X ; send dummy
CA6E: A9 FE 512 LDA #$FE
CA70: 9D 80 C0 513 STA DATA,X ; send data token
514
CA73: A0 02 515 LDY #2 ; send data to card
CA75: 64 3C 516 :LOOPY STZ WORK
CA77: B2 44 517 :LOOPW LDA (BUFFER)
CA79: 9D 80 C0 518 STA DATA,X
CA7C: E6 44 519 INC BUFFER
CA7E: D0 02 520 BNE :INW
CA80: E6 45 521 INC BUFFER+1 ; inc msb on page boundary
CA82: E6 3C 522 :INW INC WORK
CA84: D0 F1 523 BNE :LOOPW
CA86: 88 524 DEY
CA87: D0 EC 525 BNE :LOOPY
526
CA89: 9D 80 C0 527 :CRC STA DATA,X ; send 2 dummy crc bytes
CA8C: 9D 80 C0 528 STA DATA,X
529
CA8F: 9D 80 C0 530 STA DATA,X ; get data response
CA92: BD 80 C0 531 LDA DATA,X
CA95: 29 1F 532 AND #$1F
CA97: C9 05 533 CMP #$05
CA99: D0 1C 534 BNE :IOERROR ; check for write error
CA9B: 18 535 CLC ; no error
CA9C: A9 00 536 LDA #0
537
CA9E: 08 538 :DONE PHP
CA9F: 48 539 PHA
CAA0: A9 FF 540 :WAIT LDA #DUMMY
CAA2: 9D 80 C0 541 STA DATA,X ; wait for write cycle
CAA5: BD 80 C0 542 LDA DATA,X ; to complete
CAA8: C9 00 543 CMP #$00
CAAA: F0 F4 544 BEQ :WAIT
545
CAAC: BD 83 C0 546 LDA SS,X ; disable /CS
CAAF: 09 01 547 ORA #SS0
CAB1: 9D 83 C0 548 STA SS,X
CAB4: 68 549 PLA
CAB5: 28 550 PLP
CAB6: 60 551 RTS
552
CAB7: 38 553 :IOERROR SEC ; an error occured
CAB8: A9 27 554 LDA #$27
CABA: 80 E2 555 BRA :DONE
556
CABC: 38 557 :WPERROR SEC
CABD: A9 2B 558 LDA #$2B
CABF: 80 DD 559 BRA :DONE
560
561
562
563 ********************************
564 *
565 * Format
566 * not supported!
567 *
568 ********************************
569
CAC1: 38 570 FORMAT SEC
CAC2: A9 01 571 LDA #$01 ; invalid command
CAC4: 60 572 RTS
573
574
575 ********************************
576 *
577 * Test routine
578 *
579 ********************************
580
581 DO DEBUG
582 TEST
583
584 * get buffer
585 LDA #2 ; get 512 byte buffer
586 JSR $BEF5 ; call GETBUFR
587 BCS :ERROR
588 STA BUFADD+1
589 STA BUFFER+1
590 STZ BUFADD
591 STZ BUFFER
592
593 * fill buffer
594 LDY #0
595 :LOOP TYA
596 STA (BUFFER),Y
597 INY
598 BNE :LOOP
599 INC BUFFER+1
600 :LOOP1 TYA
601 STA (BUFFER),Y
602 INY
603 BNE :LOOP1
604
605 * write to card
606 LDA #2 ; write cmd
607 STA DCMD
608 LDA BUFADD ; buffer address
609 STA BUFFER
610 LDA BUFADD+1
611 STA BUFFER+1
612 STZ BLOCK ; block number
613 STZ BLOCK+1
614 LDX SLOT16
615 JSR DRIVER
616 BCS :ERROR
617
618 * read from card
619 LDA #1 ; read cmd
620 STA DCMD
621 LDA BUFADD ; buffer address
622 STA BUFFER
623 LDA BUFADD+1
624 STA BUFFER+1
625 STZ BLOCK ; block number
626 STZ BLOCK+1
627 LDX SLOT16
628 JSR DRIVER
629 BCS :ERROR
630
631 * check for errors
632 LDA BUFADD ; buffer address
633 STA BUFFER
634 LDA BUFADD+1
635 STA BUFFER+1
636 LDY #0
637 :LOOP2 TYA
638 CMP (BUFFER),Y
639 BNE :ERRCMP ; error in buffer
640 INY
641 BNE :LOOP2
642 INC BUFFER+1
643 :LOOP3 TYA
644 CMP (BUFFER),Y
645 BNE :ERRCMP
646 INY
647 BNE :LOOP3
648
649 * free buffer
650 JSR $BEF8 ; call FREEBUFR
651 CLC
652 LDA #0
653 RTS
654
655 :ERROR BRK
656 :ERRCMP BRK
657
658 BUFADD DW 0
659 FIN
660
661
CAC5: 40 00 00 662 CMD0 HEX 400000
CAC8: 00 00 95 663 HEX 000095
CACB: 41 00 00 664 CMD1 HEX 410000
CACE: 00 00 F9 665 HEX 0000F9
CAD1: 48 00 00 666 CMD8 HEX 480000
CAD4: 01 AA 87 667 HEX 01AA87
CAD7: 50 00 00 668 CMD16 HEX 500000
CADA: 02 00 FF 669 HEX 0200FF
CADD: 77 00 00 670 CMD55 HEX 770000
CAE0: 00 00 65 671 HEX 000065
CAE3: 69 40 00 672 ACMD4140 HEX 694000
CAE6: 00 00 77 673 HEX 000077
CAE9: 69 00 00 674 ACMD410 HEX 690000
CAEC: 00 00 FF 675 HEX 0000FF
676
677
678 ********************************
679 *
680 * This region is mapped to
681 * the $CsXX space. On the ROM
682 * it must appear at address $700
683 *
684 ********************************
685
686 DO DEBUG-1
CAEF: 00 00 00 687 DS \
CAF2: 00 00 00 00
CAF6: 00 00 00 00
CAFA: 00 00 00 00
CAFE: 00 00
CB00: 00 00 00 688 DS $400
CB03: 00 00 00 00
CB07: 00 00 00 00
CB0B: 00 00 00 00
CB0F: 00 00 00 00
CB13: 00 00 00 00
CB17: 00 00 00 00
CB1B: 00 00 00 00
CB1F: 00 00 00 00
CB23: 00 00 00 00
CB27: 00 00 00 00
CB2B: 00 00 00 00
CB2F: 00 00 00 00
CB33: 00 00 00 00
CB37: 00 00 00 00
CB3B: 00 00 00 00
CB3F: 00 00 00 00
CB43: 00 00 00 00
CB47: 00 00 00 00
CB4B: 00 00 00 00
CB4F: 00 00 00 00
CB53: 00 00 00 00
CB57: 00 00 00 00
CB5B: 00 00 00 00
CB5F: 00 00 00 00
CB63: 00 00 00 00
CB67: 00 00 00 00
CB6B: 00 00 00 00
CB6F: 00 00 00 00
CB73: 00 00 00 00
CB77: 00 00 00 00
CB7B: 00 00 00 00
CB7F: 00 00 00 00
CB83: 00 00 00 00
CB87: 00 00 00 00
CB8B: 00 00 00 00
CB8F: 00 00 00 00
CB93: 00 00 00 00
CB97: 00 00 00 00
CB9B: 00 00 00 00
CB9F: 00 00 00 00
CBA3: 00 00 00 00
CBA7: 00 00 00 00
CBAB: 00 00 00 00
CBAF: 00 00 00 00
CBB3: 00 00 00 00
CBB7: 00 00 00 00
CBBB: 00 00 00 00
CBBF: 00 00 00 00
CBC3: 00 00 00 00
CBC7: 00 00 00 00
CBCB: 00 00 00 00
CBCF: 00 00 00 00
CBD3: 00 00 00 00
CBD7: 00 00 00 00
CBDB: 00 00 00 00
CBDF: 00 00 00 00
CBE3: 00 00 00 00
CBE7: 00 00 00 00
CBEB: 00 00 00 00
CBEF: 00 00 00 00
CBF3: 00 00 00 00
CBF7: 00 00 00 00
CBFB: 00 00 00 00
CBFF: 00 00 00 00
CC03: 00 00 00 00
CC07: 00 00 00 00
CC0B: 00 00 00 00
CC0F: 00 00 00 00
CC13: 00 00 00 00
CC17: 00 00 00 00
CC1B: 00 00 00 00
CC1F: 00 00 00 00
CC23: 00 00 00 00
CC27: 00 00 00 00
CC2B: 00 00 00 00
CC2F: 00 00 00 00
CC33: 00 00 00 00
CC37: 00 00 00 00
CC3B: 00 00 00 00
CC3F: 00 00 00 00
CC43: 00 00 00 00
CC47: 00 00 00 00
CC4B: 00 00 00 00
CC4F: 00 00 00 00
CC53: 00 00 00 00
CC57: 00 00 00 00
CC5B: 00 00 00 00
CC5F: 00 00 00 00
CC63: 00 00 00 00
CC67: 00 00 00 00
CC6B: 00 00 00 00
CC6F: 00 00 00 00
CC73: 00 00 00 00
CC77: 00 00 00 00
CC7B: 00 00 00 00
CC7F: 00 00 00 00
CC83: 00 00 00 00
CC87: 00 00 00 00
CC8B: 00 00 00 00
CC8F: 00 00 00 00
CC93: 00 00 00 00
CC97: 00 00 00 00
CC9B: 00 00 00 00
CC9F: 00 00 00 00
CCA3: 00 00 00 00
CCA7: 00 00 00 00
CCAB: 00 00 00 00
CCAF: 00 00 00 00
CCB3: 00 00 00 00
CCB7: 00 00 00 00
CCBB: 00 00 00 00
CCBF: 00 00 00 00
CCC3: 00 00 00 00
CCC7: 00 00 00 00
CCCB: 00 00 00 00
CCCF: 00 00 00 00
CCD3: 00 00 00 00
CCD7: 00 00 00 00
CCDB: 00 00 00 00
CCDF: 00 00 00 00
CCE3: 00 00 00 00
CCE7: 00 00 00 00
CCEB: 00 00 00 00
CCEF: 00 00 00 00
CCF3: 00 00 00 00
CCF7: 00 00 00 00
CCFB: 00 00 00 00
CCFF: 00 00 00 00
CD03: 00 00 00 00
CD07: 00 00 00 00
CD0B: 00 00 00 00
CD0F: 00 00 00 00
CD13: 00 00 00 00
CD17: 00 00 00 00
CD1B: 00 00 00 00
CD1F: 00 00 00 00
CD23: 00 00 00 00
CD27: 00 00 00 00
CD2B: 00 00 00 00
CD2F: 00 00 00 00
CD33: 00 00 00 00
CD37: 00 00 00 00
CD3B: 00 00 00 00
CD3F: 00 00 00 00
CD43: 00 00 00 00
CD47: 00 00 00 00
CD4B: 00 00 00 00
CD4F: 00 00 00 00
CD53: 00 00 00 00
CD57: 00 00 00 00
CD5B: 00 00 00 00
CD5F: 00 00 00 00
CD63: 00 00 00 00
CD67: 00 00 00 00
CD6B: 00 00 00 00
CD6F: 00 00 00 00
CD73: 00 00 00 00
CD77: 00 00 00 00
CD7B: 00 00 00 00
CD7F: 00 00 00 00
CD83: 00 00 00 00
CD87: 00 00 00 00
CD8B: 00 00 00 00
CD8F: 00 00 00 00
CD93: 00 00 00 00
CD97: 00 00 00 00
CD9B: 00 00 00 00
CD9F: 00 00 00 00
CDA3: 00 00 00 00
CDA7: 00 00 00 00
CDAB: 00 00 00 00
CDAF: 00 00 00 00
CDB3: 00 00 00 00
CDB7: 00 00 00 00
CDBB: 00 00 00 00
CDBF: 00 00 00 00
CDC3: 00 00 00 00
CDC7: 00 00 00 00
CDCB: 00 00 00 00
CDCF: 00 00 00 00
CDD3: 00 00 00 00
CDD7: 00 00 00 00
CDDB: 00 00 00 00
CDDF: 00 00 00 00
CDE3: 00 00 00 00
CDE7: 00 00 00 00
CDEB: 00 00 00 00
CDEF: 00 00 00 00
CDF3: 00 00 00 00
CDF7: 00 00 00 00
CDFB: 00 00 00 00
CDFF: 00 00 00 00
CE03: 00 00 00 00
CE07: 00 00 00 00
CE0B: 00 00 00 00
CE0F: 00 00 00 00
CE13: 00 00 00 00
CE17: 00 00 00 00
CE1B: 00 00 00 00
CE1F: 00 00 00 00
CE23: 00 00 00 00
CE27: 00 00 00 00
CE2B: 00 00 00 00
CE2F: 00 00 00 00
CE33: 00 00 00 00
CE37: 00 00 00 00
CE3B: 00 00 00 00
CE3F: 00 00 00 00
CE43: 00 00 00 00
CE47: 00 00 00 00
CE4B: 00 00 00 00
CE4F: 00 00 00 00
CE53: 00 00 00 00
CE57: 00 00 00 00
CE5B: 00 00 00 00
CE5F: 00 00 00 00
CE63: 00 00 00 00
CE67: 00 00 00 00
CE6B: 00 00 00 00
CE6F: 00 00 00 00
CE73: 00 00 00 00
CE77: 00 00 00 00
CE7B: 00 00 00 00
CE7F: 00 00 00 00
CE83: 00 00 00 00
CE87: 00 00 00 00
CE8B: 00 00 00 00
CE8F: 00 00 00 00
CE93: 00 00 00 00
CE97: 00 00 00 00
CE9B: 00 00 00 00
CE9F: 00 00 00 00
CEA3: 00 00 00 00
CEA7: 00 00 00 00
CEAB: 00 00 00 00
CEAF: 00 00 00 00
CEB3: 00 00 00 00
CEB7: 00 00 00 00
CEBB: 00 00 00 00
CEBF: 00 00 00 00
CEC3: 00 00 00 00
CEC7: 00 00 00 00
CECB: 00 00 00 00
CECF: 00 00 00 00
CED3: 00 00 00 00
CED7: 00 00 00 00
CEDB: 00 00 00 00
CEDF: 00 00 00 00
CEE3: 00 00 00 00
CEE7: 00 00 00 00
CEEB: 00 00 00 00
CEEF: 00 00 00 00
CEF3: 00 00 00 00
CEF7: 00 00 00 00
CEFB: 00 00 00 00
CEFF: 00
689 ERR *-1/$CF00 ; must be at $CF00
690 FIN
691
692 * signature bytes
693
CF00: A2 20 694 START LDX #$20
CF02: A0 00 695 LDY #$00
CF04: A2 03 696 LDX #$03
CF06: A0 FF 697 LDY #$FF ; neither 5.25 nor Smartport
698
699 * find slot nr
700
701 DO DEBUG
702 LDA #$04
703 STA SLOT
704 LDA #$C4
705 STA CURSLOT
706 LDA #$40
707
708 ELSE
CF08: 20 58 FF 709 JSR $FF58
CF0B: BA 710 TSX
CF0C: BD 00 01 711 LDA $0100,X
CF0F: 8D F8 07 712 STA CURSLOT ; $Cs
CF12: 29 0F 713 AND #$0F
CF14: 85 3D 714 STA SLOT ; $0s
CF16: 0A 715 ASL A
CF17: 0A 716 ASL A
CF18: 0A 717 ASL A
CF19: 0A 718 ASL A
719 FIN
720
CF1A: 85 2B 721 STA SLOT16 ; $s0
CF1C: AA 722 TAX ; X holds now SLOT16
CF1D: 2C FF CF 723 BIT $CFFF
CF20: 20 AE C9 724 JSR CARDDET
CF23: 90 03 725 BCC :INIT
CF25: A9 27 726 LDA #$27 ; no card inserted
CF27: 00 727 BRK
728
CF28: 20 00 C8 729 :INIT JSR INIT
730
731
732 ********************************
733 *
734 * Install SD card driver
735 *
736 ********************************
737
738 DO DEBUG
739
740 * see if slot has a driver already
741
742 LDX $BF31 ; get devcnt
743 INSTALL LDA $BF32,X ; get a devnum
744 AND #$70 ; isolate slot
745 CMP SLOT16 ; slot?
746 BEQ :INSOUT ; yes, skip it
747 DEX
748 BPL INSTALL ; keep up the search
749
750 * restore the devnum to the list
751
752 LDX $BF31 ; get devcnt again
753 CPX #$0D ; device table full?
754 BNE :INST2
755
756 JSR $FF3A ; bell
757 JMP :INSOUT ; do something!
758
759 :INST2 LDA $BF32-1,X ; move all entries down
760 STA $BF32,X ; to make room at front
761 DEX ; for a new entry
762 BNE :INST2
763 LDA #$04 ; ProFile type device
764 ORA SLOT16
765 STA $BF32 ; slot, drive 1 at top of list
766 INC $BF31 ; update devcnt
767
768 * now insert the device driver vector
769
770 LDA SLOT
771 ASL
772 TAX
773 LDA #<DRIVER
774 STA $BF10,X ; write to driver table
775 LDA #>DRIVER
776 STA $BF11,X
777 :INSOUT RTS
778
779
780 ********************************
781 *
782 * Boot from SD card
783 *
784 ********************************
785
786 ELSE
787
CF2B: C9 00 788 BOOT CMP #0 ; check for error
CF2D: F0 01 789 BEQ :BOOT1
CF2F: 00 790 BRK
791
CF30: A9 01 792 :BOOT1 LDA #$01
CF32: 85 42 793 STA DCMD ; load command
CF34: A6 2B 794 LDX SLOT16
CF36: 85 43 795 STA $43 ; slot number
CF38: 64 44 796 STZ BUFFER ; buffer lo
CF3A: A9 08 797 LDA #$08
CF3C: 85 45 798 STA BUFFER+1 ; buffer hi
CF3E: 64 46 799 STZ BLOCK ; block lo
CF40: 64 47 800 STZ BLOCK+1 ; block hi
CF42: 2C FF CF 801 BIT $CFFF
CF45: 20 DD C9 802 JSR READ ; call driver
CF48: 4C 01 08 803 JMP $801 ; goto bootloader
804
805 FIN
806
807
808 ********************************
809 *
810 * Jump table
811 *
812 ********************************
813
CF4B: D8 814 DRIVER CLD
815
816 DO DEBUG
817 LDA #$04
818 STA SLOT
819 LDA #$C4
820 STA CURSLOT
821 LDA #$40
822
823 ELSE
CF4C: 20 58 FF 824 JSR $FF58 ; find slot nr
CF4F: BA 825 TSX
CF50: BD 00 01 826 LDA $0100,X
CF53: 8D F8 07 827 STA CURSLOT ; $Cs
CF56: 29 0F 828 AND #$0F
CF58: 85 3D 829 STA SLOT ; $0s
CF5A: 0A 830 ASL A
CF5B: 0A 831 ASL A
CF5C: 0A 832 ASL A
CF5D: 0A 833 ASL A
834 FIN
835
CF5E: 85 2B 836 STA SLOT16 ; $s0
CF60: AA 837 TAX ; X holds now SLOT16
CF61: 2C FF CF 838 BIT $CFFF
CF64: 20 AE C9 839 JSR CARDDET
CF67: 90 04 840 BCC :INITED
CF69: A9 27 841 LDA #$27 ; no card inserted
CF6B: 80 1B 842 BRA :DONE
843
CF6D: A9 80 844 :INITED LDA #INITED ; check for init
CF6F: 3C 83 C0 845 BIT SS,X
CF72: F0 22 846 BEQ :INIT
847
CF74: A5 42 848 :CMD LDA DCMD ; get command
CF76: C9 00 849 CMP #0
CF78: F0 10 850 BEQ :STATUS
CF7A: C9 01 851 CMP #1
CF7C: F0 0F 852 BEQ :READ
CF7E: C9 02 853 CMP #2
CF80: F0 0E 854 BEQ :WRITE
CF82: C9 03 855 CMP #3
CF84: F0 0D 856 BEQ :FORMAT
857 DO DEBUG
858 CMP #$FF
859 BEQ :TEST
860 FIN
CF86: A9 01 861 LDA #1 ; unknown command
862
CF88: 38 863 :DONE SEC
CF89: 60 864 RTS
865
CF8A: 4C C6 C9 866 :STATUS JMP STATUS
CF8D: 4C DD C9 867 :READ JMP READ
CF90: 4C 4B CA 868 :WRITE JMP WRITE
CF93: 4C C1 CA 869 :FORMAT JMP FORMAT
CF96: 20 00 C8 870 :INIT JSR INIT
CF99: B0 ED 871 BCS :DONE ; init failure
CF9B: 80 D7 872 BRA :CMD
873
874 DO DEBUG
875 :TEST JMP TEST ; do device test
876 FIN
877
878
879 * Signature bytes
880
CF9D: 00 00 00 881 DS \ ; fill with zeroes
CFA0: 00 00 00 00
CFA4: 00 00 00 00
CFA8: 00 00 00 00
CFAC: 00 00 00 00
CFB0: 00 00 00 00
CFB4: 00 00 00 00
CFB8: 00 00 00 00
CFBC: 00 00 00 00
CFC0: 00 00 00 00
CFC4: 00 00 00 00
CFC8: 00 00 00 00
CFCC: 00 00 00 00
CFD0: 00 00 00 00
CFD4: 00 00 00 00
CFD8: 00 00 00 00
CFDC: 00 00 00 00
CFE0: 00 00 00 00
CFE4: 00 00 00 00
CFE8: 00 00 00 00
CFEC: 00 00 00 00
CFF0: 00 00 00 00
CFF4: 00 00 00 00
CFF8: 00 00 00 00
CFFC: 00 00 00 00
882 DS -4 ; locate to $xxFC
CFFC: FF FF 883 DW $FFFF ; 65535 blocks
CFFE: 17 884 DB $17 ; Status bits
CFFF: 4B 885 DB #<DRIVER ; LSB of driver
--End assembly, 2048 bytes, Errors: 0
Symbol table - alphabetical order:
ACMD410 =$CAE9 ACMD4140=$CAE3 BLOCK =$46 ? BOOT =$CF2B
BUFFER =$44 CARDDET =$C9AE CD =$40 CMD =$C8F0
CMD0 =$CAC5 CMD1 =$CACB CMD16 =$CAD7 CMD55 =$CADD
CMD8 =$CAD1 CMDHI =$41 CMDLO =$40 COMMAND =$C986
CTRL =$C081 CURSLOT =$07F8 DATA =$C080 DCMD =$42
DEBUG =$00 DIV =$C082 DRIVER =$CF4B DUMMY =$FF
ECE =$04 FORMAT =$CAC1 FRX =$10 GETBLOCK=$C951
GETR1 =$C904 GETR3 =$C91F INIT =$C800 INITED =$80
R30 =$0478 R31 =$04F8 R32 =$0578 R33 =$05F8
READ =$C9DD SLOT =$3D SLOT16 =$2B SS =$C083
SS0 =$01 ? START =$CF00 STATUS =$C9C6 WORK =$3C
WP =$20 WRITE =$CA4B WRPROT =$C9BA
Symbol table - numerical order:
DEBUG =$00 SS0 =$01 ECE =$04 FRX =$10
WP =$20 SLOT16 =$2B WORK =$3C SLOT =$3D
CMDLO =$40 CD =$40 CMDHI =$41 DCMD =$42
BUFFER =$44 BLOCK =$46 INITED =$80 DUMMY =$FF
R30 =$0478 R31 =$04F8 R32 =$0578 R33 =$05F8
CURSLOT =$07F8 DATA =$C080 CTRL =$C081 DIV =$C082
SS =$C083 INIT =$C800 CMD =$C8F0 GETR1 =$C904
GETR3 =$C91F GETBLOCK=$C951 COMMAND =$C986 CARDDET =$C9AE
WRPROT =$C9BA STATUS =$C9C6 READ =$C9DD WRITE =$CA4B
FORMAT =$CAC1 CMD0 =$CAC5 CMD1 =$CACB CMD8 =$CAD1
CMD16 =$CAD7 CMD55 =$CADD ACMD4140=$CAE3 ACMD410 =$CAE9
? START =$CF00 ? BOOT =$CF2B DRIVER =$CF4B