From 7d67a7b4d5970e2b0e4d0db796e7b71aa0c54d90 Mon Sep 17 00:00:00 2001 From: Unknown Date: Fri, 11 Aug 2017 22:59:02 +0200 Subject: [PATCH] Several fixes, binary and srec files added --- AppleIISd.bin | Bin 0 -> 952 bytes AppleIISd.lst | 941 +++++++++++++++++++++++++------------------------- AppleIISd.s | 114 +++--- AppleIISd.s19 | 62 ++++ 4 files changed, 601 insertions(+), 516 deletions(-) create mode 100644 AppleIISd.bin create mode 100644 AppleIISd.s19 diff --git a/AppleIISd.bin b/AppleIISd.bin new file mode 100644 index 0000000000000000000000000000000000000000..ecb758f8ec0e74f5f7e5298668c445e57eb7717a GIT binary patch literal 952 zcmcIiO=uHA6rLozi4C-gw<4l@t1(`ZQulQH?G`;cFthJ{@8jF|&AgU?Kr3=z z6sGMr9S}+-)clCCV8!BWspZ!YL(}S#;{KnGlQ5qGl*wXE8C!@ox zZqlEa@+k-=yVhh*u6DXp2( zz9~K21pjZ@_EdEXN8p@+6L8+ZF?i2FacskeA=F{9 zm+^BSiJA<#h*x}Mm*Cao8MC)d0F6kiMCy`bOuT-A_UVX*pPVTCV1=_71yDfa;|MIC z%ApHuksO*hGy#~2XL1FB*G1Py*N86e)n(sUr(vjKszJXDAx)H-t#So%0YpzsBYD=1u(?$!6@%5vUq zWJBS+knxYMc|+m7(DFjR7uH-|9><_%BU=`7=HZ*%6mFS5r_(UV0qvu3RSbZSOT7{e z_pbFsy3?c|g{V2aC8p*pO$U_lf!mBDwq9~GPv>)!?x3&>J2T=94C^9wp78Wc0Adr~ r_x}3#N)AuR&fpiFVShU5oWIHdgxU{o01yWDtb^Q{DYA2R#)<7e>9Ma^ literal 0 HcmV?d00001 diff --git a/AppleIISd.lst b/AppleIISd.lst index 883922e..8f2bda7 100644 --- a/AppleIISd.lst +++ b/AppleIISd.lst @@ -10,10 +10,10 @@ 10 * 11 ******************************** 12 - 16-JUL-17 23:22 + 11-AUG-17 22:51 14 15 XC ; enable 65C02 code - 16 DEBUG = 1 + 16 DEBUG = 0 17 DO DEBUG 18 ORG $8000 19 ELSE @@ -53,40 +53,40 @@ 53 54 * signature bytes 55 -8000: A2 20 56 LDX #$20 -8002: A0 00 57 LDY #$00 -8004: A2 03 58 LDX #$03 -8006: 86 3C 59 STX WORK +C800: A2 20 56 LDX #$20 +C802: A0 00 57 LDY #$00 +C804: A2 03 58 LDX #$03 +C806: 86 3C 59 STX WORK ===== Page 2 ===== 60 61 * find slot nr 62 63 DO DEBUG -8008: A9 04 64 LDA #$04 -800A: 85 3D 65 STA SLOT -800C: A9 C4 66 LDA #$C4 -800E: 8D F8 07 67 STA CURSLOT -8011: A9 40 68 LDA #$40 -8013: 85 2B 69 STA SLOT16 + 64 LDA #$04 + 65 STA SLOT + 66 LDA #$C4 + 67 STA CURSLOT + 68 LDA #$40 + 69 STA SLOT16 70 ELSE - 71 JSR $FF58 - 72 TSX - 73 LDA $0100,X - 74 AND #$0F - 75 STA SLOT ; $0s - 76 ORA #$C0 - 77 STA CURSLOT ; $Cs - 78 ASL A - 79 ASL A - 80 ASL A - 81 ASL A - 82 STA SLOT16 ; $s0 +C808: 20 58 FF 71 JSR $FF58 +C80B: BA 72 TSX +C80C: BD 00 01 73 LDA $0100,X +C80F: 29 0F 74 AND #$0F +C811: 85 3D 75 STA SLOT ; $0s +C813: 09 C0 76 ORA #$C0 +C815: 8D F8 07 77 STA CURSLOT ; $Cs +C818: 0A 78 ASL A +C819: 0A 79 ASL A +C81A: 0A 80 ASL A +C81B: 0A 81 ASL A +C81C: 85 2B 82 STA SLOT16 ; $s0 83 FIN -8015: AA 84 TAX ; X holds now SLOT16 +C81E: AA 84 TAX ; X holds now SLOT16 85 -8016: 20 00 81 86 JSR INIT -8019: 2C FF CF 87 BIT $CFFF +C81F: 2C FF CF 86 BIT $CFFF +C822: 20 00 C9 87 JSR INIT 88 89 * 90 * TODO: check for init error @@ -94,49 +94,49 @@ 92 93 * see if slot has a driver already 94 -801C: AE 31 BF 95 LDX $BF31 ; get devcnt -801F: BD 32 BF 96 INSLP LDA $BF32,X ; get a devnum -8022: 29 70 97 AND #$70 ; isolate slot -8024: C5 2B 98 CMP SLOT16 ; slot? -8026: F0 31 99 BEQ INSOUT ; yes, skip it -8028: CA 100 DEX -8029: 10 F4 101 BPL INSLP ; keep up the search +C825: AE 31 BF 95 LDX $BF31 ; get devcnt +C828: BD 32 BF 96 INSLP LDA $BF32,X ; get a devnum +C82B: 29 70 97 AND #$70 ; isolate slot +C82D: C5 2B 98 CMP SLOT16 ; slot? +C82F: F0 32 99 BEQ INSOUT ; yes, skip it +C831: CA 100 DEX +C832: 10 F4 101 BPL INSLP ; keep up the search 102 103 * restore the devnum to the list 104 -802B: AE 31 BF 105 LDX $BF31 ; get devcnt again -802E: E0 0D 106 CPX #$0D ; device table full? -8030: D0 06 107 BNE INSLP2 +C834: AE 31 BF 105 LDX $BF31 ; get devcnt again +C837: E0 0D 106 CPX #$0D ; device table full? +C839: D0 06 107 BNE INSLP2 108 -8032: 20 3A FF 109 JSR $FF3A ; bell -8035: 4C 59 80 110 JMP INSOUT ; do something! +C83B: 20 3A FF 109 JSR $FF3A ; bell +C83E: 4C 63 C8 110 JMP INSOUT ; do something! 111 -8038: BD 31 BF 112 INSLP2 LDA $BF32-1,X ; move all entries down -803B: 9D 32 BF 113 STA $BF32,X ; to make room at front -803E: CA 114 DEX ; for a new entry -803F: D0 F7 115 BNE INSLP2 -8041: A9 04 116 LDA #$04 ; ProFile type device +C841: BD 31 BF 112 INSLP2 LDA $BF32-1,X ; move all entries down +C844: 9D 32 BF 113 STA $BF32,X ; to make room at front +C847: CA 114 DEX ; for a new entry +C848: D0 F7 115 BNE INSLP2 +C84A: A9 04 116 LDA #$04 ; ProFile type device ===== Page 3 ===== -8043: 05 2B 117 ORA SLOT16 -8045: 8D 32 BF 118 STA $BF32 ; slot, drive 1 at top of list -8048: EE 31 BF 119 INC $BF31 ; update devcnt +C84C: 05 2B 117 ORA SLOT16 +C84E: 8D 32 BF 118 STA $BF32 ; slot, drive 1 at top of list +C851: EE 31 BF 119 INC $BF31 ; update devcnt 120 121 * now insert the device driver vector 122 -804B: A5 3D 123 LDA SLOT -804D: 0A 124 ASL -804E: AA 125 TAX -804F: A9 5A 126 LDA #DRIVER + 129 LDA #>DRIVER 130 ELSE - 131 LDA CURSLOT +C85D: AD F8 07 131 LDA CURSLOT 132 FIN -8056: 9D 11 BF 133 STA $BF11,X +C860: 9D 11 BF 133 STA $BF11,X 134 -8059: 60 135 INSOUT RTS +C863: 60 135 INSOUT RTS 136 137 138 ******************************** @@ -145,86 +145,81 @@ 141 * 142 ******************************** 143 -805A: D8 144 DRIVER CLD +C864: D8 144 DRIVER CLD 145 DO DEBUG -805B: A9 04 146 LDA #$04 -805D: 85 3D 147 STA SLOT -805F: A9 C4 148 LDA #$C4 -8061: 8D F8 07 149 STA CURSLOT -8064: A9 40 150 LDA #$40 -8066: 85 2B 151 STA SLOT16 + 146 LDA #$04 + 147 STA SLOT + 148 LDA #$C4 + 149 STA CURSLOT + 150 LDA #$40 + 151 STA SLOT16 152 ELSE - 153 JSR $FF58 ; find slot nr - 154 TSX - 155 LDA $0100,X - 156 AND #$0F - 157 STA SLOT ; $0s - 158 ORA #$C0 - 159 STA CURSLOT ; $Cs - 160 ASL A - 161 ASL A - 162 ASL A - 163 ASL A - 164 STA SLOT16 ; $s0 +C865: 20 58 FF 153 JSR $FF58 ; find slot nr +C868: BA 154 TSX +C869: BD 00 01 155 LDA $0100,X +C86C: 29 0F 156 AND #$0F +C86E: 85 3D 157 STA SLOT ; $0s +C870: 09 C0 158 ORA #$C0 +C872: 8D F8 07 159 STA CURSLOT ; $Cs +C875: 0A 160 ASL A +C876: 0A 161 ASL A +C877: 0A 162 ASL A +C878: 0A 163 ASL A +C879: 85 2B 164 STA SLOT16 ; $s0 165 FIN -8068: AA 166 TAX ; X holds now SLOT16 +C87B: AA 166 TAX ; X holds now SLOT16 167 -8069: 2C FF CF 168 BIT $CFFF -806C: A5 42 169 LDA $42 ; get command -806E: C9 00 170 CMP #$00 -8070: F0 10 171 BEQ :STATUS -8072: C9 01 172 CMP #$01 -8074: F0 0F 173 BEQ :READ +C87C: 2C FF CF 168 BIT $CFFF +C87F: A5 42 169 LDA $42 ; get command +C881: C9 00 170 CMP #$00 +C883: F0 10 171 BEQ :STATUS +C885: C9 01 172 CMP #$01 +C887: F0 0F 173 BEQ :READ ===== Page 4 ===== -8076: C9 02 174 CMP #$02 -8078: F0 0E 175 BEQ :WRITE -807A: C9 03 176 CMP #$03 -807C: F0 0D 177 BEQ :FORMAT -807E: 38 178 SEC ; unknown command -807F: A9 01 179 LDA #$01 -8081: 60 180 RTS +C889: C9 02 174 CMP #$02 +C88B: F0 0E 175 BEQ :WRITE +C88D: C9 03 176 CMP #$03 +C88F: F0 0D 177 BEQ :FORMAT +C891: 38 178 SEC ; unknown command +C892: A9 01 179 LDA #$01 +C894: 60 180 RTS 181 -8082: 4C A8 82 182 :STATUS JMP STATUS -8085: 4C B0 82 183 :READ JMP READ -8088: 4C FA 82 184 :WRITE JMP WRITE -808B: 4C 8A 83 185 :FORMAT JMP FORMAT +C895: 4C A8 CA 182 :STATUS JMP STATUS +C898: 4C B0 CA 183 :READ JMP READ +C89B: 4C FA CA 184 :WRITE JMP WRITE +C89E: 4C 8A CB 185 :FORMAT JMP FORMAT 186 187 * Signature bytes 188 -808E: 00 00 00 189 DS \ ; fill with zeroes -8091: 00 00 00 00 -8095: 00 00 00 00 -8099: 00 00 00 00 -809D: 00 00 00 00 -80A1: 00 00 00 00 -80A5: 00 00 00 00 -80A9: 00 00 00 00 -80AD: 00 00 00 00 -80B1: 00 00 00 00 -80B5: 00 00 00 00 -80B9: 00 00 00 00 -80BD: 00 00 00 00 -80C1: 00 00 00 00 -80C5: 00 00 00 00 -80C9: 00 00 00 00 -80CD: 00 00 00 00 -80D1: 00 00 00 00 -80D5: 00 00 00 00 -80D9: 00 00 00 00 -80DD: 00 00 00 00 -80E1: 00 00 00 00 -80E5: 00 00 00 00 -80E9: 00 00 00 00 -80ED: 00 00 00 00 -80F1: 00 00 00 00 -80F5: 00 00 00 00 -80F9: 00 00 00 00 -80FD: 00 00 00 +C8A1: 00 00 00 189 DS \ ; fill with zeroes +C8A4: 00 00 00 00 +C8A8: 00 00 00 00 +C8AC: 00 00 00 00 +C8B0: 00 00 00 00 +C8B4: 00 00 00 00 +C8B8: 00 00 00 00 +C8BC: 00 00 00 00 +C8C0: 00 00 00 00 +C8C4: 00 00 00 00 +C8C8: 00 00 00 00 +C8CC: 00 00 00 00 +C8D0: 00 00 00 00 +C8D4: 00 00 00 00 +C8D8: 00 00 00 00 +C8DC: 00 00 00 00 +C8E0: 00 00 00 00 +C8E4: 00 00 00 00 +C8E8: 00 00 00 00 +C8EC: 00 00 00 00 +C8F0: 00 00 00 00 +C8F4: 00 00 00 00 +C8F8: 00 00 00 00 +C8FC: 00 00 00 00 190 DS -4 ; locate to $C8FC -80FC: FF FF 191 DW $FFFF ; 65535 blocks -80FE: 47 192 DB $47 ; Status bits -80FF: 5A 193 DB #CMD0 -812A: 85 41 229 STA CMDHI -812C: 20 D7 81 230 JSR CMD -812F: 20 EB 81 231 JSR GETR1 ; get response -8132: C9 01 232 CMP #$01 -8134: D0 39 233 BNE :ERROR1 ; error! +C924: A9 8E 226 LDA #CMD0 +C92A: 85 41 229 STA CMDHI +C92C: 20 D7 C9 230 JSR CMD +C92F: 20 EB C9 231 JSR GETR1 ; get response +C932: C9 01 232 CMP #$01 +C934: D0 39 233 BNE :ERROR1 ; error! 234 -8136: A9 9A 235 LDA #CMD8 -813C: 85 41 238 STA CMDHI -813E: 20 D7 81 239 JSR CMD -8141: 20 06 82 240 JSR GETR3 -8144: C9 01 241 CMP #$01 -8146: D0 2A 242 BNE :SDV1 ; may be SD Ver. 1 +C936: A9 9A 235 LDA #CMD8 +C93C: 85 41 238 STA CMDHI +C93E: 20 D7 C9 239 JSR CMD +C941: 20 06 CA 240 JSR GETR3 +C944: C9 01 241 CMP #$01 +C946: D0 2A 242 BNE :SDV1 ; may be SD Ver. 1 243 244 * check for $01aa match! -8148: A9 A6 245 :SDV2 LDA #CMD55 -814E: 85 41 248 STA CMDHI -8150: 20 D7 81 249 JSR CMD -8153: 20 EB 81 250 JSR GETR1 -8156: A9 AC 251 LDA #ACMD4140 -815C: 85 41 254 STA CMDHI -815E: 20 D7 81 255 JSR CMD -8161: 20 EB 81 256 JSR GETR1 -8164: C9 01 257 CMP #$01 -8166: F0 E0 258 BEQ :SDV2 ; wait for ready -8168: C9 00 259 CMP #$00 - ===== Page 6 ===== - -816A: D0 03 260 BNE :ERROR1 ; error! +C948: A9 A6 245 :SDV2 LDA #CMD55 +C94E: 85 41 248 STA CMDHI +C950: 20 D7 C9 249 JSR CMD +C953: 20 EB C9 250 JSR GETR1 +C956: A9 AC 251 LDA #ACMD4140 +C95C: 85 41 254 STA CMDHI +C95E: 20 D7 C9 255 JSR CMD +C961: 20 EB C9 256 JSR GETR1 +C964: C9 01 257 CMP #$01 +C966: F0 E0 258 BEQ :SDV2 ; wait for ready +C968: C9 00 259 CMP #$00 +C96A: D0 03 260 BNE :ERROR1 ; error! 261 * send CMD58 262 * SD Ver. 2 initialized! -816C: 4C AC 81 263 JMP :BLOCKSZ - 264 -816F: 4C C8 81 265 :ERROR1 JMP :IOERROR ; needed for far jump +C96C: 4C AC C9 263 JMP :BLOCKSZ + 264 + ===== Page 6 ===== + +C96F: 4C C8 C9 265 :ERROR1 JMP :IOERROR ; needed for far jump 266 -8172: A9 A6 267 :SDV1 LDA #CMD55 -8178: 85 41 270 STA CMDHI -817A: 20 D7 81 271 JSR CMD ; ignore response -817D: A9 B2 272 LDA #ACMD410 -8183: 85 41 275 STA CMDHI -8185: 20 D7 81 276 JSR CMD -8188: 20 EB 81 277 JSR GETR1 -818B: C9 01 278 CMP #$01 -818D: F0 E3 279 BEQ :SDV1 ; wait for ready -818F: C9 00 280 CMP #$00 -8191: D0 03 281 BNE :MMC ; may be MMC card +C972: A9 A6 267 :SDV1 LDA #CMD55 +C978: 85 41 270 STA CMDHI +C97A: 20 D7 C9 271 JSR CMD ; ignore response +C97D: A9 B2 272 LDA #ACMD410 +C983: 85 41 275 STA CMDHI +C985: 20 D7 C9 276 JSR CMD +C988: 20 EB C9 277 JSR GETR1 +C98B: C9 01 278 CMP #$01 +C98D: F0 E3 279 BEQ :SDV1 ; wait for ready +C98F: C9 00 280 CMP #$00 +C991: D0 03 281 BNE :MMC ; may be MMC card 282 * SD Ver. 1 initialized! -8193: 4C AC 81 283 JMP :BLOCKSZ +C993: 4C AC C9 283 JMP :BLOCKSZ 284 -8196: A9 94 285 :MMC LDA #CMD1 -819C: 85 41 288 STA CMDHI -819E: 20 D7 81 289 :LOOP1 JSR CMD -81A1: 20 EB 81 290 JSR GETR1 -81A4: C9 01 291 CMP #$01 -81A6: F0 F6 292 BEQ :LOOP1 ; wait for ready -81A8: C9 00 293 CMP #$00 -81AA: D0 1C 294 BNE :IOERROR ; error! +C996: A9 94 285 :MMC LDA #CMD1 +C99C: 85 41 288 STA CMDHI +C99E: 20 D7 C9 289 :LOOP1 JSR CMD +C9A1: 20 EB C9 290 JSR GETR1 +C9A4: C9 01 291 CMP #$01 +C9A6: F0 F6 292 BEQ :LOOP1 ; wait for ready +C9A8: C9 00 293 CMP #$00 +C9AA: D0 1C 294 BNE :IOERROR ; error! 295 * MMC Ver. 3 initialized! 296 -81AC: A9 A0 297 :BLOCKSZ LDA #CMD16 -81B2: 85 41 300 STA CMDHI -81B4: 20 D7 81 301 JSR CMD -81B7: 20 EB 81 302 JSR GETR1 -81BA: C9 00 303 CMP #$00 -81BC: D0 0A 304 BNE :IOERROR ; error! +C9AC: A9 A0 297 :BLOCKSZ LDA #CMD16 +C9B2: 85 41 300 STA CMDHI +C9B4: 20 D7 C9 301 JSR CMD +C9B7: 20 EB C9 302 JSR GETR1 +C9BA: C9 00 303 CMP #$00 +C9BC: D0 0A 304 BNE :IOERROR ; error! 305 -81BE: 18 306 :END CLC ; all ok -81BF: A0 00 307 LDY #0 -81C1: 90 08 308 BCC :END1 -81C3: 38 309 :CDERROR SEC -81C4: A0 28 310 LDY #$28 ; no card error -81C6: B0 03 311 BCS :END1 -81C8: 38 312 :IOERROR SEC -81C9: A0 27 313 LDY #$27 ; init error -81CB: A9 0F 314 :END1 LDA #SSNONE ; deselect card -81CD: 9D 83 C0 315 STA SS,X -81D0: A9 00 316 LDA #0 ; set div to 2 +C9BE: 18 306 :END CLC ; all ok +C9BF: A0 00 307 LDY #0 +C9C1: 90 08 308 BCC :END1 +C9C3: 38 309 :CDERROR SEC +C9C4: A0 28 310 LDY #$28 ; no card error +C9C6: B0 03 311 BCS :END1 +C9C8: 38 312 :IOERROR SEC +C9C9: A0 27 313 LDY #$27 ; init error +C9CB: A9 0F 314 :END1 LDA #SSNONE ; deselect card +C9CD: 9D 83 C0 315 STA SS,X +C9D0: A9 00 316 LDA #0 ; set div to 2 +C9D2: 9D 82 C0 317 STA DIV,X +C9D5: 98 318 TYA ; retval in A +C9D6: 60 319 RTS + 320 + 321 ===== Page 7 ===== -81D2: 9D 82 C0 317 STA DIV,X -81D5: 98 318 TYA ; retval in A -81D6: 60 319 RTS - 320 - 321 322 ******************************** 323 * 324 * Send SD command @@ -366,17 +361,17 @@ 326 * 327 ******************************** 328 -81D7: 5A 329 CMD PHY -81D8: A0 00 330 LDY #0 -81DA: B1 40 331 :LOOP LDA (CMDLO),Y -81DC: 9D 80 C0 332 STA DATA,X -81DF: 3C 81 C0 333 :WAIT BIT CTRL,X ; TC is in N -81E2: 10 FB 334 BPL :WAIT -81E4: C8 335 INY -81E5: C0 06 336 CPY #6 -81E7: 90 F1 337 BCC :LOOP -81E9: 7A 338 PLY -81EA: 60 339 RTS +C9D7: 5A 329 CMD PHY +C9D8: A0 00 330 LDY #0 +C9DA: B1 40 331 :LOOP LDA (CMDLO),Y +C9DC: 9D 80 C0 332 STA DATA,X +C9DF: 3C 81 C0 333 :WAIT BIT CTRL,X ; TC is in N +C9E2: 10 FB 334 BPL :WAIT +C9E4: C8 335 INY +C9E5: C0 06 336 CPY #6 +C9E7: 90 F1 337 BCC :LOOP +C9E9: 7A 338 PLY +C9EA: 60 339 RTS 340 341 342 ******************************** @@ -386,18 +381,18 @@ 346 * 347 ******************************** 348 -81EB: A9 FF 349 GETR1 LDA #DUMMY -81ED: 9D 80 C0 350 STA DATA,X -81F0: 3C 81 C0 351 :WAIT BIT CTRL,X -81F3: 10 FB 352 BPL :WAIT -81F5: BD 80 C0 353 LDA DATA,X ; get response -81F8: 85 3C 354 STA WORK ; save R1 -81FA: 29 80 355 AND #$80 -81FC: D0 ED 356 BNE GETR1 ; wait for MSB=0 -81FE: A9 FF 357 LDA #DUMMY -8200: 9D 80 C0 358 STA DATA,X ; send another dummy -8203: A5 3C 359 LDA WORK ; restore R1 -8205: 60 360 RTS +C9EB: A9 FF 349 GETR1 LDA #DUMMY +C9ED: 9D 80 C0 350 STA DATA,X +C9F0: 3C 81 C0 351 :WAIT BIT CTRL,X +C9F3: 10 FB 352 BPL :WAIT +C9F5: BD 80 C0 353 LDA DATA,X ; get response +C9F8: 85 3C 354 STA WORK ; save R1 +C9FA: 29 80 355 AND #$80 +C9FC: D0 ED 356 BNE GETR1 ; wait for MSB=0 +C9FE: A9 FF 357 LDA #DUMMY +CA00: 9D 80 C0 358 STA DATA,X ; send another dummy +CA03: A5 3C 359 LDA WORK ; restore R1 +CA05: 60 360 RTS 361 362 363 ******************************** @@ -408,34 +403,34 @@ 368 * 369 ******************************** 370 -8206: 20 EB 81 371 GETR3 JSR GETR1 ; get R1 first -8209: 48 372 PHA ; save R1 -820A: 5A 373 PHY ; save Y +CA06: 20 EB C9 371 GETR3 JSR GETR1 ; get R1 first +CA09: 48 372 PHA ; save R1 +CA0A: 5A 373 PHY ; save Y +CA0B: A0 04 374 LDY #04 ; load counter +CA0D: A9 FF 375 :LOOP LDA #DUMMY ; send dummy +CA0F: 9D 80 C0 376 STA DATA,X +CA12: 3C 81 C0 377 :WAIT BIT CTRL,X +CA15: 10 FB 378 BPL :WAIT ===== Page 8 ===== -820B: A0 04 374 LDY #04 ; load counter -820D: A9 FF 375 :LOOP LDA #DUMMY ; send dummy -820F: 9D 80 C0 376 STA DATA,X -8212: 3C 81 C0 377 :WAIT BIT CTRL,X -8215: 10 FB 378 BPL :WAIT -8217: BD 80 C0 379 LDA DATA,X -821A: 48 380 PHA -821B: 88 381 DEY -821C: D0 EF 382 BNE :LOOP ; do 4 times -821E: A4 3D 383 LDY SLOT -8220: 68 384 PLA -8221: 99 F8 05 385 STA R33,Y ; save R3 -8224: 68 386 PLA -8225: 99 78 05 387 STA R32,Y -8228: 68 388 PLA -8229: 99 F8 04 389 STA R31,Y -822C: 68 390 PLA -822D: 99 78 04 391 STA R30,Y -8230: 7A 392 PLY ; restore Y -8231: A9 FF 393 LDA #DUMMY -8233: 9D 80 C0 394 STA DATA,X ; send another dummy -8236: 68 395 PLA ; restore R1 -8237: 60 396 RTS +CA17: BD 80 C0 379 LDA DATA,X +CA1A: 48 380 PHA +CA1B: 88 381 DEY +CA1C: D0 EF 382 BNE :LOOP ; do 4 times +CA1E: A4 3D 383 LDY SLOT +CA20: 68 384 PLA +CA21: 99 F8 05 385 STA R33,Y ; save R3 +CA24: 68 386 PLA +CA25: 99 78 05 387 STA R32,Y +CA28: 68 388 PLA +CA29: 99 F8 04 389 STA R31,Y +CA2C: 68 390 PLA +CA2D: 99 78 04 391 STA R30,Y +CA30: 7A 392 PLY ; restore Y +CA31: A9 FF 393 LDA #DUMMY +CA33: 9D 80 C0 394 STA DATA,X ; send another dummy +CA36: 68 395 PLA ; restore R1 +CA37: 60 396 RTS 397 398 399 ******************************** @@ -446,66 +441,66 @@ 404 * 405 ******************************** 406 -8238: DA 407 BLOCK PHX ; save X -8239: 5A 408 PHY ; save Y -823A: A6 3D 409 LDX SLOT -823C: A5 46 410 LDA $46 ; store block num -823E: 9D F8 05 411 STA R33,X ; in R30-R33 -8241: A5 47 412 LDA $47 -8243: 9D 78 05 413 STA R32,X -8246: A9 00 414 LDA #0 -8248: 9D F8 04 415 STA R31,X -824B: 9D 78 04 416 STA R30,X +CA38: DA 407 BLOCK PHX ; save X +CA39: 5A 408 PHY ; save Y +CA3A: A6 3D 409 LDX SLOT +CA3C: A5 46 410 LDA $46 ; store block num +CA3E: 9D F8 05 411 STA R33,X ; in R30-R33 +CA41: A5 47 412 LDA $47 +CA43: 9D 78 05 413 STA R32,X +CA46: A9 00 414 LDA #0 +CA48: 9D F8 04 415 STA R31,X +CA4B: 9D 78 04 416 STA R30,X 417 -824E: A0 09 418 LDY #9 ; ASL can't be used with Y -8250: 1E F8 05 419 :LOOP ASL R33,X ; mul block num -8253: 3E 78 05 420 ROL R32,X ; by 512 to get -8256: 3E F8 04 421 ROL R31,X ; real address -8259: 3E 78 04 422 ROL R30,X -825C: 88 423 DEY -825D: D0 F1 424 BNE :LOOP -825F: 7A 425 PLY ; restore Y -8260: FA 426 PLX ; restore X -8261: 60 427 RTS +CA4E: A0 09 418 LDY #9 ; ASL can't be used with Y +CA50: 1E F8 05 419 :LOOP ASL R33,X ; mul block num +CA53: 3E 78 05 420 ROL R32,X ; by 512 to get +CA56: 3E F8 04 421 ROL R31,X ; real address +CA59: 3E 78 04 422 ROL R30,X +CA5C: 88 423 DEY +CA5D: D0 F1 424 BNE :LOOP +CA5F: 7A 425 PLY ; restore Y +CA60: FA 426 PLX ; restore X +CA61: 60 427 RTS 428 429 - 430 ******************************** - ===== Page 9 ===== - + 430 ******************************** 431 * 432 * Send SD command 433 * Cmd is in A 434 * - 435 ******************************** + 435 ******************************** + ===== Page 9 ===== + 436 -8262: 5A 437 COMMAND PHY ; save Y -8263: A4 3D 438 LDY SLOT -8265: 9D 80 C0 439 STA DATA,X ; send command -8268: 3C 81 C0 440 :WAIT BIT CTRL,X -826B: 10 FB 441 BPL :WAIT -826D: B9 78 04 442 :ARG LDA R30,Y ; get arg from R30 on -8270: 9D 80 C0 443 STA DATA,X -8273: 3C 81 C0 444 :WAIT1 BIT CTRL,X -8276: 10 FB 445 BPL :WAIT1 -8278: B9 F8 04 446 LDA R31,Y -827B: 9D 80 C0 447 STA DATA,X -827E: 3C 81 C0 448 :WAIT11 BIT CTRL,X -8281: 10 FB 449 BPL :WAIT11 -8283: B9 78 05 450 LDA R32,Y -8286: 9D 80 C0 451 STA DATA,X -8289: 3C 81 C0 452 :WAIT12 BIT CTRL,X -828C: 10 FB 453 BPL :WAIT12 -828E: B9 F8 05 454 LDA R33,Y -8291: 9D 80 C0 455 STA DATA,X -8294: 3C 81 C0 456 :WAIT13 BIT CTRL,X -8297: 10 FB 457 BPL :WAIT13 -8299: A9 FF 458 LDA #DUMMY -829B: 9D 80 C0 459 STA DATA,X ; dummy crc -829E: 3C 81 C0 460 :WAIT2 BIT CTRL,X -82A1: 10 FB 461 BPL :WAIT2 -82A3: 20 EB 81 462 JSR GETR1 -82A6: 7A 463 PLY ; restore Y -82A7: 60 464 RTS +CA62: 5A 437 COMMAND PHY ; save Y +CA63: A4 3D 438 LDY SLOT +CA65: 9D 80 C0 439 STA DATA,X ; send command +CA68: 3C 81 C0 440 :WAIT BIT CTRL,X +CA6B: 10 FB 441 BPL :WAIT +CA6D: B9 78 04 442 :ARG LDA R30,Y ; get arg from R30 on +CA70: 9D 80 C0 443 STA DATA,X +CA73: 3C 81 C0 444 :WAIT1 BIT CTRL,X +CA76: 10 FB 445 BPL :WAIT1 +CA78: B9 F8 04 446 LDA R31,Y +CA7B: 9D 80 C0 447 STA DATA,X +CA7E: 3C 81 C0 448 :WAIT11 BIT CTRL,X +CA81: 10 FB 449 BPL :WAIT11 +CA83: B9 78 05 450 LDA R32,Y +CA86: 9D 80 C0 451 STA DATA,X +CA89: 3C 81 C0 452 :WAIT12 BIT CTRL,X +CA8C: 10 FB 453 BPL :WAIT12 +CA8E: B9 F8 05 454 LDA R33,Y +CA91: 9D 80 C0 455 STA DATA,X +CA94: 3C 81 C0 456 :WAIT13 BIT CTRL,X +CA97: 10 FB 457 BPL :WAIT13 +CA99: A9 FF 458 LDA #DUMMY +CA9B: 9D 80 C0 459 STA DATA,X ; dummy crc +CA9E: 3C 81 C0 460 :WAIT2 BIT CTRL,X +CAA1: 10 FB 461 BPL :WAIT2 +CAA3: 20 EB C9 462 JSR GETR1 +CAA6: 7A 463 PLY ; restore Y +CAA7: 60 464 RTS 465 466 467 ******************************** @@ -526,16 +521,16 @@ 482 * 483 ******************************** 484 -82A8: 18 485 STATUS CLC ; no error -82A9: A9 00 486 LDA #0 -82AB: A2 FF 487 LDX #$FF ; 32 MB partition - ===== Page 10 ===== - -82AD: A0 FF 488 LDY #$FF -82AF: 60 489 RTS +CAA8: 18 485 STATUS CLC ; no error +CAA9: A9 00 486 LDA #0 +CAAB: A2 FF 487 LDX #$FF ; 32 MB partition +CAAD: A0 FF 488 LDY #$FF +CAAF: 60 489 RTS 490 491 * TODO: check for card detect and write protect! - 492 + 492 + ===== Page 10 ===== + 493 494 ******************************** 495 * @@ -554,48 +549,48 @@ 508 509 * TODO: check for card detect! 510 -82B0: 20 38 82 511 READ JSR BLOCK ; calc block address +CAB0: 20 38 CA 511 READ JSR BLOCK ; calc block address 512 -82B3: A9 0E 513 LDA #SS0 ; enable /CS -82B5: 9D 83 C0 514 STA SS,X -82B8: A9 51 515 LDA #$51 ; send CMD17 -82BA: 20 62 82 516 JSR COMMAND ; send command +CAB3: A9 0E 513 LDA #SS0 ; enable /CS +CAB5: 9D 83 C0 514 STA SS,X +CAB8: A9 51 515 LDA #$51 ; send CMD17 +CABA: 20 62 CA 516 JSR COMMAND ; send command 517 -82BD: A9 FF 518 :GETTOK LDA #DUMMY ; get data token -82BF: 9D 80 C0 519 STA DATA,X -82C2: 3C 81 C0 520 :WAIT BIT CTRL,X -82C5: 10 FB 521 BPL :WAIT -82C7: BD 80 C0 522 LDA DATA,X ; get response +CABD: A9 FF 518 :GETTOK LDA #DUMMY ; get data token +CABF: 9D 80 C0 519 STA DATA,X +CAC2: 3C 81 C0 520 :WAIT BIT CTRL,X +CAC5: 10 FB 521 BPL :WAIT +CAC7: BD 80 C0 522 LDA DATA,X ; get response 523 * 524 * TODO: check for error! 525 * -82CA: C9 FE 526 CMP #$FE -82CC: D0 EF 527 BNE :GETTOK ; wait for $FE +CACA: C9 FE 526 CMP #$FE +CACC: D0 EF 527 BNE :GETTOK ; wait for $FE 528 -82CE: A0 02 529 LDY #2 ; read data from card -82D0: 64 3C 530 :LOOPY STZ WORK -82D2: A9 FF 531 :LOOPW LDA #DUMMY -82D4: 9D 80 C0 532 STA DATA,X -82D7: 3C 81 C0 533 :WAIT1 BIT CTRL,X -82DA: 10 FB 534 BPL :WAIT1 -82DC: BD 80 C0 535 LDA DATA,X -82DF: 92 44 536 STA ($44) -82E1: E6 44 537 INC $44 -82E3: D0 02 538 BNE :INW -82E5: E6 45 539 INC $45 ; inc msb on page boundary -82E7: E6 3C 540 :INW INC WORK -82E9: D0 E7 541 BNE :LOOPW -82EB: 88 542 DEY -82EC: D0 E2 543 BNE :LOOPY - 544 +CACE: A0 02 529 LDY #2 ; read data from card +CAD0: 64 3C 530 :LOOPY STZ WORK +CAD2: A9 FF 531 :LOOPW LDA #DUMMY +CAD4: 9D 80 C0 532 STA DATA,X +CAD7: 3C 81 C0 533 :WAIT1 BIT CTRL,X +CADA: 10 FB 534 BPL :WAIT1 +CADC: BD 80 C0 535 LDA DATA,X +CADF: 92 44 536 STA ($44) +CAE1: E6 44 537 INC $44 +CAE3: D0 02 538 BNE :INW +CAE5: E6 45 539 INC $45 ; inc msb on page boundary +CAE7: E6 3C 540 :INW INC WORK +CAE9: D0 E7 541 BNE :LOOPW +CAEB: 88 542 DEY +CAEC: D0 E2 543 BNE :LOOPY + 544 +CAEE: 20 06 CA 545 JSR GETR3 ; read 2 bytes crc +CAF1: A9 0F 546 LDA #SSNONE +CAF3: 9D 83 C0 547 STA SS,X ; disable /CS +CAF6: 18 548 CLC ; no error +CAF7: A9 00 549 LDA #$00 ===== Page 11 ===== -82EE: 20 06 82 545 JSR GETR3 ; read 2 bytes crc -82F1: A9 0F 546 LDA #SSNONE -82F3: 9D 83 C0 547 STA SS,X ; disable /CS -82F6: 18 548 CLC ; no error -82F7: A9 00 549 LDA #$00 -82F9: 60 550 RTS +CAF9: 60 550 RTS 551 552 553 ******************************** @@ -616,81 +611,81 @@ 568 569 * TODO: check for card detect and write protect! 570 -82FA: 20 38 82 571 WRITE JSR BLOCK ; calc block address +CAFA: 20 38 CA 571 WRITE JSR BLOCK ; calc block address 572 -82FD: A9 0E 573 LDA #SS0 ; enable /CS -82FF: 9D 83 C0 574 STA SS,X -8302: A9 58 575 LDA #$58 ; send CMD24 -8304: 20 62 82 576 JSR COMMAND ; send command +CAFD: A9 0E 573 LDA #SS0 ; enable /CS +CAFF: 9D 83 C0 574 STA SS,X +CB02: A9 58 575 LDA #$58 ; send CMD24 +CB04: 20 62 CA 576 JSR COMMAND ; send command 577 -8307: A9 FF 578 LDA #DUMMY -8309: 9D 80 C0 579 STA DATA,X ; send dummy -830C: 3C 81 C0 580 :WAIT1 BIT CTRL,X -830F: 10 FB 581 BPL :WAIT1 -8311: A9 FE 582 LDA #$FE -8313: 9D 80 C0 583 STA DATA,X ; send data token -8316: 3C 81 C0 584 :WAIT2 BIT CTRL,X -8319: 10 FB 585 BPL :WAIT2 +CB07: A9 FF 578 LDA #DUMMY +CB09: 9D 80 C0 579 STA DATA,X ; send dummy +CB0C: 3C 81 C0 580 :WAIT1 BIT CTRL,X +CB0F: 10 FB 581 BPL :WAIT1 +CB11: A9 FE 582 LDA #$FE +CB13: 9D 80 C0 583 STA DATA,X ; send data token +CB16: 3C 81 C0 584 :WAIT2 BIT CTRL,X +CB19: 10 FB 585 BPL :WAIT2 586 -831B: A0 02 587 LDY #2 ; send data to card -831D: 64 3C 588 :LOOPY STZ WORK -831F: B2 44 589 :LOOPW LDA ($44) -8321: 9D 80 C0 590 STA DATA,X -8324: 3C 81 C0 591 :WAIT3 BIT CTRL,X -8327: 10 FB 592 BPL :WAIT3 -8329: E6 44 593 INC $44 -832B: D0 02 594 BNE :INW -832D: E6 45 595 INC $45 ; inc msb on page boundary -832F: E6 3C 596 :INW INC WORK -8331: D0 EC 597 BNE :LOOPW -8333: 88 598 DEY -8334: D0 E7 599 BNE :LOOPY +CB1B: A0 02 587 LDY #2 ; send data to card +CB1D: 64 3C 588 :LOOPY STZ WORK +CB1F: B2 44 589 :LOOPW LDA ($44) +CB21: 9D 80 C0 590 STA DATA,X +CB24: 3C 81 C0 591 :WAIT3 BIT CTRL,X +CB27: 10 FB 592 BPL :WAIT3 +CB29: E6 44 593 INC $44 +CB2B: D0 02 594 BNE :INW +CB2D: E6 45 595 INC $45 ; inc msb on page boundary +CB2F: E6 3C 596 :INW INC WORK +CB31: D0 EC 597 BNE :LOOPW +CB33: 88 598 DEY +CB34: D0 E7 599 BNE :LOOPY 600 -8336: A0 02 601 LDY #2 ; send 2 dummy crc bytes +CB36: A0 02 601 LDY #2 ; send 2 dummy crc bytes +CB38: 9D 80 C0 602 :CRC STA DATA,X +CB3B: 3C 81 C0 603 :WAIT4 BIT CTRL,X +CB3E: 10 FB 604 BPL :WAIT4 +CB40: 88 605 DEY +CB41: D0 F5 606 BNE :CRC ===== Page 12 ===== -8338: 9D 80 C0 602 :CRC STA DATA,X -833B: 3C 81 C0 603 :WAIT4 BIT CTRL,X -833E: 10 FB 604 BPL :WAIT4 -8340: 88 605 DEY -8341: D0 F5 606 BNE :CRC 607 -8343: A9 FF 608 LDA #DUMMY ; get data response -8345: 9D 80 C0 609 STA DATA,X -8348: 3C 81 C0 610 :WAIT5 BIT CTRL,X -834B: 10 FB 611 BPL :WAIT5 -834D: BD 80 C0 612 LDA DATA,X -8350: 29 1F 613 AND #$1F -8352: C9 05 614 CMP #$05 -8354: D0 1A 615 BNE :ERROR ; check for write error +CB43: A9 FF 608 LDA #DUMMY ; get data response +CB45: 9D 80 C0 609 STA DATA,X +CB48: 3C 81 C0 610 :WAIT5 BIT CTRL,X +CB4B: 10 FB 611 BPL :WAIT5 +CB4D: BD 80 C0 612 LDA DATA,X +CB50: 29 1F 613 AND #$1F +CB52: C9 05 614 CMP #$05 +CB54: D0 1A 615 BNE :ERROR ; check for write error 616 -8356: A9 FF 617 :WAIT6 LDA #DUMMY ; wait for write cycle -8358: 9D 80 C0 618 STA DATA,X ; to complete -835B: 3C 81 C0 619 :WAIT61 BIT CTRL,X -835E: 10 FB 620 BPL :WAIT61 -8360: BD 80 C0 621 LDA DATA,X -8363: C9 00 622 CMP #$00 -8365: F0 EF 623 BEQ :WAIT6 +CB56: A9 FF 617 :WAIT6 LDA #DUMMY ; wait for write cycle +CB58: 9D 80 C0 618 STA DATA,X ; to complete +CB5B: 3C 81 C0 619 :WAIT61 BIT CTRL,X +CB5E: 10 FB 620 BPL :WAIT61 +CB60: BD 80 C0 621 LDA DATA,X +CB63: C9 00 622 CMP #$00 +CB65: F0 EF 623 BEQ :WAIT6 624 -8367: A9 0F 625 LDA #SSNONE ; disable /CS -8369: 9D 83 C0 626 STA SS,X -836C: 18 627 CLC ; no error -836D: A9 00 628 LDA #0 -836F: 60 629 RTS +CB67: A9 0F 625 LDA #SSNONE ; disable /CS +CB69: 9D 83 C0 626 STA SS,X +CB6C: 18 627 CLC ; no error +CB6D: A9 00 628 LDA #0 +CB6F: 60 629 RTS 630 631 :ERROR -8370: A9 FF 632 :WAIT7 LDA #DUMMY ; wait for write cycle -8372: 9D 80 C0 633 STA DATA,X ; to complete -8375: 3C 81 C0 634 :WAIT71 BIT CTRL,X -8378: 10 FB 635 BPL :WAIT71 -837A: BD 80 C0 636 LDA DATA,X -837D: C9 00 637 CMP #$00 -837F: F0 EF 638 BEQ :WAIT7 -8381: A9 0F 639 LDA #SSNONE -8383: 9D 83 C0 640 STA SS,X ; disable /CS -8386: 38 641 SEC ; an error occured -8387: A9 27 642 LDA #$27 -8389: 60 643 RTS +CB70: A9 FF 632 :WAIT7 LDA #DUMMY ; wait for write cycle +CB72: 9D 80 C0 633 STA DATA,X ; to complete +CB75: 3C 81 C0 634 :WAIT71 BIT CTRL,X +CB78: 10 FB 635 BPL :WAIT71 +CB7A: BD 80 C0 636 LDA DATA,X +CB7D: C9 00 637 CMP #$00 +CB7F: F0 EF 638 BEQ :WAIT7 +CB81: A9 0F 639 LDA #SSNONE +CB83: 9D 83 C0 640 STA SS,X ; disable /CS +CB86: 38 641 SEC ; an error occured +CB87: A9 27 642 LDA #$27 +CB89: 60 643 RTS 644 645 646 ******************************** @@ -700,27 +695,27 @@ 650 * 651 ******************************** 652 -838A: 38 653 FORMAT SEC -838B: A9 01 654 LDA #$01 ; invalid command -838D: 60 655 RTS +CB8A: 38 653 FORMAT SEC +CB8B: A9 01 654 LDA #$01 ; invalid command +CB8D: 60 655 RTS 656 657 -838E: 40 00 00 658 CMD0 HEX 400000 +CB8E: 40 00 00 658 CMD0 HEX 400000 +CB91: 00 00 95 659 HEX 000095 +CB94: 41 00 00 660 CMD1 HEX 410000 +CB97: 00 00 F9 661 HEX 0000F9 +CB9A: 48 00 00 662 CMD8 HEX 480000 +CB9D: 01 AA 87 663 HEX 01AA87 ===== Page 13 ===== -8391: 00 00 95 659 HEX 000095 -8394: 41 00 00 660 CMD1 HEX 410000 -8397: 00 00 F9 661 HEX 0000F9 -839A: 48 00 00 662 CMD8 HEX 480000 -839D: 01 AA 87 663 HEX 01AA87 -83A0: 50 00 00 664 CMD16 HEX 500000 -83A3: 02 00 FF 665 HEX 0200FF -83A6: 77 00 00 666 CMD55 HEX 770000 -83A9: 00 00 65 667 HEX 000065 -83AC: 69 40 00 668 ACMD4140 HEX 694000 -83AF: 00 00 77 669 HEX 000077 -83B2: 69 00 00 670 ACMD410 HEX 690000 -83B5: 00 00 FF 671 HEX 0000FF +CBA0: 50 00 00 664 CMD16 HEX 500000 +CBA3: 02 00 FF 665 HEX 0200FF +CBA6: 77 00 00 666 CMD55 HEX 770000 +CBA9: 00 00 65 667 HEX 000065 +CBAC: 69 40 00 668 ACMD4140 HEX 694000 +CBAF: 00 00 77 669 HEX 000077 +CBB2: 69 00 00 670 ACMD410 HEX 690000 +CBB5: 00 00 FF 671 HEX 0000FF --End assembly, 952 bytes, Errors: 0 @@ -728,28 +723,28 @@ Symbol table - alphabetical order: - ACMD410 =$83B2 ACMD4140=$83AC BLOCK =$8238 CMD =$81D7 - CMD0 =$838E CMD1 =$8394 CMD16 =$83A0 CMD55 =$83A6 - CMD8 =$839A CMDHI =$41 CMDLO =$40 COMMAND =$8262 - CTRL =$C081 CURSLOT =$07F8 DATA =$C080 DEBUG =$01 - DIV =$C082 DRIVER =$805A DUMMY =$FF FORMAT =$838A - GETR1 =$81EB GETR3 =$8206 INIT =$8100 INSLP =$801F - INSLP2 =$8038 INSOUT =$8059 R30 =$0478 R31 =$04F8 - R32 =$0578 R33 =$05F8 READ =$82B0 SLOT =$3D + ACMD410 =$CBB2 ACMD4140=$CBAC BLOCK =$CA38 CMD =$C9D7 + CMD0 =$CB8E CMD1 =$CB94 CMD16 =$CBA0 CMD55 =$CBA6 + CMD8 =$CB9A CMDHI =$41 CMDLO =$40 COMMAND =$CA62 + CTRL =$C081 CURSLOT =$07F8 DATA =$C080 DEBUG =$00 + DIV =$C082 DRIVER =$C864 DUMMY =$FF FORMAT =$CB8A + GETR1 =$C9EB GETR3 =$CA06 INIT =$C900 INSLP =$C828 + INSLP2 =$C841 INSOUT =$C863 R30 =$0478 R31 =$04F8 + R32 =$0578 R33 =$05F8 READ =$CAB0 SLOT =$3D SLOT16 =$2B SS =$C083 SS0 =$0E SSNONE =$0F - STATUS =$82A8 WORK =$3C WRITE =$82FA + STATUS =$CAA8 WORK =$3C WRITE =$CAFA Symbol table - numerical order: - DEBUG =$01 SS0 =$0E SSNONE =$0F SLOT16 =$2B + DEBUG =$00 SS0 =$0E SSNONE =$0F SLOT16 =$2B WORK =$3C SLOT =$3D CMDLO =$40 CMDHI =$41 DUMMY =$FF R30 =$0478 R31 =$04F8 R32 =$0578 - R33 =$05F8 CURSLOT =$07F8 INSLP =$801F INSLP2 =$8038 - INSOUT =$8059 DRIVER =$805A INIT =$8100 CMD =$81D7 - GETR1 =$81EB GETR3 =$8206 BLOCK =$8238 COMMAND =$8262 - STATUS =$82A8 READ =$82B0 WRITE =$82FA FORMAT =$838A - CMD0 =$838E CMD1 =$8394 CMD8 =$839A CMD16 =$83A0 - CMD55 =$83A6 ACMD4140=$83AC ACMD410 =$83B2 DATA =$C080 - CTRL =$C081 DIV =$C082 SS =$C083 + R33 =$05F8 CURSLOT =$07F8 DATA =$C080 CTRL =$C081 + DIV =$C082 SS =$C083 INSLP =$C828 INSLP2 =$C841 + INSOUT =$C863 DRIVER =$C864 INIT =$C900 CMD =$C9D7 + GETR1 =$C9EB GETR3 =$CA06 BLOCK =$CA38 COMMAND =$CA62 + STATUS =$CAA8 READ =$CAB0 WRITE =$CAFA FORMAT =$CB8A + CMD0 =$CB8E CMD1 =$CB94 CMD8 =$CB9A CMD16 =$CBA0 + CMD55 =$CBA6 ACMD4140=$CBAC ACMD410 =$CBB2 diff --git a/AppleIISd.s b/AppleIISd.s index 359e61e..ca2e19f 100644 --- a/AppleIISd.s +++ b/AppleIISd.s @@ -13,7 +13,7 @@ DAT XC ; enable 65C02 code -DEBUG = 1 +DEBUG = 0 DO DEBUG ORG $8000 ELSE @@ -83,8 +83,8 @@ DUMMY = $FF FIN TAX ; X holds now SLOT16 - JSR INIT BIT $CFFF + JSR INIT * * TODO: check for init error @@ -404,27 +404,26 @@ GETR3 JSR GETR1 ; get R1 first * ******************************** -BLOCK PHY ; save Y - LDY SLOT +BLOCK PHX ; save X + PHY ; save Y + LDX SLOT LDA $46 ; store block num - STA R33,Y ; in R30-R33 + STA R33,X ; in R30-R33 LDA $47 - STA R32,Y + STA R32,X LDA #0 - STA R31,Y - STA R30,Y + STA R31,X + STA R30,X - PHX - LDY #9 - LDX SLOT ; ASL can't be done with Y + LDY #9 ; ASL can't be used with Y :LOOP ASL R33,X ; mul block num ROL R32,X ; by 512 to get ROL R31,X ; real address ROL R30,X DEY BNE :LOOP - PLX PLY ; restore Y + PLX ; restore X RTS @@ -460,16 +459,7 @@ COMMAND PHY ; save Y STA DATA,X ; dummy crc :WAIT2 BIT CTRL,X BPL :WAIT2 -:GETR1 LDA #DUMMY - STA DATA,X ; get R1 -:WAIT3 BIT CTRL,X - BPL :WAIT3 - LDA DATA,X ; get response -* -* TODO: check for error! -* - CMP #$FE - BNE :GETR1 ; wait for $FE + JSR GETR1 PLY ; restore Y RTS @@ -525,13 +515,23 @@ READ JSR BLOCK ; calc block address LDA #$51 ; send CMD17 JSR COMMAND ; send command - PHY +:GETTOK LDA #DUMMY ; get data token + STA DATA,X +:WAIT BIT CTRL,X + BPL :WAIT + LDA DATA,X ; get response +* +* TODO: check for error! +* + CMP #$FE + BNE :GETTOK ; wait for $FE + LDY #2 ; read data from card :LOOPY STZ WORK :LOOPW LDA #DUMMY STA DATA,X -:WAIT4 BIT CTRL,X - BPL :WAIT4 +:WAIT1 BIT CTRL,X + BPL :WAIT1 LDA DATA,X STA ($44) INC $44 @@ -541,21 +541,12 @@ READ JSR BLOCK ; calc block address BNE :LOOPW DEY BNE :LOOPY - PLY JSR GETR3 ; read 2 bytes crc LDA #SSNONE STA SS,X ; disable /CS CLC ; no error LDA #$00 - PLY ; restore Y - RTS - -:ERROR LDA #SSNONE - STA SS,X ; disable /CS - SEC ; an error occured - LDA #$27 - PLY ; restore Y RTS @@ -569,27 +560,35 @@ READ JSR BLOCK ; calc block address * C Clear - No error * Set - Error * A $00 - No error -* $27 - Bad block number +* $27 - I/O error or bad block number * $28 - No card inserted +* $2B - Card write protected * ******************************** * TODO: check for card detect and write protect! WRITE JSR BLOCK ; calc block address - LDA #SS0 ; enable /CS STA SS,X LDA #$58 ; send CMD24 JSR COMMAND ; send command - PHY + LDA #DUMMY + STA DATA,X ; send dummy +:WAIT1 BIT CTRL,X + BPL :WAIT1 + LDA #$FE + STA DATA,X ; send data token +:WAIT2 BIT CTRL,X + BPL :WAIT2 + LDY #2 ; send data to card :LOOPY STZ WORK :LOOPW LDA ($44) STA DATA,X -:WAIT4 BIT CTRL,X - BPL :WAIT4 +:WAIT3 BIT CTRL,X + BPL :WAIT3 INC $44 BNE :INW INC $45 ; inc msb on page boundary @@ -600,17 +599,46 @@ WRITE JSR BLOCK ; calc block address LDY #2 ; send 2 dummy crc bytes :CRC STA DATA,X -:WAIT5 BIT CTRL,X - BPL :WAIT5 +:WAIT4 BIT CTRL,X + BPL :WAIT4 DEY BNE :CRC - PLY + + LDA #DUMMY ; get data response + STA DATA,X +:WAIT5 BIT CTRL,X + BPL :WAIT5 + LDA DATA,X + AND #$1F + CMP #$05 + BNE :ERROR ; check for write error + +:WAIT6 LDA #DUMMY ; wait for write cycle + STA DATA,X ; to complete +:WAIT61 BIT CTRL,X + BPL :WAIT61 + LDA DATA,X + CMP #$00 + BEQ :WAIT6 LDA #SSNONE ; disable /CS STA SS,X CLC ; no error LDA #0 - PLY + RTS + +:ERROR +:WAIT7 LDA #DUMMY ; wait for write cycle + STA DATA,X ; to complete +:WAIT71 BIT CTRL,X + BPL :WAIT71 + LDA DATA,X + CMP #$00 + BEQ :WAIT7 + LDA #SSNONE + STA SS,X ; disable /CS + SEC ; an error occured + LDA #$27 RTS diff --git a/AppleIISd.s19 b/AppleIISd.s19 new file mode 100644 index 0000000..d487b2e --- /dev/null +++ b/AppleIISd.s19 @@ -0,0 +1,62 @@ +S00600004844521B +S1130000A220A000A203863C2058FFBABD0001290B +S11300100F853D09C08DF8070A0A0A0A852BAA2C08 +S1130020FFCF2000C9AE31BFBD32BF2970C52BF050 +S113003032CA10F4AE31BFE00DD006203AFF4C6353 +S1130040C8BD31BF9D32BFCAD0F7A904052B8D327C +S1130050BFEE31BFA53D0AAAA9649D10BFADF80744 +S11300609D11BF60D82058FFBABD0001290F853DFE +S113007009C08DF8070A0A0A0A852BAA2CFFCFA506 +S113008042C900F010C901F00FC902F00EC903F013 +S11300900D38A901604CA8CA4CB0CA4CFACA4C8AA3 +S11300A0CB00000000000000000000000000000081 +S11300B0000000000000000000000000000000003C +S11300C0000000000000000000000000000000002C +S11300D0000000000000000000000000000000001C +S11300E0000000000000000000000000000000000C +S11300F0000000000000000000000000FFFF476453 +S1130100D8A9039D81C0A90F9D83C0A9079D82C062 +S1130110A00AA9FF9D80C03C81C010FB88D0F5A92E +S11301200E9D83C0A98E8540A9CB854120D7C920C7 +S1130130EBC9C901D039A99A8540A9CB854120D7FB +S1130140C92006CAC901D02AA9A68540A9CB8541E0 +S113015020D7C920EBC9A9AC8540A9CB854120D7BC +S1130160C920EBC9C901F0E0C900D0034CACC94CAB +S1130170C8C9A9A68540A9CB854120D7C9A9B285FC +S113018040A9CB854120D7C920EBC9C901F0E3C9F7 +S113019000D0034CACC9A9948540A9CB854120D794 +S11301A0C920EBC9C901F0F6C900D01CA9A085403B +S11301B0A9CB854120D7C920EBC9C900D00A18A012 +S11301C000900838A028B00338A027A90F9D83C049 +S11301D0A9009D82C098605AA000B1409D80C03C97 +S11301E081C010FBC8C00690F17A60A9FF9D80C051 +S11301F03C81C010FBBD80C0853C2980D0EDA9FFA7 +S11302009D80C0A53C6020EBC9485AA004A9FF9D6D +S113021080C03C81C010FBBD80C04888D0EFA43DA5 +S11302206899F805689978056899F80468997804D4 +S11302307AA9FF9D80C06860DA5AA63DA5469DF85C +S113024005A5479D7805A9009DF8049D7804A0099B +S11302501EF8053E78053EF8043E780488D0F17A0D +S1130260FA605AA43D9D80C03C81C010FBB978045B +S11302709D80C03C81C010FBB9F8049D80C03C81C6 +S1130280C010FBB978059D80C03C81C010FBB9F853 +S1130290059D80C03C81C010FBA9FF9D80C03C81AE +S11302A0C010FB20EBC97A6018A900A2FFA0FF6070 +S11302B02038CAA90E9D83C0A9512062CAA9FF9DF6 +S11302C080C03C81C010FBBD80C0C9FED0EFA0023D +S11302D0643CA9FF9D80C03C81C010FBBD80C092DE +S11302E044E644D002E645E63CD0E788D0E2200666 +S11302F0CAA90F9D83C018A900602038CAA90E9D01 +S113030083C0A9582062CAA9FF9D80C03C81C01047 +S1130310FBA9FE9D80C03C81C010FBA002643CB2DE +S1130320449D80C03C81C010FBE644D002E645E613 +S11303303CD0EC88D0E7A0029D80C03C81C010FB7B +S113034088D0F5A9FF9D80C03C81C010FBBD80C052 +S1130350291FC905D01AA9FF9D80C03C81C010FB8C +S1130360BD80C0C900F0EFA90F9D83C018A900602B +S1130370A9FF9D80C03C81C010FBBD80C0C900F0B6 +S1130380EFA90F9D83C038A9276038A901604000F8 +S1130390000000954100000000F948000001AA8710 +S11303A05000000200FF7700000000656940000073 +S10B03B000776900000000FF62 +S9030000FC