AppleIISd/AppleIISd.lst

914 lines
38 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.7
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
22-OCT-17 20:21
14
15 XC ; enable 65C02 code
16 DEBUG = 0
17 DO DEBUG
18 ORG $8000
19 ELSE
20 ORG $C700 ; 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 DCMD = $42 ; Command code
32 BUFFER = $44 ; Buffer address
33 BLOCK = $46 ; Block number
34
35 CURSLOT = $07F8 ; $Cs
36 DATA = $C080
37 CTRL = DATA+1
38 DIV = DATA+2
39 SS = DATA+3
40 R30 = $0478
41 R31 = $04F8
42 R32 = $0578
43 R33 = $05F8
44 RAM0 = $0678
45 RAM1 = $06F8
46
47 * Constants
48
49 DUMMY = $FF
50 FRX = $10 ; CTRL register
51 ECE = $04
52 SS0 = $01 ; SS register
53 WP = $20
54 CD = $40
55 INITED = $80
56
57
58 * signature bytes
59
C700: A2 20 60 LDX #$20
C702: A0 00 61 LDY #$00
C704: A2 03 62 LDX #$03
C706: A0 FF 63 LDY #$FF ; neither 5.25 nor Smartport
64
65 * find slot nr
66
67 DO DEBUG
68 LDA #$04
69 STA SLOT
70 LDA #$C4
71 STA CURSLOT
72 LDA #$40
73
74 ELSE
C708: 20 58 FF 75 JSR $FF58
C70B: BA 76 TSX
C70C: BD 00 01 77 LDA $0100,X
C70F: 8D F8 07 78 STA CURSLOT ; $Cs
C712: 29 0F 79 AND #$0F
C714: 85 3D 80 STA SLOT ; $0s
C716: 0A 81 ASL A
C717: 0A 82 ASL A
C718: 0A 83 ASL A
C719: 0A 84 ASL A
85 FIN
86
C71A: 85 2B 87 STA SLOT16 ; $s0
C71C: AA 88 TAX ; X holds now SLOT16
C71D: 2C FF CF 89 BIT $CFFF
C720: 20 A9 C9 90 JSR CARDDET
C723: 90 03 91 BCC :INIT
C725: A9 2F 92 LDA #$2F ; no card inserted
C727: 00 93 BRK
94
C728: 20 00 C8 95 :INIT JSR INIT
96
97
98 ********************************
99 *
100 * Install SD card driver
101 *
102 ********************************
103
104 DO DEBUG
105
106 * see if slot has a driver already
107
108 LDX $BF31 ; get devcnt
109 INSTALL LDA $BF32,X ; get a devnum
110 AND #$70 ; isolate slot
111 CMP SLOT16 ; slot?
112 BEQ :INSOUT ; yes, skip it
113 DEX
114 BPL INSTALL ; keep up the search
115
116 * restore the devnum to the list
117
118 LDX $BF31 ; get devcnt again
119 CPX #$0D ; device table full?
120 BNE :INST2
121
122 JSR $FF3A ; bell
123 JMP :INSOUT ; do something!
124
125 :INST2 LDA $BF32-1,X ; move all entries down
126 STA $BF32,X ; to make room at front
127 DEX ; for a new entry
128 BNE :INST2
129 LDA #$04 ; ProFile type device
130 ORA SLOT16
131 STA $BF32 ; slot, drive 1 at top of list
132 INC $BF31 ; update devcnt
133
134 * now insert the device driver vector
135
136 LDA SLOT
137 ASL
138 TAX
139 LDA #<DRIVER
140 STA $BF10,X ; write to driver table
141 LDA #>DRIVER
142 STA $BF11,X
143 :INSOUT RTS
144
145
146 ********************************
147 *
148 * Boot from SD card
149 *
150 ********************************
151
152 ELSE
153
C72B: C9 00 154 BOOT CMP #0 ; check for error
C72D: F0 01 155 BEQ :BOOT1
C72F: 00 156 BRK
157
C730: A9 01 158 :BOOT1 LDA #$01
C732: 85 42 159 STA DCMD ; load command
C734: A6 2B 160 LDX SLOT16
C736: 85 43 161 STA $43 ; slot number
C738: 64 44 162 STZ BUFFER ; buffer lo
C73A: A9 08 163 LDA #$08
C73C: 85 45 164 STA BUFFER+1 ; buffer hi
C73E: 64 46 165 STZ BLOCK ; block lo
C740: 64 47 166 STZ BLOCK+1 ; block hi
C742: 2C FF CF 167 BIT $CFFF
C745: 20 CF C9 168 JSR READ ; call driver
C748: 4C 01 08 169 JMP $801 ; goto bootloader
170
171 FIN
172
173
174 ********************************
175 *
176 * Jump table
177 *
178 ********************************
179
C74B: D8 180 DRIVER CLD
181
182 DO DEBUG
183 LDA #$04
184 STA SLOT
185 LDA #$C4
186 STA CURSLOT
187 LDA #$40
188
189 ELSE
C74C: 20 58 FF 190 JSR $FF58 ; find slot nr
C74F: BA 191 TSX
C750: BD 00 01 192 LDA $0100,X
C753: 8D F8 07 193 STA CURSLOT ; $Cs
C756: 29 0F 194 AND #$0F
C758: 85 3D 195 STA SLOT ; $0s
C75A: 0A 196 ASL A
C75B: 0A 197 ASL A
C75C: 0A 198 ASL A
C75D: 0A 199 ASL A
200 FIN
201
C75E: 85 2B 202 STA SLOT16 ; $s0
C760: AA 203 TAX ; X holds now SLOT16
C761: 2C FF CF 204 BIT $CFFF
C764: 20 A9 C9 205 JSR CARDDET
C767: 90 04 206 BCC :INITED
C769: A9 2F 207 LDA #$2F ; no card inserted
C76B: 80 1F 208 BRA :DONE
209
C76D: A9 80 210 :INITED LDA #INITED ; check for init
C76F: 3C 83 C0 211 BIT SS,X
C772: F0 29 212 BEQ :INIT
213
C774: A5 42 214 :CMD LDA DCMD ; get command
C776: C9 00 215 CMP #0
C778: F0 14 216 BEQ :STATUS
C77A: C9 01 217 CMP #1
C77C: F0 13 218 BEQ :READ
C77E: C9 02 219 CMP #2
C780: F0 12 220 BEQ :WRITE
C782: C9 03 221 CMP #3
C784: F0 11 222 BEQ :FORMAT
C786: C9 FF 223 CMP #$FF
C788: F0 10 224 BEQ :TEST
C78A: A9 01 225 LDA #1 ; unknown command
226
C78C: 38 227 :DONE SEC
C78D: 60 228 RTS
229
C78E: 4C C1 C9 230 :STATUS JMP STATUS
C791: 4C CF C9 231 :READ JMP READ
C794: 4C 38 CA 232 :WRITE JMP WRITE
C797: 4C A9 CA 233 :FORMAT JMP FORMAT
C79A: 4C AD CA 234 :TEST JMP TEST ; do device test
C79D: 20 00 C8 235 :INIT JSR INIT
C7A0: B0 EA 236 BCS :DONE ; init failure
C7A2: 80 D0 237 BRA :CMD
238
239
240 * Signature bytes
241
C7A4: 00 00 00 242 DS \ ; fill with zeroes
C7A7: 00 00 00 00
C7AB: 00 00 00 00
C7AF: 00 00 00 00
C7B3: 00 00 00 00
C7B7: 00 00 00 00
C7BB: 00 00 00 00
C7BF: 00 00 00 00
C7C3: 00 00 00 00
C7C7: 00 00 00 00
C7CB: 00 00 00 00
C7CF: 00 00 00 00
C7D3: 00 00 00 00
C7D7: 00 00 00 00
C7DB: 00 00 00 00
C7DF: 00 00 00 00
C7E3: 00 00 00 00
C7E7: 00 00 00 00
C7EB: 00 00 00 00
C7EF: 00 00 00 00
C7F3: 00 00 00 00
C7F7: 00 00 00 00
C7FB: 00 00 00 00
C7FF: 00
243 DS -4 ; locate to $xxFC
C7FC: FF FF 244 DW $FFFF ; 65535 blocks
C7FE: 17 245 DB $17 ; Status bits
C7FF: 4B 246 DB #<DRIVER ; LSB of driver
247
248 ********************************
249 *
250 * Initialize SD card
251 *
252 * C Clear - No error
253 * Set - Error
254 * A $00 - No error
255 * $27 - I/O error - Init failed
256 * $2F - No card inserted
257 *
258 ********************************
259
C800: D8 260 INIT CLD
C801: A9 03 261 LDA #$03 ; set SPI mode 3
C803: 9D 81 C0 262 STA CTRL,X
C806: BD 83 C0 263 LDA SS,X
C809: 09 01 264 ORA #SS0 ; set CS high
C80B: 9D 83 C0 265 STA SS,X
C80E: A9 07 266 LDA #7
C810: 9D 82 C0 267 STA DIV,X
C813: A0 0A 268 LDY #10
C815: A9 FF 269 LDA #DUMMY
270
C817: 9D 80 C0 271 :LOOP STA DATA,X
C81A: 3C 81 C0 272 :WAIT BIT CTRL,X
C81D: 10 FB 273 BPL :WAIT
C81F: 88 274 DEY
C820: D0 F5 275 BNE :LOOP ; do 10 times
C822: BD 83 C0 276 LDA SS,X
C825: 29 FE 277 AND #$FF!SS0 ; set CS low
C827: 9D 83 C0 278 STA SS,X
279
C82A: A9 31 280 LDA #<CMD0 ; send CMD0
C82C: 85 40 281 STA CMDLO
C82E: A9 CB 282 LDA #>CMD0
C830: 85 41 283 STA CMDHI
C832: 20 EB C8 284 JSR CMD
C835: 20 FF C8 285 JSR GETR1 ; get response
C838: C9 01 286 CMP #$01
C83A: D0 39 287 BNE :ERROR1 ; error!
288
C83C: A9 3D 289 LDA #<CMD8 ; send CMD8
C83E: 85 40 290 STA CMDLO
C840: A9 CB 291 LDA #>CMD8
C842: 85 41 292 STA CMDHI
C844: 20 EB C8 293 JSR CMD
C847: 20 1A C9 294 JSR GETR3
C84A: C9 01 295 CMP #$01
C84C: D0 2A 296 BNE :SDV1 ; may be SD Ver. 1
297
298 * check for $01aa match!
C84E: A9 49 299 :SDV2 LDA #<CMD55
C850: 85 40 300 STA CMDLO
C852: A9 CB 301 LDA #>CMD55
C854: 85 41 302 STA CMDHI
C856: 20 EB C8 303 JSR CMD
C859: 20 FF C8 304 JSR GETR1
C85C: A9 4F 305 LDA #<ACMD4140
C85E: 85 40 306 STA CMDLO
C860: A9 CB 307 LDA #>ACMD4140
C862: 85 41 308 STA CMDHI
C864: 20 EB C8 309 JSR CMD
C867: 20 FF C8 310 JSR GETR1
C86A: C9 01 311 CMP #$01
C86C: F0 E0 312 BEQ :SDV2 ; wait for ready
C86E: C9 00 313 CMP #$00
C870: D0 03 314 BNE :ERROR1 ; error!
315 * send CMD58
316 * SD Ver. 2 initialized!
C872: 4C B2 C8 317 JMP :BLOCKSZ
318
C875: 4C D9 C8 319 :ERROR1 JMP :IOERROR ; needed for far jump
320
C878: A9 49 321 :SDV1 LDA #<CMD55
C87A: 85 40 322 STA CMDLO
C87C: A9 CB 323 LDA #>CMD55
C87E: 85 41 324 STA CMDHI
C880: 20 EB C8 325 JSR CMD ; ignore response
C883: A9 55 326 LDA #<ACMD410
C885: 85 40 327 STA CMDLO
C887: A9 CB 328 LDA #>ACMD410
C889: 85 41 329 STA CMDHI
C88B: 20 EB C8 330 JSR CMD
C88E: 20 FF C8 331 JSR GETR1
C891: C9 01 332 CMP #$01
C893: F0 E3 333 BEQ :SDV1 ; wait for ready
C895: C9 00 334 CMP #$00
C897: D0 03 335 BNE :MMC ; may be MMC card
336 * SD Ver. 1 initialized!
C899: 4C B2 C8 337 JMP :BLOCKSZ
338
C89C: A9 37 339 :MMC LDA #<CMD1
C89E: 85 40 340 STA CMDLO
C8A0: A9 CB 341 LDA #>CMD1
C8A2: 85 41 342 STA CMDHI
C8A4: 20 EB C8 343 :LOOP1 JSR CMD
C8A7: 20 FF C8 344 JSR GETR1
C8AA: C9 01 345 CMP #$01
C8AC: F0 F6 346 BEQ :LOOP1 ; wait for ready
C8AE: C9 00 347 CMP #$00
C8B0: D0 27 348 BNE :IOERROR ; error!
349 * MMC Ver. 3 initialized!
350
C8B2: A9 43 351 :BLOCKSZ LDA #<CMD16
C8B4: 85 40 352 STA CMDLO
C8B6: A9 CB 353 LDA #>CMD16
C8B8: 85 41 354 STA CMDHI
C8BA: 20 EB C8 355 JSR CMD
C8BD: 20 FF C8 356 JSR GETR1
C8C0: C9 00 357 CMP #$00
C8C2: D0 15 358 BNE :IOERROR ; error!
359
C8C4: BD 83 C0 360 :END LDA SS,X
C8C7: 09 80 361 ORA #INITED ; initialized
C8C9: 9D 83 C0 362 STA SS,X
C8CC: BD 81 C0 363 LDA CTRL,X
C8CF: 09 04 364 ORA #ECE ; enable 7MHz
C8D1: 9D 81 C0 365 STA CTRL,X
C8D4: 18 366 CLC ; all ok
C8D5: A0 00 367 LDY #0
C8D7: 90 03 368 BCC :END1
C8D9: 38 369 :IOERROR SEC
C8DA: A0 27 370 LDY #$27 ; init error
C8DC: BD 83 C0 371 :END1 LDA SS,X ; set CS high
C8DF: 09 01 372 ORA #SS0
C8E1: 9D 83 C0 373 STA SS,X
C8E4: A9 00 374 LDA #0 ; set div to 2
C8E6: 9D 82 C0 375 STA DIV,X
C8E9: 98 376 TYA ; retval in A
C8EA: 60 377 RTS
378
379
380 ********************************
381 *
382 * Send SD command
383 * Call with command in CMDHI and CMDLO
384 *
385 ********************************
386
C8EB: 5A 387 CMD PHY
C8EC: A0 00 388 LDY #0
C8EE: B1 40 389 :LOOP LDA (CMDLO),Y
C8F0: 9D 80 C0 390 STA DATA,X
C8F3: 3C 81 C0 391 :WAIT BIT CTRL,X ; TC is in N
C8F6: 10 FB 392 BPL :WAIT
C8F8: C8 393 INY
C8F9: C0 06 394 CPY #6
C8FB: 90 F1 395 BCC :LOOP
C8FD: 7A 396 PLY
C8FE: 60 397 RTS
398
399
400 ********************************
401 *
402 * Get R1
403 * R1 is in A
404 *
405 ********************************
406
C8FF: A9 FF 407 GETR1 LDA #DUMMY
C901: 9D 80 C0 408 STA DATA,X
C904: 3C 81 C0 409 :WAIT BIT CTRL,X
C907: 10 FB 410 BPL :WAIT
C909: BD 80 C0 411 LDA DATA,X ; get response
C90C: 85 3C 412 STA WORK ; save R1
C90E: 29 80 413 AND #$80
C910: D0 ED 414 BNE GETR1 ; wait for MSB=0
C912: A9 FF 415 LDA #DUMMY
C914: 9D 80 C0 416 STA DATA,X ; send another dummy
C917: A5 3C 417 LDA WORK ; restore R1
C919: 60 418 RTS
419
420
421 ********************************
422 *
423 * Get R3
424 * R1 is in A
425 * R3 is in scratchpad ram
426 *
427 ********************************
428
C91A: 20 FF C8 429 GETR3 JSR GETR1 ; get R1 first
C91D: 48 430 PHA ; save R1
C91E: 5A 431 PHY ; save Y
C91F: A0 04 432 LDY #04 ; load counter
C921: A9 FF 433 :LOOP LDA #DUMMY ; send dummy
C923: 9D 80 C0 434 STA DATA,X
C926: 3C 81 C0 435 :WAIT BIT CTRL,X
C929: 10 FB 436 BPL :WAIT
C92B: BD 80 C0 437 LDA DATA,X
C92E: 48 438 PHA
C92F: 88 439 DEY
C930: D0 EF 440 BNE :LOOP ; do 4 times
C932: A4 3D 441 LDY SLOT
C934: 68 442 PLA
C935: 99 F8 05 443 STA R33,Y ; save R3
C938: 68 444 PLA
C939: 99 78 05 445 STA R32,Y
C93C: 68 446 PLA
C93D: 99 F8 04 447 STA R31,Y
C940: 68 448 PLA
C941: 99 78 04 449 STA R30,Y
C944: 7A 450 PLY ; restore Y
C945: A9 FF 451 LDA #DUMMY
C947: 9D 80 C0 452 STA DATA,X ; send another dummy
C94A: 68 453 PLA ; restore R1
C94B: 60 454 RTS
455
456
457 ********************************
458 *
459 * Calculate block address
460 * Unit number is in $43 DSSS0000
461 * Block no is in $46-47
462 * Address is in R30-R33
463 *
464 ********************************
465
C94C: DA 466 GETBLOCK PHX ; save X
C94D: 5A 467 PHY ; save Y
C94E: A6 3D 468 LDX SLOT
C950: A5 46 469 LDA BLOCK ; store block num
C952: 9D F8 05 470 STA R33,X ; in R30-R33
C955: A5 47 471 LDA BLOCK+1
C957: 9D 78 05 472 STA R32,X
C95A: A9 00 473 LDA #0
C95C: 9D F8 04 474 STA R31,X
C95F: 9D 78 04 475 STA R30,X
476
C962: A9 80 477 LDA #$80 ; drive number
C964: 24 43 478 BIT $43
C966: F0 05 479 BEQ :SHIFT ; D1
C968: A9 01 480 LDA #1 ; D2
C96A: 9D F8 04 481 STA R31,X
482
C96D: A0 09 483 :SHIFT LDY #9 ; ASL can't be used with Y
C96F: 1E F8 05 484 :LOOP ASL R33,X ; mul block num
C972: 3E 78 05 485 ROL R32,X ; by 512 to get
C975: 3E F8 04 486 ROL R31,X ; real address
C978: 3E 78 04 487 ROL R30,X
C97B: 88 488 DEY
C97C: D0 F1 489 BNE :LOOP
C97E: 7A 490 PLY ; restore Y
C97F: FA 491 PLX ; restore X
C980: 60 492 RTS
493
494
495 ********************************
496 *
497 * Send SD command
498 * Cmd is in A
499 *
500 ********************************
501
C981: 5A 502 COMMAND PHY ; save Y
C982: A4 3D 503 LDY SLOT
C984: 9D 80 C0 504 STA DATA,X ; send command
C987: B9 78 04 505 LDA R30,Y ; get arg from R30 on
C98A: 9D 80 C0 506 STA DATA,X
C98D: B9 F8 04 507 LDA R31,Y
C990: 9D 80 C0 508 STA DATA,X
C993: B9 78 05 509 LDA R32,Y
C996: 9D 80 C0 510 STA DATA,X
C999: B9 F8 05 511 LDA R33,Y
C99C: 9D 80 C0 512 STA DATA,X
C99F: A9 FF 513 LDA #DUMMY
C9A1: 9D 80 C0 514 STA DATA,X ; dummy crc
C9A4: 20 FF C8 515 JSR GETR1
C9A7: 7A 516 PLY ; restore Y
C9A8: 60 517 RTS
518
519
520 ********************************
521 *
522 * Check for card detect
523 *
524 * C Clear - card in slot
525 * Set - no card in slot
526 *
527 ********************************
528
C9A9: 48 529 CARDDET PHA
C9AA: A9 40 530 LDA #CD ; 0: card in
C9AC: 3C 83 C0 531 BIT SS,X ; 1: card out
C9AF: 18 532 CLC
C9B0: F0 01 533 BEQ :DONE ; card is in
C9B2: 38 534 SEC ; card is out
C9B3: 68 535 :DONE PLA
C9B4: 60 536 RTS
537
538
539 ********************************
540 *
541 * Check for write protect
542 *
543 * C Clear - card not protected
544 * Set - card write protected
545 *
546 ********************************
547
C9B5: 48 548 WRPROT PHA
C9B6: A9 20 549 LDA #WP ; 0: write enabled
C9B8: 3C 83 C0 550 BIT SS,X ; 1: write disabled
C9BB: 18 551 CLC
C9BC: F0 01 552 BEQ :DONE
C9BE: 38 553 SEC
C9BF: 68 554 :DONE PLA
C9C0: 60 555 RTS
556
557
558 ********************************
559 *
560 * Status request
561 * $43 Unit number DSSS000
562 * $44-45 Unused
563 * $46-47 Unused
564 *
565 * C Clear - No error
566 * Set - Error
567 * A $00 - No error
568 * $2B - Card write protected
569 * $2F - No card inserted
570 * X - Blocks avail (low byte)
571 * Y - Blocks avail (high byte)
572 *
573 ********************************
574
C9C1: A9 00 575 STATUS LDA #0 ; no error
C9C3: A2 FF 576 LDX #$FF ; 32 MB partition
C9C5: A0 FF 577 LDY #$FF
578
C9C7: 20 B5 C9 579 JSR WRPROT
C9CA: 90 02 580 BCC :DONE
C9CC: A9 2B 581 LDA #$2B ; card write protected
582
C9CE: 60 583 :DONE RTS
584
585
586 ********************************
587 *
588 * Read 512 byte block
589 * $43 Unit number DSSS0000
590 * $44-45 Address (LO/HI) of buffer
591 * $46-47 Block number (LO/HI)
592 *
593 * C Clear - No error
594 * Set - Error
595 * A $00 - No error
596 * $27 - Bad block number
597 *
598 ********************************
599
C9CF: 20 4C C9 600 READ JSR GETBLOCK ; calc block address
601
C9D2: BD 83 C0 602 LDA SS,X ; enable /CS
C9D5: 29 FE 603 AND #$FF!SS0
C9D7: 9D 83 C0 604 STA SS,X
C9DA: A9 51 605 LDA #$51 ; send CMD17
C9DC: 20 81 C9 606 JSR COMMAND ; send command
607
C9DF: C9 00 608 CMP #0 ; check for error
C9E1: D0 50 609 BNE :ERROR
610
C9E3: A9 FF 611 :GETTOK LDA #DUMMY ; get data token
C9E5: 9D 80 C0 612 STA DATA,X
C9E8: BD 80 C0 613 LDA DATA,X ; get response
C9EB: C9 FE 614 CMP #$FE
C9ED: D0 F4 615 BNE :GETTOK ; wait for $FE
616
C9EF: A0 02 617 LDY #2 ; read data from card
C9F1: BD 81 C0 618 LDA CTRL,X ; enable FRX
C9F4: 09 10 619 ORA #FRX
C9F6: 9D 81 C0 620 STA CTRL,X
C9F9: A9 FF 621 LDA #DUMMY
C9FB: 9D 80 C0 622 STA DATA,X
C9FE: 64 3C 623 :LOOPY STZ WORK
CA00: BD 80 C0 624 :LOOPW LDA DATA,X
CA03: 92 44 625 STA (BUFFER)
CA05: E6 44 626 INC BUFFER
CA07: D0 02 627 BNE :INW
CA09: E6 45 628 INC BUFFER+1 ; inc msb on page boundary
CA0B: E6 3C 629 :INW INC WORK
CA0D: D0 F1 630 BNE :LOOPW
CA0F: 88 631 DEY
CA10: D0 EC 632 BNE :LOOPY
633
CA12: BD 80 C0 634 :CRC LDA DATA,X ; read two bytes crc
CA15: BD 80 C0 635 LDA DATA,X ; and ignore
CA18: BD 80 C0 636 LDA DATA,X ; read a dummy byte
637
CA1B: BD 81 C0 638 LDA CTRL,X ; disable FRX
CA1E: 29 EF 639 AND #$FF!FRX
CA20: 9D 81 C0 640 STA CTRL,X
CA23: 18 641 CLC ; no error
CA24: A9 00 642 LDA #0
643
CA26: 08 644 :DONE PHP
CA27: 48 645 PHA
CA28: BD 83 C0 646 LDA SS,X
CA2B: 09 01 647 ORA #SS0
CA2D: 9D 83 C0 648 STA SS,X ; disable /CS
CA30: 68 649 PLA
CA31: 28 650 PLP
CA32: 60 651 RTS
652
CA33: 38 653 :ERROR SEC ; an error occured
CA34: A9 27 654 LDA #$27
CA36: 80 EE 655 BRA :DONE
656
657
658 ********************************
659 *
660 * Write 512 byte block
661 * $43 Unit number DSSS0000
662 * $44-45 Address (LO/HI) of buffer
663 * $46-47 Block number (LO/HI)
664 *
665 * C Clear - No error
666 * Set - Error
667 * A $00 - No error
668 * $27 - I/O error or bad block number
669 * $2B - Card write protected
670 *
671 ********************************
672
CA38: 20 B5 C9 673 WRITE JSR WRPROT
CA3B: B0 67 674 BCS :WPERROR ; card write protected
675
CA3D: 20 4C C9 676 JSR GETBLOCK ; calc block address
677
CA40: BD 83 C0 678 LDA SS,X ; enable /CS
CA43: 29 FE 679 AND #$FF!SS0
CA45: 9D 83 C0 680 STA SS,X
CA48: A9 58 681 LDA #$58 ; send CMD24
CA4A: 20 81 C9 682 JSR COMMAND ; send command
683
CA4D: C9 00 684 CMP #0 ; check for error
CA4F: D0 4E 685 BNE :IOERROR
686
CA51: A9 FF 687 LDA #DUMMY
CA53: 9D 80 C0 688 STA DATA,X ; send dummy
CA56: A9 FE 689 LDA #$FE
CA58: 9D 80 C0 690 STA DATA,X ; send data token
691
CA5B: A0 02 692 LDY #2 ; send data to card
CA5D: 64 3C 693 :LOOPY STZ WORK
CA5F: B2 44 694 :LOOPW LDA (BUFFER)
CA61: 9D 80 C0 695 STA DATA,X
CA64: E6 44 696 INC BUFFER
CA66: D0 02 697 BNE :INW
CA68: E6 45 698 INC BUFFER+1 ; inc msb on page boundary
CA6A: E6 3C 699 :INW INC WORK
CA6C: D0 F1 700 BNE :LOOPW
CA6E: 88 701 DEY
CA6F: D0 EC 702 BNE :LOOPY
703
CA71: 9D 80 C0 704 :CRC STA DATA,X ; send 2 dummy crc bytes
CA74: 9D 80 C0 705 STA DATA,X
706
CA77: 9D 80 C0 707 STA DATA,X ; get data response
CA7A: BD 80 C0 708 LDA DATA,X
CA7D: 29 1F 709 AND #$1F
CA7F: C9 05 710 CMP #$05
CA81: D0 1C 711 BNE :IOERROR ; check for write error
CA83: 18 712 CLC ; no error
CA84: A9 00 713 LDA #0
714
CA86: 08 715 :DONE PHP
CA87: 48 716 PHA
CA88: A9 FF 717 :WAIT LDA #DUMMY
CA8A: 9D 80 C0 718 STA DATA,X ; wait for write cycle
CA8D: BD 80 C0 719 LDA DATA,X ; to complete
CA90: C9 00 720 CMP #$00
CA92: F0 F4 721 BEQ :WAIT
722
CA94: BD 83 C0 723 LDA SS,X ; disable /CS
CA97: 09 01 724 ORA #SS0
CA99: 9D 83 C0 725 STA SS,X
CA9C: 68 726 PLA
CA9D: 28 727 PLP
CA9E: 60 728 RTS
729
CA9F: 38 730 :IOERROR SEC ; an error occured
CAA0: A9 27 731 LDA #$27
CAA2: 80 E2 732 BRA :DONE
733
CAA4: 38 734 :WPERROR SEC
CAA5: A9 2B 735 LDA #$2B
CAA7: 80 DD 736 BRA :DONE
737
738
739
740 ********************************
741 *
742 * Format
743 * not supported!
744 *
745 ********************************
746
CAA9: 38 747 FORMAT SEC
CAAA: A9 01 748 LDA #$01 ; invalid command
CAAC: 60 749 RTS
750
751
752 ********************************
753 *
754 * Test routine
755 *
756 ********************************
757
758 TEST
759
760 * get buffer
CAAD: A4 3D 761 LDY SLOT
CAAF: A9 02 762 LDA #2 ; get 512 byte buffer
CAB1: 20 F5 BE 763 JSR $BEF5 ; call GETBUFR
CAB4: B0 79 764 BCS :ERROR
CAB6: 99 F8 06 765 STA RAM1,Y
CAB9: 85 45 766 STA BUFFER+1
CABB: A9 00 767 LDA #0
CABD: 99 78 06 768 STA RAM0,Y
CAC0: 85 44 769 STA BUFFER
770
771 * fill buffer
CAC2: A0 00 772 LDY #0
CAC4: 98 773 :LOOP TYA
CAC5: 91 44 774 STA (BUFFER),Y
CAC7: C8 775 INY
CAC8: D0 FA 776 BNE :LOOP
CACA: E6 45 777 INC BUFFER+1
CACC: 98 778 :LOOP1 TYA
CACD: 91 44 779 STA (BUFFER),Y
CACF: C8 780 INY
CAD0: D0 FA 781 BNE :LOOP1
782
783 * write to card
CAD2: A9 02 784 LDA #2 ; write cmd
CAD4: A4 3D 785 LDY SLOT
CAD6: 85 42 786 STA DCMD
CAD8: AD 78 06 787 LDA RAM0 ; buffer address
CADB: 85 44 788 STA BUFFER
CADD: B9 F8 06 789 LDA RAM1,Y
CAE0: 85 45 790 STA BUFFER+1
CAE2: 64 46 791 STZ BLOCK ; block number
CAE4: 64 47 792 STZ BLOCK+1
CAE6: A6 2B 793 LDX SLOT16
CAE8: 20 4B C7 794 JSR DRIVER
CAEB: B0 42 795 BCS :ERROR
796
797 * read from card
CAED: A9 01 798 LDA #1 ; read cmd
CAEF: A4 3D 799 LDY SLOT
CAF1: 85 42 800 STA DCMD
CAF3: B9 78 06 801 LDA RAM0,Y ; buffer address
CAF6: 85 44 802 STA BUFFER
CAF8: B9 F8 06 803 LDA RAM1,Y
CAFB: 85 45 804 STA BUFFER+1
CAFD: 64 46 805 STZ BLOCK ; block number
CAFF: 64 47 806 STZ BLOCK+1
CB01: A6 2B 807 LDX SLOT16
CB03: 20 4B C7 808 JSR DRIVER
CB06: B0 27 809 BCS :ERROR
810
811 * check for errors
CB08: A4 3D 812 LDY SLOT
CB0A: B9 78 06 813 LDA RAM0,Y ; buffer address
CB0D: 85 44 814 STA BUFFER
CB0F: B9 F8 06 815 LDA RAM1,Y
CB12: 85 45 816 STA BUFFER+1
CB14: A0 00 817 LDY #0
CB16: 98 818 :LOOP2 TYA
CB17: D1 44 819 CMP (BUFFER),Y
CB19: D0 15 820 BNE :ERRCMP ; error in buffer
CB1B: C8 821 INY
CB1C: D0 F8 822 BNE :LOOP2
CB1E: E6 45 823 INC BUFFER+1
CB20: 98 824 :LOOP3 TYA
CB21: D1 44 825 CMP (BUFFER),Y
CB23: D0 0B 826 BNE :ERRCMP
CB25: C8 827 INY
CB26: D0 F8 828 BNE :LOOP3
829
830 * free buffer
CB28: 20 F8 BE 831 JSR $BEF8 ; call FREEBUFR
CB2B: 18 832 CLC
CB2C: A9 00 833 LDA #0
CB2E: 60 834 RTS
835
CB2F: 00 836 :ERROR BRK
CB30: 00 837 :ERRCMP BRK
838
839
CB31: 40 00 00 840 CMD0 HEX 400000
CB34: 00 00 95 841 HEX 000095
CB37: 41 00 00 842 CMD1 HEX 410000
CB3A: 00 00 F9 843 HEX 0000F9
CB3D: 48 00 00 844 CMD8 HEX 480000
CB40: 01 AA 87 845 HEX 01AA87
CB43: 50 00 00 846 CMD16 HEX 500000
CB46: 02 00 FF 847 HEX 0200FF
CB49: 77 00 00 848 CMD55 HEX 770000
CB4C: 00 00 65 849 HEX 000065
CB4F: 69 40 00 850 ACMD4140 HEX 694000
CB52: 00 00 77 851 HEX 000077
CB55: 69 00 00 852 ACMD410 HEX 690000
CB58: 00 00 FF 853 HEX 0000FF
--End assembly, 1115 bytes, Errors: 0
Symbol table - alphabetical order:
ACMD410 =$CB55 ACMD4140=$CB4F BLOCK =$46 ? BOOT =$C72B
BUFFER =$44 CARDDET =$C9A9 CD =$40 CMD =$C8EB
CMD0 =$CB31 CMD1 =$CB37 CMD16 =$CB43 CMD55 =$CB49
CMD8 =$CB3D CMDHI =$41 CMDLO =$40 COMMAND =$C981
CTRL =$C081 CURSLOT =$07F8 DATA =$C080 DCMD =$42
DEBUG =$00 DIV =$C082 DRIVER =$C74B DUMMY =$FF
ECE =$04 FORMAT =$CAA9 FRX =$10 GETBLOCK=$C94C
GETR1 =$C8FF GETR3 =$C91A INIT =$C800 INITED =$80
R30 =$0478 R31 =$04F8 R32 =$0578 R33 =$05F8
RAM0 =$0678 RAM1 =$06F8 READ =$C9CF SLOT =$3D
SLOT16 =$2B SS =$C083 SS0 =$01 STATUS =$C9C1
TEST =$CAAD WORK =$3C WP =$20 WRITE =$CA38
WRPROT =$C9B5
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 DCMD =$42
BUFFER =$44 BLOCK =$46 INITED =$80 DUMMY =$FF
R30 =$0478 R31 =$04F8 R32 =$0578 R33 =$05F8
RAM0 =$0678 RAM1 =$06F8 CURSLOT =$07F8 DATA =$C080
CTRL =$C081 DIV =$C082 SS =$C083 ? BOOT =$C72B
DRIVER =$C74B INIT =$C800 CMD =$C8EB GETR1 =$C8FF
GETR3 =$C91A GETBLOCK=$C94C COMMAND =$C981 CARDDET =$C9A9
WRPROT =$C9B5 STATUS =$C9C1 READ =$C9CF WRITE =$CA38
FORMAT =$CAA9 TEST =$CAAD CMD0 =$CB31 CMD1 =$CB37
CMD8 =$CB3D CMD16 =$CB43 CMD55 =$CB49 ACMD4140=$CB4F
ACMD410 =$CB55