diff --git a/AppleIISd.bin b/AppleIISd.bin index 8306de1..42f2818 100644 Binary files a/AppleIISd.bin and b/AppleIISd.bin differ diff --git a/AppleIISd.hex b/AppleIISd.hex new file mode 100644 index 0000000..4c4bc55 --- /dev/null +++ b/AppleIISd.hex @@ -0,0 +1,64 @@ +:10000000A220A000A203863C2058FFBABD00018DAB +:10001000F807290F853D0A0A0A0A852BAA2CFFCF6B +:1000200020B0CA9003A927002000C9C900F0010030 +:10003000A9018542A52BAA85436444A90885456486 +:100040004664472CFFCF20D6CA4C0108D82058FF61 +:10005000BABD00018DF807290F853D0A0A0A0A85F5 +:100060002BAA2CFFCF20B0CA9004A927801BA980FF +:100070003C83C0F022A542C900F010C901F00FC9AD +:1000800002F00EC903F00DA90138604CC8CA4CD665 +:10009000CA4C44CB4CBACB2000C980D90000000028 +:1000A0000000000000000000000000000000000050 +:1000B0000000000000000000000000000000000040 +:1000C0000000000000000000000000000000000030 +:1000D0000000000000000000000000000000000020 +:1000E0000000000000000000000000000000000010 +:1000F0000000000000000000000000000000174C9D +:10010000D8A9039D81C0BD83C009019D83C0A907F3 +:100110009D82C0A00AA9FF9D80C03C81C010FB88C1 +:10012000D0F5BD83C029FE9D83C0A9BE8540A9CB63 +:10013000854120F2C92006CAC901D039A9CA854023 +:10014000A9CB854120F2C92021CAC901D02AA9D64C +:100150008540A9CB854120F2C92006CAA9DC85408B +:10016000A9CB854120F2C92006CAC901F0E0C90027 +:10017000D0034CB2C94CE0C9A9D68540A9CB854172 +:1001800020F2C9A9E28540A9CB854120F2C9200609 +:10019000CAC901F0E3C900D0034CB2C9A9C4854063 +:1001A000A9CB854120F2C92006CAC901F0F6C900D1 +:1001B000D02EA9D08540A9CB854120F2C92006CAFE +:1001C000C900D01CA43DBD83C009809D83C0BD81F2 +:1001D000C009049D81C018A000900838A028B00371 +:1001E00038A027BD83C009019D83C0A9009D82C09E +:1001F00098605AA000B1409D80C03C81C010FBC8EF +:10020000C00690F17A60A9FF9D80C03C81C010FBC0 +:10021000BD80C0853C2980D0EDA9FF9D80C0A53C54 +:10022000602006CA485AA004A9FF9D80C03C81C036 +:1002300010FBBD80C04888D0EFA43D6899F80568E0 +:100240009978056899F804689978047AA9FF9D80DF +:10025000C06860DA5AA63DA5469DF805A5479D7879 +:1002600005A9009DF8049D7804A9802443F005A900 +:10027000019DF804A0091EF8053E78053EF8043EED +:10028000780488D0F17AFA605AA43D9D80C0B9788C +:10029000049D80C0B9F8049D80C0B978059D80C0D8 +:1002A000B9F8059D80C0A9FF9D80C02006CA7A606C +:1002B00048A9403C83C018F00138686048A9203C38 +:1002C00083C018F001386860A900A2FFA0FF20BC1D +:1002D000CA9002A92B6020B0CAB0642053CABD8363 +:1002E000C029FE9D83C0A9512088CAC900D050A949 +:1002F000FF9D80C0BD80C0C9FED0F4A002BD81C0FA +:1003000009109D81C0A9FF9D80C0643CBD80C09242 +:1003100044E644D002E645E63CD0F188D0ECBD800E +:10032000C0BD80C0BD80C0BD81C029EF9D81C01807 +:10033000A9000848BD83C009019D83C068286038B2 +:10034000A92780EE20B0CAB06720BCCAB06720538E +:10035000CABD83C029FE9D83C0A9582088CAC90090 +:10036000D04EA9FF9D80C0A9FE9D80C0A002643C24 +:10037000B2449D80C0E644D002E645E63CD0F18818 +:10038000D0EC9D80C09D80C09D80C0BD80C0291FD5 +:10039000C905D01C18A9000848A9FF9D80C0BD80D0 +:1003A000C0C900F0F4BD83C009019D83C068286006 +:1003B00038A92780E238A92B80DD38A901604000E8 +:1003C000000000954100000000F948000001AA87E4 +:1003D0005000000200FF7700000000656940000047 +:0803E00000776900000000FF36 +:00000001FF diff --git a/AppleIISd.lst b/AppleIISd.lst index 9d1be02..ac199fb 100644 --- a/AppleIISd.lst +++ b/AppleIISd.lst @@ -10,7 +10,7 @@ 10 * 11 ******************************** 12 - 27-AUG-17 14:47 + 9-SEP-17 19:55 14 15 XC ; enable 65C02 code 16 DEBUG = 0 @@ -45,7 +45,7 @@ 45 ECE = $04 46 SS0 = $01 ; SS register 47 WP = $20 - 48 CARDDET = $40 + 48 CD = $40 49 INITED = $80 50 51 @@ -65,704 +65,763 @@ C806: 86 3C 57 STX WORK 65 STA CURSLOT 66 LDA #$40 67 STA SLOT16 - 68 ELSE -C808: 20 58 FF 69 JSR $FF58 -C80B: BA 70 TSX -C80C: BD 00 01 71 LDA $0100,X -C80F: 29 0F 72 AND #$0F -C811: 85 3D 73 STA SLOT ; $0s -C813: 09 C0 74 ORA #$C0 -C815: 8D F8 07 75 STA CURSLOT ; $Cs -C818: 0A 76 ASL A -C819: 0A 77 ASL A -C81A: 0A 78 ASL A -C81B: 0A 79 ASL A -C81C: 85 2B 80 STA SLOT16 ; $s0 + 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 -C81E: AA 82 TAX ; X holds now SLOT16 - 83 -C81F: 2C FF CF 84 BIT $CFFF -C822: 20 00 C9 85 JSR INIT - 86 - 87 * - 88 * TODO: check for init error - 89 * - 90 - 91 ******************************** - 92 * - 93 * Install SD card driver + 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 ******************************** - 96 - 97 DO DEBUG + 95 * Install SD card driver + 96 * + 97 ******************************** 98 - 99 * see if slot has a driver already + 99 DO DEBUG 100 - 101 LDX $BF31 ; get devcnt - 102 INSTALL LDA $BF32,X ; get a devnum - 103 AND #$70 ; isolate slot - 104 CMP SLOT16 ; slot? - 105 BEQ :INSOUT ; yes, skip it - 106 DEX - 107 BPL INSTALL ; keep up the search - 108 - 109 * restore the devnum to the list + 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 LDX $BF31 ; get devcnt again - 112 CPX #$0D ; device table full? - 113 BNE :INST2 - 114 - 115 JSR $FF3A ; bell - 116 JMP :INSOUT ; do something! - 117 - 118 :INST2 LDA $BF32-1,X ; move all entries down - 119 STA $BF32,X ; to make room at front - 120 DEX ; for a new entry - 121 BNE :INST2 - 122 LDA #$04 ; ProFile type device - 123 ORA SLOT16 - 124 STA $BF32 ; slot, drive 1 at top of list - 125 INC $BF31 ; update devcnt - 126 - 127 * now insert the device driver vector + 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 LDA SLOT - 130 ASL - 131 TAX - 132 LDA #DRIVER - 135 STA $BF11,X - 136 :INSOUT RTS - 137 - 138 - 139 ******************************** - 140 * - 141 * Boot from SD card + 129 * now insert the device driver vector + 130 + 131 LDA SLOT + 132 ASL + 133 TAX + 134 LDA #DRIVER + 137 STA $BF11,X + 138 :INSOUT RTS + 139 + 140 + 141 ******************************** 142 * - 143 ******************************** - 144 - 145 ELSE + 143 * Boot from SD card + 144 * + 145 ******************************** 146 -C825: A9 01 147 BOOT LDA #$01 -C827: 85 42 148 STA $42 ; load command -C829: A5 2B 149 LDA SLOT16 -C82B: AA 150 TAX -C82C: 85 43 151 STA $43 ; slot number -C82E: 64 44 152 STZ $44 ; buffer lo -C830: A9 08 153 LDA #$08 -C832: 85 45 154 STA $45 ; buffer hi -C834: 64 46 155 STZ $46 ; block lo -C836: 64 47 156 STZ $47 ; block hi -C838: 2C FF CF 157 BIT $CFFF -C83B: 20 AD CA 158 JSR READ ; call driver -C83E: 4C 01 08 159 JMP $801 ; goto bootloader - 160 - 161 FIN - 162 - 163 - 164 ******************************** - 165 * - 166 * Jump table - 167 * - 168 ******************************** + 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 -C841: D8 170 DRIVER CLD - 171 DO DEBUG - 172 LDA #$04 - 173 STA SLOT - 174 LDA #$C4 - 175 STA CURSLOT - 176 LDA #$40 - 177 STA SLOT16 - 178 ELSE -C842: 20 58 FF 179 JSR $FF58 ; find slot nr -C845: BA 180 TSX -C846: BD 00 01 181 LDA $0100,X -C849: 29 0F 182 AND #$0F -C84B: 85 3D 183 STA SLOT ; $0s -C84D: 09 C0 184 ORA #$C0 -C84F: 8D F8 07 185 STA CURSLOT ; $Cs -C852: 0A 186 ASL A -C853: 0A 187 ASL A -C854: 0A 188 ASL A -C855: 0A 189 ASL A -C856: 85 2B 190 STA SLOT16 ; $s0 - 191 FIN -C858: AA 192 TAX ; X holds now SLOT16 - 193 -C859: 2C FF CF 194 BIT $CFFF -C85C: A9 80 195 LDA #INITED ; check for init -C85E: 3C 83 C0 196 BIT SS,X -C861: F0 22 197 BEQ :INIT - 198 -C863: A5 42 199 :CMD LDA $42 ; get command -C865: C9 00 200 CMP #$00 -C867: F0 10 201 BEQ :STATUS -C869: C9 01 202 CMP #$01 -C86B: F0 0F 203 BEQ :READ -C86D: C9 02 204 CMP #$02 -C86F: F0 0E 205 BEQ :WRITE -C871: C9 03 206 CMP #$03 -C873: F0 0D 207 BEQ :FORMAT -C875: 38 208 SEC ; unknown command -C876: A9 01 209 LDA #$01 -C878: 60 210 RTS - 211 -C879: 4C A5 CA 212 :STATUS JMP STATUS -C87C: 4C AD CA 213 :READ JMP READ -C87F: 4C 15 CB 214 :WRITE JMP WRITE -C882: 4C 8B CB 215 :FORMAT JMP FORMAT -C885: 20 00 C9 216 :INIT JSR INIT -C888: 80 D9 217 BRA :CMD - 218 - 219 - 220 * Signature bytes + 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 -C88A: 00 00 00 222 DS \ ; fill with zeroes -C88D: 00 00 00 00 -C891: 00 00 00 00 -C895: 00 00 00 00 -C899: 00 00 00 00 -C89D: 00 00 00 00 -C8A1: 00 00 00 00 -C8A5: 00 00 00 00 -C8A9: 00 00 00 00 -C8AD: 00 00 00 00 -C8B1: 00 00 00 00 -C8B5: 00 00 00 00 -C8B9: 00 00 00 00 -C8BD: 00 00 00 00 -C8C1: 00 00 00 00 -C8C5: 00 00 00 00 -C8C9: 00 00 00 00 -C8CD: 00 00 00 00 -C8D1: 00 00 00 00 -C8D5: 00 00 00 00 -C8D9: 00 00 00 00 -C8DD: 00 00 00 00 -C8E1: 00 00 00 00 -C8E5: 00 00 00 00 -C8E9: 00 00 00 00 -C8ED: 00 00 00 00 -C8F1: 00 00 00 00 -C8F5: 00 00 00 00 -C8F9: 00 00 00 00 -C8FD: 00 00 00 - 223 DS -4 ; locate to $xxFC -C8FC: FF FF 224 DW $FFFF ; 65535 blocks -C8FE: 47 225 DB $47 ; Status bits -C8FF: 41 226 DB #CMD0 -C930: 85 41 264 STA CMDHI -C932: 20 F2 C9 265 JSR CMD -C935: 20 06 CA 266 JSR GETR1 ; get response -C938: C9 01 267 CMP #$01 -C93A: D0 39 268 BNE :ERROR1 ; error! - 269 -C93C: A9 9B 270 LDA #CMD8 -C942: 85 41 273 STA CMDHI -C944: 20 F2 C9 274 JSR CMD -C947: 20 21 CA 275 JSR GETR3 -C94A: C9 01 276 CMP #$01 -C94C: D0 2A 277 BNE :SDV1 ; may be SD Ver. 1 - 278 - 279 * check for $01aa match! -C94E: A9 A7 280 :SDV2 LDA #CMD55 -C954: 85 41 283 STA CMDHI -C956: 20 F2 C9 284 JSR CMD -C959: 20 06 CA 285 JSR GETR1 -C95C: A9 AD 286 LDA #ACMD4140 -C962: 85 41 289 STA CMDHI -C964: 20 F2 C9 290 JSR CMD -C967: 20 06 CA 291 JSR GETR1 -C96A: C9 01 292 CMP #$01 -C96C: F0 E0 293 BEQ :SDV2 ; wait for ready -C96E: C9 00 294 CMP #$00 -C970: D0 03 295 BNE :ERROR1 ; error! - 296 * send CMD58 - 297 * SD Ver. 2 initialized! -C972: 4C B2 C9 298 JMP :BLOCKSZ - 299 -C975: 4C E0 C9 300 :ERROR1 JMP :IOERROR ; needed for far jump - 301 -C978: A9 A7 302 :SDV1 LDA #CMD55 -C97E: 85 41 305 STA CMDHI -C980: 20 F2 C9 306 JSR CMD ; ignore response -C983: A9 B3 307 LDA #ACMD410 -C989: 85 41 310 STA CMDHI -C98B: 20 F2 C9 311 JSR CMD -C98E: 20 06 CA 312 JSR GETR1 -C991: C9 01 313 CMP #$01 -C993: F0 E3 314 BEQ :SDV1 ; wait for ready -C995: C9 00 315 CMP #$00 -C997: D0 03 316 BNE :MMC ; may be MMC card - 317 * SD Ver. 1 initialized! -C999: 4C B2 C9 318 JMP :BLOCKSZ - 319 -C99C: A9 95 320 :MMC LDA #CMD1 -C9A2: 85 41 323 STA CMDHI -C9A4: 20 F2 C9 324 :LOOP1 JSR CMD -C9A7: 20 06 CA 325 JSR GETR1 -C9AA: C9 01 326 CMP #$01 -C9AC: F0 F6 327 BEQ :LOOP1 ; wait for ready -C9AE: C9 00 328 CMP #$00 -C9B0: D0 2E 329 BNE :IOERROR ; error! - 330 * MMC Ver. 3 initialized! - 331 -C9B2: A9 A1 332 :BLOCKSZ LDA #CMD16 -C9B8: 85 41 335 STA CMDHI -C9BA: 20 F2 C9 336 JSR CMD -C9BD: 20 06 CA 337 JSR GETR1 -C9C0: C9 00 338 CMP #$00 -C9C2: D0 1C 339 BNE :IOERROR ; error! - 340 -C9C4: A4 3D 341 :END LDY SLOT -C9C6: BD 83 C0 342 LDA SS,X -C9C9: 09 80 343 ORA #INITED ; initialized -C9CB: 9D 83 C0 344 STA SS,X -C9CE: BD 81 C0 345 LDA CTRL,X -C9D1: 09 04 346 ORA #ECE ; enable 7MHz -C9D3: 9D 81 C0 347 STA CTRL,X -C9D6: 18 348 CLC ; all ok -C9D7: A0 00 349 LDY #0 -C9D9: 90 08 350 BCC :END1 -C9DB: 38 351 :CDERROR SEC -C9DC: A0 28 352 LDY #$28 ; no card error -C9DE: B0 03 353 BCS :END1 -C9E0: 38 354 :IOERROR SEC -C9E1: A0 27 355 LDY #$27 ; init error -C9E3: BD 83 C0 356 :END1 LDA SS,X ; set CS high -C9E6: 09 01 357 ORA #SS0 -C9E8: 9D 83 C0 358 STA SS,X -C9EB: A9 00 359 LDA #0 ; set div to 2 -C9ED: 9D 82 C0 360 STA DIV,X -C9F0: 98 361 TYA ; retval in A -C9F1: 60 362 RTS - 363 - 364 - 365 ******************************** - 366 * - 367 * Send SD command - 368 * Call with command in CMDHI and CMDLO - 369 * - 370 ******************************** - 371 -C9F2: 5A 372 CMD PHY -C9F3: A0 00 373 LDY #0 -C9F5: B1 40 374 :LOOP LDA (CMDLO),Y -C9F7: 9D 80 C0 375 STA DATA,X -C9FA: 3C 81 C0 376 :WAIT BIT CTRL,X ; TC is in N -C9FD: 10 FB 377 BPL :WAIT -C9FF: C8 378 INY -CA00: C0 06 379 CPY #6 -CA02: 90 F1 380 BCC :LOOP -CA04: 7A 381 PLY -CA05: 60 382 RTS - 383 + 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 +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 +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 +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 +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 +C97E: 85 41 318 STA CMDHI +C980: 20 F2 C9 319 JSR CMD ; ignore response +C983: A9 E2 320 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 +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 +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 - 385 ******************************** - 386 * - 387 * Get R1 - 388 * R1 is in A - 389 * - 390 ******************************** - 391 -CA06: A9 FF 392 GETR1 LDA #DUMMY -CA08: 9D 80 C0 393 STA DATA,X -CA0B: 3C 81 C0 394 :WAIT BIT CTRL,X -CA0E: 10 FB 395 BPL :WAIT -CA10: BD 80 C0 396 LDA DATA,X ; get response -CA13: 85 3C 397 STA WORK ; save R1 -CA15: 29 80 398 AND #$80 -CA17: D0 ED 399 BNE GETR1 ; wait for MSB=0 -CA19: A9 FF 400 LDA #DUMMY -CA1B: 9D 80 C0 401 STA DATA,X ; send another dummy -CA1E: A5 3C 402 LDA WORK ; restore R1 -CA20: 60 403 RTS +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 - 405 - 406 ******************************** - 407 * - 408 * Get R3 - 409 * R1 is in A - 410 * R3 is in scratchpad ram - 411 * - 412 ******************************** - 413 -CA21: 20 06 CA 414 GETR3 JSR GETR1 ; get R1 first -CA24: 48 415 PHA ; save R1 -CA25: 5A 416 PHY ; save Y -CA26: A0 04 417 LDY #04 ; load counter -CA28: A9 FF 418 :LOOP LDA #DUMMY ; send dummy -CA2A: 9D 80 C0 419 STA DATA,X -CA2D: 3C 81 C0 420 :WAIT BIT CTRL,X -CA30: 10 FB 421 BPL :WAIT -CA32: BD 80 C0 422 LDA DATA,X -CA35: 48 423 PHA -CA36: 88 424 DEY -CA37: D0 EF 425 BNE :LOOP ; do 4 times -CA39: A4 3D 426 LDY SLOT -CA3B: 68 427 PLA -CA3C: 99 F8 05 428 STA R33,Y ; save R3 -CA3F: 68 429 PLA -CA40: 99 78 05 430 STA R32,Y -CA43: 68 431 PLA -CA44: 99 F8 04 432 STA R31,Y -CA47: 68 433 PLA -CA48: 99 78 04 434 STA R30,Y -CA4B: 7A 435 PLY ; restore Y -CA4C: A9 FF 436 LDA #DUMMY -CA4E: 9D 80 C0 437 STA DATA,X ; send another dummy -CA51: 68 438 PLA ; restore R1 -CA52: 60 439 RTS - 440 - 441 - 442 ******************************** - 443 * - 444 * Calculate block address - 445 * Block no is in $46-47 - 446 * Address is in R30-R33 - 447 * - 448 ******************************** - 449 -CA53: DA 450 BLOCK PHX ; save X -CA54: 5A 451 PHY ; save Y -CA55: A6 3D 452 LDX SLOT -CA57: A5 46 453 LDA $46 ; store block num -CA59: 9D F8 05 454 STA R33,X ; in R30-R33 -CA5C: A5 47 455 LDA $47 -CA5E: 9D 78 05 456 STA R32,X -CA61: A9 00 457 LDA #0 -CA63: 9D F8 04 458 STA R31,X -CA66: 9D 78 04 459 STA R30,X - 460 -CA69: A0 09 461 LDY #9 ; ASL can't be used with Y -CA6B: 1E F8 05 462 :LOOP ASL R33,X ; mul block num -CA6E: 3E 78 05 463 ROL R32,X ; by 512 to get -CA71: 3E F8 04 464 ROL R31,X ; real address -CA74: 3E 78 04 465 ROL R30,X -CA77: 88 466 DEY -CA78: D0 F1 467 BNE :LOOP -CA7A: 7A 468 PLY ; restore Y -CA7B: FA 469 PLX ; restore X -CA7C: 60 470 RTS - 471 - 472 - 473 ******************************** - 474 * - 475 * Send SD command - 476 * Cmd is in A - 477 * - 478 ******************************** - 479 -CA7D: 5A 480 COMMAND PHY ; save Y -CA7E: A4 3D 481 LDY SLOT -CA80: 9D 80 C0 482 STA DATA,X ; send command -CA83: B9 78 04 483 LDA R30,Y ; get arg from R30 on -CA86: 9D 80 C0 484 STA DATA,X -CA89: B9 F8 04 485 LDA R31,Y -CA8C: 9D 80 C0 486 STA DATA,X -CA8F: B9 78 05 487 LDA R32,Y -CA92: 9D 80 C0 488 STA DATA,X -CA95: B9 F8 05 489 LDA R33,Y -CA98: 9D 80 C0 490 STA DATA,X -CA9B: A9 FF 491 LDA #DUMMY -CA9D: 9D 80 C0 492 STA DATA,X ; dummy crc -CAA0: 20 06 CA 493 JSR GETR1 -CAA3: 7A 494 PLY ; restore Y -CAA4: 60 495 RTS - 496 - 497 +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 * - 500 * Status request - 501 * $43 Unit number DSSS000 - 502 * $44-45 Unused - 503 * $46-47 Unused - 504 * - 505 * C Clear - No error - 506 * Set - Error - 507 * A $00 - No error - 508 * $27 - I/O error - 509 * $28 - No card inserted / no init - 510 * $2B - Card write protected - 511 * x - Blocks avail (low byte) - 512 * y - Blocks avail (high byte) - 513 * - 514 ******************************** - 515 -CAA5: 18 516 STATUS CLC ; no error -CAA6: A9 00 517 LDA #0 -CAA8: A2 FF 518 LDX #$FF ; 32 MB partition -CAAA: A0 FF 519 LDY #$FF -CAAC: 60 520 RTS - 521 - 522 * TODO: check for card detect and write protect! - 523 - 524 + 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 * - 527 * Read 512 byte block - 528 * $43 Unit number DSSS0000 - 529 * $44-45 Address (LO/HI) of buffer - 530 * $46-47 Block number (LO/HI) - 531 * - 532 * C Clear - No error - 533 * Set - Error - 534 * A $00 - No error - 535 * $27 - Bad block number - 536 * $28 - No card inserted - 537 * - 538 ******************************** - 539 - 540 * TODO: check for card detect! - 541 -CAAD: 20 53 CA 542 READ JSR BLOCK ; calc block address - 543 -CAB0: BD 83 C0 544 LDA SS,X ; enable /CS -CAB3: 29 FE 545 AND #$FF!SS0 -CAB5: 9D 83 C0 546 STA SS,X -CAB8: A9 51 547 LDA #$51 ; send CMD17 -CABA: 20 7D CA 548 JSR COMMAND ; send command - 549 -CABD: C9 00 550 CMP #0 ; check for error -CABF: D0 48 551 BNE :ERROR - 552 -CAC1: A9 FF 553 :GETTOK LDA #DUMMY ; get data token -CAC3: 9D 80 C0 554 STA DATA,X -CAC6: BD 80 C0 555 LDA DATA,X ; get response -CAC9: C9 FE 556 CMP #$FE -CACB: D0 F4 557 BNE :GETTOK ; wait for $FE - 558 -CACD: A0 02 559 LDY #2 ; read data from card -CACF: BD 81 C0 560 LDA CTRL,X ; enable FRX -CAD2: 09 10 561 ORA #FRX -CAD4: 9D 81 C0 562 STA CTRL,X -CAD7: A9 FF 563 LDA #DUMMY -CAD9: 9D 80 C0 564 STA DATA,X -CADC: 64 3C 565 :LOOPY STZ WORK -CADE: BD 80 C0 566 :LOOPW LDA DATA,X -CAE1: 92 44 567 STA ($44) -CAE3: E6 44 568 INC $44 -CAE5: D0 02 569 BNE :INW -CAE7: E6 45 570 INC $45 ; inc msb on page boundary -CAE9: E6 3C 571 :INW INC WORK -CAEB: D0 F1 572 BNE :LOOPW -CAED: 88 573 DEY -CAEE: D0 EC 574 BNE :LOOPY - 575 -CAF0: BD 81 C0 576 LDA CTRL,X ; disable FRX -CAF3: 29 EF 577 AND #$FF!FRX -CAF5: 9D 81 C0 578 STA CTRL,X - 579 -CAF8: A9 FF 580 :CRC LDA #DUMMY ; first crc byte has -CAFA: 9D 80 C0 581 STA DATA,X ; already been read - 582 -CAFD: BD 83 C0 583 LDA SS,X -CB00: 09 01 584 ORA #SS0 -CB02: 9D 83 C0 585 STA SS,X ; disable /CS -CB05: 18 586 CLC ; no error -CB06: A9 00 587 LDA #$00 -CB08: 60 588 RTS - 589 -CB09: BD 83 C0 590 :ERROR LDA SS,X -CB0C: 09 01 591 ORA #SS0 -CB0E: 9D 83 C0 592 STA SS,X ; disable /CS -CB11: 38 593 SEC ; an error occured -CB12: A9 27 594 LDA #$27 -CB14: 60 595 RTS - 596 - 597 + 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 * - 600 * Write 512 byte block - 601 * $43 Unit number DSSS000 - 602 * $44-45 Address (LO/HI) of buffer - 603 * $46-47 Block number (LO/HI) - 604 * - 605 * C Clear - No error - 606 * Set - Error - 607 * A $00 - No error - 608 * $27 - I/O error or bad block number - 609 * $28 - No card inserted - 610 * $2B - Card write protected - 611 * - 612 ******************************** + 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 - 614 * TODO: check for card detect and write protect! - 615 -CB15: 20 53 CA 616 WRITE JSR BLOCK ; calc block address - 617 -CB18: BD 83 C0 618 LDA SS,X ; enable /CS -CB1B: 29 FE 619 AND #$FF!SS0 -CB1D: 9D 83 C0 620 STA SS,X -CB20: A9 58 621 LDA #$58 ; send CMD24 -CB22: 20 7D CA 622 JSR COMMAND ; send command - 623 -CB25: C9 00 624 CMP #0 ; check for error -CB27: D0 4A 625 BNE :ERROR - 626 -CB29: A9 FF 627 LDA #DUMMY -CB2B: 9D 80 C0 628 STA DATA,X ; send dummy -CB2E: A9 FE 629 LDA #$FE -CB30: 9D 80 C0 630 STA DATA,X ; send data token - 631 -CB33: A0 02 632 LDY #2 ; send data to card -CB35: 64 3C 633 :LOOPY STZ WORK -CB37: B2 44 634 :LOOPW LDA ($44) -CB39: 9D 80 C0 635 STA DATA,X -CB3C: E6 44 636 INC $44 -CB3E: D0 02 637 BNE :INW -CB40: E6 45 638 INC $45 ; inc msb on page boundary -CB42: E6 3C 639 :INW INC WORK -CB44: D0 F1 640 BNE :LOOPW -CB46: 88 641 DEY -CB47: D0 EC 642 BNE :LOOPY - 643 -CB49: 9D 80 C0 644 :CRC STA DATA,X ; send 2 dummy crc bytes -CB4C: 9D 80 C0 645 STA DATA,X +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 -CB4F: 9D 80 C0 647 STA DATA,X ; get data response -CB52: BD 80 C0 648 LDA DATA,X -CB55: 29 1F 649 AND #$1F -CB57: C9 05 650 CMP #$05 -CB59: D0 18 651 BNE :ERROR ; check for write error - 652 -CB5B: A9 FF 653 :WAIT6 LDA #DUMMY -CB5D: 9D 80 C0 654 STA DATA,X ; wait for write cycle -CB60: BD 80 C0 655 LDA DATA,X ; to complete -CB63: C9 00 656 CMP #$00 -CB65: F0 F4 657 BEQ :WAIT6 - 658 -CB67: BD 83 C0 659 LDA SS,X ; disable /CS -CB6A: 09 01 660 ORA #SS0 -CB6C: 9D 83 C0 661 STA SS,X -CB6F: 18 662 CLC ; no error -CB70: A9 00 663 LDA #0 -CB72: 60 664 RTS - 665 -CB73: A9 FF 666 :ERROR LDA #DUMMY -CB75: 9D 80 C0 667 STA DATA,X ; wait for write cycle -CB78: BD 80 C0 668 LDA DATA,X ; to complete -CB7B: C9 00 669 CMP #$00 -CB7D: F0 F4 670 BEQ :ERROR - 671 -CB7F: BD 83 C0 672 LDA SS,X -CB82: 09 01 673 ORA #SS0 -CB84: 9D 83 C0 674 STA SS,X ; disable /CS -CB87: 38 675 SEC ; an error occured -CB88: A9 27 676 LDA #$27 -CB8A: 60 677 RTS +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 - 679 - 680 ******************************** - 681 * - 682 * Format - 683 * not supported! - 684 * - 685 ******************************** - 686 -CB8B: 38 687 FORMAT SEC -CB8C: A9 01 688 LDA #$01 ; invalid command -CB8E: 60 689 RTS - 690 - 691 -CB8F: 40 00 00 692 CMD0 HEX 400000 -CB92: 00 00 95 693 HEX 000095 -CB95: 41 00 00 694 CMD1 HEX 410000 -CB98: 00 00 F9 695 HEX 0000F9 -CB9B: 48 00 00 696 CMD8 HEX 480000 -CB9E: 01 AA 87 697 HEX 01AA87 -CBA1: 50 00 00 698 CMD16 HEX 500000 -CBA4: 02 00 FF 699 HEX 0200FF -CBA7: 77 00 00 700 CMD55 HEX 770000 -CBAA: 00 00 65 701 HEX 000065 -CBAD: 69 40 00 702 ACMD4140 HEX 694000 -CBB0: 00 00 77 703 HEX 000077 -CBB3: 69 00 00 704 ACMD410 HEX 690000 -CBB6: 00 00 FF 705 HEX 0000FF +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, 953 bytes, Errors: 0 +--End assembly, 1000 bytes, Errors: 0 Symbol table - alphabetical order: - ACMD410 =$CBB3 ACMD4140=$CBAD BLOCK =$CA53 ? BOOT =$C825 -? CARDDET =$40 CMD =$C9F2 CMD0 =$CB8F CMD1 =$CB95 - CMD16 =$CBA1 CMD55 =$CBA7 CMD8 =$CB9B CMDHI =$41 - CMDLO =$40 COMMAND =$CA7D CTRL =$C081 CURSLOT =$07F8 - DATA =$C080 DEBUG =$00 DIV =$C082 DRIVER =$C841 - DUMMY =$FF ECE =$04 FORMAT =$CB8B FRX =$10 - GETR1 =$CA06 GETR3 =$CA21 INIT =$C900 INITED =$80 - R30 =$0478 R31 =$04F8 R32 =$0578 R33 =$05F8 - READ =$CAAD SLOT =$3D SLOT16 =$2B SS =$C083 - SS0 =$01 STATUS =$CAA5 WORK =$3C ? WP =$20 - WRITE =$CB15 + 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 ? CARDDET =$40 CMDHI =$41 INITED =$80 + 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 =$C825 DRIVER =$C841 - INIT =$C900 CMD =$C9F2 GETR1 =$CA06 GETR3 =$CA21 - BLOCK =$CA53 COMMAND =$CA7D STATUS =$CAA5 READ =$CAAD - WRITE =$CB15 FORMAT =$CB8B CMD0 =$CB8F CMD1 =$CB95 - CMD8 =$CB9B CMD16 =$CBA1 CMD55 =$CBA7 ACMD4140=$CBAD - ACMD410 =$CBB3 + DIV =$C082 SS =$C083 ? BOOT =$C82B DRIVER =$C84C + INIT =$C900 CMD =$C9F2 GETR1 =$CA06 GETR3 =$C ÓÔÁ ÃÍÄÌÏ´±°òå òåóðïîóååäåä æïò æáò êõíð䪪ªùòéåó äï÷îäïò éîéôéóô÷ ìéóô READ =$CADF WRITE =$CB4D FORMAT =$CBC3 + CMD0 =$CBC7 CMD1 =$CBCD CBDF ACMD4140=$CBE5 ACMD410 =$CBEB \ No newline at end of file diff --git a/AppleIISd.s b/AppleIISd.s index 43b4bb6..807ca6d 100644 --- a/AppleIISd.s +++ b/AppleIISd.s @@ -45,7 +45,7 @@ FRX = $10 ; CTRL register ECE = $04 SS0 = $01 ; SS register WP = $20 -CARDDET = $40 +CD = $40 INITED = $80 @@ -65,28 +65,30 @@ INITED = $80 STA CURSLOT LDA #$40 STA SLOT16 + ELSE JSR $FF58 TSX LDA $0100,X + STA CURSLOT ; $Cs AND #$0F STA SLOT ; $0s - ORA #$C0 - STA CURSLOT ; $Cs ASL A ASL A ASL A ASL A STA SLOT16 ; $s0 FIN + TAX ; X holds now SLOT16 - BIT $CFFF - JSR INIT + JSR CARDDET + BCC :INIT + LDA #$27 ; no card inserted + BRK + +:INIT JSR INIT -* -* TODO: check for init error -* ******************************** * @@ -144,7 +146,11 @@ INSTALL LDA $BF32,X ; get a devnum ELSE -BOOT LDA #$01 +BOOT CMP #0 ; check for error + BEQ :BOOT1 + BRK + +:BOOT1 LDA #$01 STA $42 ; load command LDA SLOT16 TAX @@ -168,6 +174,7 @@ BOOT LDA #$01 ******************************** DRIVER CLD + DO DEBUG LDA #$04 STA SLOT @@ -175,38 +182,44 @@ DRIVER CLD STA CURSLOT LDA #$40 STA SLOT16 + ELSE JSR $FF58 ; find slot nr TSX LDA $0100,X + STA CURSLOT ; $Cs AND #$0F STA SLOT ; $0s - ORA #$C0 - STA CURSLOT ; $Cs ASL A ASL A ASL A ASL A STA SLOT16 ; $s0 FIN - TAX ; X holds now SLOT16 + TAX ; X holds now SLOT16 BIT $CFFF - LDA #INITED ; check for init + JSR CARDDET + BCC :INITED + LDA #$27 ; no card inserted + BRA :DONE + +:INITED LDA #INITED ; check for init BIT SS,X BEQ :INIT :CMD LDA $42 ; get command - CMP #$00 + CMP #0 BEQ :STATUS - CMP #$01 + CMP #1 BEQ :READ - CMP #$02 + CMP #2 BEQ :WRITE - CMP #$03 + CMP #3 BEQ :FORMAT - SEC ; unknown command - LDA #$01 + LDA #1 ; unknown command + +:DONE SEC RTS :STATUS JMP STATUS @@ -221,8 +234,8 @@ DRIVER CLD DS \ ; fill with zeroes DS -4 ; locate to $xxFC - DW $FFFF ; 65535 blocks - DB $47 ; Status bits + DW $0000 ; use status request + DB $17 ; Status bits DB #