AppleIISd/AppleIISd.lst

756 lines
33 KiB
Plaintext
Raw Normal View History

2017-07-05 18:07:55 +00:00
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
2017-07-16 21:29:09 +00:00
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
2017-07-05 18:07:55 +00:00
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
2017-07-05 18:07:55 +00:00
===== 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
2017-07-16 21:29:09 +00:00
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
2017-07-05 18:07:55 +00:00
===== 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
2017-07-16 21:29:09 +00:00
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
2017-07-16 21:29:09 +00:00
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!
2017-07-16 21:29:09 +00:00
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
2017-07-16 21:29:09 +00:00
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
2017-07-05 18:07:55 +00: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
2017-07-16 21:29:09 +00:00
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
2017-07-16 21:29:09 +00:00
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
2017-07-16 21:29:09 +00:00
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
2017-07-16 21:29:09 +00:00
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
2017-07-05 18:07:55 +00:00
===== 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
2017-07-05 18:07:55 +00:00
===== 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
2017-07-16 21:29:09 +00:00
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
2017-07-16 21:29:09 +00:00
430 ********************************
2017-07-05 18:07:55 +00:00
===== Page 9 =====
2017-07-16 21:29:09 +00:00
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 *
2017-07-16 21:29:09 +00:00
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
2017-07-05 18:07:55 +00:00
===== Page 10 =====
2017-07-16 21:29:09 +00:00
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
2017-07-16 21:29:09 +00:00
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
2017-07-16 21:29:09 +00:00
544
2017-07-05 18:07:55 +00:00
===== Page 11 =====
2017-07-16 21:29:09 +00:00
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
2017-07-16 21:29:09 +00:00
8336: A0 02 601 LDY #2 ; send 2 dummy crc bytes
===== Page 12 =====
2017-07-05 18:07:55 +00:00
2017-07-16 21:29:09 +00:00
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
2017-07-16 21:29:09 +00:00
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
2017-07-05 18:07:55 +00:00
2017-07-16 21:29:09 +00:00
--End assembly, 952 bytes, Errors: 0
2017-07-05 18:07:55 +00:00
Symbol table - alphabetical order:
2017-07-16 21:29:09 +00:00
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
2017-07-16 21:29:09 +00:00
DIV =$C082 DRIVER =$805A DUMMY =$FF FORMAT =$838A
GETR1 =$81EB GETR3 =$8206 INIT =$8100 INSLP =$801F
INSLP2 =$8038 INSOUT =$8059 R30 =$0478 R31 =$04F8
2017-07-16 21:29:09 +00:00
R32 =$0578 R33 =$05F8 READ =$82B0 SLOT =$3D
SLOT16 =$2B SS =$C083 SS0 =$0E SSNONE =$0F
STATUS =$82A8 WORK =$3C WRITE =$82FA
2017-07-05 18:07:55 +00:00
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
2017-07-16 21:29:09 +00:00
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
2017-07-05 17:08:54 +00:00