AppleIISd/AppleIISd.lst

780 lines
35 KiB
Plaintext
Raw Normal View History

1 ********************************
2 *
3 * Apple][Sd Firmware
4 * Version 0.6
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
27-AUG-17 0:31
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 CURSLOT = $07F8 ; $Cs
32 DATA = $C080
33 CTRL = DATA+1
34 DIV = DATA+2
35 SS = DATA+3
36 R30 = $0478
37 R31 = $04F8
38 R32 = $0578
39 R33 = $05F8
40 INITED = $0678
41
42 * Constants
43
44 SSNONE = $0F
45 SS0 = $0E
46 DUMMY = $FF
47 FRXEN = $17
48 FRXDIS = $07
49
50
51 * signature bytes
52
C800: A2 20 53 LDX #$20
C802: A0 00 54 LDY #$00
C804: A2 03 55 LDX #$03
C806: 86 3C 56 STX WORK
57
58 * find slot nr
59
===== Page 2 =====
60 DO DEBUG
61 LDA #$04
62 STA SLOT
63 LDA #$C4
64 STA CURSLOT
65 LDA #$40
66 STA SLOT16
67 ELSE
C808: 20 58 FF 68 JSR $FF58
C80B: BA 69 TSX
C80C: BD 00 01 70 LDA $0100,X
C80F: 29 0F 71 AND #$0F
C811: 85 3D 72 STA SLOT ; $0s
C813: 09 C0 73 ORA #$C0
C815: 8D F8 07 74 STA CURSLOT ; $Cs
C818: 0A 75 ASL A
C819: 0A 76 ASL A
C81A: 0A 77 ASL A
C81B: 0A 78 ASL A
C81C: 85 2B 79 STA SLOT16 ; $s0
80 FIN
C81E: AA 81 TAX ; X holds now SLOT16
82
C81F: 2C FF CF 83 BIT $CFFF
C822: 20 00 C9 84 JSR INIT
85
86 *
87 * TODO: check for init error
88 *
89
90 ********************************
91 *
92 * Install SD card driver
93 *
94 ********************************
95
96 DO DEBUG
97
98 * see if slot has a driver already
99
100 LDX $BF31 ; get devcnt
101 INSTALL LDA $BF32,X ; get a devnum
102 AND #$70 ; isolate slot
103 CMP SLOT16 ; slot?
104 BEQ :INSOUT ; yes, skip it
105 DEX
106 BPL INSTALL ; keep up the search
107
108 * restore the devnum to the list
109
110 LDX $BF31 ; get devcnt again
111 CPX #$0D ; device table full?
112 BNE :INST2
113
114 JSR $FF3A ; bell
115 JMP :INSOUT ; do something!
116
===== Page 3 =====
117 :INST2 LDA $BF32-1,X ; move all entries down
118 STA $BF32,X ; to make room at front
119 DEX ; for a new entry
120 BNE :INST2
121 LDA #$04 ; ProFile type device
122 ORA SLOT16
123 STA $BF32 ; slot, drive 1 at top of list
124 INC $BF31 ; update devcnt
125
126 * now insert the device driver vector
127
128 LDA SLOT
129 ASL
130 TAX
131 LDA #<DRIVER
132 STA $BF10,X ; write to driver table
133 LDA #>DRIVER
134 STA $BF11,X
135 :INSOUT RTS
136
137
138 ********************************
139 *
140 * Boot from SD card
141 *
142 ********************************
143
144 ELSE
145
C825: A9 01 146 BOOT LDA #$01
C827: 85 42 147 STA $42 ; load command
C829: A5 2B 148 LDA SLOT16
C82B: AA 149 TAX
C82C: 85 43 150 STA $43 ; slot number
C82E: 64 44 151 STZ $44 ; buffer lo
C830: A9 08 152 LDA #$08
C832: 85 45 153 STA $45 ; buffer hi
C834: 64 46 154 STZ $46 ; block lo
C836: 64 47 155 STZ $47 ; block hi
C838: 2C FF CF 156 BIT $CFFF
C83B: 20 9E CA 157 JSR READ ; call driver
C83E: 4C 01 08 158 JMP $801 ; goto bootloader
159
160 FIN
161
162
163 ********************************
164 *
165 * Jump table
166 *
167 ********************************
168
C841: D8 169 DRIVER CLD
170 DO DEBUG
171 LDA #$04
172 STA SLOT
173 LDA #$C4
===== Page 4 =====
174 STA CURSLOT
175 LDA #$40
176 STA SLOT16
177 ELSE
C842: 20 58 FF 178 JSR $FF58 ; find slot nr
C845: BA 179 TSX
C846: BD 00 01 180 LDA $0100,X
C849: 29 0F 181 AND #$0F
C84B: 85 3D 182 STA SLOT ; $0s
C84D: 09 C0 183 ORA #$C0
C84F: 8D F8 07 184 STA CURSLOT ; $Cs
C852: 0A 185 ASL A
C853: 0A 186 ASL A
C854: 0A 187 ASL A
C855: 0A 188 ASL A
C856: 85 2B 189 STA SLOT16 ; $s0
190 FIN
C858: AA 191 TAX ; X holds now SLOT16
192
C859: 2C FF CF 193 BIT $CFFF
C85C: A4 3D 194 LDY SLOT
C85E: B9 78 06 195 LDA INITED,Y ; check for init
C861: C9 01 196 CMP #$01
C863: 90 22 197 BCC :INIT
C865: A5 42 198 :CMD LDA $42 ; get command
C867: C9 00 199 CMP #$00
C869: F0 10 200 BEQ :STATUS
C86B: C9 01 201 CMP #$01
C86D: F0 0F 202 BEQ :READ
C86F: C9 02 203 CMP #$02
C871: F0 0E 204 BEQ :WRITE
C873: C9 03 205 CMP #$03
C875: F0 0D 206 BEQ :FORMAT
C877: 38 207 SEC ; unknown command
C878: A9 01 208 LDA #$01
C87A: 60 209 RTS
210
C87B: 4C 96 CA 211 :STATUS JMP STATUS
C87E: 4C 9E CA 212 :READ JMP READ
C881: 4C F7 CA 213 :WRITE JMP WRITE
C884: 4C 64 CB 214 :FORMAT JMP FORMAT
C887: 20 00 C9 215 :INIT JSR INIT
C88A: 80 D9 216 BRA :CMD
217
218
219 * Signature bytes
220
C88C: 00 00 00 221 DS \ ; fill with zeroes
C88F: 00 00 00 00
C893: 00 00 00 00
C897: 00 00 00 00
C89B: 00 00 00 00
C89F: 00 00 00 00
C8A3: 00 00 00 00
C8A7: 00 00 00 00
C8AB: 00 00 00 00
C8AF: 00 00 00 00
===== Page 5 =====
C8B3: 00 00 00 00
C8B7: 00 00 00 00
C8BB: 00 00 00 00
C8BF: 00 00 00 00
C8C3: 00 00 00 00
C8C7: 00 00 00 00
C8CB: 00 00 00 00
C8CF: 00 00 00 00
C8D3: 00 00 00 00
C8D7: 00 00 00 00
C8DB: 00 00 00 00
C8DF: 00 00 00 00
C8E3: 00 00 00 00
C8E7: 00 00 00 00
C8EB: 00 00 00 00
C8EF: 00 00 00 00
C8F3: 00 00 00 00
C8F7: 00 00 00 00
C8FB: 00 00 00 00
C8FF: 00
222 DS -4 ; locate to $xxFC
C8FC: FF FF 223 DW $FFFF ; 65535 blocks
C8FE: 47 224 DB $47 ; Status bits
C8FF: 41 225 DB #<DRIVER ; LSB of driver
226
227
228 ********************************
229 *
230 * Initialize SD card
231 *
232 * C Clear - No error
233 * Set - Error
234 * A $00 - No error
235 * $27 - I/O error - Init failed
236 * $28 - No card inserted
237 *
238 ********************************
239
C900: D8 240 INIT CLD
C901: A9 03 241 LDA #$03 ; set SPI mode 3
C903: 9D 81 C0 242 STA CTRL,X
C906: A9 0F 243 LDA #SSNONE
C908: 9D 83 C0 244 STA SS,X
C90B: A9 07 245 LDA #7
C90D: 9D 82 C0 246 STA DIV,X
C910: A0 0A 247 LDY #10
C912: A9 FF 248 LDA #DUMMY
249
C914: 9D 80 C0 250 :LOOP STA DATA,X
C917: 3C 81 C0 251 :WAIT BIT CTRL,X
C91A: 10 FB 252 BPL :WAIT
C91C: 88 253 DEY
C91D: D0 F5 254 BNE :LOOP ; do 10 times
C91F: A9 0E 255 LDA #SS0 ; set CS low
C921: 9D 83 C0 256 STA SS,X
257
C924: A9 68 258 LDA #<CMD0 ; send CMD0
===== Page 6 =====
C926: 85 40 259 STA CMDLO
C928: A9 CB 260 LDA #>CMD0
C92A: 85 41 261 STA CMDHI
C92C: 20 E3 C9 262 JSR CMD
C92F: 20 F7 C9 263 JSR GETR1 ; get response
C932: C9 01 264 CMP #$01
C934: D0 39 265 BNE :ERROR1 ; error!
266
C936: A9 74 267 LDA #<CMD8 ; send CMD8
C938: 85 40 268 STA CMDLO
C93A: A9 CB 269 LDA #>CMD8
C93C: 85 41 270 STA CMDHI
C93E: 20 E3 C9 271 JSR CMD
C941: 20 12 CA 272 JSR GETR3
C944: C9 01 273 CMP #$01
C946: D0 2A 274 BNE :SDV1 ; may be SD Ver. 1
275
276 * check for $01aa match!
C948: A9 80 277 :SDV2 LDA #<CMD55
C94A: 85 40 278 STA CMDLO
C94C: A9 CB 279 LDA #>CMD55
C94E: 85 41 280 STA CMDHI
C950: 20 E3 C9 281 JSR CMD
C953: 20 F7 C9 282 JSR GETR1
C956: A9 86 283 LDA #<ACMD4140
C958: 85 40 284 STA CMDLO
C95A: A9 CB 285 LDA #>ACMD4140
C95C: 85 41 286 STA CMDHI
C95E: 20 E3 C9 287 JSR CMD
C961: 20 F7 C9 288 JSR GETR1
C964: C9 01 289 CMP #$01
C966: F0 E0 290 BEQ :SDV2 ; wait for ready
C968: C9 00 291 CMP #$00
C96A: D0 03 292 BNE :ERROR1 ; error!
293 * send CMD58
294 * SD Ver. 2 initialized!
C96C: 4C AC C9 295 JMP :BLOCKSZ
296
C96F: 4C CF C9 297 :ERROR1 JMP :IOERROR ; needed for far jump
298
C972: A9 80 299 :SDV1 LDA #<CMD55
C974: 85 40 300 STA CMDLO
C976: A9 CB 301 LDA #>CMD55
C978: 85 41 302 STA CMDHI
C97A: 20 E3 C9 303 JSR CMD ; ignore response
C97D: A9 8C 304 LDA #<ACMD410
C97F: 85 40 305 STA CMDLO
C981: A9 CB 306 LDA #>ACMD410
C983: 85 41 307 STA CMDHI
C985: 20 E3 C9 308 JSR CMD
C988: 20 F7 C9 309 JSR GETR1
C98B: C9 01 310 CMP #$01
C98D: F0 E3 311 BEQ :SDV1 ; wait for ready
C98F: C9 00 312 CMP #$00
C991: D0 03 313 BNE :MMC ; may be MMC card
314 * SD Ver. 1 initialized!
C993: 4C AC C9 315 JMP :BLOCKSZ
===== Page 7 =====
316
C996: A9 6E 317 :MMC LDA #<CMD1
C998: 85 40 318 STA CMDLO
C99A: A9 CB 319 LDA #>CMD1
C99C: 85 41 320 STA CMDHI
C99E: 20 E3 C9 321 :LOOP1 JSR CMD
C9A1: 20 F7 C9 322 JSR GETR1
C9A4: C9 01 323 CMP #$01
C9A6: F0 F6 324 BEQ :LOOP1 ; wait for ready
C9A8: C9 00 325 CMP #$00
C9AA: D0 23 326 BNE :IOERROR ; error!
327 * MMC Ver. 3 initialized!
328
C9AC: A9 7A 329 :BLOCKSZ LDA #<CMD16
C9AE: 85 40 330 STA CMDLO
C9B0: A9 CB 331 LDA #>CMD16
C9B2: 85 41 332 STA CMDHI
C9B4: 20 E3 C9 333 JSR CMD
C9B7: 20 F7 C9 334 JSR GETR1
C9BA: C9 00 335 CMP #$00
C9BC: D0 11 336 BNE :IOERROR ; error!
337
C9BE: A4 3D 338 :END LDY SLOT
C9C0: A9 01 339 LDA #$01
C9C2: 99 78 06 340 STA INITED,Y ; initialized
C9C5: 18 341 CLC ; all ok
C9C6: A0 00 342 LDY #0
C9C8: 90 08 343 BCC :END1
C9CA: 38 344 :CDERROR SEC
C9CB: A0 28 345 LDY #$28 ; no card error
C9CD: B0 03 346 BCS :END1
C9CF: 38 347 :IOERROR SEC
C9D0: A0 27 348 LDY #$27 ; init error
C9D2: A9 0F 349 :END1 LDA #SSNONE ; deselect card
C9D4: 9D 83 C0 350 STA SS,X
C9D7: A9 07 351 LDA #7 ; enable 7MHz
C9D9: 9D 81 C0 352 STA CTRL,X
C9DC: A9 00 353 LDA #0 ; set div to 2
C9DE: 9D 82 C0 354 STA DIV,X
C9E1: 98 355 TYA ; retval in A
C9E2: 60 356 RTS
357
358
359 ********************************
360 *
361 * Send SD command
362 * Call with command in CMDHI and CMDLO
363 *
364 ********************************
365
C9E3: 5A 366 CMD PHY
C9E4: A0 00 367 LDY #0
C9E6: B1 40 368 :LOOP LDA (CMDLO),Y
C9E8: 9D 80 C0 369 STA DATA,X
C9EB: 3C 81 C0 370 :WAIT BIT CTRL,X ; TC is in N
C9EE: 10 FB 371 BPL :WAIT
C9F0: C8 372 INY
===== Page 8 =====
C9F1: C0 06 373 CPY #6
C9F3: 90 F1 374 BCC :LOOP
C9F5: 7A 375 PLY
C9F6: 60 376 RTS
377
378
379 ********************************
380 *
381 * Get R1
382 * R1 is in A
383 *
384 ********************************
385
C9F7: A9 FF 386 GETR1 LDA #DUMMY
C9F9: 9D 80 C0 387 STA DATA,X
C9FC: 3C 81 C0 388 :WAIT BIT CTRL,X
C9FF: 10 FB 389 BPL :WAIT
CA01: BD 80 C0 390 LDA DATA,X ; get response
CA04: 85 3C 391 STA WORK ; save R1
CA06: 29 80 392 AND #$80
CA08: D0 ED 393 BNE GETR1 ; wait for MSB=0
CA0A: A9 FF 394 LDA #DUMMY
CA0C: 9D 80 C0 395 STA DATA,X ; send another dummy
CA0F: A5 3C 396 LDA WORK ; restore R1
CA11: 60 397 RTS
398
399
400 ********************************
401 *
402 * Get R3
403 * R1 is in A
404 * R3 is in scratchpad ram
405 *
406 ********************************
407
CA12: 20 F7 C9 408 GETR3 JSR GETR1 ; get R1 first
CA15: 48 409 PHA ; save R1
CA16: 5A 410 PHY ; save Y
CA17: A0 04 411 LDY #04 ; load counter
CA19: A9 FF 412 :LOOP LDA #DUMMY ; send dummy
CA1B: 9D 80 C0 413 STA DATA,X
CA1E: 3C 81 C0 414 :WAIT BIT CTRL,X
CA21: 10 FB 415 BPL :WAIT
CA23: BD 80 C0 416 LDA DATA,X
CA26: 48 417 PHA
CA27: 88 418 DEY
CA28: D0 EF 419 BNE :LOOP ; do 4 times
CA2A: A4 3D 420 LDY SLOT
CA2C: 68 421 PLA
CA2D: 99 F8 05 422 STA R33,Y ; save R3
CA30: 68 423 PLA
CA31: 99 78 05 424 STA R32,Y
CA34: 68 425 PLA
CA35: 99 F8 04 426 STA R31,Y
CA38: 68 427 PLA
CA39: 99 78 04 428 STA R30,Y
CA3C: 7A 429 PLY ; restore Y
===== Page 9 =====
CA3D: A9 FF 430 LDA #DUMMY
CA3F: 9D 80 C0 431 STA DATA,X ; send another dummy
CA42: 68 432 PLA ; restore R1
CA43: 60 433 RTS
434
435
436 ********************************
437 *
438 * Calculate block address
439 * Block no is in $46-47
440 * Address is in R30-R33
441 *
442 ********************************
443
CA44: DA 444 BLOCK PHX ; save X
CA45: 5A 445 PHY ; save Y
CA46: A6 3D 446 LDX SLOT
CA48: A5 46 447 LDA $46 ; store block num
CA4A: 9D F8 05 448 STA R33,X ; in R30-R33
CA4D: A5 47 449 LDA $47
CA4F: 9D 78 05 450 STA R32,X
CA52: A9 00 451 LDA #0
CA54: 9D F8 04 452 STA R31,X
CA57: 9D 78 04 453 STA R30,X
454
CA5A: A0 09 455 LDY #9 ; ASL can't be used with Y
CA5C: 1E F8 05 456 :LOOP ASL R33,X ; mul block num
CA5F: 3E 78 05 457 ROL R32,X ; by 512 to get
CA62: 3E F8 04 458 ROL R31,X ; real address
CA65: 3E 78 04 459 ROL R30,X
CA68: 88 460 DEY
CA69: D0 F1 461 BNE :LOOP
CA6B: 7A 462 PLY ; restore Y
CA6C: FA 463 PLX ; restore X
CA6D: 60 464 RTS
465
466
467 ********************************
468 *
469 * Send SD command
470 * Cmd is in A
471 *
472 ********************************
473
CA6E: 5A 474 COMMAND PHY ; save Y
CA6F: A4 3D 475 LDY SLOT
CA71: 9D 80 C0 476 STA DATA,X ; send command
CA74: B9 78 04 477 LDA R30,Y ; get arg from R30 on
CA77: 9D 80 C0 478 STA DATA,X
CA7A: B9 F8 04 479 LDA R31,Y
CA7D: 9D 80 C0 480 STA DATA,X
CA80: B9 78 05 481 LDA R32,Y
CA83: 9D 80 C0 482 STA DATA,X
CA86: B9 F8 05 483 LDA R33,Y
CA89: 9D 80 C0 484 STA DATA,X
CA8C: A9 FF 485 LDA #DUMMY
CA8E: 9D 80 C0 486 STA DATA,X ; dummy crc
===== Page 10 =====
CA91: 20 F7 C9 487 JSR GETR1
CA94: 7A 488 PLY ; restore Y
CA95: 60 489 RTS
490
491
492 ********************************
493 *
494 * Status request
495 * $43 Unit number DSSS000
496 * $44-45 Unused
497 * $46-47 Unused
498 *
499 * C Clear - No error
500 * Set - Error
501 * A $00 - No error
502 * $27 - I/O error
503 * $28 - No card inserted / no init
504 * $2B - Card write protected
505 * x - Blocks avail (low byte)
506 * y - Blocks avail (high byte)
507 *
508 ********************************
509
CA96: 18 510 STATUS CLC ; no error
CA97: A9 00 511 LDA #0
CA99: A2 FF 512 LDX #$FF ; 32 MB partition
CA9B: A0 FF 513 LDY #$FF
CA9D: 60 514 RTS
515
516 * TODO: check for card detect and write protect!
517
518
519 ********************************
520 *
521 * Read 512 byte block
522 * $43 Unit number DSSS0000
523 * $44-45 Address (LO/HI) of buffer
524 * $46-47 Block number (LO/HI)
525 *
526 * C Clear - No error
527 * Set - Error
528 * A $00 - No error
529 * $27 - Bad block number
530 * $28 - No card inserted
531 *
532 ********************************
533
534 * TODO: check for card detect!
535
CA9E: 20 44 CA 536 READ JSR BLOCK ; calc block address
537
CAA1: A9 0E 538 LDA #SS0 ; enable /CS
CAA3: 9D 83 C0 539 STA SS,X
CAA6: A9 51 540 LDA #$51 ; send CMD17
CAA8: 20 6E CA 541 JSR COMMAND ; send command
542
CAAB: C9 00 543 CMP #0 ; check for error
===== Page 11 =====
CAAD: D0 3F 544 BNE :ERROR
545
CAAF: A9 FF 546 :GETTOK LDA #DUMMY ; get data token
CAB1: 9D 80 C0 547 STA DATA,X
CAB4: BD 80 C0 548 LDA DATA,X ; get response
CAB7: C9 FE 549 CMP #$FE
CAB9: D0 F4 550 BNE :GETTOK ; wait for $FE
551
CABB: A0 02 552 LDY #2 ; read data from card
CABD: A9 17 553 LDA #FRXEN ; enable FRX
CABF: 9D 81 C0 554 STA CTRL,X
CAC2: A9 FF 555 LDA #DUMMY
CAC4: 9D 80 C0 556 STA DATA,X
CAC7: 64 3C 557 :LOOPY STZ WORK
CAC9: BD 80 C0 558 :LOOPW LDA DATA,X
CACC: 92 44 559 STA ($44)
CACE: E6 44 560 INC $44
CAD0: D0 02 561 BNE :INW
CAD2: E6 45 562 INC $45 ; inc msb on page boundary
CAD4: E6 3C 563 :INW INC WORK
CAD6: D0 F1 564 BNE :LOOPW
CAD8: 88 565 DEY
CAD9: D0 EC 566 BNE :LOOPY
567
CADB: A9 07 568 LDA #FRXDIS ; disable FRX
CADD: 9D 81 C0 569 STA CTRL,X
570
CAE0: A9 FF 571 :CRC LDA #DUMMY ; first crc byte has
CAE2: 9D 80 C0 572 STA DATA,X ; already been read
573
CAE5: A9 0F 574 LDA #SSNONE
CAE7: 9D 83 C0 575 STA SS,X ; disable /CS
CAEA: 18 576 CLC ; no error
CAEB: A9 00 577 LDA #$00
CAED: 60 578 RTS
579
CAEE: A9 0F 580 :ERROR LDA #SSNONE
CAF0: 9D 83 C0 581 STA SS,X ; disable /CS
CAF3: 38 582 SEC ; an error occured
CAF4: A9 27 583 LDA #$27
CAF6: 60 584 RTS
585
586
587 ********************************
588 *
589 * Write 512 byte block
590 * $43 Unit number DSSS000
591 * $44-45 Address (LO/HI) of buffer
592 * $46-47 Block number (LO/HI)
593 *
594 * C Clear - No error
595 * Set - Error
596 * A $00 - No error
597 * $27 - I/O error or bad block number
598 * $28 - No card inserted
599 * $2B - Card write protected
600 *
===== Page 12 =====
601 ********************************
602
603 * TODO: check for card detect and write protect!
604
CAF7: 20 44 CA 605 WRITE JSR BLOCK ; calc block address
606
CAFA: A9 0E 607 LDA #SS0 ; enable /CS
CAFC: 9D 83 C0 608 STA SS,X
CAFF: A9 58 609 LDA #$58 ; send CMD24
CB01: 20 6E CA 610 JSR COMMAND ; send command
611
CB04: C9 00 612 CMP #0 ; check for error
CB06: D0 47 613 BNE :ERROR
614
CB08: A9 FF 615 LDA #DUMMY
CB0A: 9D 80 C0 616 STA DATA,X ; send dummy
CB0D: A9 FE 617 LDA #$FE
CB0F: 9D 80 C0 618 STA DATA,X ; send data token
619
CB12: A0 02 620 LDY #2 ; send data to card
CB14: 64 3C 621 :LOOPY STZ WORK
CB16: B2 44 622 :LOOPW LDA ($44)
CB18: 9D 80 C0 623 STA DATA,X
CB1B: E6 44 624 INC $44
CB1D: D0 02 625 BNE :INW
CB1F: E6 45 626 INC $45 ; inc msb on page boundary
CB21: E6 3C 627 :INW INC WORK
CB23: D0 F1 628 BNE :LOOPW
CB25: 88 629 DEY
CB26: D0 EC 630 BNE :LOOPY
631
CB28: 9D 80 C0 632 :CRC STA DATA,X ; send 2 dummy crc bytes
CB2B: 9D 80 C0 633 STA DATA,X
634
CB2E: 9D 80 C0 635 STA DATA,X ; get data response
CB31: BD 80 C0 636 LDA DATA,X
CB34: 29 1F 637 AND #$1F
CB36: C9 05 638 CMP #$05
CB38: D0 15 639 BNE :ERROR ; check for write error
640
CB3A: A9 FF 641 :WAIT6 LDA #DUMMY
CB3C: 9D 80 C0 642 STA DATA,X ; wait for write cycle
CB3F: BD 80 C0 643 LDA DATA,X ; to complete
CB42: C9 00 644 CMP #$00
CB44: F0 F4 645 BEQ :WAIT6
646
CB46: A9 0F 647 LDA #SSNONE ; disable /CS
CB48: 9D 83 C0 648 STA SS,X
CB4B: 18 649 CLC ; no error
CB4C: A9 00 650 LDA #0
CB4E: 60 651 RTS
652
CB4F: A9 FF 653 :ERROR LDA #DUMMY
CB51: 9D 80 C0 654 STA DATA,X ; wait for write cycle
CB54: BD 80 C0 655 LDA DATA,X ; to complete
CB57: C9 00 656 CMP #$00
CB59: F0 F4 657 BEQ :ERROR
===== Page 13 =====
658
CB5B: A9 0F 659 LDA #SSNONE
CB5D: 9D 83 C0 660 STA SS,X ; disable /CS
CB60: 38 661 SEC ; an error occured
CB61: A9 27 662 LDA #$27
CB63: 60 663 RTS
664
665
666 ********************************
667 *
668 * Format
669 * not supported!
670 *
671 ********************************
672
CB64: 38 673 FORMAT SEC
CB65: A9 01 674 LDA #$01 ; invalid command
CB67: 60 675 RTS
676
677
CB68: 40 00 00 678 CMD0 HEX 400000
CB6B: 00 00 95 679 HEX 000095
CB6E: 41 00 00 680 CMD1 HEX 410000
CB71: 00 00 F9 681 HEX 0000F9
CB74: 48 00 00 682 CMD8 HEX 480000
CB77: 01 AA 87 683 HEX 01AA87
CB7A: 50 00 00 684 CMD16 HEX 500000
CB7D: 02 00 FF 685 HEX 0200FF
CB80: 77 00 00 686 CMD55 HEX 770000
CB83: 00 00 65 687 HEX 000065
CB86: 69 40 00 688 ACMD4140 HEX 694000
CB89: 00 00 77 689 HEX 000077
CB8C: 69 00 00 690 ACMD410 HEX 690000
CB8F: 00 00 FF 691 HEX 0000FF
--End assembly, 914 bytes, Errors: 0
Symbol table - alphabetical order:
ACMD410 =$CB8C ACMD4140=$CB86 BLOCK =$CA44 ? BOOT =$C825
CMD =$C9E3 CMD0 =$CB68 CMD1 =$CB6E CMD16 =$CB7A
CMD55 =$CB80 CMD8 =$CB74 CMDHI =$41 CMDLO =$40
COMMAND =$CA6E CTRL =$C081 CURSLOT =$07F8 DATA =$C080
DEBUG =$00 DIV =$C082 DRIVER =$C841 DUMMY =$FF
FORMAT =$CB64 FRXDIS =$07 FRXEN =$17 GETR1 =$C9F7
GETR3 =$CA12 INIT =$C900 INITED =$0678 R30 =$0478
R31 =$04F8 R32 =$0578 R33 =$05F8 READ =$CA9E
SLOT =$3D SLOT16 =$2B SS =$C083 SS0 =$0E
SSNONE =$0F STATUS =$CA96 WORK =$3C WRITE =$CAF7
Symbol table - numerical order:
DEBUG =$00 FRXDIS =$07 SS0 =$0E SSNONE =$0F
===== Page 14 =====
FRXEN =$17 SLOT16 =$2B WORK =$3C SLOT =$3D
CMDLO =$40 CMDHI =$41 DUMMY =$FF R30 =$0478
R31 =$04F8 R32 =$0578 R33 =$05F8 INITED =$0678
CURSLOT =$07F8 DATA =$C080 CTRL =$C081 DIV =$C082
SS =$C083 ? BOOT =$C825 DRIVER =$C841 INIT =$C900
CMD =$C9E3 GETR1 =$C9F7 GETR3 =$CA12 BLOCK =$CA44
COMMAND =$CA6E STATUS =$CA96 READ =$CA9E WRITE =$CAF7
FORMAT =$CB64 CMD0 =$CB68 CMD1 =$CB6E CMD8 =$CB74
CMD16 =$CB7A CMD55 =$CB80 ACMD4140=$CB86 ACMD410 =$CB8C