AppleIISd/AppleIISd.lst

1205 lines
44 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
2017-10-16 22:06:33 +00:00
16-OCT-17 23:58
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 $C800 ; 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
45 * Constants
46
47 DUMMY = $FF
48 FRX = $10 ; CTRL register
49 ECE = $04
50 SS0 = $01 ; SS register
51 WP = $20
52 CD = $40
53 INITED = $80
54
55
2017-10-16 22:06:33 +00:00
56 ********************************
57 *
58 * Initialize SD card
59 *
60 * C Clear - No error
61 * Set - Error
62 * A $00 - No error
63 * $27 - I/O error - Init failed
64 * $2F - No card inserted
65 *
66 ********************************
67
C800: D8 68 INIT CLD
C801: A9 03 69 LDA #$03 ; set SPI mode 3
C803: 9D 81 C0 70 STA CTRL,X
C806: BD 83 C0 71 LDA SS,X
C809: 09 01 72 ORA #SS0 ; set CS high
C80B: 9D 83 C0 73 STA SS,X
C80E: A9 07 74 LDA #7
C810: 9D 82 C0 75 STA DIV,X
C813: A0 0A 76 LDY #10
C815: A9 FF 77 LDA #DUMMY
78
C817: 9D 80 C0 79 :LOOP STA DATA,X
C81A: 3C 81 C0 80 :WAIT BIT CTRL,X
C81D: 10 FB 81 BPL :WAIT
C81F: 88 82 DEY
C820: D0 F5 83 BNE :LOOP ; do 10 times
C822: BD 83 C0 84 LDA SS,X
C825: 29 FE 85 AND #$FF!SS0 ; set CS low
C827: 9D 83 C0 86 STA SS,X
87
C82A: A9 C5 88 LDA #<CMD0 ; send CMD0
C82C: 85 40 89 STA CMDLO
C82E: A9 CA 90 LDA #>CMD0
C830: 85 41 91 STA CMDHI
C832: 20 F0 C8 92 JSR CMD
C835: 20 04 C9 93 JSR GETR1 ; get response
C838: C9 01 94 CMP #$01
C83A: D0 39 95 BNE :ERROR1 ; error!
96
C83C: A9 D1 97 LDA #<CMD8 ; send CMD8
C83E: 85 40 98 STA CMDLO
C840: A9 CA 99 LDA #>CMD8
C842: 85 41 100 STA CMDHI
C844: 20 F0 C8 101 JSR CMD
C847: 20 1F C9 102 JSR GETR3
C84A: C9 01 103 CMP #$01
C84C: D0 2A 104 BNE :SDV1 ; may be SD Ver. 1
2017-10-15 14:48:13 +00:00
105
2017-10-16 22:06:33 +00:00
106 * check for $01aa match!
C84E: A9 DD 107 :SDV2 LDA #<CMD55
C850: 85 40 108 STA CMDLO
C852: A9 CA 109 LDA #>CMD55
C854: 85 41 110 STA CMDHI
C856: 20 F0 C8 111 JSR CMD
C859: 20 04 C9 112 JSR GETR1
C85C: A9 E3 113 LDA #<ACMD4140
C85E: 85 40 114 STA CMDLO
C860: A9 CA 115 LDA #>ACMD4140
C862: 85 41 116 STA CMDHI
C864: 20 F0 C8 117 JSR CMD
C867: 20 04 C9 118 JSR GETR1
C86A: C9 01 119 CMP #$01
C86C: F0 E0 120 BEQ :SDV2 ; wait for ready
C86E: C9 00 121 CMP #$00
C870: D0 03 122 BNE :ERROR1 ; error!
123 * send CMD58
124 * SD Ver. 2 initialized!
C872: 4C B2 C8 125 JMP :BLOCKSZ
126
C875: 4C DE C8 127 :ERROR1 JMP :IOERROR ; needed for far jump
128
C878: A9 DD 129 :SDV1 LDA #<CMD55
C87A: 85 40 130 STA CMDLO
C87C: A9 CA 131 LDA #>CMD55
C87E: 85 41 132 STA CMDHI
C880: 20 F0 C8 133 JSR CMD ; ignore response
C883: A9 E9 134 LDA #<ACMD410
C885: 85 40 135 STA CMDLO
C887: A9 CA 136 LDA #>ACMD410
C889: 85 41 137 STA CMDHI
C88B: 20 F0 C8 138 JSR CMD
C88E: 20 04 C9 139 JSR GETR1
C891: C9 01 140 CMP #$01
C893: F0 E3 141 BEQ :SDV1 ; wait for ready
C895: C9 00 142 CMP #$00
C897: D0 03 143 BNE :MMC ; may be MMC card
144 * SD Ver. 1 initialized!
C899: 4C B2 C8 145 JMP :BLOCKSZ
146
C89C: A9 CB 147 :MMC LDA #<CMD1
C89E: 85 40 148 STA CMDLO
C8A0: A9 CA 149 LDA #>CMD1
C8A2: 85 41 150 STA CMDHI
C8A4: 20 F0 C8 151 :LOOP1 JSR CMD
C8A7: 20 04 C9 152 JSR GETR1
C8AA: C9 01 153 CMP #$01
C8AC: F0 F6 154 BEQ :LOOP1 ; wait for ready
C8AE: C9 00 155 CMP #$00
C8B0: D0 2C 156 BNE :IOERROR ; error!
157 * MMC Ver. 3 initialized!
158
C8B2: A9 D7 159 :BLOCKSZ LDA #<CMD16
C8B4: 85 40 160 STA CMDLO
C8B6: A9 CA 161 LDA #>CMD16
C8B8: 85 41 162 STA CMDHI
C8BA: 20 F0 C8 163 JSR CMD
C8BD: 20 04 C9 164 JSR GETR1
C8C0: C9 00 165 CMP #$00
C8C2: D0 1A 166 BNE :IOERROR ; error!
167
C8C4: BD 83 C0 168 :END LDA SS,X
C8C7: 09 80 169 ORA #INITED ; initialized
C8C9: 9D 83 C0 170 STA SS,X
C8CC: BD 81 C0 171 LDA CTRL,X
C8CF: 09 04 172 ORA #ECE ; enable 7MHz
C8D1: 9D 81 C0 173 STA CTRL,X
C8D4: 18 174 CLC ; all ok
C8D5: A0 00 175 LDY #0
C8D7: 90 08 176 BCC :END1
C8D9: 38 177 :CDERROR SEC
C8DA: A0 2F 178 LDY #$2F ; no card error
C8DC: B0 03 179 BCS :END1
C8DE: 38 180 :IOERROR SEC
C8DF: A0 27 181 LDY #$27 ; init error
C8E1: BD 83 C0 182 :END1 LDA SS,X ; set CS high
C8E4: 09 01 183 ORA #SS0
C8E6: 9D 83 C0 184 STA SS,X
C8E9: A9 00 185 LDA #0 ; set div to 2
C8EB: 9D 82 C0 186 STA DIV,X
C8EE: 98 187 TYA ; retval in A
C8EF: 60 188 RTS
189
190
191 ********************************
192 *
193 * Send SD command
194 * Call with command in CMDHI and CMDLO
195 *
196 ********************************
197
C8F0: 5A 198 CMD PHY
C8F1: A0 00 199 LDY #0
C8F3: B1 40 200 :LOOP LDA (CMDLO),Y
C8F5: 9D 80 C0 201 STA DATA,X
C8F8: 3C 81 C0 202 :WAIT BIT CTRL,X ; TC is in N
C8FB: 10 FB 203 BPL :WAIT
C8FD: C8 204 INY
C8FE: C0 06 205 CPY #6
C900: 90 F1 206 BCC :LOOP
C902: 7A 207 PLY
C903: 60 208 RTS
209
210
211 ********************************
212 *
213 * Get R1
214 * R1 is in A
215 *
216 ********************************
217
C904: A9 FF 218 GETR1 LDA #DUMMY
C906: 9D 80 C0 219 STA DATA,X
C909: 3C 81 C0 220 :WAIT BIT CTRL,X
C90C: 10 FB 221 BPL :WAIT
C90E: BD 80 C0 222 LDA DATA,X ; get response
C911: 85 3C 223 STA WORK ; save R1
C913: 29 80 224 AND #$80
C915: D0 ED 225 BNE GETR1 ; wait for MSB=0
C917: A9 FF 226 LDA #DUMMY
C919: 9D 80 C0 227 STA DATA,X ; send another dummy
C91C: A5 3C 228 LDA WORK ; restore R1
C91E: 60 229 RTS
230
231
232 ********************************
233 *
234 * Get R3
235 * R1 is in A
236 * R3 is in scratchpad ram
237 *
238 ********************************
239
C91F: 20 04 C9 240 GETR3 JSR GETR1 ; get R1 first
C922: 48 241 PHA ; save R1
C923: 5A 242 PHY ; save Y
C924: A0 04 243 LDY #04 ; load counter
C926: A9 FF 244 :LOOP LDA #DUMMY ; send dummy
C928: 9D 80 C0 245 STA DATA,X
C92B: 3C 81 C0 246 :WAIT BIT CTRL,X
C92E: 10 FB 247 BPL :WAIT
C930: BD 80 C0 248 LDA DATA,X
C933: 48 249 PHA
C934: 88 250 DEY
C935: D0 EF 251 BNE :LOOP ; do 4 times
C937: A4 3D 252 LDY SLOT
C939: 68 253 PLA
C93A: 99 F8 05 254 STA R33,Y ; save R3
C93D: 68 255 PLA
C93E: 99 78 05 256 STA R32,Y
C941: 68 257 PLA
C942: 99 F8 04 258 STA R31,Y
C945: 68 259 PLA
C946: 99 78 04 260 STA R30,Y
C949: 7A 261 PLY ; restore Y
C94A: A9 FF 262 LDA #DUMMY
C94C: 9D 80 C0 263 STA DATA,X ; send another dummy
C94F: 68 264 PLA ; restore R1
C950: 60 265 RTS
266
267
268 ********************************
269 *
270 * Calculate block address
271 * Unit number is in $43 DSSS0000
272 * Block no is in $46-47
273 * Address is in R30-R33
274 *
275 ********************************
276
C951: DA 277 GETBLOCK PHX ; save X
C952: 5A 278 PHY ; save Y
C953: A6 3D 279 LDX SLOT
C955: A5 46 280 LDA BLOCK ; store block num
C957: 9D F8 05 281 STA R33,X ; in R30-R33
C95A: A5 47 282 LDA BLOCK+1
C95C: 9D 78 05 283 STA R32,X
C95F: A9 00 284 LDA #0
C961: 9D F8 04 285 STA R31,X
C964: 9D 78 04 286 STA R30,X
287
C967: A9 80 288 LDA #$80 ; drive number
C969: 24 43 289 BIT $43
C96B: F0 05 290 BEQ :SHIFT ; D1
C96D: A9 01 291 LDA #1 ; D2
C96F: 9D F8 04 292 STA R31,X
293
C972: A0 09 294 :SHIFT LDY #9 ; ASL can't be used with Y
C974: 1E F8 05 295 :LOOP ASL R33,X ; mul block num
C977: 3E 78 05 296 ROL R32,X ; by 512 to get
C97A: 3E F8 04 297 ROL R31,X ; real address
C97D: 3E 78 04 298 ROL R30,X
C980: 88 299 DEY
C981: D0 F1 300 BNE :LOOP
C983: 7A 301 PLY ; restore Y
C984: FA 302 PLX ; restore X
C985: 60 303 RTS
304
305
306 ********************************
307 *
308 * Send SD command
309 * Cmd is in A
310 *
311 ********************************
312
C986: 5A 313 COMMAND PHY ; save Y
C987: A4 3D 314 LDY SLOT
C989: 9D 80 C0 315 STA DATA,X ; send command
C98C: B9 78 04 316 LDA R30,Y ; get arg from R30 on
C98F: 9D 80 C0 317 STA DATA,X
C992: B9 F8 04 318 LDA R31,Y
C995: 9D 80 C0 319 STA DATA,X
C998: B9 78 05 320 LDA R32,Y
C99B: 9D 80 C0 321 STA DATA,X
C99E: B9 F8 05 322 LDA R33,Y
C9A1: 9D 80 C0 323 STA DATA,X
C9A4: A9 FF 324 LDA #DUMMY
C9A6: 9D 80 C0 325 STA DATA,X ; dummy crc
C9A9: 20 04 C9 326 JSR GETR1
C9AC: 7A 327 PLY ; restore Y
C9AD: 60 328 RTS
329
330
331 ********************************
332 *
333 * Check for card detect
334 *
335 * C Clear - card in slot
336 * Set - no card in slot
337 *
338 ********************************
339
C9AE: 48 340 CARDDET PHA
C9AF: A9 40 341 LDA #CD ; 0: card in
C9B1: 3C 83 C0 342 BIT SS,X ; 1: card out
C9B4: 18 343 CLC
C9B5: F0 01 344 BEQ :DONE ; card is in
C9B7: 38 345 SEC ; card is out
C9B8: 68 346 :DONE PLA
C9B9: 60 347 RTS
348
349
350 ********************************
351 *
352 * Check for write protect
353 *
354 * C Clear - card not protected
355 * Set - card write protected
356 *
357 ********************************
358
C9BA: 48 359 WRPROT PHA
C9BB: A9 20 360 LDA #WP ; 0: write enabled
C9BD: 3C 83 C0 361 BIT SS,X ; 1: write disabled
C9C0: 18 362 CLC
C9C1: F0 01 363 BEQ :DONE
C9C3: 38 364 SEC
C9C4: 68 365 :DONE PLA
C9C5: 60 366 RTS
367
368
369 ********************************
370 *
371 * Status request
372 * $43 Unit number DSSS000
373 * $44-45 Unused
374 * $46-47 Unused
375 *
376 * C Clear - No error
377 * Set - Error
378 * A $00 - No error
379 * $2B - Card write protected
380 * $2F - No card inserted
381 * X - Blocks avail (low byte)
382 * Y - Blocks avail (high byte)
383 *
384 ********************************
2017-10-15 14:48:13 +00:00
385
2017-10-16 22:06:33 +00:00
C9C6: A9 00 386 STATUS LDA #0 ; no error
C9C8: A2 FF 387 LDX #$FF ; 32 MB partition
C9CA: A0 FF 388 LDY #$FF
389
C9CC: 20 AE C9 390 JSR CARDDET
C9CF: 90 04 391 BCC :WRPROT
C9D1: A9 2F 392 LDA #$2F ; no card inserted
C9D3: 80 07 393 BRA :DONE
394
C9D5: 20 BA C9 395 :WRPROT JSR WRPROT
C9D8: 90 02 396 BCC :DONE
C9DA: A9 2B 397 LDA #$2B ; card write protected
398
C9DC: 60 399 :DONE RTS
400
401
402 ********************************
403 *
404 * Read 512 byte block
405 * $43 Unit number DSSS0000
406 * $44-45 Address (LO/HI) of buffer
407 * $46-47 Block number (LO/HI)
2017-10-15 14:48:13 +00:00
408 *
2017-10-16 22:06:33 +00:00
409 * C Clear - No error
410 * Set - Error
411 * A $00 - No error
412 * $27 - Bad block number
413 * $28 - No card inserted
414 *
415 ********************************
416
C9DD: 20 AE C9 417 READ JSR CARDDET
C9E0: B0 64 418 BCS :ERROR ; no card inserted
419
C9E2: 20 51 C9 420 JSR GETBLOCK ; calc block address
421
C9E5: BD 83 C0 422 LDA SS,X ; enable /CS
C9E8: 29 FE 423 AND #$FF!SS0
C9EA: 9D 83 C0 424 STA SS,X
C9ED: A9 51 425 LDA #$51 ; send CMD17
C9EF: 20 86 C9 426 JSR COMMAND ; send command
2017-10-15 14:48:13 +00:00
427
2017-10-16 22:06:33 +00:00
C9F2: C9 00 428 CMP #0 ; check for error
C9F4: D0 50 429 BNE :ERROR
430
C9F6: A9 FF 431 :GETTOK LDA #DUMMY ; get data token
C9F8: 9D 80 C0 432 STA DATA,X
C9FB: BD 80 C0 433 LDA DATA,X ; get response
C9FE: C9 FE 434 CMP #$FE
CA00: D0 F4 435 BNE :GETTOK ; wait for $FE
436
CA02: A0 02 437 LDY #2 ; read data from card
CA04: BD 81 C0 438 LDA CTRL,X ; enable FRX
CA07: 09 10 439 ORA #FRX
CA09: 9D 81 C0 440 STA CTRL,X
CA0C: A9 FF 441 LDA #DUMMY
CA0E: 9D 80 C0 442 STA DATA,X
CA11: 64 3C 443 :LOOPY STZ WORK
CA13: BD 80 C0 444 :LOOPW LDA DATA,X
CA16: 92 44 445 STA (BUFFER)
CA18: E6 44 446 INC BUFFER
CA1A: D0 02 447 BNE :INW
CA1C: E6 45 448 INC BUFFER+1 ; inc msb on page boundary
CA1E: E6 3C 449 :INW INC WORK
CA20: D0 F1 450 BNE :LOOPW
CA22: 88 451 DEY
CA23: D0 EC 452 BNE :LOOPY
453
CA25: BD 80 C0 454 :CRC LDA DATA,X ; read two bytes crc
CA28: BD 80 C0 455 LDA DATA,X ; and ignore
CA2B: BD 80 C0 456 LDA DATA,X ; read a dummy byte
457
CA2E: BD 81 C0 458 LDA CTRL,X ; disable FRX
CA31: 29 EF 459 AND #$FF!FRX
CA33: 9D 81 C0 460 STA CTRL,X
CA36: 18 461 CLC ; no error
CA37: A9 00 462 LDA #0
463
2017-10-16 22:06:33 +00:00
CA39: 08 464 :DONE PHP
CA3A: 48 465 PHA
CA3B: BD 83 C0 466 LDA SS,X
CA3E: 09 01 467 ORA #SS0
CA40: 9D 83 C0 468 STA SS,X ; disable /CS
CA43: 68 469 PLA
CA44: 28 470 PLP
CA45: 60 471 RTS
2017-10-15 14:48:13 +00:00
472
2017-10-16 22:06:33 +00:00
CA46: 38 473 :ERROR SEC ; an error occured
CA47: A9 27 474 LDA #$27
CA49: 80 EE 475 BRA :DONE
476
477
478 ********************************
479 *
480 * Write 512 byte block
481 * $43 Unit number DSSS0000
482 * $44-45 Address (LO/HI) of buffer
483 * $46-47 Block number (LO/HI)
484 *
485 * C Clear - No error
486 * Set - Error
487 * A $00 - No error
488 * $27 - I/O error or bad block number
489 * $2B - Card write protected
490 *
491 ********************************
492
CA4B: 20 AE C9 493 WRITE JSR CARDDET
CA4E: B0 67 494 BCS :IOERROR ; no card inserted
495
CA50: 20 BA C9 496 JSR WRPROT
CA53: B0 67 497 BCS :WPERROR ; card write protected
498
CA55: 20 51 C9 499 JSR GETBLOCK ; calc block address
2017-10-15 14:48:13 +00:00
500
2017-10-16 22:06:33 +00:00
CA58: BD 83 C0 501 LDA SS,X ; enable /CS
CA5B: 29 FE 502 AND #$FF!SS0
CA5D: 9D 83 C0 503 STA SS,X
CA60: A9 58 504 LDA #$58 ; send CMD24
CA62: 20 86 C9 505 JSR COMMAND ; send command
506
CA65: C9 00 507 CMP #0 ; check for error
CA67: D0 4E 508 BNE :IOERROR
509
CA69: A9 FF 510 LDA #DUMMY
CA6B: 9D 80 C0 511 STA DATA,X ; send dummy
CA6E: A9 FE 512 LDA #$FE
CA70: 9D 80 C0 513 STA DATA,X ; send data token
514
CA73: A0 02 515 LDY #2 ; send data to card
CA75: 64 3C 516 :LOOPY STZ WORK
CA77: B2 44 517 :LOOPW LDA (BUFFER)
CA79: 9D 80 C0 518 STA DATA,X
CA7C: E6 44 519 INC BUFFER
CA7E: D0 02 520 BNE :INW
CA80: E6 45 521 INC BUFFER+1 ; inc msb on page boundary
CA82: E6 3C 522 :INW INC WORK
CA84: D0 F1 523 BNE :LOOPW
CA86: 88 524 DEY
CA87: D0 EC 525 BNE :LOOPY
526
2017-10-16 22:06:33 +00:00
CA89: 9D 80 C0 527 :CRC STA DATA,X ; send 2 dummy crc bytes
CA8C: 9D 80 C0 528 STA DATA,X
529
CA8F: 9D 80 C0 530 STA DATA,X ; get data response
CA92: BD 80 C0 531 LDA DATA,X
CA95: 29 1F 532 AND #$1F
CA97: C9 05 533 CMP #$05
CA99: D0 1C 534 BNE :IOERROR ; check for write error
CA9B: 18 535 CLC ; no error
CA9C: A9 00 536 LDA #0
537
CA9E: 08 538 :DONE PHP
CA9F: 48 539 PHA
CAA0: A9 FF 540 :WAIT LDA #DUMMY
CAA2: 9D 80 C0 541 STA DATA,X ; wait for write cycle
CAA5: BD 80 C0 542 LDA DATA,X ; to complete
CAA8: C9 00 543 CMP #$00
CAAA: F0 F4 544 BEQ :WAIT
545
2017-10-16 22:06:33 +00:00
CAAC: BD 83 C0 546 LDA SS,X ; disable /CS
CAAF: 09 01 547 ORA #SS0
CAB1: 9D 83 C0 548 STA SS,X
CAB4: 68 549 PLA
CAB5: 28 550 PLP
CAB6: 60 551 RTS
552
CAB7: 38 553 :IOERROR SEC ; an error occured
CAB8: A9 27 554 LDA #$27
CABA: 80 E2 555 BRA :DONE
556
CABC: 38 557 :WPERROR SEC
CABD: A9 2B 558 LDA #$2B
CABF: 80 DD 559 BRA :DONE
560
561
562
563 ********************************
564 *
565 * Format
566 * not supported!
567 *
568 ********************************
569
CAC1: 38 570 FORMAT SEC
CAC2: A9 01 571 LDA #$01 ; invalid command
CAC4: 60 572 RTS
573
574
575 ********************************
576 *
577 * Test routine
578 *
579 ********************************
580
581 DO DEBUG
582 TEST
583
584 * get buffer
585 LDA #2 ; get 512 byte buffer
586 JSR $BEF5 ; call GETBUFR
587 BCS :ERROR
588 STA BUFADD+1
589 STA BUFFER+1
590 STZ BUFADD
591 STZ BUFFER
592
593 * fill buffer
594 LDY #0
595 :LOOP TYA
596 STA (BUFFER),Y
597 INY
598 BNE :LOOP
599 INC BUFFER+1
600 :LOOP1 TYA
601 STA (BUFFER),Y
602 INY
603 BNE :LOOP1
604
605 * write to card
606 LDA #2 ; write cmd
607 STA DCMD
608 LDA BUFADD ; buffer address
609 STA BUFFER
610 LDA BUFADD+1
611 STA BUFFER+1
612 STZ BLOCK ; block number
613 STZ BLOCK+1
614 LDX SLOT16
615 JSR DRIVER
616 BCS :ERROR
2017-10-03 15:46:50 +00:00
617
2017-10-16 22:06:33 +00:00
618 * read from card
619 LDA #1 ; read cmd
620 STA DCMD
621 LDA BUFADD ; buffer address
622 STA BUFFER
623 LDA BUFADD+1
624 STA BUFFER+1
625 STZ BLOCK ; block number
626 STZ BLOCK+1
627 LDX SLOT16
628 JSR DRIVER
629 BCS :ERROR
630
631 * check for errors
632 LDA BUFADD ; buffer address
633 STA BUFFER
634 LDA BUFADD+1
635 STA BUFFER+1
636 LDY #0
637 :LOOP2 TYA
638 CMP (BUFFER),Y
639 BNE :ERRCMP ; error in buffer
640 INY
641 BNE :LOOP2
642 INC BUFFER+1
643 :LOOP3 TYA
644 CMP (BUFFER),Y
645 BNE :ERRCMP
646 INY
647 BNE :LOOP3
648
649 * free buffer
650 JSR $BEF8 ; call FREEBUFR
651 CLC
652 LDA #0
653 RTS
654
655 :ERROR BRK
656 :ERRCMP BRK
657
658 BUFADD DW 0
659 FIN
660
661
CAC5: 40 00 00 662 CMD0 HEX 400000
CAC8: 00 00 95 663 HEX 000095
CACB: 41 00 00 664 CMD1 HEX 410000
CACE: 00 00 F9 665 HEX 0000F9
CAD1: 48 00 00 666 CMD8 HEX 480000
CAD4: 01 AA 87 667 HEX 01AA87
CAD7: 50 00 00 668 CMD16 HEX 500000
CADA: 02 00 FF 669 HEX 0200FF
CADD: 77 00 00 670 CMD55 HEX 770000
CAE0: 00 00 65 671 HEX 000065
CAE3: 69 40 00 672 ACMD4140 HEX 694000
CAE6: 00 00 77 673 HEX 000077
CAE9: 69 00 00 674 ACMD410 HEX 690000
CAEC: 00 00 FF 675 HEX 0000FF
676
677
678 ********************************
679 *
680 * This region is mapped to
681 * the $CsXX space. On the ROM
682 * it must appear at address $700
683 *
684 ********************************
685
686 DO DEBUG-1
CAEF: 00 00 00 687 DS \
CAF2: 00 00 00 00
CAF6: 00 00 00 00
CAFA: 00 00 00 00
CAFE: 00 00
CB00: 00 00 00 688 DS $400
CB03: 00 00 00 00
CB07: 00 00 00 00
CB0B: 00 00 00 00
CB0F: 00 00 00 00
CB13: 00 00 00 00
CB17: 00 00 00 00
CB1B: 00 00 00 00
CB1F: 00 00 00 00
CB23: 00 00 00 00
CB27: 00 00 00 00
CB2B: 00 00 00 00
CB2F: 00 00 00 00
CB33: 00 00 00 00
CB37: 00 00 00 00
CB3B: 00 00 00 00
CB3F: 00 00 00 00
CB43: 00 00 00 00
CB47: 00 00 00 00
CB4B: 00 00 00 00
CB4F: 00 00 00 00
CB53: 00 00 00 00
CB57: 00 00 00 00
CB5B: 00 00 00 00
CB5F: 00 00 00 00
CB63: 00 00 00 00
CB67: 00 00 00 00
CB6B: 00 00 00 00
CB6F: 00 00 00 00
CB73: 00 00 00 00
CB77: 00 00 00 00
CB7B: 00 00 00 00
CB7F: 00 00 00 00
CB83: 00 00 00 00
CB87: 00 00 00 00
CB8B: 00 00 00 00
CB8F: 00 00 00 00
CB93: 00 00 00 00
CB97: 00 00 00 00
CB9B: 00 00 00 00
CB9F: 00 00 00 00
CBA3: 00 00 00 00
CBA7: 00 00 00 00
CBAB: 00 00 00 00
CBAF: 00 00 00 00
CBB3: 00 00 00 00
CBB7: 00 00 00 00
CBBB: 00 00 00 00
CBBF: 00 00 00 00
CBC3: 00 00 00 00
CBC7: 00 00 00 00
CBCB: 00 00 00 00
CBCF: 00 00 00 00
CBD3: 00 00 00 00
CBD7: 00 00 00 00
CBDB: 00 00 00 00
CBDF: 00 00 00 00
CBE3: 00 00 00 00
CBE7: 00 00 00 00
CBEB: 00 00 00 00
CBEF: 00 00 00 00
CBF3: 00 00 00 00
CBF7: 00 00 00 00
CBFB: 00 00 00 00
CBFF: 00 00 00 00
CC03: 00 00 00 00
CC07: 00 00 00 00
CC0B: 00 00 00 00
CC0F: 00 00 00 00
CC13: 00 00 00 00
CC17: 00 00 00 00
CC1B: 00 00 00 00
CC1F: 00 00 00 00
CC23: 00 00 00 00
CC27: 00 00 00 00
CC2B: 00 00 00 00
CC2F: 00 00 00 00
CC33: 00 00 00 00
CC37: 00 00 00 00
CC3B: 00 00 00 00
CC3F: 00 00 00 00
CC43: 00 00 00 00
CC47: 00 00 00 00
CC4B: 00 00 00 00
CC4F: 00 00 00 00
CC53: 00 00 00 00
CC57: 00 00 00 00
CC5B: 00 00 00 00
CC5F: 00 00 00 00
CC63: 00 00 00 00
CC67: 00 00 00 00
CC6B: 00 00 00 00
CC6F: 00 00 00 00
CC73: 00 00 00 00
CC77: 00 00 00 00
CC7B: 00 00 00 00
CC7F: 00 00 00 00
CC83: 00 00 00 00
CC87: 00 00 00 00
CC8B: 00 00 00 00
CC8F: 00 00 00 00
CC93: 00 00 00 00
CC97: 00 00 00 00
CC9B: 00 00 00 00
CC9F: 00 00 00 00
CCA3: 00 00 00 00
CCA7: 00 00 00 00
CCAB: 00 00 00 00
CCAF: 00 00 00 00
CCB3: 00 00 00 00
CCB7: 00 00 00 00
CCBB: 00 00 00 00
CCBF: 00 00 00 00
CCC3: 00 00 00 00
CCC7: 00 00 00 00
CCCB: 00 00 00 00
CCCF: 00 00 00 00
CCD3: 00 00 00 00
CCD7: 00 00 00 00
CCDB: 00 00 00 00
CCDF: 00 00 00 00
CCE3: 00 00 00 00
CCE7: 00 00 00 00
CCEB: 00 00 00 00
CCEF: 00 00 00 00
CCF3: 00 00 00 00
CCF7: 00 00 00 00
CCFB: 00 00 00 00
CCFF: 00 00 00 00
CD03: 00 00 00 00
CD07: 00 00 00 00
CD0B: 00 00 00 00
CD0F: 00 00 00 00
CD13: 00 00 00 00
CD17: 00 00 00 00
CD1B: 00 00 00 00
CD1F: 00 00 00 00
CD23: 00 00 00 00
CD27: 00 00 00 00
CD2B: 00 00 00 00
CD2F: 00 00 00 00
CD33: 00 00 00 00
CD37: 00 00 00 00
CD3B: 00 00 00 00
CD3F: 00 00 00 00
CD43: 00 00 00 00
CD47: 00 00 00 00
CD4B: 00 00 00 00
CD4F: 00 00 00 00
CD53: 00 00 00 00
CD57: 00 00 00 00
CD5B: 00 00 00 00
CD5F: 00 00 00 00
CD63: 00 00 00 00
CD67: 00 00 00 00
CD6B: 00 00 00 00
CD6F: 00 00 00 00
CD73: 00 00 00 00
CD77: 00 00 00 00
CD7B: 00 00 00 00
CD7F: 00 00 00 00
CD83: 00 00 00 00
CD87: 00 00 00 00
CD8B: 00 00 00 00
CD8F: 00 00 00 00
CD93: 00 00 00 00
CD97: 00 00 00 00
CD9B: 00 00 00 00
CD9F: 00 00 00 00
CDA3: 00 00 00 00
CDA7: 00 00 00 00
CDAB: 00 00 00 00
CDAF: 00 00 00 00
CDB3: 00 00 00 00
CDB7: 00 00 00 00
CDBB: 00 00 00 00
CDBF: 00 00 00 00
CDC3: 00 00 00 00
CDC7: 00 00 00 00
CDCB: 00 00 00 00
CDCF: 00 00 00 00
CDD3: 00 00 00 00
CDD7: 00 00 00 00
CDDB: 00 00 00 00
CDDF: 00 00 00 00
CDE3: 00 00 00 00
CDE7: 00 00 00 00
CDEB: 00 00 00 00
CDEF: 00 00 00 00
CDF3: 00 00 00 00
CDF7: 00 00 00 00
CDFB: 00 00 00 00
CDFF: 00 00 00 00
CE03: 00 00 00 00
CE07: 00 00 00 00
CE0B: 00 00 00 00
CE0F: 00 00 00 00
CE13: 00 00 00 00
CE17: 00 00 00 00
CE1B: 00 00 00 00
CE1F: 00 00 00 00
CE23: 00 00 00 00
CE27: 00 00 00 00
CE2B: 00 00 00 00
CE2F: 00 00 00 00
CE33: 00 00 00 00
CE37: 00 00 00 00
CE3B: 00 00 00 00
CE3F: 00 00 00 00
CE43: 00 00 00 00
CE47: 00 00 00 00
CE4B: 00 00 00 00
CE4F: 00 00 00 00
CE53: 00 00 00 00
CE57: 00 00 00 00
CE5B: 00 00 00 00
CE5F: 00 00 00 00
CE63: 00 00 00 00
CE67: 00 00 00 00
CE6B: 00 00 00 00
CE6F: 00 00 00 00
CE73: 00 00 00 00
CE77: 00 00 00 00
CE7B: 00 00 00 00
CE7F: 00 00 00 00
CE83: 00 00 00 00
CE87: 00 00 00 00
CE8B: 00 00 00 00
CE8F: 00 00 00 00
CE93: 00 00 00 00
CE97: 00 00 00 00
CE9B: 00 00 00 00
CE9F: 00 00 00 00
CEA3: 00 00 00 00
CEA7: 00 00 00 00
CEAB: 00 00 00 00
CEAF: 00 00 00 00
CEB3: 00 00 00 00
CEB7: 00 00 00 00
CEBB: 00 00 00 00
CEBF: 00 00 00 00
CEC3: 00 00 00 00
CEC7: 00 00 00 00
CECB: 00 00 00 00
CECF: 00 00 00 00
CED3: 00 00 00 00
CED7: 00 00 00 00
CEDB: 00 00 00 00
CEDF: 00 00 00 00
CEE3: 00 00 00 00
CEE7: 00 00 00 00
CEEB: 00 00 00 00
CEEF: 00 00 00 00
CEF3: 00 00 00 00
CEF7: 00 00 00 00
CEFB: 00 00 00 00
CEFF: 00
689 ERR *-1/$CF00 ; must be at $CF00
690 FIN
2017-10-15 14:48:13 +00:00
691
2017-10-16 22:06:33 +00:00
692 * signature bytes
693
CF00: A2 20 694 START LDX #$20
CF02: A0 00 695 LDY #$00
CF04: A2 03 696 LDX #$03
CF06: A0 FF 697 LDY #$FF ; neither 5.25 nor Smartport
698
699 * find slot nr
700
701 DO DEBUG
702 LDA #$04
703 STA SLOT
704 LDA #$C4
705 STA CURSLOT
706 LDA #$40
707
708 ELSE
CF08: 20 58 FF 709 JSR $FF58
CF0B: BA 710 TSX
CF0C: BD 00 01 711 LDA $0100,X
CF0F: 8D F8 07 712 STA CURSLOT ; $Cs
CF12: 29 0F 713 AND #$0F
CF14: 85 3D 714 STA SLOT ; $0s
CF16: 0A 715 ASL A
CF17: 0A 716 ASL A
CF18: 0A 717 ASL A
CF19: 0A 718 ASL A
719 FIN
720
CF1A: 85 2B 721 STA SLOT16 ; $s0
CF1C: AA 722 TAX ; X holds now SLOT16
CF1D: 2C FF CF 723 BIT $CFFF
CF20: 20 AE C9 724 JSR CARDDET
CF23: 90 03 725 BCC :INIT
CF25: A9 27 726 LDA #$27 ; no card inserted
CF27: 00 727 BRK
728
CF28: 20 00 C8 729 :INIT JSR INIT
730
731
732 ********************************
733 *
734 * Install SD card driver
735 *
736 ********************************
737
738 DO DEBUG
739
740 * see if slot has a driver already
2017-10-15 14:48:13 +00:00
741
2017-10-16 22:06:33 +00:00
742 LDX $BF31 ; get devcnt
743 INSTALL LDA $BF32,X ; get a devnum
744 AND #$70 ; isolate slot
745 CMP SLOT16 ; slot?
746 BEQ :INSOUT ; yes, skip it
747 DEX
748 BPL INSTALL ; keep up the search
749
750 * restore the devnum to the list
751
752 LDX $BF31 ; get devcnt again
753 CPX #$0D ; device table full?
754 BNE :INST2
755
756 JSR $FF3A ; bell
757 JMP :INSOUT ; do something!
2017-10-15 14:48:13 +00:00
758
2017-10-16 22:06:33 +00:00
759 :INST2 LDA $BF32-1,X ; move all entries down
760 STA $BF32,X ; to make room at front
761 DEX ; for a new entry
762 BNE :INST2
763 LDA #$04 ; ProFile type device
764 ORA SLOT16
765 STA $BF32 ; slot, drive 1 at top of list
766 INC $BF31 ; update devcnt
767
768 * now insert the device driver vector
2017-10-15 14:48:13 +00:00
769
2017-10-16 22:06:33 +00:00
770 LDA SLOT
771 ASL
772 TAX
773 LDA #<DRIVER
774 STA $BF10,X ; write to driver table
775 LDA #>DRIVER
776 STA $BF11,X
777 :INSOUT RTS
778
2017-10-15 14:48:13 +00:00
779
2017-10-16 22:06:33 +00:00
780 ********************************
781 *
782 * Boot from SD card
783 *
784 ********************************
785
786 ELSE
787
CF2B: C9 00 788 BOOT CMP #0 ; check for error
CF2D: F0 01 789 BEQ :BOOT1
CF2F: 00 790 BRK
791
CF30: A9 01 792 :BOOT1 LDA #$01
CF32: 85 42 793 STA DCMD ; load command
CF34: A6 2B 794 LDX SLOT16
CF36: 85 43 795 STA $43 ; slot number
CF38: 64 44 796 STZ BUFFER ; buffer lo
CF3A: A9 08 797 LDA #$08
CF3C: 85 45 798 STA BUFFER+1 ; buffer hi
CF3E: 64 46 799 STZ BLOCK ; block lo
CF40: 64 47 800 STZ BLOCK+1 ; block hi
CF42: 2C FF CF 801 BIT $CFFF
CF45: 20 DD C9 802 JSR READ ; call driver
CF48: 4C 01 08 803 JMP $801 ; goto bootloader
804
805 FIN
806
807
808 ********************************
809 *
810 * Jump table
811 *
812 ********************************
2017-10-15 14:48:13 +00:00
813
2017-10-16 22:06:33 +00:00
CF4B: D8 814 DRIVER CLD
815
816 DO DEBUG
817 LDA #$04
818 STA SLOT
819 LDA #$C4
820 STA CURSLOT
821 LDA #$40
822
823 ELSE
CF4C: 20 58 FF 824 JSR $FF58 ; find slot nr
CF4F: BA 825 TSX
CF50: BD 00 01 826 LDA $0100,X
CF53: 8D F8 07 827 STA CURSLOT ; $Cs
CF56: 29 0F 828 AND #$0F
CF58: 85 3D 829 STA SLOT ; $0s
CF5A: 0A 830 ASL A
CF5B: 0A 831 ASL A
CF5C: 0A 832 ASL A
CF5D: 0A 833 ASL A
834 FIN
835
CF5E: 85 2B 836 STA SLOT16 ; $s0
CF60: AA 837 TAX ; X holds now SLOT16
CF61: 2C FF CF 838 BIT $CFFF
CF64: 20 AE C9 839 JSR CARDDET
CF67: 90 04 840 BCC :INITED
CF69: A9 27 841 LDA #$27 ; no card inserted
CF6B: 80 1B 842 BRA :DONE
843
CF6D: A9 80 844 :INITED LDA #INITED ; check for init
CF6F: 3C 83 C0 845 BIT SS,X
CF72: F0 22 846 BEQ :INIT
847
CF74: A5 42 848 :CMD LDA DCMD ; get command
CF76: C9 00 849 CMP #0
CF78: F0 10 850 BEQ :STATUS
CF7A: C9 01 851 CMP #1
CF7C: F0 0F 852 BEQ :READ
CF7E: C9 02 853 CMP #2
CF80: F0 0E 854 BEQ :WRITE
CF82: C9 03 855 CMP #3
CF84: F0 0D 856 BEQ :FORMAT
857 DO DEBUG
858 CMP #$FF
859 BEQ :TEST
860 FIN
CF86: A9 01 861 LDA #1 ; unknown command
862
CF88: 38 863 :DONE SEC
CF89: 60 864 RTS
865
CF8A: 4C C6 C9 866 :STATUS JMP STATUS
CF8D: 4C DD C9 867 :READ JMP READ
CF90: 4C 4B CA 868 :WRITE JMP WRITE
CF93: 4C C1 CA 869 :FORMAT JMP FORMAT
CF96: 20 00 C8 870 :INIT JSR INIT
CF99: B0 ED 871 BCS :DONE ; init failure
CF9B: 80 D7 872 BRA :CMD
873
874 DO DEBUG
875 :TEST JMP TEST ; do device test
876 FIN
877
878
879 * Signature bytes
880
CF9D: 00 00 00 881 DS \ ; fill with zeroes
CFA0: 00 00 00 00
CFA4: 00 00 00 00
CFA8: 00 00 00 00
CFAC: 00 00 00 00
CFB0: 00 00 00 00
CFB4: 00 00 00 00
CFB8: 00 00 00 00
CFBC: 00 00 00 00
CFC0: 00 00 00 00
CFC4: 00 00 00 00
CFC8: 00 00 00 00
CFCC: 00 00 00 00
CFD0: 00 00 00 00
CFD4: 00 00 00 00
CFD8: 00 00 00 00
CFDC: 00 00 00 00
CFE0: 00 00 00 00
CFE4: 00 00 00 00
CFE8: 00 00 00 00
CFEC: 00 00 00 00
CFF0: 00 00 00 00
CFF4: 00 00 00 00
CFF8: 00 00 00 00
CFFC: 00 00 00 00
882 DS -4 ; locate to $xxFC
CFFC: FF FF 883 DW $FFFF ; 65535 blocks
CFFE: 17 884 DB $17 ; Status bits
CFFF: 4B 885 DB #<DRIVER ; LSB of driver
2017-10-16 22:06:33 +00:00
--End assembly, 2048 bytes, Errors: 0
2017-08-27 13:02:58 +00:00
2017-08-27 13:02:58 +00:00
Symbol table - alphabetical order:
2017-10-16 22:06:33 +00:00
ACMD410 =$CAE9 ACMD4140=$CAE3 BLOCK =$46 ? BOOT =$CF2B
BUFFER =$44 CARDDET =$C9AE CD =$40 CMD =$C8F0
CMD0 =$CAC5 CMD1 =$CACB CMD16 =$CAD7 CMD55 =$CADD
CMD8 =$CAD1 CMDHI =$41 CMDLO =$40 COMMAND =$C986
2017-10-15 14:48:13 +00:00
CTRL =$C081 CURSLOT =$07F8 DATA =$C080 DCMD =$42
2017-10-16 22:06:33 +00:00
DEBUG =$00 DIV =$C082 DRIVER =$CF4B DUMMY =$FF
ECE =$04 FORMAT =$CAC1 FRX =$10 GETBLOCK=$C951
GETR1 =$C904 GETR3 =$C91F INIT =$C800 INITED =$80
2017-10-15 14:48:13 +00:00
R30 =$0478 R31 =$04F8 R32 =$0578 R33 =$05F8
2017-10-16 22:06:33 +00:00
READ =$C9DD SLOT =$3D SLOT16 =$2B SS =$C083
SS0 =$01 ? START =$CF00 STATUS =$C9C6 WORK =$3C
WP =$20 WRITE =$CA4B WRPROT =$C9BA
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
2017-10-16 22:06:33 +00:00
CURSLOT =$07F8 DATA =$C080 CTRL =$C081 DIV =$C082
SS =$C083 INIT =$C800 CMD =$C8F0 GETR1 =$C904
GETR3 =$C91F GETBLOCK=$C951 COMMAND =$C986 CARDDET =$C9AE
WRPROT =$C9BA STATUS =$C9C6 READ =$C9DD WRITE =$CA4B
FORMAT =$CAC1 CMD0 =$CAC5 CMD1 =$CACB CMD8 =$CAD1
CMD16 =$CAD7 CMD55 =$CADD ACMD4140=$CAE3 ACMD410 =$CAE9
? START =$CF00 ? BOOT =$CF2B DRIVER =$CF4B