AppleIISd/AppleIISd.lst

827 lines
34 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.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
9-SEP-17 19:55
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 CD = $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
69 ELSE
C808: 20 58 FF 70 JSR $FF58
C80B: BA 71 TSX
C80C: BD 00 01 72 LDA $0100,X
C80F: 8D F8 07 73 STA CURSLOT ; $Cs
C812: 29 0F 74 AND #$0F
C814: 85 3D 75 STA SLOT ; $0s
C816: 0A 76 ASL A
C817: 0A 77 ASL A
C818: 0A 78 ASL A
C819: 0A 79 ASL A
C81A: 85 2B 80 STA SLOT16 ; $s0
81 FIN
82
C81C: AA 83 TAX ; X holds now SLOT16
C81D: 2C FF CF 84 BIT $CFFF
C820: 20 B0 CA 85 JSR CARDDET
C823: 90 03 86 BCC :INIT
C825: A9 27 87 LDA #$27 ; no card inserted
C827: 00 88 BRK
89
C828: 20 00 C9 90 :INIT JSR INIT
91
92
93 ********************************
94 *
95 * Install SD card driver
96 *
97 ********************************
98
99 DO DEBUG
100
101 * see if slot has a driver already
102
103 LDX $BF31 ; get devcnt
104 INSTALL LDA $BF32,X ; get a devnum
105 AND #$70 ; isolate slot
106 CMP SLOT16 ; slot?
107 BEQ :INSOUT ; yes, skip it
108 DEX
109 BPL INSTALL ; keep up the search
110
111 * restore the devnum to the list
112
113 LDX $BF31 ; get devcnt again
114 CPX #$0D ; device table full?
115 BNE :INST2
116
117 JSR $FF3A ; bell
118 JMP :INSOUT ; do something!
119
120 :INST2 LDA $BF32-1,X ; move all entries down
121 STA $BF32,X ; to make room at front
122 DEX ; for a new entry
123 BNE :INST2
124 LDA #$04 ; ProFile type device
125 ORA SLOT16
126 STA $BF32 ; slot, drive 1 at top of list
127 INC $BF31 ; update devcnt
128
129 * now insert the device driver vector
130
131 LDA SLOT
132 ASL
133 TAX
134 LDA #<DRIVER
135 STA $BF10,X ; write to driver table
136 LDA #>DRIVER
137 STA $BF11,X
138 :INSOUT RTS
139
140
141 ********************************
142 *
143 * Boot from SD card
144 *
145 ********************************
146
147 ELSE
148
C82B: C9 00 149 BOOT CMP #0 ; check for error
C82D: F0 01 150 BEQ :BOOT1
C82F: 00 151 BRK
152
C830: A9 01 153 :BOOT1 LDA #$01
C832: 85 42 154 STA $42 ; load command
C834: A5 2B 155 LDA SLOT16
C836: AA 156 TAX
C837: 85 43 157 STA $43 ; slot number
C839: 64 44 158 STZ $44 ; buffer lo
C83B: A9 08 159 LDA #$08
C83D: 85 45 160 STA $45 ; buffer hi
C83F: 64 46 161 STZ $46 ; block lo
C841: 64 47 162 STZ $47 ; block hi
C843: 2C FF CF 163 BIT $CFFF
C846: 20 D6 CA 164 JSR READ ; call driver
C849: 4C 01 08 165 JMP $801 ; goto bootloader
166
167 FIN
168
169
170 ********************************
171 *
172 * Jump table
173 *
174 ********************************
175
C84C: D8 176 DRIVER CLD
177
178 DO DEBUG
179 LDA #$04
180 STA SLOT
181 LDA #$C4
182 STA CURSLOT
183 LDA #$40
184 STA SLOT16
185
186 ELSE
C84D: 20 58 FF 187 JSR $FF58 ; find slot nr
C850: BA 188 TSX
C851: BD 00 01 189 LDA $0100,X
C854: 8D F8 07 190 STA CURSLOT ; $Cs
C857: 29 0F 191 AND #$0F
C859: 85 3D 192 STA SLOT ; $0s
C85B: 0A 193 ASL A
C85C: 0A 194 ASL A
C85D: 0A 195 ASL A
C85E: 0A 196 ASL A
C85F: 85 2B 197 STA SLOT16 ; $s0
198 FIN
199
C861: AA 200 TAX ; X holds now SLOT16
C862: 2C FF CF 201 BIT $CFFF
C865: 20 B0 CA 202 JSR CARDDET
C868: 90 04 203 BCC :INITED
C86A: A9 27 204 LDA #$27 ; no card inserted
C86C: 80 1B 205 BRA :DONE
206
C86E: A9 80 207 :INITED LDA #INITED ; check for init
C870: 3C 83 C0 208 BIT SS,X
C873: F0 22 209 BEQ :INIT
210
C875: A5 42 211 :CMD LDA $42 ; get command
C877: C9 00 212 CMP #0
C879: F0 10 213 BEQ :STATUS
C87B: C9 01 214 CMP #1
C87D: F0 0F 215 BEQ :READ
C87F: C9 02 216 CMP #2
C881: F0 0E 217 BEQ :WRITE
C883: C9 03 218 CMP #3
C885: F0 0D 219 BEQ :FORMAT
C887: A9 01 220 LDA #1 ; unknown command
221
C889: 38 222 :DONE SEC
C88A: 60 223 RTS
224
C88B: 4C C8 CA 225 :STATUS JMP STATUS
C88E: 4C D6 CA 226 :READ JMP READ
C891: 4C 44 CB 227 :WRITE JMP WRITE
C894: 4C BA CB 228 :FORMAT JMP FORMAT
C897: 20 00 C9 229 :INIT JSR INIT
C89A: 80 D9 230 BRA :CMD
231
232
233 * Signature bytes
234
C89C: 00 00 00 235 DS \ ; fill with zeroes
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
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
236 DS -4 ; locate to $xxFC
C8FC: 00 00 237 DW $0000 ; use status request
C8FE: 17 238 DB $17 ; Status bits
C8FF: 4C 239 DB #<DRIVER ; LSB of driver
240
241
242 ********************************
243 *
244 * Initialize SD card
245 *
246 * C Clear - No error
247 * Set - Error
248 * A $00 - No error
249 * $27 - I/O error - Init failed
250 * $28 - No card inserted
251 *
252 ********************************
253
C900: D8 254 INIT CLD
C901: A9 03 255 LDA #$03 ; set SPI mode 3
C903: 9D 81 C0 256 STA CTRL,X
C906: BD 83 C0 257 LDA SS,X
C909: 09 01 258 ORA #SS0 ; set CS high
C90B: 9D 83 C0 259 STA SS,X
C90E: A9 07 260 LDA #7
C910: 9D 82 C0 261 STA DIV,X
C913: A0 0A 262 LDY #10
C915: A9 FF 263 LDA #DUMMY
264
C917: 9D 80 C0 265 :LOOP STA DATA,X
C91A: 3C 81 C0 266 :WAIT BIT CTRL,X
C91D: 10 FB 267 BPL :WAIT
C91F: 88 268 DEY
C920: D0 F5 269 BNE :LOOP ; do 10 times
C922: BD 83 C0 270 LDA SS,X
C925: 29 FE 271 AND #$FF!SS0 ; set CS low
C927: 9D 83 C0 272 STA SS,X
273
C92A: A9 BE 274 LDA #<CMD0 ; send CMD0
C92C: 85 40 275 STA CMDLO
C92E: A9 CB 276 LDA #>CMD0
C930: 85 41 277 STA CMDHI
C932: 20 F2 C9 278 JSR CMD
C935: 20 06 CA 279 JSR GETR1 ; get response
C938: C9 01 280 CMP #$01
C93A: D0 39 281 BNE :ERROR1 ; error!
282
C93C: A9 CA 283 LDA #<CMD8 ; send CMD8
C93E: 85 40 284 STA CMDLO
C940: A9 CB 285 LDA #>CMD8
C942: 85 41 286 STA CMDHI
C944: 20 F2 C9 287 JSR CMD
C947: 20 21 CA 288 JSR GETR3
C94A: C9 01 289 CMP #$01
C94C: D0 2A 290 BNE :SDV1 ; may be SD Ver. 1
291
292 * check for $01aa match!
C94E: A9 D6 293 :SDV2 LDA #<CMD55
C950: 85 40 294 STA CMDLO
C952: A9 CB 295 LDA #>CMD55
C954: 85 41 296 STA CMDHI
C956: 20 F2 C9 297 JSR CMD
C959: 20 06 CA 298 JSR GETR1
C95C: A9 DC 299 LDA #<ACMD4140
C95E: 85 40 300 STA CMDLO
C960: A9 CB 301 LDA #>ACMD4140
C962: 85 41 302 STA CMDHI
C964: 20 F2 C9 303 JSR CMD
C967: 20 06 CA 304 JSR GETR1
C96A: C9 01 305 CMP #$01
C96C: F0 E0 306 BEQ :SDV2 ; wait for ready
C96E: C9 00 307 CMP #$00
C970: D0 03 308 BNE :ERROR1 ; error!
309 * send CMD58
310 * SD Ver. 2 initialized!
C972: 4C B2 C9 311 JMP :BLOCKSZ
312
C975: 4C E0 C9 313 :ERROR1 JMP :IOERROR ; needed for far jump
314
C978: A9 D6 315 :SDV1 LDA #<CMD55
C97A: 85 40 316 STA CMDLO
C97C: A9 CB 317 LDA #>CMD55
C97E: 85 41 318 STA CMDHI
C980: 20 F2 C9 319 JSR CMD ; ignore response
C983: A9 E2 320 LDA #<ACMD410
C985: 85 40 321 STA CMDLO
C987: A9 CB 322 LDA #>ACMD410
C989: 85 41 323 STA CMDHI
C98B: 20 F2 C9 324 JSR CMD
C98E: 20 06 CA 325 JSR GETR1
C991: C9 01 326 CMP #$01
C993: F0 E3 327 BEQ :SDV1 ; wait for ready
C995: C9 00 328 CMP #$00
C997: D0 03 329 BNE :MMC ; may be MMC card
330 * SD Ver. 1 initialized!
C999: 4C B2 C9 331 JMP :BLOCKSZ
332
C99C: A9 C4 333 :MMC LDA #<CMD1
C99E: 85 40 334 STA CMDLO
C9A0: A9 CB 335 LDA #>CMD1
C9A2: 85 41 336 STA CMDHI
C9A4: 20 F2 C9 337 :LOOP1 JSR CMD
C9A7: 20 06 CA 338 JSR GETR1
C9AA: C9 01 339 CMP #$01
C9AC: F0 F6 340 BEQ :LOOP1 ; wait for ready
C9AE: C9 00 341 CMP #$00
C9B0: D0 2E 342 BNE :IOERROR ; error!
343 * MMC Ver. 3 initialized!
344
C9B2: A9 D0 345 :BLOCKSZ LDA #<CMD16
C9B4: 85 40 346 STA CMDLO
C9B6: A9 CB 347 LDA #>CMD16
C9B8: 85 41 348 STA CMDHI
C9BA: 20 F2 C9 349 JSR CMD
C9BD: 20 06 CA 350 JSR GETR1
C9C0: C9 00 351 CMP #$00
C9C2: D0 1C 352 BNE :IOERROR ; error!
353
C9C4: A4 3D 354 :END LDY SLOT
C9C6: BD 83 C0 355 LDA SS,X
C9C9: 09 80 356 ORA #INITED ; initialized
C9CB: 9D 83 C0 357 STA SS,X
C9CE: BD 81 C0 358 LDA CTRL,X
C9D1: 09 04 359 ORA #ECE ; enable 7MHz
C9D3: 9D 81 C0 360 STA CTRL,X
C9D6: 18 361 CLC ; all ok
C9D7: A0 00 362 LDY #0
C9D9: 90 08 363 BCC :END1
C9DB: 38 364 :CDERROR SEC
C9DC: A0 28 365 LDY #$28 ; no card error
C9DE: B0 03 366 BCS :END1
C9E0: 38 367 :IOERROR SEC
C9E1: A0 27 368 LDY #$27 ; init error
C9E3: BD 83 C0 369 :END1 LDA SS,X ; set CS high
C9E6: 09 01 370 ORA #SS0
C9E8: 9D 83 C0 371 STA SS,X
C9EB: A9 00 372 LDA #0 ; set div to 2
C9ED: 9D 82 C0 373 STA DIV,X
C9F0: 98 374 TYA ; retval in A
C9F1: 60 375 RTS
376
377
378 ********************************
379 *
380 * Send SD command
381 * Call with command in CMDHI and CMDLO
382 *
383 ********************************
384
C9F2: 5A 385 CMD PHY
C9F3: A0 00 386 LDY #0
C9F5: B1 40 387 :LOOP LDA (CMDLO),Y
C9F7: 9D 80 C0 388 STA DATA,X
C9FA: 3C 81 C0 389 :WAIT BIT CTRL,X ; TC is in N
C9FD: 10 FB 390 BPL :WAIT
C9FF: C8 391 INY
CA00: C0 06 392 CPY #6
CA02: 90 F1 393 BCC :LOOP
CA04: 7A 394 PLY
CA05: 60 395 RTS
396
397
398 ********************************
399 *
400 * Get R1
401 * R1 is in A
402 *
403 ********************************
404
CA06: A9 FF 405 GETR1 LDA #DUMMY
CA08: 9D 80 C0 406 STA DATA,X
CA0B: 3C 81 C0 407 :WAIT BIT CTRL,X
CA0E: 10 FB 408 BPL :WAIT
CA10: BD 80 C0 409 LDA DATA,X ; get response
CA13: 85 3C 410 STA WORK ; save R1
CA15: 29 80 411 AND #$80
CA17: D0 ED 412 BNE GETR1 ; wait for MSB=0
CA19: A9 FF 413 LDA #DUMMY
CA1B: 9D 80 C0 414 STA DATA,X ; send another dummy
CA1E: A5 3C 415 LDA WORK ; restore R1
CA20: 60 416 RTS
417
418
419 ********************************
420 *
421 * Get R3
422 * R1 is in A
423 * R3 is in scratchpad ram
424 *
425 ********************************
426
CA21: 20 06 CA 427 GETR3 JSR GETR1 ; get R1 first
CA24: 48 428 PHA ; save R1
CA25: 5A 429 PHY ; save Y
CA26: A0 04 430 LDY #04 ; load counter
CA28: A9 FF 431 :LOOP LDA #DUMMY ; send dummy
CA2A: 9D 80 C0 432 STA DATA,X
CA2D: 3C 81 C0 433 :WAIT BIT CTRL,X
CA30: 10 FB 434 BPL :WAIT
CA32: BD 80 C0 435 LDA DATA,X
CA35: 48 436 PHA
CA36: 88 437 DEY
CA37: D0 EF 438 BNE :LOOP ; do 4 times
CA39: A4 3D 439 LDY SLOT
CA3B: 68 440 PLA
CA3C: 99 F8 05 441 STA R33,Y ; save R3
CA3F: 68 442 PLA
CA40: 99 78 05 443 STA R32,Y
CA43: 68 444 PLA
CA44: 99 F8 04 445 STA R31,Y
CA47: 68 446 PLA
CA48: 99 78 04 447 STA R30,Y
CA4B: 7A 448 PLY ; restore Y
CA4C: A9 FF 449 LDA #DUMMY
CA4E: 9D 80 C0 450 STA DATA,X ; send another dummy
CA51: 68 451 PLA ; restore R1
CA52: 60 452 RTS
453
454
455 ********************************
456 *
457 * Calculate block address
458 * Unit number is in $43 DSSS0000
459 * Block no is in $46-47
460 * Address is in R30-R33
461 *
462 ********************************
463
CA53: DA 464 BLOCK PHX ; save X
CA54: 5A 465 PHY ; save Y
CA55: A6 3D 466 LDX SLOT
CA57: A5 46 467 LDA $46 ; store block num
CA59: 9D F8 05 468 STA R33,X ; in R30-R33
CA5C: A5 47 469 LDA $47
CA5E: 9D 78 05 470 STA R32,X
CA61: A9 00 471 LDA #0
CA63: 9D F8 04 472 STA R31,X
CA66: 9D 78 04 473 STA R30,X
474
CA69: A9 80 475 LDA #$80 ; drive number
CA6B: 24 43 476 BIT $43
CA6D: F0 05 477 BEQ :SHIFT ; D1
CA6F: A9 01 478 LDA #1 ; D2
CA71: 9D F8 04 479 STA R31,X
480
CA74: A0 09 481 :SHIFT LDY #9 ; ASL can't be used with Y
CA76: 1E F8 05 482 :LOOP ASL R33,X ; mul block num
CA79: 3E 78 05 483 ROL R32,X ; by 512 to get
CA7C: 3E F8 04 484 ROL R31,X ; real address
CA7F: 3E 78 04 485 ROL R30,X
CA82: 88 486 DEY
CA83: D0 F1 487 BNE :LOOP
CA85: 7A 488 PLY ; restore Y
CA86: FA 489 PLX ; restore X
CA87: 60 490 RTS
491
492
493 ********************************
494 *
495 * Send SD command
496 * Cmd is in A
497 *
498 ********************************
499
CA88: 5A 500 COMMAND PHY ; save Y
CA89: A4 3D 501 LDY SLOT
CA8B: 9D 80 C0 502 STA DATA,X ; send command
CA8E: B9 78 04 503 LDA R30,Y ; get arg from R30 on
CA91: 9D 80 C0 504 STA DATA,X
CA94: B9 F8 04 505 LDA R31,Y
CA97: 9D 80 C0 506 STA DATA,X
CA9A: B9 78 05 507 LDA R32,Y
CA9D: 9D 80 C0 508 STA DATA,X
CAA0: B9 F8 05 509 LDA R33,Y
CAA3: 9D 80 C0 510 STA DATA,X
CAA6: A9 FF 511 LDA #DUMMY
CAA8: 9D 80 C0 512 STA DATA,X ; dummy crc
CAAB: 20 06 CA 513 JSR GETR1
CAAE: 7A 514 PLY ; restore Y
CAAF: 60 515 RTS
516
517
518 ********************************
519 *
520 * Check for card detect
521 *
522 * C Clear - card in slot
523 * Set - no card in slot
524 *
525 ********************************
526
CAB0: 48 527 CARDDET PHA
CAB1: A9 40 528 LDA #CD ; 0: card in
CAB3: 3C 83 C0 529 BIT SS,X ; 1: card out
CAB6: 18 530 CLC
CAB7: F0 01 531 BEQ :DONE ; card is in
CAB9: 38 532 SEC ; card is out
CABA: 68 533 :DONE PLA
CABB: 60 534 RTS
535
536
537 ********************************
538 *
539 * Check for write protect
540 *
541 * C Clear - card not protected
542 * Set - card write protected
543 *
544 ********************************
545
CABC: 48 546 WRPROT PHA
CABD: A9 20 547 LDA #WP ; 0: write enabled
CABF: 3C 83 C0 548 BIT SS,X ; 1: write disabled
CAC2: 18 549 CLC
CAC3: F0 01 550 BEQ :DONE
CAC5: 38 551 SEC
CAC6: 68 552 :DONE PLA
CAC7: 60 553 RTS
554
555
556 ********************************
557 *
558 * Status request
559 * $43 Unit number DSSS000
560 * $44-45 Unused
561 * $46-47 Unused
562 *
563 * C Clear - No error
564 * Set - Error
565 * A $00 - No error
566 * $27 - I/O error
567 * $28 - No card inserted / no init
568 * $2B - Card write protected
569 * X - Blocks avail (low byte)
570 * Y - Blocks avail (high byte)
571 *
572 ********************************
573
CAC8: A9 00 574 STATUS LDA #0 ; no error
CACA: A2 FF 575 LDX #$FF ; 32 MB partition
CACC: A0 FF 576 LDY #$FF
577
CACE: 20 BC CA 578 JSR WRPROT
CAD1: 90 02 579 BCC :DONE
CAD3: A9 2B 580 LDA #$2B ; card write protected
581
CAD5: 60 582 :DONE RTS
583
584
585 ********************************
586 *
587 * Read 512 byte block
588 * $43 Unit number DSSS0000
589 * $44-45 Address (LO/HI) of buffer
590 * $46-47 Block number (LO/HI)
591 *
592 * C Clear - No error
593 * Set - Error
594 * A $00 - No error
595 * $27 - Bad block number
596 * $28 - No card inserted
597 *
598 ********************************
599
CAD6: 20 B0 CA 600 READ JSR CARDDET
CAD9: B0 64 601 BCS :ERROR ; no card inserted
602
CADB: 20 53 CA 603 JSR BLOCK ; calc block address
604
CADE: BD 83 C0 605 LDA SS,X ; enable /CS
CAE1: 29 FE 606 AND #$FF!SS0
CAE3: 9D 83 C0 607 STA SS,X
CAE6: A9 51 608 LDA #$51 ; send CMD17
CAE8: 20 88 CA 609 JSR COMMAND ; send command
610
CAEB: C9 00 611 CMP #0 ; check for error
CAED: D0 50 612 BNE :ERROR
613
CAEF: A9 FF 614 :GETTOK LDA #DUMMY ; get data token
CAF1: 9D 80 C0 615 STA DATA,X
CAF4: BD 80 C0 616 LDA DATA,X ; get response
CAF7: C9 FE 617 CMP #$FE
CAF9: D0 F4 618 BNE :GETTOK ; wait for $FE
619
CAFB: A0 02 620 LDY #2 ; read data from card
CAFD: BD 81 C0 621 LDA CTRL,X ; enable FRX
CB00: 09 10 622 ORA #FRX
CB02: 9D 81 C0 623 STA CTRL,X
CB05: A9 FF 624 LDA #DUMMY
CB07: 9D 80 C0 625 STA DATA,X
CB0A: 64 3C 626 :LOOPY STZ WORK
CB0C: BD 80 C0 627 :LOOPW LDA DATA,X
CB0F: 92 44 628 STA ($44)
CB11: E6 44 629 INC $44
CB13: D0 02 630 BNE :INW
CB15: E6 45 631 INC $45 ; inc msb on page boundary
CB17: E6 3C 632 :INW INC WORK
CB19: D0 F1 633 BNE :LOOPW
CB1B: 88 634 DEY
CB1C: D0 EC 635 BNE :LOOPY
636
CB1E: BD 80 C0 637 :CRC LDA DATA,X ; read two bytes crc
CB21: BD 80 C0 638 LDA DATA,X ; and ignore
CB24: BD 80 C0 639 LDA DATA,X ; read a dummy byte
640
CB27: BD 81 C0 641 LDA CTRL,X ; disable FRX
CB2A: 29 EF 642 AND #$FF!FRX
CB2C: 9D 81 C0 643 STA CTRL,X
CB2F: 18 644 CLC ; no error
CB30: A9 00 645 LDA #0
646
CB32: 08 647 :DONE PHP
CB33: 48 648 PHA
CB34: BD 83 C0 649 LDA SS,X
CB37: 09 01 650 ORA #SS0
CB39: 9D 83 C0 651 STA SS,X ; disable /CS
CB3C: 68 652 PLA
CB3D: 28 653 PLP
CB3E: 60 654 RTS
655
CB3F: 38 656 :ERROR SEC ; an error occured
CB40: A9 27 657 LDA #$27
CB42: 80 EE 658 BRA :DONE
659
660
661 ********************************
662 *
663 * Write 512 byte block
664 * $43 Unit number DSSS0000
665 * $44-45 Address (LO/HI) of buffer
666 * $46-47 Block number (LO/HI)
667 *
668 * C Clear - No error
669 * Set - Error
670 * A $00 - No error
671 * $27 - I/O error or bad block number
672 * $2B - Card write protected
673 *
674 ********************************
675
CB44: 20 B0 CA 676 WRITE JSR CARDDET
CB47: B0 67 677 BCS :IOERROR ; no card inserted
678
CB49: 20 BC CA 679 JSR WRPROT
CB4C: B0 67 680 BCS :WPERROR ; card write protected
681
CB4E: 20 53 CA 682 JSR BLOCK ; calc block address
683
CB51: BD 83 C0 684 LDA SS,X ; enable /CS
CB54: 29 FE 685 AND #$FF!SS0
CB56: 9D 83 C0 686 STA SS,X
CB59: A9 58 687 LDA #$58 ; send CMD24
CB5B: 20 88 CA 688 JSR COMMAND ; send command
689
CB5E: C9 00 690 CMP #0 ; check for error
CB60: D0 4E 691 BNE :IOERROR
692
CB62: A9 FF 693 LDA #DUMMY
CB64: 9D 80 C0 694 STA DATA,X ; send dummy
CB67: A9 FE 695 LDA #$FE
CB69: 9D 80 C0 696 STA DATA,X ; send data token
697
CB6C: A0 02 698 LDY #2 ; send data to card
CB6E: 64 3C 699 :LOOPY STZ WORK
CB70: B2 44 700 :LOOPW LDA ($44)
CB72: 9D 80 C0 701 STA DATA,X
CB75: E6 44 702 INC $44
CB77: D0 02 703 BNE :INW
CB79: E6 45 704 INC $45 ; inc msb on page boundary
CB7B: E6 3C 705 :INW INC WORK
CB7D: D0 F1 706 BNE :LOOPW
CB7F: 88 707 DEY
CB80: D0 EC 708 BNE :LOOPY
709
CB82: 9D 80 C0 710 :CRC STA DATA,X ; send 2 dummy crc bytes
CB85: 9D 80 C0 711 STA DATA,X
712
CB88: 9D 80 C0 713 STA DATA,X ; get data response
CB8B: BD 80 C0 714 LDA DATA,X
CB8E: 29 1F 715 AND #$1F
CB90: C9 05 716 CMP #$05
CB92: D0 1C 717 BNE :IOERROR ; check for write error
CB94: 18 718 CLC ; no error
CB95: A9 00 719 LDA #0
720
CB97: 08 721 :DONE PHP
CB98: 48 722 PHA
CB99: A9 FF 723 :WAIT LDA #DUMMY
CB9B: 9D 80 C0 724 STA DATA,X ; wait for write cycle
CB9E: BD 80 C0 725 LDA DATA,X ; to complete
CBA1: C9 00 726 CMP #$00
CBA3: F0 F4 727 BEQ :WAIT
728
CBA5: BD 83 C0 729 LDA SS,X ; disable /CS
CBA8: 09 01 730 ORA #SS0
CBAA: 9D 83 C0 731 STA SS,X
CBAD: 68 732 PLA
CBAE: 28 733 PLP
CBAF: 60 734 RTS
735
CBB0: 38 736 :IOERROR SEC ; an error occured
CBB1: A9 27 737 LDA #$27
CBB3: 80 E2 738 BRA :DONE
739
CBB5: 38 740 :WPERROR SEC
CBB6: A9 2B 741 LDA #$2B
CBB8: 80 DD 742 BRA :DONE
743
744
745
746 ********************************
747 *
748 * Format
749 * not supported!
750 *
751 ********************************
752
CBBA: 38 753 FORMAT SEC
CBBB: A9 01 754 LDA #$01 ; invalid command
CBBD: 60 755 RTS
756
757
CBBE: 40 00 00 758 CMD0 HEX 400000
CBC1: 00 00 95 759 HEX 000095
CBC4: 41 00 00 760 CMD1 HEX 410000
CBC7: 00 00 F9 761 HEX 0000F9
CBCA: 48 00 00 762 CMD8 HEX 480000
CBCD: 01 AA 87 763 HEX 01AA87
CBD0: 50 00 00 764 CMD16 HEX 500000
CBD3: 02 00 FF 765 HEX 0200FF
CBD6: 77 00 00 766 CMD55 HEX 770000
CBD9: 00 00 65 767 HEX 000065
CBDC: 69 40 00 768 ACMD4140 HEX 694000
CBDF: 00 00 77 769 HEX 000077
CBE2: 69 00 00 770 ACMD410 HEX 690000
CBE5: 00 00 FF 771 HEX 0000FF
--End assembly, 1000 bytes, Errors: 0
Symbol table - alphabetical order:
ACMD410 =$CBE2 ACMD4140=$CBDC BLOCK =$CA53 ? BOOT =$C82B
CARDDET =$CAB0 CD =$40 CMD =$C9F2 CMD0 =$CBBE
CMD1 =$CBC4 CMD16 =$CBD0 CMD55 =$CBD6 CMD8 =$CBCA
CMDHI =$41 CMDLO =$40 COMMAND =$CA88 CTRL =$C081
CURSLOT =$07F8 DATA =$C080 DEBUG =$00 DIV =$C082
DRIVER =$C84C DUMMY =$FF ECE =$04 FORMAT =$CBBA
FRX =$10 GETR1 =$CA06 GETR3 =$CA21 INIT =$C900
INITED =$80 R30 =$0478 R31 =$04F8 R32 =$0578
R33 =$05F8 READ =$CAD6 SLOT =$3D SLOT16 =$2B
SS =$C083 SS0 =$01 STATUS =$CAC8 WORK =$3C
WP =$20 WRITE =$CB44 WRPROT =$CABC
Symbol table - numerical order:
DEBUG =$00 SS0 =$01 ECE =$04 FRX =$10
WP =$20 SLOT16 =$2B WORK =$3C SLOT =$3D
CMDLO =$40 CD =$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 =$C82B DRIVER =$C84C
INIT =$C900 CMD =$C9F2 GETR1 =$CA06 GETR3 =$C<><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ύ<EFBFBD><CF8D><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E48DAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EE8D8D><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> READ =$CADF WRITE =$CB4D FORMAT =$CBC3
CMD0 =$CBC7 CMD1 =$CBCD <20>CBDF ACMD4140=$CBE5 ACMD410 =$CBEB