mirror of
https://github.com/freitz85/AppleIISd.git
synced 2025-02-19 18:31:29 +00:00
827 lines
34 KiB
Plaintext
827 lines
34 KiB
Plaintext
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
|
||
|