1 ******************************** 2 * 3 * Apple][Sd Firmware 4 * Version 0.5 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-JUL-17 23:22 14 15 XC ; enable 65C02 code 16 DEBUG = 1 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 SSNONE = $0F 44 SS0 = $0E 45 DUMMY = $FF 46 47 48 ******************************** 49 * 50 * Install SD card driver 51 * 52 ******************************** 53 54 * signature bytes 55 8000: A2 20 56 LDX #$20 8002: A0 00 57 LDY #$00 8004: A2 03 58 LDX #$03 8006: 86 3C 59 STX WORK ===== Page 2 ===== 60 61 * find slot nr 62 63 DO DEBUG 8008: A9 04 64 LDA #$04 800A: 85 3D 65 STA SLOT 800C: A9 C4 66 LDA #$C4 800E: 8D F8 07 67 STA CURSLOT 8011: A9 40 68 LDA #$40 8013: 85 2B 69 STA SLOT16 70 ELSE 71 JSR $FF58 72 TSX 73 LDA $0100,X 74 AND #$0F 75 STA SLOT ; $0s 76 ORA #$C0 77 STA CURSLOT ; $Cs 78 ASL A 79 ASL A 80 ASL A 81 ASL A 82 STA SLOT16 ; $s0 83 FIN 8015: AA 84 TAX ; X holds now SLOT16 85 8016: 20 00 81 86 JSR INIT 8019: 2C FF CF 87 BIT $CFFF 88 89 * 90 * TODO: check for init error 91 * 92 93 * see if slot has a driver already 94 801C: AE 31 BF 95 LDX $BF31 ; get devcnt 801F: BD 32 BF 96 INSLP LDA $BF32,X ; get a devnum 8022: 29 70 97 AND #$70 ; isolate slot 8024: C5 2B 98 CMP SLOT16 ; slot? 8026: F0 31 99 BEQ INSOUT ; yes, skip it 8028: CA 100 DEX 8029: 10 F4 101 BPL INSLP ; keep up the search 102 103 * restore the devnum to the list 104 802B: AE 31 BF 105 LDX $BF31 ; get devcnt again 802E: E0 0D 106 CPX #$0D ; device table full? 8030: D0 06 107 BNE INSLP2 108 8032: 20 3A FF 109 JSR $FF3A ; bell 8035: 4C 59 80 110 JMP INSOUT ; do something! 111 8038: BD 31 BF 112 INSLP2 LDA $BF32-1,X ; move all entries down 803B: 9D 32 BF 113 STA $BF32,X ; to make room at front 803E: CA 114 DEX ; for a new entry 803F: D0 F7 115 BNE INSLP2 8041: A9 04 116 LDA #$04 ; ProFile type device ===== Page 3 ===== 8043: 05 2B 117 ORA SLOT16 8045: 8D 32 BF 118 STA $BF32 ; slot, drive 1 at top of list 8048: EE 31 BF 119 INC $BF31 ; update devcnt 120 121 * now insert the device driver vector 122 804B: A5 3D 123 LDA SLOT 804D: 0A 124 ASL 804E: AA 125 TAX 804F: A9 5A 126 LDA #DRIVER 130 ELSE 131 LDA CURSLOT 132 FIN 8056: 9D 11 BF 133 STA $BF11,X 134 8059: 60 135 INSOUT RTS 136 137 138 ******************************** 139 * 140 * Jump table 141 * 142 ******************************** 143 805A: D8 144 DRIVER CLD 145 DO DEBUG 805B: A9 04 146 LDA #$04 805D: 85 3D 147 STA SLOT 805F: A9 C4 148 LDA #$C4 8061: 8D F8 07 149 STA CURSLOT 8064: A9 40 150 LDA #$40 8066: 85 2B 151 STA SLOT16 152 ELSE 153 JSR $FF58 ; find slot nr 154 TSX 155 LDA $0100,X 156 AND #$0F 157 STA SLOT ; $0s 158 ORA #$C0 159 STA CURSLOT ; $Cs 160 ASL A 161 ASL A 162 ASL A 163 ASL A 164 STA SLOT16 ; $s0 165 FIN 8068: AA 166 TAX ; X holds now SLOT16 167 8069: 2C FF CF 168 BIT $CFFF 806C: A5 42 169 LDA $42 ; get command 806E: C9 00 170 CMP #$00 8070: F0 10 171 BEQ :STATUS 8072: C9 01 172 CMP #$01 8074: F0 0F 173 BEQ :READ ===== Page 4 ===== 8076: C9 02 174 CMP #$02 8078: F0 0E 175 BEQ :WRITE 807A: C9 03 176 CMP #$03 807C: F0 0D 177 BEQ :FORMAT 807E: 38 178 SEC ; unknown command 807F: A9 01 179 LDA #$01 8081: 60 180 RTS 181 8082: 4C A8 82 182 :STATUS JMP STATUS 8085: 4C B0 82 183 :READ JMP READ 8088: 4C FA 82 184 :WRITE JMP WRITE 808B: 4C 8A 83 185 :FORMAT JMP FORMAT 186 187 * Signature bytes 188 808E: 00 00 00 189 DS \ ; fill with zeroes 8091: 00 00 00 00 8095: 00 00 00 00 8099: 00 00 00 00 809D: 00 00 00 00 80A1: 00 00 00 00 80A5: 00 00 00 00 80A9: 00 00 00 00 80AD: 00 00 00 00 80B1: 00 00 00 00 80B5: 00 00 00 00 80B9: 00 00 00 00 80BD: 00 00 00 00 80C1: 00 00 00 00 80C5: 00 00 00 00 80C9: 00 00 00 00 80CD: 00 00 00 00 80D1: 00 00 00 00 80D5: 00 00 00 00 80D9: 00 00 00 00 80DD: 00 00 00 00 80E1: 00 00 00 00 80E5: 00 00 00 00 80E9: 00 00 00 00 80ED: 00 00 00 00 80F1: 00 00 00 00 80F5: 00 00 00 00 80F9: 00 00 00 00 80FD: 00 00 00 190 DS -4 ; locate to $C8FC 80FC: FF FF 191 DW $FFFF ; 65535 blocks 80FE: 47 192 DB $47 ; Status bits 80FF: 5A 193 DB #CMD0 812A: 85 41 229 STA CMDHI 812C: 20 D7 81 230 JSR CMD 812F: 20 EB 81 231 JSR GETR1 ; get response 8132: C9 01 232 CMP #$01 8134: D0 39 233 BNE :ERROR1 ; error! 234 8136: A9 9A 235 LDA #CMD8 813C: 85 41 238 STA CMDHI 813E: 20 D7 81 239 JSR CMD 8141: 20 06 82 240 JSR GETR3 8144: C9 01 241 CMP #$01 8146: D0 2A 242 BNE :SDV1 ; may be SD Ver. 1 243 244 * check for $01aa match! 8148: A9 A6 245 :SDV2 LDA #CMD55 814E: 85 41 248 STA CMDHI 8150: 20 D7 81 249 JSR CMD 8153: 20 EB 81 250 JSR GETR1 8156: A9 AC 251 LDA #ACMD4140 815C: 85 41 254 STA CMDHI 815E: 20 D7 81 255 JSR CMD 8161: 20 EB 81 256 JSR GETR1 8164: C9 01 257 CMP #$01 8166: F0 E0 258 BEQ :SDV2 ; wait for ready 8168: C9 00 259 CMP #$00 ===== Page 6 ===== 816A: D0 03 260 BNE :ERROR1 ; error! 261 * send CMD58 262 * SD Ver. 2 initialized! 816C: 4C AC 81 263 JMP :BLOCKSZ 264 816F: 4C C8 81 265 :ERROR1 JMP :IOERROR ; needed for far jump 266 8172: A9 A6 267 :SDV1 LDA #CMD55 8178: 85 41 270 STA CMDHI 817A: 20 D7 81 271 JSR CMD ; ignore response 817D: A9 B2 272 LDA #ACMD410 8183: 85 41 275 STA CMDHI 8185: 20 D7 81 276 JSR CMD 8188: 20 EB 81 277 JSR GETR1 818B: C9 01 278 CMP #$01 818D: F0 E3 279 BEQ :SDV1 ; wait for ready 818F: C9 00 280 CMP #$00 8191: D0 03 281 BNE :MMC ; may be MMC card 282 * SD Ver. 1 initialized! 8193: 4C AC 81 283 JMP :BLOCKSZ 284 8196: A9 94 285 :MMC LDA #CMD1 819C: 85 41 288 STA CMDHI 819E: 20 D7 81 289 :LOOP1 JSR CMD 81A1: 20 EB 81 290 JSR GETR1 81A4: C9 01 291 CMP #$01 81A6: F0 F6 292 BEQ :LOOP1 ; wait for ready 81A8: C9 00 293 CMP #$00 81AA: D0 1C 294 BNE :IOERROR ; error! 295 * MMC Ver. 3 initialized! 296 81AC: A9 A0 297 :BLOCKSZ LDA #CMD16 81B2: 85 41 300 STA CMDHI 81B4: 20 D7 81 301 JSR CMD 81B7: 20 EB 81 302 JSR GETR1 81BA: C9 00 303 CMP #$00 81BC: D0 0A 304 BNE :IOERROR ; error! 305 81BE: 18 306 :END CLC ; all ok 81BF: A0 00 307 LDY #0 81C1: 90 08 308 BCC :END1 81C3: 38 309 :CDERROR SEC 81C4: A0 28 310 LDY #$28 ; no card error 81C6: B0 03 311 BCS :END1 81C8: 38 312 :IOERROR SEC 81C9: A0 27 313 LDY #$27 ; init error 81CB: A9 0F 314 :END1 LDA #SSNONE ; deselect card 81CD: 9D 83 C0 315 STA SS,X 81D0: A9 00 316 LDA #0 ; set div to 2 ===== Page 7 ===== 81D2: 9D 82 C0 317 STA DIV,X 81D5: 98 318 TYA ; retval in A 81D6: 60 319 RTS 320 321 322 ******************************** 323 * 324 * Send SD command 325 * Call with command in CMDHI and CMDLO 326 * 327 ******************************** 328 81D7: 5A 329 CMD PHY 81D8: A0 00 330 LDY #0 81DA: B1 40 331 :LOOP LDA (CMDLO),Y 81DC: 9D 80 C0 332 STA DATA,X 81DF: 3C 81 C0 333 :WAIT BIT CTRL,X ; TC is in N 81E2: 10 FB 334 BPL :WAIT 81E4: C8 335 INY 81E5: C0 06 336 CPY #6 81E7: 90 F1 337 BCC :LOOP 81E9: 7A 338 PLY 81EA: 60 339 RTS 340 341 342 ******************************** 343 * 344 * Get R1 345 * R1 is in A 346 * 347 ******************************** 348 81EB: A9 FF 349 GETR1 LDA #DUMMY 81ED: 9D 80 C0 350 STA DATA,X 81F0: 3C 81 C0 351 :WAIT BIT CTRL,X 81F3: 10 FB 352 BPL :WAIT 81F5: BD 80 C0 353 LDA DATA,X ; get response 81F8: 85 3C 354 STA WORK ; save R1 81FA: 29 80 355 AND #$80 81FC: D0 ED 356 BNE GETR1 ; wait for MSB=0 81FE: A9 FF 357 LDA #DUMMY 8200: 9D 80 C0 358 STA DATA,X ; send another dummy 8203: A5 3C 359 LDA WORK ; restore R1 8205: 60 360 RTS 361 362 363 ******************************** 364 * 365 * Get R3 366 * R1 is in A 367 * R3 is in scratchpad ram 368 * 369 ******************************** 370 8206: 20 EB 81 371 GETR3 JSR GETR1 ; get R1 first 8209: 48 372 PHA ; save R1 820A: 5A 373 PHY ; save Y ===== Page 8 ===== 820B: A0 04 374 LDY #04 ; load counter 820D: A9 FF 375 :LOOP LDA #DUMMY ; send dummy 820F: 9D 80 C0 376 STA DATA,X 8212: 3C 81 C0 377 :WAIT BIT CTRL,X 8215: 10 FB 378 BPL :WAIT 8217: BD 80 C0 379 LDA DATA,X 821A: 48 380 PHA 821B: 88 381 DEY 821C: D0 EF 382 BNE :LOOP ; do 4 times 821E: A4 3D 383 LDY SLOT 8220: 68 384 PLA 8221: 99 F8 05 385 STA R33,Y ; save R3 8224: 68 386 PLA 8225: 99 78 05 387 STA R32,Y 8228: 68 388 PLA 8229: 99 F8 04 389 STA R31,Y 822C: 68 390 PLA 822D: 99 78 04 391 STA R30,Y 8230: 7A 392 PLY ; restore Y 8231: A9 FF 393 LDA #DUMMY 8233: 9D 80 C0 394 STA DATA,X ; send another dummy 8236: 68 395 PLA ; restore R1 8237: 60 396 RTS 397 398 399 ******************************** 400 * 401 * Calculate block address 402 * Block no is in $46-47 403 * Address is in R30-R33 404 * 405 ******************************** 406 8238: DA 407 BLOCK PHX ; save X 8239: 5A 408 PHY ; save Y 823A: A6 3D 409 LDX SLOT 823C: A5 46 410 LDA $46 ; store block num 823E: 9D F8 05 411 STA R33,X ; in R30-R33 8241: A5 47 412 LDA $47 8243: 9D 78 05 413 STA R32,X 8246: A9 00 414 LDA #0 8248: 9D F8 04 415 STA R31,X 824B: 9D 78 04 416 STA R30,X 417 824E: A0 09 418 LDY #9 ; ASL can't be used with Y 8250: 1E F8 05 419 :LOOP ASL R33,X ; mul block num 8253: 3E 78 05 420 ROL R32,X ; by 512 to get 8256: 3E F8 04 421 ROL R31,X ; real address 8259: 3E 78 04 422 ROL R30,X 825C: 88 423 DEY 825D: D0 F1 424 BNE :LOOP 825F: 7A 425 PLY ; restore Y 8260: FA 426 PLX ; restore X 8261: 60 427 RTS 428 429 430 ******************************** ===== Page 9 ===== 431 * 432 * Send SD command 433 * Cmd is in A 434 * 435 ******************************** 436 8262: 5A 437 COMMAND PHY ; save Y 8263: A4 3D 438 LDY SLOT 8265: 9D 80 C0 439 STA DATA,X ; send command 8268: 3C 81 C0 440 :WAIT BIT CTRL,X 826B: 10 FB 441 BPL :WAIT 826D: B9 78 04 442 :ARG LDA R30,Y ; get arg from R30 on 8270: 9D 80 C0 443 STA DATA,X 8273: 3C 81 C0 444 :WAIT1 BIT CTRL,X 8276: 10 FB 445 BPL :WAIT1 8278: B9 F8 04 446 LDA R31,Y 827B: 9D 80 C0 447 STA DATA,X 827E: 3C 81 C0 448 :WAIT11 BIT CTRL,X 8281: 10 FB 449 BPL :WAIT11 8283: B9 78 05 450 LDA R32,Y 8286: 9D 80 C0 451 STA DATA,X 8289: 3C 81 C0 452 :WAIT12 BIT CTRL,X 828C: 10 FB 453 BPL :WAIT12 828E: B9 F8 05 454 LDA R33,Y 8291: 9D 80 C0 455 STA DATA,X 8294: 3C 81 C0 456 :WAIT13 BIT CTRL,X 8297: 10 FB 457 BPL :WAIT13 8299: A9 FF 458 LDA #DUMMY 829B: 9D 80 C0 459 STA DATA,X ; dummy crc 829E: 3C 81 C0 460 :WAIT2 BIT CTRL,X 82A1: 10 FB 461 BPL :WAIT2 82A3: 20 EB 81 462 JSR GETR1 82A6: 7A 463 PLY ; restore Y 82A7: 60 464 RTS 465 466 467 ******************************** 468 * 469 * Status request 470 * $43 Unit number DSSS000 471 * $44-45 Unused 472 * $46-47 Unused 473 * 474 * C Clear - No error 475 * Set - Error 476 * A $00 - No error 477 * $27 - I/O error 478 * $28 - No card inserted / no init 479 * $2B - Card write protected 480 * x - Blocks avail (low byte) 481 * y - Blocks avail (high byte) 482 * 483 ******************************** 484 82A8: 18 485 STATUS CLC ; no error 82A9: A9 00 486 LDA #0 82AB: A2 FF 487 LDX #$FF ; 32 MB partition ===== Page 10 ===== 82AD: A0 FF 488 LDY #$FF 82AF: 60 489 RTS 490 491 * TODO: check for card detect and write protect! 492 493 494 ******************************** 495 * 496 * Read 512 byte block 497 * $43 Unit number DSSS0000 498 * $44-45 Address (LO/HI) of buffer 499 * $46-47 Block number (LO/HI) 500 * 501 * C Clear - No error 502 * Set - Error 503 * A $00 - No error 504 * $27 - Bad block number 505 * $28 - No card inserted 506 * 507 ******************************** 508 509 * TODO: check for card detect! 510 82B0: 20 38 82 511 READ JSR BLOCK ; calc block address 512 82B3: A9 0E 513 LDA #SS0 ; enable /CS 82B5: 9D 83 C0 514 STA SS,X 82B8: A9 51 515 LDA #$51 ; send CMD17 82BA: 20 62 82 516 JSR COMMAND ; send command 517 82BD: A9 FF 518 :GETTOK LDA #DUMMY ; get data token 82BF: 9D 80 C0 519 STA DATA,X 82C2: 3C 81 C0 520 :WAIT BIT CTRL,X 82C5: 10 FB 521 BPL :WAIT 82C7: BD 80 C0 522 LDA DATA,X ; get response 523 * 524 * TODO: check for error! 525 * 82CA: C9 FE 526 CMP #$FE 82CC: D0 EF 527 BNE :GETTOK ; wait for $FE 528 82CE: A0 02 529 LDY #2 ; read data from card 82D0: 64 3C 530 :LOOPY STZ WORK 82D2: A9 FF 531 :LOOPW LDA #DUMMY 82D4: 9D 80 C0 532 STA DATA,X 82D7: 3C 81 C0 533 :WAIT1 BIT CTRL,X 82DA: 10 FB 534 BPL :WAIT1 82DC: BD 80 C0 535 LDA DATA,X 82DF: 92 44 536 STA ($44) 82E1: E6 44 537 INC $44 82E3: D0 02 538 BNE :INW 82E5: E6 45 539 INC $45 ; inc msb on page boundary 82E7: E6 3C 540 :INW INC WORK 82E9: D0 E7 541 BNE :LOOPW 82EB: 88 542 DEY 82EC: D0 E2 543 BNE :LOOPY 544 ===== Page 11 ===== 82EE: 20 06 82 545 JSR GETR3 ; read 2 bytes crc 82F1: A9 0F 546 LDA #SSNONE 82F3: 9D 83 C0 547 STA SS,X ; disable /CS 82F6: 18 548 CLC ; no error 82F7: A9 00 549 LDA #$00 82F9: 60 550 RTS 551 552 553 ******************************** 554 * 555 * Write 512 byte block 556 * $43 Unit number DSSS000 557 * $44-45 Address (LO/HI) of buffer 558 * $46-47 Block number (LO/HI) 559 * 560 * C Clear - No error 561 * Set - Error 562 * A $00 - No error 563 * $27 - I/O error or bad block number 564 * $28 - No card inserted 565 * $2B - Card write protected 566 * 567 ******************************** 568 569 * TODO: check for card detect and write protect! 570 82FA: 20 38 82 571 WRITE JSR BLOCK ; calc block address 572 82FD: A9 0E 573 LDA #SS0 ; enable /CS 82FF: 9D 83 C0 574 STA SS,X 8302: A9 58 575 LDA #$58 ; send CMD24 8304: 20 62 82 576 JSR COMMAND ; send command 577 8307: A9 FF 578 LDA #DUMMY 8309: 9D 80 C0 579 STA DATA,X ; send dummy 830C: 3C 81 C0 580 :WAIT1 BIT CTRL,X 830F: 10 FB 581 BPL :WAIT1 8311: A9 FE 582 LDA #$FE 8313: 9D 80 C0 583 STA DATA,X ; send data token 8316: 3C 81 C0 584 :WAIT2 BIT CTRL,X 8319: 10 FB 585 BPL :WAIT2 586 831B: A0 02 587 LDY #2 ; send data to card 831D: 64 3C 588 :LOOPY STZ WORK 831F: B2 44 589 :LOOPW LDA ($44) 8321: 9D 80 C0 590 STA DATA,X 8324: 3C 81 C0 591 :WAIT3 BIT CTRL,X 8327: 10 FB 592 BPL :WAIT3 8329: E6 44 593 INC $44 832B: D0 02 594 BNE :INW 832D: E6 45 595 INC $45 ; inc msb on page boundary 832F: E6 3C 596 :INW INC WORK 8331: D0 EC 597 BNE :LOOPW 8333: 88 598 DEY 8334: D0 E7 599 BNE :LOOPY 600 8336: A0 02 601 LDY #2 ; send 2 dummy crc bytes ===== Page 12 ===== 8338: 9D 80 C0 602 :CRC STA DATA,X 833B: 3C 81 C0 603 :WAIT4 BIT CTRL,X 833E: 10 FB 604 BPL :WAIT4 8340: 88 605 DEY 8341: D0 F5 606 BNE :CRC 607 8343: A9 FF 608 LDA #DUMMY ; get data response 8345: 9D 80 C0 609 STA DATA,X 8348: 3C 81 C0 610 :WAIT5 BIT CTRL,X 834B: 10 FB 611 BPL :WAIT5 834D: BD 80 C0 612 LDA DATA,X 8350: 29 1F 613 AND #$1F 8352: C9 05 614 CMP #$05 8354: D0 1A 615 BNE :ERROR ; check for write error 616 8356: A9 FF 617 :WAIT6 LDA #DUMMY ; wait for write cycle 8358: 9D 80 C0 618 STA DATA,X ; to complete 835B: 3C 81 C0 619 :WAIT61 BIT CTRL,X 835E: 10 FB 620 BPL :WAIT61 8360: BD 80 C0 621 LDA DATA,X 8363: C9 00 622 CMP #$00 8365: F0 EF 623 BEQ :WAIT6 624 8367: A9 0F 625 LDA #SSNONE ; disable /CS 8369: 9D 83 C0 626 STA SS,X 836C: 18 627 CLC ; no error 836D: A9 00 628 LDA #0 836F: 60 629 RTS 630 631 :ERROR 8370: A9 FF 632 :WAIT7 LDA #DUMMY ; wait for write cycle 8372: 9D 80 C0 633 STA DATA,X ; to complete 8375: 3C 81 C0 634 :WAIT71 BIT CTRL,X 8378: 10 FB 635 BPL :WAIT71 837A: BD 80 C0 636 LDA DATA,X 837D: C9 00 637 CMP #$00 837F: F0 EF 638 BEQ :WAIT7 8381: A9 0F 639 LDA #SSNONE 8383: 9D 83 C0 640 STA SS,X ; disable /CS 8386: 38 641 SEC ; an error occured 8387: A9 27 642 LDA #$27 8389: 60 643 RTS 644 645 646 ******************************** 647 * 648 * Format 649 * not supported! 650 * 651 ******************************** 652 838A: 38 653 FORMAT SEC 838B: A9 01 654 LDA #$01 ; invalid command 838D: 60 655 RTS 656 657 838E: 40 00 00 658 CMD0 HEX 400000 ===== Page 13 ===== 8391: 00 00 95 659 HEX 000095 8394: 41 00 00 660 CMD1 HEX 410000 8397: 00 00 F9 661 HEX 0000F9 839A: 48 00 00 662 CMD8 HEX 480000 839D: 01 AA 87 663 HEX 01AA87 83A0: 50 00 00 664 CMD16 HEX 500000 83A3: 02 00 FF 665 HEX 0200FF 83A6: 77 00 00 666 CMD55 HEX 770000 83A9: 00 00 65 667 HEX 000065 83AC: 69 40 00 668 ACMD4140 HEX 694000 83AF: 00 00 77 669 HEX 000077 83B2: 69 00 00 670 ACMD410 HEX 690000 83B5: 00 00 FF 671 HEX 0000FF --End assembly, 952 bytes, Errors: 0 Symbol table - alphabetical order: ACMD410 =$83B2 ACMD4140=$83AC BLOCK =$8238 CMD =$81D7 CMD0 =$838E CMD1 =$8394 CMD16 =$83A0 CMD55 =$83A6 CMD8 =$839A CMDHI =$41 CMDLO =$40 COMMAND =$8262 CTRL =$C081 CURSLOT =$07F8 DATA =$C080 DEBUG =$01 DIV =$C082 DRIVER =$805A DUMMY =$FF FORMAT =$838A GETR1 =$81EB GETR3 =$8206 INIT =$8100 INSLP =$801F INSLP2 =$8038 INSOUT =$8059 R30 =$0478 R31 =$04F8 R32 =$0578 R33 =$05F8 READ =$82B0 SLOT =$3D SLOT16 =$2B SS =$C083 SS0 =$0E SSNONE =$0F STATUS =$82A8 WORK =$3C WRITE =$82FA Symbol table - numerical order: DEBUG =$01 SS0 =$0E SSNONE =$0F SLOT16 =$2B WORK =$3C SLOT =$3D CMDLO =$40 CMDHI =$41 DUMMY =$FF R30 =$0478 R31 =$04F8 R32 =$0578 R33 =$05F8 CURSLOT =$07F8 INSLP =$801F INSLP2 =$8038 INSOUT =$8059 DRIVER =$805A INIT =$8100 CMD =$81D7 GETR1 =$81EB GETR3 =$8206 BLOCK =$8238 COMMAND =$8262 STATUS =$82A8 READ =$82B0 WRITE =$82FA FORMAT =$838A CMD0 =$838E CMD1 =$8394 CMD8 =$839A CMD16 =$83A0 CMD55 =$83A6 ACMD4140=$83AC ACMD410 =$83B2 DATA =$C080 CTRL =$C081 DIV =$C082 SS =$C083