AppleIISd/AppleIISd.lst

914 lines
38 KiB
Plaintext
Raw Normal View History

1 ********************************
2 *
3 * Apple][Sd Firmware
2017-10-15 14:48:13 +00:00
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 ********************************
2017-08-27 13:02:58 +00:00
12
22-OCT-17 20:21
2017-08-27 13:02:58 +00:00
14
15 XC ; enable 65C02 code
2017-08-27 13:02:58 +00:00
16 DEBUG = 0
17 DO DEBUG
18 ORG $8000
19 ELSE
20 ORG $C700 ; Expansion ROM
2017-08-27 13:02:58 +00:00
21 FIN
22
23 * Memory defines
2017-08-27 13:02:58 +00:00
24
25 SLOT16 = $2B ; $s0 -> slot * 16
2017-08-27 13:02:58 +00:00
26 WORK = $3C
27 SLOT = $3D ; $0s
2017-08-27 13:02:58 +00:00
28 CMDLO = $40
29 CMDHI = $41
30
2017-10-15 14:48:13 +00:00
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
2017-10-15 14:48:13 +00:00
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
2017-10-16 22:06:33 +00:00
96
97
98 ********************************
99 *
100 * Install SD card driver
101 *
102 ********************************
103
104 DO DEBUG
2017-10-15 14:48:13 +00:00
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
2017-10-16 22:06:33 +00:00
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
2017-10-16 22:06:33 +00:00
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
2017-10-16 22:06:33 +00:00
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
2017-10-16 22:06:33 +00:00
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
2017-10-16 22:06:33 +00:00
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
2017-10-16 22:06:33 +00:00
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
2017-10-16 22:06:33 +00:00
556
557
558 ********************************
559 *
560 * Status request
561 * $43 Unit number DSSS000
562 * $44-45 Unused
563 * $46-47 Unused
2017-10-16 22:06:33 +00:00
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 ********************************
2017-10-16 22:06:33 +00:00
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
2017-10-16 22:06:33 +00:00
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
2017-10-16 22:06:33 +00:00
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
2017-10-15 14:48:13 +00:00
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
2017-10-16 22:06:33 +00:00
737
738
2017-10-16 22:06:33 +00:00
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
2017-10-16 22:06:33 +00:00
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
2017-10-16 22:06:33 +00:00
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
2017-08-27 13:02:58 +00:00
2017-08-27 13:02:58 +00:00
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
2017-10-15 14:48:13 +00:00
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
2017-10-15 14:48:13 +00:00
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:
2017-08-27 13:02:58 +00:00
DEBUG =$00 SS0 =$01 ECE =$04 FRX =$10
WP =$20 SLOT16 =$2B WORK =$3C SLOT =$3D
2017-10-15 14:48:13 +00:00
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