2017-08-26 22:37:54 +00:00
|
|
|
|
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
|
|
|
|
|
27-AUG-17 0:31
|
|
|
|
|
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 INITED = $0678
|
|
|
|
|
41
|
|
|
|
|
42 * Constants
|
|
|
|
|
43
|
|
|
|
|
44 SSNONE = $0F
|
|
|
|
|
45 SS0 = $0E
|
|
|
|
|
46 DUMMY = $FF
|
|
|
|
|
47 FRXEN = $17
|
|
|
|
|
48 FRXDIS = $07
|
|
|
|
|
49
|
|
|
|
|
50
|
|
|
|
|
51 * signature bytes
|
|
|
|
|
52
|
|
|
|
|
C800: A2 20 53 LDX #$20
|
|
|
|
|
C802: A0 00 54 LDY #$00
|
|
|
|
|
C804: A2 03 55 LDX #$03
|
|
|
|
|
C806: 86 3C 56 STX WORK
|
|
|
|
|
57
|
|
|
|
|
58 * find slot nr
|
|
|
|
|
59
|
|
|
|
|
===== Page 2 =====
|
|
|
|
|
|
|
|
|
|
60 DO DEBUG
|
|
|
|
|
61 LDA #$04
|
|
|
|
|
62 STA SLOT
|
|
|
|
|
63 LDA #$C4
|
|
|
|
|
64 STA CURSLOT
|
|
|
|
|
65 LDA #$40
|
|
|
|
|
66 STA SLOT16
|
|
|
|
|
67 ELSE
|
|
|
|
|
C808: 20 58 FF 68 JSR $FF58
|
|
|
|
|
C80B: BA 69 TSX
|
|
|
|
|
C80C: BD 00 01 70 LDA $0100,X
|
|
|
|
|
C80F: 29 0F 71 AND #$0F
|
|
|
|
|
C811: 85 3D 72 STA SLOT ; $0s
|
|
|
|
|
C813: 09 C0 73 ORA #$C0
|
|
|
|
|
C815: 8D F8 07 74 STA CURSLOT ; $Cs
|
|
|
|
|
C818: 0A 75 ASL A
|
|
|
|
|
C819: 0A 76 ASL A
|
|
|
|
|
C81A: 0A 77 ASL A
|
|
|
|
|
C81B: 0A 78 ASL A
|
|
|
|
|
C81C: 85 2B 79 STA SLOT16 ; $s0
|
|
|
|
|
80 FIN
|
|
|
|
|
C81E: AA 81 TAX ; X holds now SLOT16
|
|
|
|
|
82
|
|
|
|
|
C81F: 2C FF CF 83 BIT $CFFF
|
|
|
|
|
C822: 20 00 C9 84 JSR INIT
|
|
|
|
|
85
|
|
|
|
|
86 *
|
|
|
|
|
87 * TODO: check for init error
|
|
|
|
|
88 *
|
|
|
|
|
89
|
|
|
|
|
90 ********************************
|
|
|
|
|
91 *
|
|
|
|
|
92 * Install SD card driver
|
|
|
|
|
93 *
|
|
|
|
|
94 ********************************
|
|
|
|
|
95
|
|
|
|
|
96 DO DEBUG
|
|
|
|
|
97
|
|
|
|
|
98 * see if slot has a driver already
|
|
|
|
|
99
|
|
|
|
|
100 LDX $BF31 ; get devcnt
|
|
|
|
|
101 INSTALL LDA $BF32,X ; get a devnum
|
|
|
|
|
102 AND #$70 ; isolate slot
|
|
|
|
|
103 CMP SLOT16 ; slot?
|
|
|
|
|
104 BEQ :INSOUT ; yes, skip it
|
|
|
|
|
105 DEX
|
|
|
|
|
106 BPL INSTALL ; keep up the search
|
|
|
|
|
107
|
|
|
|
|
108 * restore the devnum to the list
|
|
|
|
|
109
|
|
|
|
|
110 LDX $BF31 ; get devcnt again
|
|
|
|
|
111 CPX #$0D ; device table full?
|
|
|
|
|
112 BNE :INST2
|
|
|
|
|
113
|
|
|
|
|
114 JSR $FF3A ; bell
|
|
|
|
|
115 JMP :INSOUT ; do something!
|
|
|
|
|
116
|
|
|
|
|
===== Page 3 =====
|
|
|
|
|
|
|
|
|
|
117 :INST2 LDA $BF32-1,X ; move all entries down
|
|
|
|
|
118 STA $BF32,X ; to make room at front
|
|
|
|
|
119 DEX ; for a new entry
|
|
|
|
|
120 BNE :INST2
|
|
|
|
|
121 LDA #$04 ; ProFile type device
|
|
|
|
|
122 ORA SLOT16
|
|
|
|
|
123 STA $BF32 ; slot, drive 1 at top of list
|
|
|
|
|
124 INC $BF31 ; update devcnt
|
|
|
|
|
125
|
|
|
|
|
126 * now insert the device driver vector
|
|
|
|
|
127
|
|
|
|
|
128 LDA SLOT
|
|
|
|
|
129 ASL
|
|
|
|
|
130 TAX
|
|
|
|
|
131 LDA #<DRIVER
|
|
|
|
|
132 STA $BF10,X ; write to driver table
|
|
|
|
|
133 LDA #>DRIVER
|
|
|
|
|
134 STA $BF11,X
|
|
|
|
|
135 :INSOUT RTS
|
|
|
|
|
136
|
|
|
|
|
137
|
|
|
|
|
138 ********************************
|
|
|
|
|
139 *
|
|
|
|
|
140 * Boot from SD card
|
|
|
|
|
141 *
|
|
|
|
|
142 ********************************
|
|
|
|
|
143
|
|
|
|
|
144 ELSE
|
|
|
|
|
145
|
|
|
|
|
C825: A9 01 146 BOOT LDA #$01
|
|
|
|
|
C827: 85 42 147 STA $42 ; load command
|
|
|
|
|
C829: A5 2B 148 LDA SLOT16
|
|
|
|
|
C82B: AA 149 TAX
|
|
|
|
|
C82C: 85 43 150 STA $43 ; slot number
|
|
|
|
|
C82E: 64 44 151 STZ $44 ; buffer lo
|
|
|
|
|
C830: A9 08 152 LDA #$08
|
|
|
|
|
C832: 85 45 153 STA $45 ; buffer hi
|
|
|
|
|
C834: 64 46 154 STZ $46 ; block lo
|
|
|
|
|
C836: 64 47 155 STZ $47 ; block hi
|
|
|
|
|
C838: 2C FF CF 156 BIT $CFFF
|
|
|
|
|
C83B: 20 9E CA 157 JSR READ ; call driver
|
|
|
|
|
C83E: 4C 01 08 158 JMP $801 ; goto bootloader
|
|
|
|
|
159
|
|
|
|
|
160 FIN
|
|
|
|
|
161
|
|
|
|
|
162
|
|
|
|
|
163 ********************************
|
|
|
|
|
164 *
|
|
|
|
|
165 * Jump table
|
|
|
|
|
166 *
|
|
|
|
|
167 ********************************
|
|
|
|
|
168
|
|
|
|
|
C841: D8 169 DRIVER CLD
|
|
|
|
|
170 DO DEBUG
|
|
|
|
|
171 LDA #$04
|
|
|
|
|
172 STA SLOT
|
|
|
|
|
173 LDA #$C4
|
|
|
|
|
===== Page 4 =====
|
|
|
|
|
|
|
|
|
|
174 STA CURSLOT
|
|
|
|
|
175 LDA #$40
|
|
|
|
|
176 STA SLOT16
|
|
|
|
|
177 ELSE
|
|
|
|
|
C842: 20 58 FF 178 JSR $FF58 ; find slot nr
|
|
|
|
|
C845: BA 179 TSX
|
|
|
|
|
C846: BD 00 01 180 LDA $0100,X
|
|
|
|
|
C849: 29 0F 181 AND #$0F
|
|
|
|
|
C84B: 85 3D 182 STA SLOT ; $0s
|
|
|
|
|
C84D: 09 C0 183 ORA #$C0
|
|
|
|
|
C84F: 8D F8 07 184 STA CURSLOT ; $Cs
|
|
|
|
|
C852: 0A 185 ASL A
|
|
|
|
|
C853: 0A 186 ASL A
|
|
|
|
|
C854: 0A 187 ASL A
|
|
|
|
|
C855: 0A 188 ASL A
|
|
|
|
|
C856: 85 2B 189 STA SLOT16 ; $s0
|
|
|
|
|
190 FIN
|
|
|
|
|
C858: AA 191 TAX ; X holds now SLOT16
|
|
|
|
|
192
|
|
|
|
|
C859: 2C FF CF 193 BIT $CFFF
|
|
|
|
|
C85C: A4 3D 194 LDY SLOT
|
|
|
|
|
C85E: B9 78 06 195 LDA INITED,Y ; check for init
|
|
|
|
|
C861: C9 01 196 CMP #$01
|
|
|
|
|
C863: 90 22 197 BCC :INIT
|
|
|
|
|
C865: A5 42 198 :CMD LDA $42 ; get command
|
|
|
|
|
C867: C9 00 199 CMP #$00
|
|
|
|
|
C869: F0 10 200 BEQ :STATUS
|
|
|
|
|
C86B: C9 01 201 CMP #$01
|
|
|
|
|
C86D: F0 0F 202 BEQ :READ
|
|
|
|
|
C86F: C9 02 203 CMP #$02
|
|
|
|
|
C871: F0 0E 204 BEQ :WRITE
|
|
|
|
|
C873: C9 03 205 CMP #$03
|
|
|
|
|
C875: F0 0D 206 BEQ :FORMAT
|
|
|
|
|
C877: 38 207 SEC ; unknown command
|
|
|
|
|
C878: A9 01 208 LDA #$01
|
|
|
|
|
C87A: 60 209 RTS
|
|
|
|
|
210
|
|
|
|
|
C87B: 4C 96 CA 211 :STATUS JMP STATUS
|
|
|
|
|
C87E: 4C 9E CA 212 :READ JMP READ
|
|
|
|
|
C881: 4C F7 CA 213 :WRITE JMP WRITE
|
|
|
|
|
C884: 4C 64 CB 214 :FORMAT JMP FORMAT
|
|
|
|
|
C887: 20 00 C9 215 :INIT JSR INIT
|
|
|
|
|
C88A: 80 D9 216 BRA :CMD
|
|
|
|
|
217
|
|
|
|
|
218
|
|
|
|
|
219 * Signature bytes
|
|
|
|
|
220
|
|
|
|
|
C88C: 00 00 00 221 DS \ ; fill with zeroes
|
|
|
|
|
C88F: 00 00 00 00
|
|
|
|
|
C893: 00 00 00 00
|
|
|
|
|
C897: 00 00 00 00
|
|
|
|
|
C89B: 00 00 00 00
|
|
|
|
|
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
|
|
|
|
|
===== Page 5 =====
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
222 DS -4 ; locate to $xxFC
|
|
|
|
|
C8FC: FF FF 223 DW $FFFF ; 65535 blocks
|
|
|
|
|
C8FE: 47 224 DB $47 ; Status bits
|
|
|
|
|
C8FF: 41 225 DB #<DRIVER ; LSB of driver
|
|
|
|
|
226
|
|
|
|
|
227
|
|
|
|
|
228 ********************************
|
|
|
|
|
229 *
|
|
|
|
|
230 * Initialize SD card
|
|
|
|
|
231 *
|
|
|
|
|
232 * C Clear - No error
|
|
|
|
|
233 * Set - Error
|
|
|
|
|
234 * A $00 - No error
|
|
|
|
|
235 * $27 - I/O error - Init failed
|
|
|
|
|
236 * $28 - No card inserted
|
|
|
|
|
237 *
|
|
|
|
|
238 ********************************
|
|
|
|
|
239
|
|
|
|
|
C900: D8 240 INIT CLD
|
|
|
|
|
C901: A9 03 241 LDA #$03 ; set SPI mode 3
|
|
|
|
|
C903: 9D 81 C0 242 STA CTRL,X
|
|
|
|
|
C906: A9 0F 243 LDA #SSNONE
|
|
|
|
|
C908: 9D 83 C0 244 STA SS,X
|
|
|
|
|
C90B: A9 07 245 LDA #7
|
|
|
|
|
C90D: 9D 82 C0 246 STA DIV,X
|
|
|
|
|
C910: A0 0A 247 LDY #10
|
|
|
|
|
C912: A9 FF 248 LDA #DUMMY
|
|
|
|
|
249
|
|
|
|
|
C914: 9D 80 C0 250 :LOOP STA DATA,X
|
|
|
|
|
C917: 3C 81 C0 251 :WAIT BIT CTRL,X
|
|
|
|
|
C91A: 10 FB 252 BPL :WAIT
|
|
|
|
|
C91C: 88 253 DEY
|
|
|
|
|
C91D: D0 F5 254 BNE :LOOP ; do 10 times
|
|
|
|
|
C91F: A9 0E 255 LDA #SS0 ; set CS low
|
|
|
|
|
C921: 9D 83 C0 256 STA SS,X
|
|
|
|
|
257
|
|
|
|
|
C924: A9 68 258 LDA #<CMD0 ; send CMD0
|
|
|
|
|
===== Page 6 =====
|
|
|
|
|
|
|
|
|
|
C926: 85 40 259 STA CMDLO
|
|
|
|
|
C928: A9 CB 260 LDA #>CMD0
|
|
|
|
|
C92A: 85 41 261 STA CMDHI
|
|
|
|
|
C92C: 20 E3 C9 262 JSR CMD
|
|
|
|
|
C92F: 20 F7 C9 263 JSR GETR1 ; get response
|
|
|
|
|
C932: C9 01 264 CMP #$01
|
|
|
|
|
C934: D0 39 265 BNE :ERROR1 ; error!
|
|
|
|
|
266
|
|
|
|
|
C936: A9 74 267 LDA #<CMD8 ; send CMD8
|
|
|
|
|
C938: 85 40 268 STA CMDLO
|
|
|
|
|
C93A: A9 CB 269 LDA #>CMD8
|
|
|
|
|
C93C: 85 41 270 STA CMDHI
|
|
|
|
|
C93E: 20 E3 C9 271 JSR CMD
|
|
|
|
|
C941: 20 12 CA 272 JSR GETR3
|
|
|
|
|
C944: C9 01 273 CMP #$01
|
|
|
|
|
C946: D0 2A 274 BNE :SDV1 ; may be SD Ver. 1
|
|
|
|
|
275
|
|
|
|
|
276 * check for $01aa match!
|
|
|
|
|
C948: A9 80 277 :SDV2 LDA #<CMD55
|
|
|
|
|
C94A: 85 40 278 STA CMDLO
|
|
|
|
|
C94C: A9 CB 279 LDA #>CMD55
|
|
|
|
|
C94E: 85 41 280 STA CMDHI
|
|
|
|
|
C950: 20 E3 C9 281 JSR CMD
|
|
|
|
|
C953: 20 F7 C9 282 JSR GETR1
|
|
|
|
|
C956: A9 86 283 LDA #<ACMD4140
|
|
|
|
|
C958: 85 40 284 STA CMDLO
|
|
|
|
|
C95A: A9 CB 285 LDA #>ACMD4140
|
|
|
|
|
C95C: 85 41 286 STA CMDHI
|
|
|
|
|
C95E: 20 E3 C9 287 JSR CMD
|
|
|
|
|
C961: 20 F7 C9 288 JSR GETR1
|
|
|
|
|
C964: C9 01 289 CMP #$01
|
|
|
|
|
C966: F0 E0 290 BEQ :SDV2 ; wait for ready
|
|
|
|
|
C968: C9 00 291 CMP #$00
|
|
|
|
|
C96A: D0 03 292 BNE :ERROR1 ; error!
|
|
|
|
|
293 * send CMD58
|
|
|
|
|
294 * SD Ver. 2 initialized!
|
|
|
|
|
C96C: 4C AC C9 295 JMP :BLOCKSZ
|
|
|
|
|
296
|
|
|
|
|
C96F: 4C CF C9 297 :ERROR1 JMP :IOERROR ; needed for far jump
|
|
|
|
|
298
|
|
|
|
|
C972: A9 80 299 :SDV1 LDA #<CMD55
|
|
|
|
|
C974: 85 40 300 STA CMDLO
|
|
|
|
|
C976: A9 CB 301 LDA #>CMD55
|
|
|
|
|
C978: 85 41 302 STA CMDHI
|
|
|
|
|
C97A: 20 E3 C9 303 JSR CMD ; ignore response
|
|
|
|
|
C97D: A9 8C 304 LDA #<ACMD410
|
|
|
|
|
C97F: 85 40 305 STA CMDLO
|
|
|
|
|
C981: A9 CB 306 LDA #>ACMD410
|
|
|
|
|
C983: 85 41 307 STA CMDHI
|
|
|
|
|
C985: 20 E3 C9 308 JSR CMD
|
|
|
|
|
C988: 20 F7 C9 309 JSR GETR1
|
|
|
|
|
C98B: C9 01 310 CMP #$01
|
|
|
|
|
C98D: F0 E3 311 BEQ :SDV1 ; wait for ready
|
|
|
|
|
C98F: C9 00 312 CMP #$00
|
|
|
|
|
C991: D0 03 313 BNE :MMC ; may be MMC card
|
|
|
|
|
314 * SD Ver. 1 initialized!
|
|
|
|
|
C993: 4C AC C9 315 JMP :BLOCKSZ
|
|
|
|
|
===== Page 7 =====
|
|
|
|
|
|
|
|
|
|
316
|
|
|
|
|
C996: A9 6E 317 :MMC LDA #<CMD1
|
|
|
|
|
C998: 85 40 318 STA CMDLO
|
|
|
|
|
C99A: A9 CB 319 LDA #>CMD1
|
|
|
|
|
C99C: 85 41 320 STA CMDHI
|
|
|
|
|
C99E: 20 E3 C9 321 :LOOP1 JSR CMD
|
|
|
|
|
C9A1: 20 F7 C9 322 JSR GETR1
|
|
|
|
|
C9A4: C9 01 323 CMP #$01
|
|
|
|
|
C9A6: F0 F6 324 BEQ :LOOP1 ; wait for ready
|
|
|
|
|
C9A8: C9 00 325 CMP #$00
|
|
|
|
|
C9AA: D0 23 326 BNE :IOERROR ; error!
|
|
|
|
|
327 * MMC Ver. 3 initialized!
|
|
|
|
|
328
|
|
|
|
|
C9AC: A9 7A 329 :BLOCKSZ LDA #<CMD16
|
|
|
|
|
C9AE: 85 40 330 STA CMDLO
|
|
|
|
|
C9B0: A9 CB 331 LDA #>CMD16
|
|
|
|
|
C9B2: 85 41 332 STA CMDHI
|
|
|
|
|
C9B4: 20 E3 C9 333 JSR CMD
|
|
|
|
|
C9B7: 20 F7 C9 334 JSR GETR1
|
|
|
|
|
C9BA: C9 00 335 CMP #$00
|
|
|
|
|
C9BC: D0 11 336 BNE :IOERROR ; error!
|
|
|
|
|
337
|
|
|
|
|
C9BE: A4 3D 338 :END LDY SLOT
|
|
|
|
|
C9C0: A9 01 339 LDA #$01
|
|
|
|
|
C9C2: 99 78 06 340 STA INITED,Y ; initialized
|
|
|
|
|
C9C5: 18 341 CLC ; all ok
|
|
|
|
|
C9C6: A0 00 342 LDY #0
|
|
|
|
|
C9C8: 90 08 343 BCC :END1
|
|
|
|
|
C9CA: 38 344 :CDERROR SEC
|
|
|
|
|
C9CB: A0 28 345 LDY #$28 ; no card error
|
|
|
|
|
C9CD: B0 03 346 BCS :END1
|
|
|
|
|
C9CF: 38 347 :IOERROR SEC
|
|
|
|
|
C9D0: A0 27 348 LDY #$27 ; init error
|
|
|
|
|
C9D2: A9 0F 349 :END1 LDA #SSNONE ; deselect card
|
|
|
|
|
C9D4: 9D 83 C0 350 STA SS,X
|
|
|
|
|
C9D7: A9 07 351 LDA #7 ; enable 7MHz
|
|
|
|
|
C9D9: 9D 81 C0 352 STA CTRL,X
|
|
|
|
|
C9DC: A9 00 353 LDA #0 ; set div to 2
|
|
|
|
|
C9DE: 9D 82 C0 354 STA DIV,X
|
|
|
|
|
C9E1: 98 355 TYA ; retval in A
|
|
|
|
|
C9E2: 60 356 RTS
|
|
|
|
|
357
|
|
|
|
|
358
|
|
|
|
|
359 ********************************
|
|
|
|
|
360 *
|
|
|
|
|
361 * Send SD command
|
|
|
|
|
362 * Call with command in CMDHI and CMDLO
|
|
|
|
|
363 *
|
|
|
|
|
364 ********************************
|
|
|
|
|
365
|
|
|
|
|
C9E3: 5A 366 CMD PHY
|
|
|
|
|
C9E4: A0 00 367 LDY #0
|
|
|
|
|
C9E6: B1 40 368 :LOOP LDA (CMDLO),Y
|
|
|
|
|
C9E8: 9D 80 C0 369 STA DATA,X
|
|
|
|
|
C9EB: 3C 81 C0 370 :WAIT BIT CTRL,X ; TC is in N
|
|
|
|
|
C9EE: 10 FB 371 BPL :WAIT
|
|
|
|
|
C9F0: C8 372 INY
|
|
|
|
|
===== Page 8 =====
|
|
|
|
|
|
|
|
|
|
C9F1: C0 06 373 CPY #6
|
|
|
|
|
C9F3: 90 F1 374 BCC :LOOP
|
|
|
|
|
C9F5: 7A 375 PLY
|
|
|
|
|
C9F6: 60 376 RTS
|
|
|
|
|
377
|
|
|
|
|
378
|
|
|
|
|
379 ********************************
|
|
|
|
|
380 *
|
|
|
|
|
381 * Get R1
|
|
|
|
|
382 * R1 is in A
|
|
|
|
|
383 *
|
|
|
|
|
384 ********************************
|
|
|
|
|
385
|
|
|
|
|
C9F7: A9 FF 386 GETR1 LDA #DUMMY
|
|
|
|
|
C9F9: 9D 80 C0 387 STA DATA,X
|
|
|
|
|
C9FC: 3C 81 C0 388 :WAIT BIT CTRL,X
|
|
|
|
|
C9FF: 10 FB 389 BPL :WAIT
|
|
|
|
|
CA01: BD 80 C0 390 LDA DATA,X ; get response
|
|
|
|
|
CA04: 85 3C 391 STA WORK ; save R1
|
|
|
|
|
CA06: 29 80 392 AND #$80
|
|
|
|
|
CA08: D0 ED 393 BNE GETR1 ; wait for MSB=0
|
|
|
|
|
CA0A: A9 FF 394 LDA #DUMMY
|
|
|
|
|
CA0C: 9D 80 C0 395 STA DATA,X ; send another dummy
|
|
|
|
|
CA0F: A5 3C 396 LDA WORK ; restore R1
|
|
|
|
|
CA11: 60 397 RTS
|
|
|
|
|
398
|
|
|
|
|
399
|
|
|
|
|
400 ********************************
|
|
|
|
|
401 *
|
|
|
|
|
402 * Get R3
|
|
|
|
|
403 * R1 is in A
|
|
|
|
|
404 * R3 is in scratchpad ram
|
|
|
|
|
405 *
|
|
|
|
|
406 ********************************
|
|
|
|
|
407
|
|
|
|
|
CA12: 20 F7 C9 408 GETR3 JSR GETR1 ; get R1 first
|
|
|
|
|
CA15: 48 409 PHA ; save R1
|
|
|
|
|
CA16: 5A 410 PHY ; save Y
|
|
|
|
|
CA17: A0 04 411 LDY #04 ; load counter
|
|
|
|
|
CA19: A9 FF 412 :LOOP LDA #DUMMY ; send dummy
|
|
|
|
|
CA1B: 9D 80 C0 413 STA DATA,X
|
|
|
|
|
CA1E: 3C 81 C0 414 :WAIT BIT CTRL,X
|
|
|
|
|
CA21: 10 FB 415 BPL :WAIT
|
|
|
|
|
CA23: BD 80 C0 416 LDA DATA,X
|
|
|
|
|
CA26: 48 417 PHA
|
|
|
|
|
CA27: 88 418 DEY
|
|
|
|
|
CA28: D0 EF 419 BNE :LOOP ; do 4 times
|
|
|
|
|
CA2A: A4 3D 420 LDY SLOT
|
|
|
|
|
CA2C: 68 421 PLA
|
|
|
|
|
CA2D: 99 F8 05 422 STA R33,Y ; save R3
|
|
|
|
|
CA30: 68 423 PLA
|
|
|
|
|
CA31: 99 78 05 424 STA R32,Y
|
|
|
|
|
CA34: 68 425 PLA
|
|
|
|
|
CA35: 99 F8 04 426 STA R31,Y
|
|
|
|
|
CA38: 68 427 PLA
|
|
|
|
|
CA39: 99 78 04 428 STA R30,Y
|
|
|
|
|
CA3C: 7A 429 PLY ; restore Y
|
|
|
|
|
===== Page 9 =====
|
|
|
|
|
|
|
|
|
|
CA3D: A9 FF 430 LDA #DUMMY
|
|
|
|
|
CA3F: 9D 80 C0 431 STA DATA,X ; send another dummy
|
|
|
|
|
CA42: 68 432 PLA ; restore R1
|
|
|
|
|
CA43: 60 433 RTS
|
|
|
|
|
434
|
|
|
|
|
435
|
|
|
|
|
436 ********************************
|
|
|
|
|
437 *
|
|
|
|
|
438 * Calculate block address
|
|
|
|
|
439 * Block no is in $46-47
|
|
|
|
|
440 * Address is in R30-R33
|
|
|
|
|
441 *
|
|
|
|
|
442 ********************************
|
|
|
|
|
443
|
|
|
|
|
CA44: DA 444 BLOCK PHX ; save X
|
|
|
|
|
CA45: 5A 445 PHY ; save Y
|
|
|
|
|
CA46: A6 3D 446 LDX SLOT
|
|
|
|
|
CA48: A5 46 447 LDA $46 ; store block num
|
|
|
|
|
CA4A: 9D F8 05 448 STA R33,X ; in R30-R33
|
|
|
|
|
CA4D: A5 47 449 LDA $47
|
|
|
|
|
CA4F: 9D 78 05 450 STA R32,X
|
|
|
|
|
CA52: A9 00 451 LDA #0
|
|
|
|
|
CA54: 9D F8 04 452 STA R31,X
|
|
|
|
|
CA57: 9D 78 04 453 STA R30,X
|
|
|
|
|
454
|
|
|
|
|
CA5A: A0 09 455 LDY #9 ; ASL can't be used with Y
|
|
|
|
|
CA5C: 1E F8 05 456 :LOOP ASL R33,X ; mul block num
|
|
|
|
|
CA5F: 3E 78 05 457 ROL R32,X ; by 512 to get
|
|
|
|
|
CA62: 3E F8 04 458 ROL R31,X ; real address
|
|
|
|
|
CA65: 3E 78 04 459 ROL R30,X
|
|
|
|
|
CA68: 88 460 DEY
|
|
|
|
|
CA69: D0 F1 461 BNE :LOOP
|
|
|
|
|
CA6B: 7A 462 PLY ; restore Y
|
|
|
|
|
CA6C: FA 463 PLX ; restore X
|
|
|
|
|
CA6D: 60 464 RTS
|
|
|
|
|
465
|
|
|
|
|
466
|
|
|
|
|
467 ********************************
|
|
|
|
|
468 *
|
|
|
|
|
469 * Send SD command
|
|
|
|
|
470 * Cmd is in A
|
|
|
|
|
471 *
|
|
|
|
|
472 ********************************
|
|
|
|
|
473
|
|
|
|
|
CA6E: 5A 474 COMMAND PHY ; save Y
|
|
|
|
|
CA6F: A4 3D 475 LDY SLOT
|
|
|
|
|
CA71: 9D 80 C0 476 STA DATA,X ; send command
|
|
|
|
|
CA74: B9 78 04 477 LDA R30,Y ; get arg from R30 on
|
|
|
|
|
CA77: 9D 80 C0 478 STA DATA,X
|
|
|
|
|
CA7A: B9 F8 04 479 LDA R31,Y
|
|
|
|
|
CA7D: 9D 80 C0 480 STA DATA,X
|
|
|
|
|
CA80: B9 78 05 481 LDA R32,Y
|
|
|
|
|
CA83: 9D 80 C0 482 STA DATA,X
|
|
|
|
|
CA86: B9 F8 05 483 LDA R33,Y
|
|
|
|
|
CA89: 9D 80 C0 484 STA DATA,X
|
|
|
|
|
CA8C: A9 FF 485 LDA #DUMMY
|
|
|
|
|
CA8E: 9D 80 C0 486 STA DATA,X ; dummy crc
|
|
|
|
|
===== Page 10 =====
|
|
|
|
|
|
|
|
|
|
CA91: 20 F7 C9 487 JSR GETR1
|
|
|
|
|
CA94: 7A 488 PLY ; restore Y
|
|
|
|
|
CA95: 60 489 RTS
|
|
|
|
|
490
|
|
|
|
|
491
|
|
|
|
|
492 ********************************
|
|
|
|
|
493 *
|
|
|
|
|
494 * Status request
|
|
|
|
|
495 * $43 Unit number DSSS000
|
|
|
|
|
496 * $44-45 Unused
|
|
|
|
|
497 * $46-47 Unused
|
|
|
|
|
498 *
|
|
|
|
|
499 * C Clear - No error
|
|
|
|
|
500 * Set - Error
|
|
|
|
|
501 * A $00 - No error
|
|
|
|
|
502 * $27 - I/O error
|
|
|
|
|
503 * $28 - No card inserted / no init
|
|
|
|
|
504 * $2B - Card write protected
|
|
|
|
|
505 * x - Blocks avail (low byte)
|
|
|
|
|
506 * y - Blocks avail (high byte)
|
|
|
|
|
507 *
|
|
|
|
|
508 ********************************
|
|
|
|
|
509
|
|
|
|
|
CA96: 18 510 STATUS CLC ; no error
|
|
|
|
|
CA97: A9 00 511 LDA #0
|
|
|
|
|
CA99: A2 FF 512 LDX #$FF ; 32 MB partition
|
|
|
|
|
CA9B: A0 FF 513 LDY #$FF
|
|
|
|
|
CA9D: 60 514 RTS
|
|
|
|
|
515
|
|
|
|
|
516 * TODO: check for card detect and write protect!
|
|
|
|
|
517
|
|
|
|
|
518
|
|
|
|
|
519 ********************************
|
|
|
|
|
520 *
|
|
|
|
|
521 * Read 512 byte block
|
|
|
|
|
522 * $43 Unit number DSSS0000
|
|
|
|
|
523 * $44-45 Address (LO/HI) of buffer
|
|
|
|
|
524 * $46-47 Block number (LO/HI)
|
|
|
|
|
525 *
|
|
|
|
|
526 * C Clear - No error
|
|
|
|
|
527 * Set - Error
|
|
|
|
|
528 * A $00 - No error
|
|
|
|
|
529 * $27 - Bad block number
|
|
|
|
|
530 * $28 - No card inserted
|
|
|
|
|
531 *
|
|
|
|
|
532 ********************************
|
|
|
|
|
533
|
|
|
|
|
534 * TODO: check for card detect!
|
|
|
|
|
535
|
|
|
|
|
CA9E: 20 44 CA 536 READ JSR BLOCK ; calc block address
|
|
|
|
|
537
|
|
|
|
|
CAA1: A9 0E 538 LDA #SS0 ; enable /CS
|
|
|
|
|
CAA3: 9D 83 C0 539 STA SS,X
|
|
|
|
|
CAA6: A9 51 540 LDA #$51 ; send CMD17
|
|
|
|
|
CAA8: 20 6E CA 541 JSR COMMAND ; send command
|
|
|
|
|
542
|
|
|
|
|
CAAB: C9 00 543 CMP #0 ; check for error
|
|
|
|
|
===== Page 11 =====
|
|
|
|
|
|
|
|
|
|
CAAD: D0 3F 544 BNE :ERROR
|
|
|
|
|
545
|
|
|
|
|
CAAF: A9 FF 546 :GETTOK LDA #DUMMY ; get data token
|
|
|
|
|
CAB1: 9D 80 C0 547 STA DATA,X
|
|
|
|
|
CAB4: BD 80 C0 548 LDA DATA,X ; get response
|
|
|
|
|
CAB7: C9 FE 549 CMP #$FE
|
|
|
|
|
CAB9: D0 F4 550 BNE :GETTOK ; wait for $FE
|
|
|
|
|
551
|
|
|
|
|
CABB: A0 02 552 LDY #2 ; read data from card
|
|
|
|
|
CABD: A9 17 553 LDA #FRXEN ; enable FRX
|
|
|
|
|
CABF: 9D 81 C0 554 STA CTRL,X
|
|
|
|
|
CAC2: A9 FF 555 LDA #DUMMY
|
|
|
|
|
CAC4: 9D 80 C0 556 STA DATA,X
|
|
|
|
|
CAC7: 64 3C 557 :LOOPY STZ WORK
|
|
|
|
|
CAC9: BD 80 C0 558 :LOOPW LDA DATA,X
|
|
|
|
|
CACC: 92 44 559 STA ($44)
|
|
|
|
|
CACE: E6 44 560 INC $44
|
|
|
|
|
CAD0: D0 02 561 BNE :INW
|
|
|
|
|
CAD2: E6 45 562 INC $45 ; inc msb on page boundary
|
|
|
|
|
CAD4: E6 3C 563 :INW INC WORK
|
|
|
|
|
CAD6: D0 F1 564 BNE :LOOPW
|
|
|
|
|
CAD8: 88 565 DEY
|
|
|
|
|
CAD9: D0 EC 566 BNE :LOOPY
|
|
|
|
|
567
|
|
|
|
|
CADB: A9 07 568 LDA #FRXDIS ; disable FRX
|
|
|
|
|
CADD: 9D 81 C0 569 STA CTRL,X
|
|
|
|
|
570
|
|
|
|
|
CAE0: A9 FF 571 :CRC LDA #DUMMY ; first crc byte has
|
|
|
|
|
CAE2: 9D 80 C0 572 STA DATA,X ; already been read
|
|
|
|
|
573
|
|
|
|
|
CAE5: A9 0F 574 LDA #SSNONE
|
|
|
|
|
CAE7: 9D 83 C0 575 STA SS,X ; disable /CS
|
|
|
|
|
CAEA: 18 576 CLC ; no error
|
|
|
|
|
CAEB: A9 00 577 LDA #$00
|
|
|
|
|
CAED: 60 578 RTS
|
|
|
|
|
579
|
|
|
|
|
CAEE: A9 0F 580 :ERROR LDA #SSNONE
|
|
|
|
|
CAF0: 9D 83 C0 581 STA SS,X ; disable /CS
|
|
|
|
|
CAF3: 38 582 SEC ; an error occured
|
|
|
|
|
CAF4: A9 27 583 LDA #$27
|
|
|
|
|
CAF6: 60 584 RTS
|
|
|
|
|
585
|
|
|
|
|
586
|
|
|
|
|
587 ********************************
|
|
|
|
|
588 *
|
|
|
|
|
589 * Write 512 byte block
|
|
|
|
|
590 * $43 Unit number DSSS000
|
|
|
|
|
591 * $44-45 Address (LO/HI) of buffer
|
|
|
|
|
592 * $46-47 Block number (LO/HI)
|
|
|
|
|
593 *
|
|
|
|
|
594 * C Clear - No error
|
|
|
|
|
595 * Set - Error
|
|
|
|
|
596 * A $00 - No error
|
|
|
|
|
597 * $27 - I/O error or bad block number
|
|
|
|
|
598 * $28 - No card inserted
|
|
|
|
|
599 * $2B - Card write protected
|
|
|
|
|
600 *
|
|
|
|
|
===== Page 12 =====
|
|
|
|
|
|
|
|
|
|
601 ********************************
|
|
|
|
|
602
|
|
|
|
|
603 * TODO: check for card detect and write protect!
|
|
|
|
|
604
|
|
|
|
|
CAF7: 20 44 CA 605 WRITE JSR BLOCK ; calc block address
|
|
|
|
|
606
|
|
|
|
|
CAFA: A9 0E 607 LDA #SS0 ; enable /CS
|
|
|
|
|
CAFC: 9D 83 C0 608 STA SS,X
|
|
|
|
|
CAFF: A9 58 609 LDA #$58 ; send CMD24
|
|
|
|
|
CB01: 20 6E CA 610 JSR COMMAND ; send command
|
|
|
|
|
611
|
|
|
|
|
CB04: C9 00 612 CMP #0 ; check for error
|
|
|
|
|
CB06: D0 47 613 BNE :ERROR
|
|
|
|
|
614
|
|
|
|
|
CB08: A9 FF 615 LDA #DUMMY
|
|
|
|
|
CB0A: 9D 80 C0 616 STA DATA,X ; send dummy
|
|
|
|
|
CB0D: A9 FE 617 LDA #$FE
|
|
|
|
|
CB0F: 9D 80 C0 618 STA DATA,X ; send data token
|
|
|
|
|
619
|
|
|
|
|
CB12: A0 02 620 LDY #2 ; send data to card
|
|
|
|
|
CB14: 64 3C 621 :LOOPY STZ WORK
|
|
|
|
|
CB16: B2 44 622 :LOOPW LDA ($44)
|
|
|
|
|
CB18: 9D 80 C0 623 STA DATA,X
|
|
|
|
|
CB1B: E6 44 624 INC $44
|
|
|
|
|
CB1D: D0 02 625 BNE :INW
|
|
|
|
|
CB1F: E6 45 626 INC $45 ; inc msb on page boundary
|
|
|
|
|
CB21: E6 3C 627 :INW INC WORK
|
|
|
|
|
CB23: D0 F1 628 BNE :LOOPW
|
|
|
|
|
CB25: 88 629 DEY
|
|
|
|
|
CB26: D0 EC 630 BNE :LOOPY
|
|
|
|
|
631
|
|
|
|
|
CB28: 9D 80 C0 632 :CRC STA DATA,X ; send 2 dummy crc bytes
|
|
|
|
|
CB2B: 9D 80 C0 633 STA DATA,X
|
|
|
|
|
634
|
|
|
|
|
CB2E: 9D 80 C0 635 STA DATA,X ; get data response
|
|
|
|
|
CB31: BD 80 C0 636 LDA DATA,X
|
|
|
|
|
CB34: 29 1F 637 AND #$1F
|
|
|
|
|
CB36: C9 05 638 CMP #$05
|
|
|
|
|
CB38: D0 15 639 BNE :ERROR ; check for write error
|
|
|
|
|
640
|
|
|
|
|
CB3A: A9 FF 641 :WAIT6 LDA #DUMMY
|
|
|
|
|
CB3C: 9D 80 C0 642 STA DATA,X ; wait for write cycle
|
|
|
|
|
CB3F: BD 80 C0 643 LDA DATA,X ; to complete
|
|
|
|
|
CB42: C9 00 644 CMP #$00
|
|
|
|
|
CB44: F0 F4 645 BEQ :WAIT6
|
|
|
|
|
646
|
|
|
|
|
CB46: A9 0F 647 LDA #SSNONE ; disable /CS
|
|
|
|
|
CB48: 9D 83 C0 648 STA SS,X
|
|
|
|
|
CB4B: 18 649 CLC ; no error
|
|
|
|
|
CB4C: A9 00 650 LDA #0
|
|
|
|
|
CB4E: 60 651 RTS
|
|
|
|
|
652
|
|
|
|
|
CB4F: A9 FF 653 :ERROR LDA #DUMMY
|
|
|
|
|
CB51: 9D 80 C0 654 STA DATA,X ; wait for write cycle
|
|
|
|
|
CB54: BD 80 C0 655 LDA DATA,X ; to complete
|
|
|
|
|
CB57: C9 00 656 CMP #$00
|
|
|
|
|
CB59: F0 F4 657 BEQ :ERROR
|
|
|
|
|
===== Page 13 =====
|
|
|
|
|
|
|
|
|
|
658
|
|
|
|
|
CB5B: A9 0F 659 LDA #SSNONE
|
|
|
|
|
CB5D: 9D 83 C0 660 STA SS,X ; disable /CS
|
|
|
|
|
CB60: 38 661 SEC ; an error occured
|
|
|
|
|
CB61: A9 27 662 LDA #$27
|
|
|
|
|
CB63: 60 663 RTS
|
|
|
|
|
664
|
|
|
|
|
665
|
|
|
|
|
666 ********************************
|
|
|
|
|
667 *
|
|
|
|
|
668 * Format
|
|
|
|
|
669 * not supported!
|
|
|
|
|
670 *
|
|
|
|
|
671 ********************************
|
|
|
|
|
672
|
|
|
|
|
CB64: 38 673 FORMAT SEC
|
|
|
|
|
CB65: A9 01 674 LDA #$01 ; invalid command
|
|
|
|
|
CB67: 60 675 RTS
|
|
|
|
|
676
|
|
|
|
|
677
|
|
|
|
|
CB68: 40 00 00 678 CMD0 HEX 400000
|
|
|
|
|
CB6B: 00 00 95 679 HEX 000095
|
|
|
|
|
CB6E: 41 00 00 680 CMD1 HEX 410000
|
|
|
|
|
CB71: 00 00 F9 681 HEX 0000F9
|
|
|
|
|
CB74: 48 00 00 682 CMD8 HEX 480000
|
|
|
|
|
CB77: 01 AA 87 683 HEX 01AA87
|
|
|
|
|
CB7A: 50 00 00 684 CMD16 HEX 500000
|
|
|
|
|
CB7D: 02 00 FF 685 HEX 0200FF
|
|
|
|
|
CB80: 77 00 00 686 CMD55 HEX 770000
|
|
|
|
|
CB83: 00 00 65 687 HEX 000065
|
|
|
|
|
CB86: 69 40 00 688 ACMD4140 HEX 694000
|
|
|
|
|
CB89: 00 00 77 689 HEX 000077
|
|
|
|
|
CB8C: 69 00 00 690 ACMD410 HEX 690000
|
|
|
|
|
CB8F: 00 00 FF 691 HEX 0000FF
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
--End assembly, 914 bytes, Errors: 0
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Symbol table - alphabetical order:
|
|
|
|
|
|
|
|
|
|
ACMD410 =$CB8C ACMD4140=$CB86 BLOCK =$CA44 ? BOOT =$C825
|
|
|
|
|
CMD =$C9E3 CMD0 =$CB68 CMD1 =$CB6E CMD16 =$CB7A
|
|
|
|
|
CMD55 =$CB80 CMD8 =$CB74 CMDHI =$41 CMDLO =$40
|
|
|
|
|
COMMAND =$CA6E CTRL =$C081 CURSLOT =$07F8 DATA =$C080
|
|
|
|
|
DEBUG =$00 DIV =$C082 DRIVER =$C841 DUMMY =$FF
|
|
|
|
|
FORMAT =$CB64 FRXDIS =$07 FRXEN =$17 GETR1 =$C9F7
|
|
|
|
|
GETR3 =$CA12 INIT =$C900 INITED =$0678 R30 =$0478
|
|
|
|
|
R31 =$04F8 R32 =$0578 R33 =$05F8 READ =$CA9E
|
|
|
|
|
SLOT =$3D SLOT16 =$2B SS =$C083 SS0 =$0E
|
|
|
|
|
SSNONE =$0F STATUS =$CA96 WORK =$3C WRITE =$CAF7
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Symbol table - numerical order:
|
|
|
|
|
|
|
|
|
|
DEBUG =$00 FRXDIS =$07 SS0 =$0E SSNONE =$0F
|
|
|
|
|
===== Page 14 =====
|
|
|
|
|
|
|
|
|
|
FRXEN =$17 SLOT16 =$2B WORK =$3C SLOT =$3D
|
|
|
|
|
CMDLO =$40 CMDHI =$41 DUMMY =$FF R30 =$0478
|
|
|
|
|
R31 =$04F8 R32 =$0578 R33 =$05F8 INITED =$0678
|
|
|
|
|
CURSLOT =$07F8 DATA =$C080 CTRL =$C081 DIV =$C082
|
|
|
|
|
SS =$C083 ? BOOT =$C825 DRIVER =$C841 INIT =$C900
|
|
|
|
|
CMD =$C9E3 GETR1 =$C9F7 GETR3 =$CA12 BLOCK =$CA44
|
|
|
|
|
COMMAND =$CA6E STATUS =$CA96 READ =$CA9E WRITE =$CAF7
|
|
|
|
|
FORMAT =$CB64 CMD0 =$CB68 CMD1 =$CB6E CMD8 =$CB74
|
|
|
|
|
CMD16 =$CB7A CMD55 =$CB80 ACMD4140=$CB86 ACMD410 =$CB8C
|
|
|
|
|
|
|
|
|
|
|