AppleIISd/AppleIISd.lst

756 lines
33 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.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
8051: 9D 10 BF 127 STA $BF10,X ; write to driver table
128 DO DEBUG
8054: A9 80 129 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 #<DRIVER ; LSB of driver
194
195
196 ********************************
197 *
198 * Initialize SD card
199 *
200 * C Clear - No error
201 * Set - Error
202 * A $00 - No error
===== Page 5 =====
203 * $27 - I/O error - Init failed
204 * $28 - No card inserted
205 *
206 ********************************
207
8100: D8 208 INIT CLD
8101: A9 03 209 LDA #$03 ; set SPI mode 3
8103: 9D 81 C0 210 STA CTRL,X
8106: A9 0F 211 LDA #SSNONE
8108: 9D 83 C0 212 STA SS,X
810B: A9 07 213 LDA #7
810D: 9D 82 C0 214 STA DIV,X
8110: A0 0A 215 LDY #10
8112: A9 FF 216 LDA #DUMMY
217
8114: 9D 80 C0 218 :LOOP STA DATA,X
8117: 3C 81 C0 219 :WAIT BIT CTRL,X
811A: 10 FB 220 BPL :WAIT
811C: 88 221 DEY
811D: D0 F5 222 BNE :LOOP ; do 10 times
811F: A9 0E 223 LDA #SS0 ; set CS low
8121: 9D 83 C0 224 STA SS,X
225
8124: A9 8E 226 LDA #<CMD0 ; send CMD0
8126: 85 40 227 STA CMDLO
8128: A9 83 228 LDA #>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 ; send CMD8
8138: 85 40 236 STA CMDLO
813A: A9 83 237 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
814A: 85 40 246 STA CMDLO
814C: A9 83 247 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
8158: 85 40 252 STA CMDLO
815A: A9 83 253 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
8174: 85 40 268 STA CMDLO
8176: A9 83 269 LDA #>CMD55
8178: 85 41 270 STA CMDHI
817A: 20 D7 81 271 JSR CMD ; ignore response
817D: A9 B2 272 LDA #<ACMD410
817F: 85 40 273 STA CMDLO
8181: A9 83 274 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
8198: 85 40 286 STA CMDLO
819A: A9 83 287 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
81AE: 85 40 298 STA CMDLO
81B0: A9 83 299 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