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 14:47 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 41 * Constants 42 43 DUMMY = $FF 44 FRX = $10 ; CTRL register 45 ECE = $04 46 SS0 = $01 ; SS register 47 WP = $20 48 CARDDET = $40 49 INITED = $80 50 51 52 * signature bytes 53 C800: A2 20 54 LDX #$20 C802: A0 00 55 LDY #$00 C804: A2 03 56 LDX #$03 C806: 86 3C 57 STX WORK 58 59 * find slot nr 60 61 DO DEBUG 62 LDA #$04 63 STA SLOT 64 LDA #$C4 65 STA CURSLOT 66 LDA #$40 67 STA SLOT16 68 ELSE C808: 20 58 FF 69 JSR $FF58 C80B: BA 70 TSX C80C: BD 00 01 71 LDA $0100,X C80F: 29 0F 72 AND #$0F C811: 85 3D 73 STA SLOT ; $0s C813: 09 C0 74 ORA #$C0 C815: 8D F8 07 75 STA CURSLOT ; $Cs C818: 0A 76 ASL A C819: 0A 77 ASL A C81A: 0A 78 ASL A C81B: 0A 79 ASL A C81C: 85 2B 80 STA SLOT16 ; $s0 81 FIN C81E: AA 82 TAX ; X holds now SLOT16 83 C81F: 2C FF CF 84 BIT $CFFF C822: 20 00 C9 85 JSR INIT 86 87 * 88 * TODO: check for init error 89 * 90 91 ******************************** 92 * 93 * Install SD card driver 94 * 95 ******************************** 96 97 DO DEBUG 98 99 * see if slot has a driver already 100 101 LDX $BF31 ; get devcnt 102 INSTALL LDA $BF32,X ; get a devnum 103 AND #$70 ; isolate slot 104 CMP SLOT16 ; slot? 105 BEQ :INSOUT ; yes, skip it 106 DEX 107 BPL INSTALL ; keep up the search 108 109 * restore the devnum to the list 110 111 LDX $BF31 ; get devcnt again 112 CPX #$0D ; device table full? 113 BNE :INST2 114 115 JSR $FF3A ; bell 116 JMP :INSOUT ; do something! 117 118 :INST2 LDA $BF32-1,X ; move all entries down 119 STA $BF32,X ; to make room at front 120 DEX ; for a new entry 121 BNE :INST2 122 LDA #$04 ; ProFile type device 123 ORA SLOT16 124 STA $BF32 ; slot, drive 1 at top of list 125 INC $BF31 ; update devcnt 126 127 * now insert the device driver vector 128 129 LDA SLOT 130 ASL 131 TAX 132 LDA #DRIVER 135 STA $BF11,X 136 :INSOUT RTS 137 138 139 ******************************** 140 * 141 * Boot from SD card 142 * 143 ******************************** 144 145 ELSE 146 C825: A9 01 147 BOOT LDA #$01 C827: 85 42 148 STA $42 ; load command C829: A5 2B 149 LDA SLOT16 C82B: AA 150 TAX C82C: 85 43 151 STA $43 ; slot number C82E: 64 44 152 STZ $44 ; buffer lo C830: A9 08 153 LDA #$08 C832: 85 45 154 STA $45 ; buffer hi C834: 64 46 155 STZ $46 ; block lo C836: 64 47 156 STZ $47 ; block hi C838: 2C FF CF 157 BIT $CFFF C83B: 20 AD CA 158 JSR READ ; call driver C83E: 4C 01 08 159 JMP $801 ; goto bootloader 160 161 FIN 162 163 164 ******************************** 165 * 166 * Jump table 167 * 168 ******************************** 169 C841: D8 170 DRIVER CLD 171 DO DEBUG 172 LDA #$04 173 STA SLOT 174 LDA #$C4 175 STA CURSLOT 176 LDA #$40 177 STA SLOT16 178 ELSE C842: 20 58 FF 179 JSR $FF58 ; find slot nr C845: BA 180 TSX C846: BD 00 01 181 LDA $0100,X C849: 29 0F 182 AND #$0F C84B: 85 3D 183 STA SLOT ; $0s C84D: 09 C0 184 ORA #$C0 C84F: 8D F8 07 185 STA CURSLOT ; $Cs C852: 0A 186 ASL A C853: 0A 187 ASL A C854: 0A 188 ASL A C855: 0A 189 ASL A C856: 85 2B 190 STA SLOT16 ; $s0 191 FIN C858: AA 192 TAX ; X holds now SLOT16 193 C859: 2C FF CF 194 BIT $CFFF C85C: A9 80 195 LDA #INITED ; check for init C85E: 3C 83 C0 196 BIT SS,X C861: F0 22 197 BEQ :INIT 198 C863: A5 42 199 :CMD LDA $42 ; get command C865: C9 00 200 CMP #$00 C867: F0 10 201 BEQ :STATUS C869: C9 01 202 CMP #$01 C86B: F0 0F 203 BEQ :READ C86D: C9 02 204 CMP #$02 C86F: F0 0E 205 BEQ :WRITE C871: C9 03 206 CMP #$03 C873: F0 0D 207 BEQ :FORMAT C875: 38 208 SEC ; unknown command C876: A9 01 209 LDA #$01 C878: 60 210 RTS 211 C879: 4C A5 CA 212 :STATUS JMP STATUS C87C: 4C AD CA 213 :READ JMP READ C87F: 4C 15 CB 214 :WRITE JMP WRITE C882: 4C 8B CB 215 :FORMAT JMP FORMAT C885: 20 00 C9 216 :INIT JSR INIT C888: 80 D9 217 BRA :CMD 218 219 220 * Signature bytes 221 C88A: 00 00 00 222 DS \ ; fill with zeroes C88D: 00 00 00 00 C891: 00 00 00 00 C895: 00 00 00 00 C899: 00 00 00 00 C89D: 00 00 00 00 C8A1: 00 00 00 00 C8A5: 00 00 00 00 C8A9: 00 00 00 00 C8AD: 00 00 00 00 C8B1: 00 00 00 00 C8B5: 00 00 00 00 C8B9: 00 00 00 00 C8BD: 00 00 00 00 C8C1: 00 00 00 00 C8C5: 00 00 00 00 C8C9: 00 00 00 00 C8CD: 00 00 00 00 C8D1: 00 00 00 00 C8D5: 00 00 00 00 C8D9: 00 00 00 00 C8DD: 00 00 00 00 C8E1: 00 00 00 00 C8E5: 00 00 00 00 C8E9: 00 00 00 00 C8ED: 00 00 00 00 C8F1: 00 00 00 00 C8F5: 00 00 00 00 C8F9: 00 00 00 00 C8FD: 00 00 00 223 DS -4 ; locate to $xxFC C8FC: FF FF 224 DW $FFFF ; 65535 blocks C8FE: 47 225 DB $47 ; Status bits C8FF: 41 226 DB #CMD0 C930: 85 41 264 STA CMDHI C932: 20 F2 C9 265 JSR CMD C935: 20 06 CA 266 JSR GETR1 ; get response C938: C9 01 267 CMP #$01 C93A: D0 39 268 BNE :ERROR1 ; error! 269 C93C: A9 9B 270 LDA #CMD8 C942: 85 41 273 STA CMDHI C944: 20 F2 C9 274 JSR CMD C947: 20 21 CA 275 JSR GETR3 C94A: C9 01 276 CMP #$01 C94C: D0 2A 277 BNE :SDV1 ; may be SD Ver. 1 278 279 * check for $01aa match! C94E: A9 A7 280 :SDV2 LDA #CMD55 C954: 85 41 283 STA CMDHI C956: 20 F2 C9 284 JSR CMD C959: 20 06 CA 285 JSR GETR1 C95C: A9 AD 286 LDA #ACMD4140 C962: 85 41 289 STA CMDHI C964: 20 F2 C9 290 JSR CMD C967: 20 06 CA 291 JSR GETR1 C96A: C9 01 292 CMP #$01 C96C: F0 E0 293 BEQ :SDV2 ; wait for ready C96E: C9 00 294 CMP #$00 C970: D0 03 295 BNE :ERROR1 ; error! 296 * send CMD58 297 * SD Ver. 2 initialized! C972: 4C B2 C9 298 JMP :BLOCKSZ 299 C975: 4C E0 C9 300 :ERROR1 JMP :IOERROR ; needed for far jump 301 C978: A9 A7 302 :SDV1 LDA #CMD55 C97E: 85 41 305 STA CMDHI C980: 20 F2 C9 306 JSR CMD ; ignore response C983: A9 B3 307 LDA #ACMD410 C989: 85 41 310 STA CMDHI C98B: 20 F2 C9 311 JSR CMD C98E: 20 06 CA 312 JSR GETR1 C991: C9 01 313 CMP #$01 C993: F0 E3 314 BEQ :SDV1 ; wait for ready C995: C9 00 315 CMP #$00 C997: D0 03 316 BNE :MMC ; may be MMC card 317 * SD Ver. 1 initialized! C999: 4C B2 C9 318 JMP :BLOCKSZ 319 C99C: A9 95 320 :MMC LDA #CMD1 C9A2: 85 41 323 STA CMDHI C9A4: 20 F2 C9 324 :LOOP1 JSR CMD C9A7: 20 06 CA 325 JSR GETR1 C9AA: C9 01 326 CMP #$01 C9AC: F0 F6 327 BEQ :LOOP1 ; wait for ready C9AE: C9 00 328 CMP #$00 C9B0: D0 2E 329 BNE :IOERROR ; error! 330 * MMC Ver. 3 initialized! 331 C9B2: A9 A1 332 :BLOCKSZ LDA #CMD16 C9B8: 85 41 335 STA CMDHI C9BA: 20 F2 C9 336 JSR CMD C9BD: 20 06 CA 337 JSR GETR1 C9C0: C9 00 338 CMP #$00 C9C2: D0 1C 339 BNE :IOERROR ; error! 340 C9C4: A4 3D 341 :END LDY SLOT C9C6: BD 83 C0 342 LDA SS,X C9C9: 09 80 343 ORA #INITED ; initialized C9CB: 9D 83 C0 344 STA SS,X C9CE: BD 81 C0 345 LDA CTRL,X C9D1: 09 04 346 ORA #ECE ; enable 7MHz C9D3: 9D 81 C0 347 STA CTRL,X C9D6: 18 348 CLC ; all ok C9D7: A0 00 349 LDY #0 C9D9: 90 08 350 BCC :END1 C9DB: 38 351 :CDERROR SEC C9DC: A0 28 352 LDY #$28 ; no card error C9DE: B0 03 353 BCS :END1 C9E0: 38 354 :IOERROR SEC C9E1: A0 27 355 LDY #$27 ; init error C9E3: BD 83 C0 356 :END1 LDA SS,X ; set CS high C9E6: 09 01 357 ORA #SS0 C9E8: 9D 83 C0 358 STA SS,X C9EB: A9 00 359 LDA #0 ; set div to 2 C9ED: 9D 82 C0 360 STA DIV,X C9F0: 98 361 TYA ; retval in A C9F1: 60 362 RTS 363 364 365 ******************************** 366 * 367 * Send SD command 368 * Call with command in CMDHI and CMDLO 369 * 370 ******************************** 371 C9F2: 5A 372 CMD PHY C9F3: A0 00 373 LDY #0 C9F5: B1 40 374 :LOOP LDA (CMDLO),Y C9F7: 9D 80 C0 375 STA DATA,X C9FA: 3C 81 C0 376 :WAIT BIT CTRL,X ; TC is in N C9FD: 10 FB 377 BPL :WAIT C9FF: C8 378 INY CA00: C0 06 379 CPY #6 CA02: 90 F1 380 BCC :LOOP CA04: 7A 381 PLY CA05: 60 382 RTS 383 384 385 ******************************** 386 * 387 * Get R1 388 * R1 is in A 389 * 390 ******************************** 391 CA06: A9 FF 392 GETR1 LDA #DUMMY CA08: 9D 80 C0 393 STA DATA,X CA0B: 3C 81 C0 394 :WAIT BIT CTRL,X CA0E: 10 FB 395 BPL :WAIT CA10: BD 80 C0 396 LDA DATA,X ; get response CA13: 85 3C 397 STA WORK ; save R1 CA15: 29 80 398 AND #$80 CA17: D0 ED 399 BNE GETR1 ; wait for MSB=0 CA19: A9 FF 400 LDA #DUMMY CA1B: 9D 80 C0 401 STA DATA,X ; send another dummy CA1E: A5 3C 402 LDA WORK ; restore R1 CA20: 60 403 RTS 404 405 406 ******************************** 407 * 408 * Get R3 409 * R1 is in A 410 * R3 is in scratchpad ram 411 * 412 ******************************** 413 CA21: 20 06 CA 414 GETR3 JSR GETR1 ; get R1 first CA24: 48 415 PHA ; save R1 CA25: 5A 416 PHY ; save Y CA26: A0 04 417 LDY #04 ; load counter CA28: A9 FF 418 :LOOP LDA #DUMMY ; send dummy CA2A: 9D 80 C0 419 STA DATA,X CA2D: 3C 81 C0 420 :WAIT BIT CTRL,X CA30: 10 FB 421 BPL :WAIT CA32: BD 80 C0 422 LDA DATA,X CA35: 48 423 PHA CA36: 88 424 DEY CA37: D0 EF 425 BNE :LOOP ; do 4 times CA39: A4 3D 426 LDY SLOT CA3B: 68 427 PLA CA3C: 99 F8 05 428 STA R33,Y ; save R3 CA3F: 68 429 PLA CA40: 99 78 05 430 STA R32,Y CA43: 68 431 PLA CA44: 99 F8 04 432 STA R31,Y CA47: 68 433 PLA CA48: 99 78 04 434 STA R30,Y CA4B: 7A 435 PLY ; restore Y CA4C: A9 FF 436 LDA #DUMMY CA4E: 9D 80 C0 437 STA DATA,X ; send another dummy CA51: 68 438 PLA ; restore R1 CA52: 60 439 RTS 440 441 442 ******************************** 443 * 444 * Calculate block address 445 * Block no is in $46-47 446 * Address is in R30-R33 447 * 448 ******************************** 449 CA53: DA 450 BLOCK PHX ; save X CA54: 5A 451 PHY ; save Y CA55: A6 3D 452 LDX SLOT CA57: A5 46 453 LDA $46 ; store block num CA59: 9D F8 05 454 STA R33,X ; in R30-R33 CA5C: A5 47 455 LDA $47 CA5E: 9D 78 05 456 STA R32,X CA61: A9 00 457 LDA #0 CA63: 9D F8 04 458 STA R31,X CA66: 9D 78 04 459 STA R30,X 460 CA69: A0 09 461 LDY #9 ; ASL can't be used with Y CA6B: 1E F8 05 462 :LOOP ASL R33,X ; mul block num CA6E: 3E 78 05 463 ROL R32,X ; by 512 to get CA71: 3E F8 04 464 ROL R31,X ; real address CA74: 3E 78 04 465 ROL R30,X CA77: 88 466 DEY CA78: D0 F1 467 BNE :LOOP CA7A: 7A 468 PLY ; restore Y CA7B: FA 469 PLX ; restore X CA7C: 60 470 RTS 471 472 473 ******************************** 474 * 475 * Send SD command 476 * Cmd is in A 477 * 478 ******************************** 479 CA7D: 5A 480 COMMAND PHY ; save Y CA7E: A4 3D 481 LDY SLOT CA80: 9D 80 C0 482 STA DATA,X ; send command CA83: B9 78 04 483 LDA R30,Y ; get arg from R30 on CA86: 9D 80 C0 484 STA DATA,X CA89: B9 F8 04 485 LDA R31,Y CA8C: 9D 80 C0 486 STA DATA,X CA8F: B9 78 05 487 LDA R32,Y CA92: 9D 80 C0 488 STA DATA,X CA95: B9 F8 05 489 LDA R33,Y CA98: 9D 80 C0 490 STA DATA,X CA9B: A9 FF 491 LDA #DUMMY CA9D: 9D 80 C0 492 STA DATA,X ; dummy crc CAA0: 20 06 CA 493 JSR GETR1 CAA3: 7A 494 PLY ; restore Y CAA4: 60 495 RTS 496 497 498 ******************************** 499 * 500 * Status request 501 * $43 Unit number DSSS000 502 * $44-45 Unused 503 * $46-47 Unused 504 * 505 * C Clear - No error 506 * Set - Error 507 * A $00 - No error 508 * $27 - I/O error 509 * $28 - No card inserted / no init 510 * $2B - Card write protected 511 * x - Blocks avail (low byte) 512 * y - Blocks avail (high byte) 513 * 514 ******************************** 515 CAA5: 18 516 STATUS CLC ; no error CAA6: A9 00 517 LDA #0 CAA8: A2 FF 518 LDX #$FF ; 32 MB partition CAAA: A0 FF 519 LDY #$FF CAAC: 60 520 RTS 521 522 * TODO: check for card detect and write protect! 523 524 525 ******************************** 526 * 527 * Read 512 byte block 528 * $43 Unit number DSSS0000 529 * $44-45 Address (LO/HI) of buffer 530 * $46-47 Block number (LO/HI) 531 * 532 * C Clear - No error 533 * Set - Error 534 * A $00 - No error 535 * $27 - Bad block number 536 * $28 - No card inserted 537 * 538 ******************************** 539 540 * TODO: check for card detect! 541 CAAD: 20 53 CA 542 READ JSR BLOCK ; calc block address 543 CAB0: BD 83 C0 544 LDA SS,X ; enable /CS CAB3: 29 FE 545 AND #$FF!SS0 CAB5: 9D 83 C0 546 STA SS,X CAB8: A9 51 547 LDA #$51 ; send CMD17 CABA: 20 7D CA 548 JSR COMMAND ; send command 549 CABD: C9 00 550 CMP #0 ; check for error CABF: D0 48 551 BNE :ERROR 552 CAC1: A9 FF 553 :GETTOK LDA #DUMMY ; get data token CAC3: 9D 80 C0 554 STA DATA,X CAC6: BD 80 C0 555 LDA DATA,X ; get response CAC9: C9 FE 556 CMP #$FE CACB: D0 F4 557 BNE :GETTOK ; wait for $FE 558 CACD: A0 02 559 LDY #2 ; read data from card CACF: BD 81 C0 560 LDA CTRL,X ; enable FRX CAD2: 09 10 561 ORA #FRX CAD4: 9D 81 C0 562 STA CTRL,X CAD7: A9 FF 563 LDA #DUMMY CAD9: 9D 80 C0 564 STA DATA,X CADC: 64 3C 565 :LOOPY STZ WORK CADE: BD 80 C0 566 :LOOPW LDA DATA,X CAE1: 92 44 567 STA ($44) CAE3: E6 44 568 INC $44 CAE5: D0 02 569 BNE :INW CAE7: E6 45 570 INC $45 ; inc msb on page boundary CAE9: E6 3C 571 :INW INC WORK CAEB: D0 F1 572 BNE :LOOPW CAED: 88 573 DEY CAEE: D0 EC 574 BNE :LOOPY 575 CAF0: BD 81 C0 576 LDA CTRL,X ; disable FRX CAF3: 29 EF 577 AND #$FF!FRX CAF5: 9D 81 C0 578 STA CTRL,X 579 CAF8: A9 FF 580 :CRC LDA #DUMMY ; first crc byte has CAFA: 9D 80 C0 581 STA DATA,X ; already been read 582 CAFD: BD 83 C0 583 LDA SS,X CB00: 09 01 584 ORA #SS0 CB02: 9D 83 C0 585 STA SS,X ; disable /CS CB05: 18 586 CLC ; no error CB06: A9 00 587 LDA #$00 CB08: 60 588 RTS 589 CB09: BD 83 C0 590 :ERROR LDA SS,X CB0C: 09 01 591 ORA #SS0 CB0E: 9D 83 C0 592 STA SS,X ; disable /CS CB11: 38 593 SEC ; an error occured CB12: A9 27 594 LDA #$27 CB14: 60 595 RTS 596 597 598 ******************************** 599 * 600 * Write 512 byte block 601 * $43 Unit number DSSS000 602 * $44-45 Address (LO/HI) of buffer 603 * $46-47 Block number (LO/HI) 604 * 605 * C Clear - No error 606 * Set - Error 607 * A $00 - No error 608 * $27 - I/O error or bad block number 609 * $28 - No card inserted 610 * $2B - Card write protected 611 * 612 ******************************** 613 614 * TODO: check for card detect and write protect! 615 CB15: 20 53 CA 616 WRITE JSR BLOCK ; calc block address 617 CB18: BD 83 C0 618 LDA SS,X ; enable /CS CB1B: 29 FE 619 AND #$FF!SS0 CB1D: 9D 83 C0 620 STA SS,X CB20: A9 58 621 LDA #$58 ; send CMD24 CB22: 20 7D CA 622 JSR COMMAND ; send command 623 CB25: C9 00 624 CMP #0 ; check for error CB27: D0 4A 625 BNE :ERROR 626 CB29: A9 FF 627 LDA #DUMMY CB2B: 9D 80 C0 628 STA DATA,X ; send dummy CB2E: A9 FE 629 LDA #$FE CB30: 9D 80 C0 630 STA DATA,X ; send data token 631 CB33: A0 02 632 LDY #2 ; send data to card CB35: 64 3C 633 :LOOPY STZ WORK CB37: B2 44 634 :LOOPW LDA ($44) CB39: 9D 80 C0 635 STA DATA,X CB3C: E6 44 636 INC $44 CB3E: D0 02 637 BNE :INW CB40: E6 45 638 INC $45 ; inc msb on page boundary CB42: E6 3C 639 :INW INC WORK CB44: D0 F1 640 BNE :LOOPW CB46: 88 641 DEY CB47: D0 EC 642 BNE :LOOPY 643 CB49: 9D 80 C0 644 :CRC STA DATA,X ; send 2 dummy crc bytes CB4C: 9D 80 C0 645 STA DATA,X 646 CB4F: 9D 80 C0 647 STA DATA,X ; get data response CB52: BD 80 C0 648 LDA DATA,X CB55: 29 1F 649 AND #$1F CB57: C9 05 650 CMP #$05 CB59: D0 18 651 BNE :ERROR ; check for write error 652 CB5B: A9 FF 653 :WAIT6 LDA #DUMMY CB5D: 9D 80 C0 654 STA DATA,X ; wait for write cycle CB60: BD 80 C0 655 LDA DATA,X ; to complete CB63: C9 00 656 CMP #$00 CB65: F0 F4 657 BEQ :WAIT6 658 CB67: BD 83 C0 659 LDA SS,X ; disable /CS CB6A: 09 01 660 ORA #SS0 CB6C: 9D 83 C0 661 STA SS,X CB6F: 18 662 CLC ; no error CB70: A9 00 663 LDA #0 CB72: 60 664 RTS 665 CB73: A9 FF 666 :ERROR LDA #DUMMY CB75: 9D 80 C0 667 STA DATA,X ; wait for write cycle CB78: BD 80 C0 668 LDA DATA,X ; to complete CB7B: C9 00 669 CMP #$00 CB7D: F0 F4 670 BEQ :ERROR 671 CB7F: BD 83 C0 672 LDA SS,X CB82: 09 01 673 ORA #SS0 CB84: 9D 83 C0 674 STA SS,X ; disable /CS CB87: 38 675 SEC ; an error occured CB88: A9 27 676 LDA #$27 CB8A: 60 677 RTS 678 679 680 ******************************** 681 * 682 * Format 683 * not supported! 684 * 685 ******************************** 686 CB8B: 38 687 FORMAT SEC CB8C: A9 01 688 LDA #$01 ; invalid command CB8E: 60 689 RTS 690 691 CB8F: 40 00 00 692 CMD0 HEX 400000 CB92: 00 00 95 693 HEX 000095 CB95: 41 00 00 694 CMD1 HEX 410000 CB98: 00 00 F9 695 HEX 0000F9 CB9B: 48 00 00 696 CMD8 HEX 480000 CB9E: 01 AA 87 697 HEX 01AA87 CBA1: 50 00 00 698 CMD16 HEX 500000 CBA4: 02 00 FF 699 HEX 0200FF CBA7: 77 00 00 700 CMD55 HEX 770000 CBAA: 00 00 65 701 HEX 000065 CBAD: 69 40 00 702 ACMD4140 HEX 694000 CBB0: 00 00 77 703 HEX 000077 CBB3: 69 00 00 704 ACMD410 HEX 690000 CBB6: 00 00 FF 705 HEX 0000FF --End assembly, 953 bytes, Errors: 0 Symbol table - alphabetical order: ACMD410 =$CBB3 ACMD4140=$CBAD BLOCK =$CA53 ? BOOT =$C825 ? CARDDET =$40 CMD =$C9F2 CMD0 =$CB8F CMD1 =$CB95 CMD16 =$CBA1 CMD55 =$CBA7 CMD8 =$CB9B CMDHI =$41 CMDLO =$40 COMMAND =$CA7D CTRL =$C081 CURSLOT =$07F8 DATA =$C080 DEBUG =$00 DIV =$C082 DRIVER =$C841 DUMMY =$FF ECE =$04 FORMAT =$CB8B FRX =$10 GETR1 =$CA06 GETR3 =$CA21 INIT =$C900 INITED =$80 R30 =$0478 R31 =$04F8 R32 =$0578 R33 =$05F8 READ =$CAAD SLOT =$3D SLOT16 =$2B SS =$C083 SS0 =$01 STATUS =$CAA5 WORK =$3C ? WP =$20 WRITE =$CB15 Symbol table - numerical order: DEBUG =$00 SS0 =$01 ECE =$04 FRX =$10 ? WP =$20 SLOT16 =$2B WORK =$3C SLOT =$3D CMDLO =$40 ? CARDDET =$40 CMDHI =$41 INITED =$80 DUMMY =$FF R30 =$0478 R31 =$04F8 R32 =$0578 R33 =$05F8 CURSLOT =$07F8 DATA =$C080 CTRL =$C081 DIV =$C082 SS =$C083 ? BOOT =$C825 DRIVER =$C841 INIT =$C900 CMD =$C9F2 GETR1 =$CA06 GETR3 =$CA21 BLOCK =$CA53 COMMAND =$CA7D STATUS =$CAA5 READ =$CAAD WRITE =$CB15 FORMAT =$CB8B CMD0 =$CB8F CMD1 =$CB95 CMD8 =$CB9B CMD16 =$CBA1 CMD55 =$CBA7 ACMD4140=$CBAD ACMD410 =$CBB3