diff --git a/AppleIISd.bin b/AppleIISd.bin index 5967736..3ae11c1 100644 Binary files a/AppleIISd.bin and b/AppleIISd.bin differ diff --git a/AppleIISd.hex b/AppleIISd.hex index bd221d0..8f8c52d 100644 --- a/AppleIISd.hex +++ b/AppleIISd.hex @@ -1,64 +1,129 @@ -:10000000A220A000A203A0FF2058FFBABD00018DCE -:10001000F807290F853D0A0A0A0A852BAA2CFFCF6B -:1000200020AECA9003A927002000C9C900F0010032 -:10003000A9018542A62B85436444A90885456446E9 -:1000400064472CFFCF20DDCA4C0108D82058FFBAE6 -:10005000BD00018DF807290F853D0A0A0A0A852B84 -:10006000AA2CFFCF20AECA9004A927801BA9803CF0 -:1000700083C0F022A542C900F010C901F00FC902E7 -:10008000F00EC903F00DA90138604CC6CA4CDDCA98 -:100090004C4BCB4CC1CB2000C9B0ED80D700000049 -:1000A0000000000000000000000000000000000050 -:1000B0000000000000000000000000000000000040 -:1000C0000000000000000000000000000000000030 -:1000D0000000000000000000000000000000000020 -:1000E0000000000000000000000000000000000010 -:1000F000000000000000000000000000FFFF174BA0 -:10010000D8A9039D81C0BD83C009019D83C0A907F3 -:100110009D82C0A00AA9FF9D80C03C81C010FB88C1 -:10012000D0F5BD83C029FE9D83C0A9C58540A9CB5C -:10013000854120F0C92004CAC901D039A9D1854020 -:10014000A9CB854120F0C9201FCAC901D02AA9DD49 -:100150008540A9CB854120F0C92004CAA9E3854088 -:10016000A9CB854120F0C92004CAC901F0E0C9002B -:10017000D0034CB2C94CDEC9A9DD8540A9CB85416D -:1001800020F0C9A9E98540A9CB854120F0C9200408 -:10019000CAC901F0E3C900D0034CB2C9A9CB85405C -:1001A000A9CB854120F0C92004CAC901F0F6C900D5 -:1001B000D02CA9D78540A9CB854120F0C92004CAFD -:1001C000C900D01ABD83C009809D83C0BD81C0090C -:1001D000049D81C018A000900838A02FB00338A05B -:1001E00027BD83C009019D83C0A9009D82C098607E -:1001F0005AA000B1409D80C03C81C010FBC8C00621 -:1002000090F17A60A9FF9D80C03C81C010FBBD8049 -:10021000C0853C2980D0EDA9FF9D80C0A53C602011 -:1002200004CA485AA004A9FF9D80C03C81C010FBAD -:10023000BD80C04888D0EFA43D6899F805689978DA -:10024000056899F804689978047AA9FF9D80C068C8 -:1002500060DA5AA63DA5469DF805A5479D7805A9F3 -:10026000009DF8049D7804A9802443F005A9019D10 -:10027000F804A0091EF8053E78053EF8043E78040F -:1002800088D0F17AFA605AA43D9D80C0B978049D67 -:1002900080C0B9F8049D80C0B978059D80C0B9F8C8 -:1002A000059D80C0A9FF9D80C02004CA7A6048A92E -:1002B000403C83C018F00138686048A9203C83C0E6 -:1002C00018F001386860A900A2FFA0FF20AECA9014 -:1002D00004A92F800720BACA9002A92B6020AECAB9 -:1002E000B0642051CABD83C029FE9D83C0A951209E -:1002F00086CAC900D050A9FF9D80C0BD80C0C9FE7C -:10030000D0F4A002BD81C009109D81C0A9FF9D80CD -:10031000C0643CBD80C09244E644D002E645E63C61 -:10032000D0F188D0ECBD80C0BD80C0BD80C0BD8193 -:10033000C029EF9D81C018A9000848BD83C00901EC -:100340009D83C068286038A92780EE20AECAB067B8 -:1003500020BACAB0672051CABD83C029FE9D83C0A0 -:10036000A9582086CAC900D04EA9FF9D80C0A9FE09 -:100370009D80C0A002643CB2449D80C0E644D0028F -:10038000E645E63CD0F188D0EC9D80C09D80C09DC4 -:1003900080C0BD80C0291FC905D01C18A90008480D -:1003A000A9FF9D80C0BD80C0C900F0F4BD83C00915 -:1003B000019D83C068286038A92780E238A92B8076 -:1003C000DD38A901604000000000954100000000F8 -:1003D000F948000001AA875000000200FF770000E2 -:0F03E0000000656940000000776900000000FF21 +:10000000D8A9039D81C0BD83C009019D83C0A907F4 +:100010009D82C0A00AA9FF9D80C03C81C010FB88C2 +:10002000D0F5BD83C029FE9D83C0A9C58540A9CA5E +:10003000854120F0C82004C9C901D039A9D1854023 +:10004000A9CA854120F0C8201FC9C901D02AA9DD4D +:100050008540A9CA854120F0C82004C9A9E385408C +:10006000A9CA854120F0C82004C9C901F0E0C9002F +:10007000D0034CB2C84CDEC8A9DD8540A9CA854171 +:1000800020F0C8A9E98540A9CA854120F0C820040C +:10009000C9C901F0E3C900D0034CB2C8A9CB85405F +:1000A000A9CA854120F0C82004C9C901F0F6C900D9 +:1000B000D02CA9D78540A9CA854120F0C82004C901 +:1000C000C900D01ABD83C009809D83C0BD81C0090D +:1000D000049D81C018A000900838A02FB00338A05C +:1000E00027BD83C009019D83C0A9009D82C098607F +:1000F0005AA000B1409D80C03C81C010FBC8C00622 +:1001000090F17A60A9FF9D80C03C81C010FBBD804A +:10011000C0853C2980D0EDA9FF9D80C0A53C602012 +:1001200004C9485AA004A9FF9D80C03C81C010FBAF +:10013000BD80C04888D0EFA43D6899F805689978DB +:10014000056899F804689978047AA9FF9D80C068C9 +:1001500060DA5AA63DA5469DF805A5479D7805A9F4 +:10016000009DF8049D7804A9802443F005A9019D11 +:10017000F804A0091EF8053E78053EF8043E780410 +:1001800088D0F17AFA605AA43D9D80C0B978049D68 +:1001900080C0B9F8049D80C0B978059D80C0B9F8C9 +:1001A000059D80C0A9FF9D80C02004C97A6048A930 +:1001B000403C83C018F00138686048A9203C83C0E7 +:1001C00018F001386860A900A2FFA0FF20AEC99016 +:1001D00004A92F800720BAC99002A92B6020AEC9BC +:1001E000B0642051C9BD83C029FE9D83C0A95120A0 +:1001F00086C9C900D050A9FF9D80C0BD80C0C9FE7E +:10020000D0F4A002BD81C009109D81C0A9FF9D80CE +:10021000C0643CBD80C09244E644D002E645E63C62 +:10022000D0F188D0ECBD80C0BD80C0BD80C0BD8194 +:10023000C029EF9D81C018A9000848BD83C00901ED +:100240009D83C068286038A92780EE20AEC9B067BA +:1002500020BAC9B0672051C9BD83C029FE9D83C0A3 +:10026000A9582086C9C900D04EA9FF9D80C0A9FE0B +:100270009D80C0A002643CB2449D80C0E644D00290 +:10028000E645E63CD0F188D0EC9D80C09D80C09DC5 +:1002900080C0BD80C0291FC905D01C18A90008480E +:1002A000A9FF9D80C0BD80C0C900F0F4BD83C00916 +:1002B000019D83C068286038A92780E238A92B8077 +:1002C000DD38A901604000000000954100000000F9 +:1002D000F948000001AA875000000200FF770000E3 +:1002E0000000656940000000776900000000FF0021 +:1002F00000000000000000000000000000000000FE +:1003000000000000000000000000000000000000ED +:1003100000000000000000000000000000000000DD +:1003200000000000000000000000000000000000CD +:1003300000000000000000000000000000000000BD +:1003400000000000000000000000000000000000AD +:10035000000000000000000000000000000000009D +:10036000000000000000000000000000000000008D +:10037000000000000000000000000000000000007D +:10038000000000000000000000000000000000006D +:10039000000000000000000000000000000000005D +:1003A000000000000000000000000000000000004D +:1003B000000000000000000000000000000000003D +:1003C000000000000000000000000000000000002D +:1003D000000000000000000000000000000000001D +:1003E000000000000000000000000000000000000D +:1003F00000000000000000000000000000000000FD +:1004000000000000000000000000000000000000EC +:1004100000000000000000000000000000000000DC +:1004200000000000000000000000000000000000CC +:1004300000000000000000000000000000000000BC +:1004400000000000000000000000000000000000AC +:10045000000000000000000000000000000000009C +:10046000000000000000000000000000000000008C +:10047000000000000000000000000000000000007C +:10048000000000000000000000000000000000006C +:10049000000000000000000000000000000000005C +:1004A000000000000000000000000000000000004C +:1004B000000000000000000000000000000000003C +:1004C000000000000000000000000000000000002C +:1004D000000000000000000000000000000000001C +:1004E000000000000000000000000000000000000C +:1004F00000000000000000000000000000000000FC +:1005000000000000000000000000000000000000EB +:1005100000000000000000000000000000000000DB +:1005200000000000000000000000000000000000CB +:1005300000000000000000000000000000000000BB +:1005400000000000000000000000000000000000AB +:10055000000000000000000000000000000000009B +:10056000000000000000000000000000000000008B +:10057000000000000000000000000000000000007B +:10058000000000000000000000000000000000006B +:10059000000000000000000000000000000000005B +:1005A000000000000000000000000000000000004B +:1005B000000000000000000000000000000000003B +:1005C000000000000000000000000000000000002B +:1005D000000000000000000000000000000000001B +:1005E000000000000000000000000000000000000B +:1005F00000000000000000000000000000000000FB +:1006000000000000000000000000000000000000EA +:1006100000000000000000000000000000000000DA +:1006200000000000000000000000000000000000CA +:1006300000000000000000000000000000000000BA +:1006400000000000000000000000000000000000AA +:10065000000000000000000000000000000000009A +:10066000000000000000000000000000000000008A +:10067000000000000000000000000000000000007A +:10068000000000000000000000000000000000006A +:10069000000000000000000000000000000000005A +:1006A000000000000000000000000000000000004A +:1006B000000000000000000000000000000000003A +:1006C000000000000000000000000000000000002A +:1006D000000000000000000000000000000000001A +:1006E000000000000000000000000000000000000A +:1006F00000000000000000000000000000000000FA +:10070000A220A000A203A0FF2058FFBABD00018DC7 +:10071000F807290F853D0A0A0A0A852BAA2CFFCF64 +:1007200020AEC99003A927002000C8C900F001002D +:10073000A9018542A62B85436444A90885456446E2 +:1007400064472CFFCF20DDC94C0108D82058FFBAE0 +:10075000BD00018DF807290F853D0A0A0A0A852B7D +:10076000AA2CFFCF20AEC99004A927801BA9803CEA +:1007700083C0F022A542C900F010C901F00FC902E0 +:10078000F00EC903F00DA90138604CC6C94CDDC993 +:100790004C4BCA4CC1CA2000C8B0ED80D700000045 +:1007A0000000000000000000000000000000000049 +:1007B0000000000000000000000000000000000039 +:1007C0000000000000000000000000000000000029 +:1007D0000000000000000000000000000000000019 +:1007E0000000000000000000000000000000000009 +:1007F000000000000000000000000000FFFF174B99 :00000001FF diff --git a/AppleIISd.lst b/AppleIISd.lst index 036b3ce..de5a9c6 100644 --- a/AppleIISd.lst +++ b/AppleIISd.lst @@ -10,7 +10,7 @@ 10 * 11 ******************************** 12 - 15-OCT-17 16:35 + 16-OCT-17 23:58 14 15 XC ; enable 65C02 code 16 DEBUG = 0 @@ -53,865 +53,1139 @@ 53 INITED = $80 54 55 - 56 * signature bytes - 57 -C800: A2 20 58 LDX #$20 -C802: A0 00 59 LDY #$00 -C804: A2 03 60 LDX #$03 -C806: A0 FF 61 LDY #$FF ; neither 5.25 nor Smartport - 62 - 63 * find slot nr - 64 - 65 DO DEBUG - 66 LDA #$04 - 67 STA SLOT - 68 LDA #$C4 - 69 STA CURSLOT - 70 LDA #$40 - 71 - 72 ELSE -C808: 20 58 FF 73 JSR $FF58 -C80B: BA 74 TSX -C80C: BD 00 01 75 LDA $0100,X -C80F: 8D F8 07 76 STA CURSLOT ; $Cs -C812: 29 0F 77 AND #$0F -C814: 85 3D 78 STA SLOT ; $0s -C816: 0A 79 ASL A -C817: 0A 80 ASL A -C818: 0A 81 ASL A -C819: 0A 82 ASL A - 83 FIN - 84 -C81A: 85 2B 85 STA SLOT16 ; $s0 -C81C: AA 86 TAX ; X holds now SLOT16 -C81D: 2C FF CF 87 BIT $CFFF -C820: 20 AE CA 88 JSR CARDDET -C823: 90 03 89 BCC :INIT -C825: A9 27 90 LDA #$27 ; no card inserted -C827: 00 91 BRK - 92 -C828: 20 00 C9 93 :INIT JSR INIT - 94 - 95 - 96 ******************************** - 97 * - 98 * Install SD card driver - 99 * - 100 ******************************** - 101 - 102 DO DEBUG - 103 - 104 * see if slot has a driver already + 56 ******************************** + 57 * + 58 * Initialize SD card + 59 * + 60 * C Clear - No error + 61 * Set - Error + 62 * A $00 - No error + 63 * $27 - I/O error - Init failed + 64 * $2F - No card inserted + 65 * + 66 ******************************** + 67 +C800: D8 68 INIT CLD +C801: A9 03 69 LDA #$03 ; set SPI mode 3 +C803: 9D 81 C0 70 STA CTRL,X +C806: BD 83 C0 71 LDA SS,X +C809: 09 01 72 ORA #SS0 ; set CS high +C80B: 9D 83 C0 73 STA SS,X +C80E: A9 07 74 LDA #7 +C810: 9D 82 C0 75 STA DIV,X +C813: A0 0A 76 LDY #10 +C815: A9 FF 77 LDA #DUMMY + 78 +C817: 9D 80 C0 79 :LOOP STA DATA,X +C81A: 3C 81 C0 80 :WAIT BIT CTRL,X +C81D: 10 FB 81 BPL :WAIT +C81F: 88 82 DEY +C820: D0 F5 83 BNE :LOOP ; do 10 times +C822: BD 83 C0 84 LDA SS,X +C825: 29 FE 85 AND #$FF!SS0 ; set CS low +C827: 9D 83 C0 86 STA SS,X + 87 +C82A: A9 C5 88 LDA #CMD0 +C830: 85 41 91 STA CMDHI +C832: 20 F0 C8 92 JSR CMD +C835: 20 04 C9 93 JSR GETR1 ; get response +C838: C9 01 94 CMP #$01 +C83A: D0 39 95 BNE :ERROR1 ; error! + 96 +C83C: A9 D1 97 LDA #CMD8 +C842: 85 41 100 STA CMDHI +C844: 20 F0 C8 101 JSR CMD +C847: 20 1F C9 102 JSR GETR3 +C84A: C9 01 103 CMP #$01 +C84C: D0 2A 104 BNE :SDV1 ; may be SD Ver. 1 105 - 106 LDX $BF31 ; get devcnt - 107 INSTALL LDA $BF32,X ; get a devnum - 108 AND #$70 ; isolate slot - 109 CMP SLOT16 ; slot? - 110 BEQ :INSOUT ; yes, skip it - 111 DEX - 112 BPL INSTALL ; keep up the search - 113 - 114 * restore the devnum to the list - 115 - 116 LDX $BF31 ; get devcnt again - 117 CPX #$0D ; device table full? - 118 BNE :INST2 - 119 - 120 JSR $FF3A ; bell - 121 JMP :INSOUT ; do something! - 122 - 123 :INST2 LDA $BF32-1,X ; move all entries down - 124 STA $BF32,X ; to make room at front - 125 DEX ; for a new entry - 126 BNE :INST2 - 127 LDA #$04 ; ProFile type device - 128 ORA SLOT16 - 129 STA $BF32 ; slot, drive 1 at top of list - 130 INC $BF31 ; update devcnt - 131 - 132 * now insert the device driver vector - 133 - 134 LDA SLOT - 135 ASL - 136 TAX - 137 LDA #DRIVER - 140 STA $BF11,X - 141 :INSOUT RTS - 142 - 143 - 144 ******************************** - 145 * - 146 * Boot from SD card - 147 * - 148 ******************************** - 149 - 150 ELSE - 151 -C82B: C9 00 152 BOOT CMP #0 ; check for error -C82D: F0 01 153 BEQ :BOOT1 -C82F: 00 154 BRK - 155 -C830: A9 01 156 :BOOT1 LDA #$01 -C832: 85 42 157 STA DCMD ; load command -C834: A6 2B 158 LDX SLOT16 -C836: 85 43 159 STA $43 ; slot number -C838: 64 44 160 STZ BUFFER ; buffer lo -C83A: A9 08 161 LDA #$08 -C83C: 85 45 162 STA BUFFER+1 ; buffer hi -C83E: 64 46 163 STZ BLOCK ; block lo -C840: 64 47 164 STZ BLOCK+1 ; block hi -C842: 2C FF CF 165 BIT $CFFF -C845: 20 DD CA 166 JSR READ ; call driver -C848: 4C 01 08 167 JMP $801 ; goto bootloader - 168 - 169 FIN - 170 - 171 - 172 ******************************** - 173 * - 174 * Jump table - 175 * - 176 ******************************** - 177 -C84B: D8 178 DRIVER CLD - 179 - 180 DO DEBUG - 181 LDA #$04 - 182 STA SLOT - 183 LDA #$C4 - 184 STA CURSLOT - 185 LDA #$40 - 186 - 187 ELSE -C84C: 20 58 FF 188 JSR $FF58 ; find slot nr -C84F: BA 189 TSX -C850: BD 00 01 190 LDA $0100,X -C853: 8D F8 07 191 STA CURSLOT ; $Cs -C856: 29 0F 192 AND #$0F -C858: 85 3D 193 STA SLOT ; $0s -C85A: 0A 194 ASL A -C85B: 0A 195 ASL A -C85C: 0A 196 ASL A -C85D: 0A 197 ASL A - 198 FIN - 199 -C85E: 85 2B 200 STA SLOT16 ; $s0 -C860: AA 201 TAX ; X holds now SLOT16 -C861: 2C FF CF 202 BIT $CFFF -C864: 20 AE CA 203 JSR CARDDET -C867: 90 04 204 BCC :INITED -C869: A9 27 205 LDA #$27 ; no card inserted -C86B: 80 1B 206 BRA :DONE - 207 -C86D: A9 80 208 :INITED LDA #INITED ; check for init -C86F: 3C 83 C0 209 BIT SS,X -C872: F0 22 210 BEQ :INIT - 211 -C874: A5 42 212 :CMD LDA DCMD ; get command -C876: C9 00 213 CMP #0 -C878: F0 10 214 BEQ :STATUS -C87A: C9 01 215 CMP #1 -C87C: F0 0F 216 BEQ :READ -C87E: C9 02 217 CMP #2 -C880: F0 0E 218 BEQ :WRITE -C882: C9 03 219 CMP #3 -C884: F0 0D 220 BEQ :FORMAT - 221 DO DEBUG - 222 CMP #$FF - 223 BEQ :TEST - 224 FIN -C886: A9 01 225 LDA #1 ; unknown command - 226 -C888: 38 227 :DONE SEC -C889: 60 228 RTS - 229 -C88A: 4C C6 CA 230 :STATUS JMP STATUS -C88D: 4C DD CA 231 :READ JMP READ -C890: 4C 4B CB 232 :WRITE JMP WRITE -C893: 4C C1 CB 233 :FORMAT JMP FORMAT -C896: 20 00 C9 234 :INIT JSR INIT -C899: B0 ED 235 BCS :DONE ; init failure -C89B: 80 D7 236 BRA :CMD - 237 - 238 DO DEBUG - 239 :TEST JMP TEST ; do device test - 240 FIN - 241 - 242 - 243 * Signature bytes - 244 -C89D: 00 00 00 245 DS \ ; fill with zeroes -C8A0: 00 00 00 00 -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 - 246 DS -4 ; locate to $xxFC -C8FC: FF FF 247 DW $FFFF ; 65535 blocks -C8FE: 17 248 DB $17 ; Status bits -C8FF: 4B 249 DB #CMD0 -C930: 85 41 287 STA CMDHI -C932: 20 F0 C9 288 JSR CMD -C935: 20 04 CA 289 JSR GETR1 ; get response -C938: C9 01 290 CMP #$01 -C93A: D0 39 291 BNE :ERROR1 ; error! - 292 -C93C: A9 D1 293 LDA #CMD8 -C942: 85 41 296 STA CMDHI -C944: 20 F0 C9 297 JSR CMD -C947: 20 1F CA 298 JSR GETR3 -C94A: C9 01 299 CMP #$01 -C94C: D0 2A 300 BNE :SDV1 ; may be SD Ver. 1 - 301 - 302 * check for $01aa match! -C94E: A9 DD 303 :SDV2 LDA #CMD55 -C954: 85 41 306 STA CMDHI -C956: 20 F0 C9 307 JSR CMD -C959: 20 04 CA 308 JSR GETR1 -C95C: A9 E3 309 LDA #ACMD4140 -C962: 85 41 312 STA CMDHI -C964: 20 F0 C9 313 JSR CMD -C967: 20 04 CA 314 JSR GETR1 -C96A: C9 01 315 CMP #$01 -C96C: F0 E0 316 BEQ :SDV2 ; wait for ready -C96E: C9 00 317 CMP #$00 -C970: D0 03 318 BNE :ERROR1 ; error! - 319 * send CMD58 - 320 * SD Ver. 2 initialized! -C972: 4C B2 C9 321 JMP :BLOCKSZ - 322 -C975: 4C DE C9 323 :ERROR1 JMP :IOERROR ; needed for far jump - 324 -C978: A9 DD 325 :SDV1 LDA #CMD55 -C97E: 85 41 328 STA CMDHI -C980: 20 F0 C9 329 JSR CMD ; ignore response -C983: A9 E9 330 LDA #ACMD410 -C989: 85 41 333 STA CMDHI -C98B: 20 F0 C9 334 JSR CMD -C98E: 20 04 CA 335 JSR GETR1 -C991: C9 01 336 CMP #$01 -C993: F0 E3 337 BEQ :SDV1 ; wait for ready -C995: C9 00 338 CMP #$00 -C997: D0 03 339 BNE :MMC ; may be MMC card - 340 * SD Ver. 1 initialized! -C999: 4C B2 C9 341 JMP :BLOCKSZ - 342 -C99C: A9 CB 343 :MMC LDA #CMD1 -C9A2: 85 41 346 STA CMDHI -C9A4: 20 F0 C9 347 :LOOP1 JSR CMD -C9A7: 20 04 CA 348 JSR GETR1 -C9AA: C9 01 349 CMP #$01 -C9AC: F0 F6 350 BEQ :LOOP1 ; wait for ready -C9AE: C9 00 351 CMP #$00 -C9B0: D0 2C 352 BNE :IOERROR ; error! - 353 * MMC Ver. 3 initialized! - 354 -C9B2: A9 D7 355 :BLOCKSZ LDA #CMD16 -C9B8: 85 41 358 STA CMDHI -C9BA: 20 F0 C9 359 JSR CMD -C9BD: 20 04 CA 360 JSR GETR1 -C9C0: C9 00 361 CMP #$00 -C9C2: D0 1A 362 BNE :IOERROR ; error! - 363 -C9C4: BD 83 C0 364 :END LDA SS,X -C9C7: 09 80 365 ORA #INITED ; initialized -C9C9: 9D 83 C0 366 STA SS,X -C9CC: BD 81 C0 367 LDA CTRL,X -C9CF: 09 04 368 ORA #ECE ; enable 7MHz -C9D1: 9D 81 C0 369 STA CTRL,X -C9D4: 18 370 CLC ; all ok -C9D5: A0 00 371 LDY #0 -C9D7: 90 08 372 BCC :END1 -C9D9: 38 373 :CDERROR SEC -C9DA: A0 2F 374 LDY #$2F ; no card error -C9DC: B0 03 375 BCS :END1 -C9DE: 38 376 :IOERROR SEC -C9DF: A0 27 377 LDY #$27 ; init error -C9E1: BD 83 C0 378 :END1 LDA SS,X ; set CS high -C9E4: 09 01 379 ORA #SS0 -C9E6: 9D 83 C0 380 STA SS,X -C9E9: A9 00 381 LDA #0 ; set div to 2 -C9EB: 9D 82 C0 382 STA DIV,X -C9EE: 98 383 TYA ; retval in A -C9EF: 60 384 RTS + 106 * check for $01aa match! +C84E: A9 DD 107 :SDV2 LDA #CMD55 +C854: 85 41 110 STA CMDHI +C856: 20 F0 C8 111 JSR CMD +C859: 20 04 C9 112 JSR GETR1 +C85C: A9 E3 113 LDA #ACMD4140 +C862: 85 41 116 STA CMDHI +C864: 20 F0 C8 117 JSR CMD +C867: 20 04 C9 118 JSR GETR1 +C86A: C9 01 119 CMP #$01 +C86C: F0 E0 120 BEQ :SDV2 ; wait for ready +C86E: C9 00 121 CMP #$00 +C870: D0 03 122 BNE :ERROR1 ; error! + 123 * send CMD58 + 124 * SD Ver. 2 initialized! +C872: 4C B2 C8 125 JMP :BLOCKSZ + 126 +C875: 4C DE C8 127 :ERROR1 JMP :IOERROR ; needed for far jump + 128 +C878: A9 DD 129 :SDV1 LDA #CMD55 +C87E: 85 41 132 STA CMDHI +C880: 20 F0 C8 133 JSR CMD ; ignore response +C883: A9 E9 134 LDA #ACMD410 +C889: 85 41 137 STA CMDHI +C88B: 20 F0 C8 138 JSR CMD +C88E: 20 04 C9 139 JSR GETR1 +C891: C9 01 140 CMP #$01 +C893: F0 E3 141 BEQ :SDV1 ; wait for ready +C895: C9 00 142 CMP #$00 +C897: D0 03 143 BNE :MMC ; may be MMC card + 144 * SD Ver. 1 initialized! +C899: 4C B2 C8 145 JMP :BLOCKSZ + 146 +C89C: A9 CB 147 :MMC LDA #CMD1 +C8A2: 85 41 150 STA CMDHI +C8A4: 20 F0 C8 151 :LOOP1 JSR CMD +C8A7: 20 04 C9 152 JSR GETR1 +C8AA: C9 01 153 CMP #$01 +C8AC: F0 F6 154 BEQ :LOOP1 ; wait for ready +C8AE: C9 00 155 CMP #$00 +C8B0: D0 2C 156 BNE :IOERROR ; error! + 157 * MMC Ver. 3 initialized! + 158 +C8B2: A9 D7 159 :BLOCKSZ LDA #CMD16 +C8B8: 85 41 162 STA CMDHI +C8BA: 20 F0 C8 163 JSR CMD +C8BD: 20 04 C9 164 JSR GETR1 +C8C0: C9 00 165 CMP #$00 +C8C2: D0 1A 166 BNE :IOERROR ; error! + 167 +C8C4: BD 83 C0 168 :END LDA SS,X +C8C7: 09 80 169 ORA #INITED ; initialized +C8C9: 9D 83 C0 170 STA SS,X +C8CC: BD 81 C0 171 LDA CTRL,X +C8CF: 09 04 172 ORA #ECE ; enable 7MHz +C8D1: 9D 81 C0 173 STA CTRL,X +C8D4: 18 174 CLC ; all ok +C8D5: A0 00 175 LDY #0 +C8D7: 90 08 176 BCC :END1 +C8D9: 38 177 :CDERROR SEC +C8DA: A0 2F 178 LDY #$2F ; no card error +C8DC: B0 03 179 BCS :END1 +C8DE: 38 180 :IOERROR SEC +C8DF: A0 27 181 LDY #$27 ; init error +C8E1: BD 83 C0 182 :END1 LDA SS,X ; set CS high +C8E4: 09 01 183 ORA #SS0 +C8E6: 9D 83 C0 184 STA SS,X +C8E9: A9 00 185 LDA #0 ; set div to 2 +C8EB: 9D 82 C0 186 STA DIV,X +C8EE: 98 187 TYA ; retval in A +C8EF: 60 188 RTS + 189 + 190 + 191 ******************************** + 192 * + 193 * Send SD command + 194 * Call with command in CMDHI and CMDLO + 195 * + 196 ******************************** + 197 +C8F0: 5A 198 CMD PHY +C8F1: A0 00 199 LDY #0 +C8F3: B1 40 200 :LOOP LDA (CMDLO),Y +C8F5: 9D 80 C0 201 STA DATA,X +C8F8: 3C 81 C0 202 :WAIT BIT CTRL,X ; TC is in N +C8FB: 10 FB 203 BPL :WAIT +C8FD: C8 204 INY +C8FE: C0 06 205 CPY #6 +C900: 90 F1 206 BCC :LOOP +C902: 7A 207 PLY +C903: 60 208 RTS + 209 + 210 + 211 ******************************** + 212 * + 213 * Get R1 + 214 * R1 is in A + 215 * + 216 ******************************** + 217 +C904: A9 FF 218 GETR1 LDA #DUMMY +C906: 9D 80 C0 219 STA DATA,X +C909: 3C 81 C0 220 :WAIT BIT CTRL,X +C90C: 10 FB 221 BPL :WAIT +C90E: BD 80 C0 222 LDA DATA,X ; get response +C911: 85 3C 223 STA WORK ; save R1 +C913: 29 80 224 AND #$80 +C915: D0 ED 225 BNE GETR1 ; wait for MSB=0 +C917: A9 FF 226 LDA #DUMMY +C919: 9D 80 C0 227 STA DATA,X ; send another dummy +C91C: A5 3C 228 LDA WORK ; restore R1 +C91E: 60 229 RTS + 230 + 231 + 232 ******************************** + 233 * + 234 * Get R3 + 235 * R1 is in A + 236 * R3 is in scratchpad ram + 237 * + 238 ******************************** + 239 +C91F: 20 04 C9 240 GETR3 JSR GETR1 ; get R1 first +C922: 48 241 PHA ; save R1 +C923: 5A 242 PHY ; save Y +C924: A0 04 243 LDY #04 ; load counter +C926: A9 FF 244 :LOOP LDA #DUMMY ; send dummy +C928: 9D 80 C0 245 STA DATA,X +C92B: 3C 81 C0 246 :WAIT BIT CTRL,X +C92E: 10 FB 247 BPL :WAIT +C930: BD 80 C0 248 LDA DATA,X +C933: 48 249 PHA +C934: 88 250 DEY +C935: D0 EF 251 BNE :LOOP ; do 4 times +C937: A4 3D 252 LDY SLOT +C939: 68 253 PLA +C93A: 99 F8 05 254 STA R33,Y ; save R3 +C93D: 68 255 PLA +C93E: 99 78 05 256 STA R32,Y +C941: 68 257 PLA +C942: 99 F8 04 258 STA R31,Y +C945: 68 259 PLA +C946: 99 78 04 260 STA R30,Y +C949: 7A 261 PLY ; restore Y +C94A: A9 FF 262 LDA #DUMMY +C94C: 9D 80 C0 263 STA DATA,X ; send another dummy +C94F: 68 264 PLA ; restore R1 +C950: 60 265 RTS + 266 + 267 + 268 ******************************** + 269 * + 270 * Calculate block address + 271 * Unit number is in $43 DSSS0000 + 272 * Block no is in $46-47 + 273 * Address is in R30-R33 + 274 * + 275 ******************************** + 276 +C951: DA 277 GETBLOCK PHX ; save X +C952: 5A 278 PHY ; save Y +C953: A6 3D 279 LDX SLOT +C955: A5 46 280 LDA BLOCK ; store block num +C957: 9D F8 05 281 STA R33,X ; in R30-R33 +C95A: A5 47 282 LDA BLOCK+1 +C95C: 9D 78 05 283 STA R32,X +C95F: A9 00 284 LDA #0 +C961: 9D F8 04 285 STA R31,X +C964: 9D 78 04 286 STA R30,X + 287 +C967: A9 80 288 LDA #$80 ; drive number +C969: 24 43 289 BIT $43 +C96B: F0 05 290 BEQ :SHIFT ; D1 +C96D: A9 01 291 LDA #1 ; D2 +C96F: 9D F8 04 292 STA R31,X + 293 +C972: A0 09 294 :SHIFT LDY #9 ; ASL can't be used with Y +C974: 1E F8 05 295 :LOOP ASL R33,X ; mul block num +C977: 3E 78 05 296 ROL R32,X ; by 512 to get +C97A: 3E F8 04 297 ROL R31,X ; real address +C97D: 3E 78 04 298 ROL R30,X +C980: 88 299 DEY +C981: D0 F1 300 BNE :LOOP +C983: 7A 301 PLY ; restore Y +C984: FA 302 PLX ; restore X +C985: 60 303 RTS + 304 + 305 + 306 ******************************** + 307 * + 308 * Send SD command + 309 * Cmd is in A + 310 * + 311 ******************************** + 312 +C986: 5A 313 COMMAND PHY ; save Y +C987: A4 3D 314 LDY SLOT +C989: 9D 80 C0 315 STA DATA,X ; send command +C98C: B9 78 04 316 LDA R30,Y ; get arg from R30 on +C98F: 9D 80 C0 317 STA DATA,X +C992: B9 F8 04 318 LDA R31,Y +C995: 9D 80 C0 319 STA DATA,X +C998: B9 78 05 320 LDA R32,Y +C99B: 9D 80 C0 321 STA DATA,X +C99E: B9 F8 05 322 LDA R33,Y +C9A1: 9D 80 C0 323 STA DATA,X +C9A4: A9 FF 324 LDA #DUMMY +C9A6: 9D 80 C0 325 STA DATA,X ; dummy crc +C9A9: 20 04 C9 326 JSR GETR1 +C9AC: 7A 327 PLY ; restore Y +C9AD: 60 328 RTS + 329 + 330 + 331 ******************************** + 332 * + 333 * Check for card detect + 334 * + 335 * C Clear - card in slot + 336 * Set - no card in slot + 337 * + 338 ******************************** + 339 +C9AE: 48 340 CARDDET PHA +C9AF: A9 40 341 LDA #CD ; 0: card in +C9B1: 3C 83 C0 342 BIT SS,X ; 1: card out +C9B4: 18 343 CLC +C9B5: F0 01 344 BEQ :DONE ; card is in +C9B7: 38 345 SEC ; card is out +C9B8: 68 346 :DONE PLA +C9B9: 60 347 RTS + 348 + 349 + 350 ******************************** + 351 * + 352 * Check for write protect + 353 * + 354 * C Clear - card not protected + 355 * Set - card write protected + 356 * + 357 ******************************** + 358 +C9BA: 48 359 WRPROT PHA +C9BB: A9 20 360 LDA #WP ; 0: write enabled +C9BD: 3C 83 C0 361 BIT SS,X ; 1: write disabled +C9C0: 18 362 CLC +C9C1: F0 01 363 BEQ :DONE +C9C3: 38 364 SEC +C9C4: 68 365 :DONE PLA +C9C5: 60 366 RTS + 367 + 368 + 369 ******************************** + 370 * + 371 * Status request + 372 * $43 Unit number DSSS000 + 373 * $44-45 Unused + 374 * $46-47 Unused + 375 * + 376 * C Clear - No error + 377 * Set - Error + 378 * A $00 - No error + 379 * $2B - Card write protected + 380 * $2F - No card inserted + 381 * X - Blocks avail (low byte) + 382 * Y - Blocks avail (high byte) + 383 * + 384 ******************************** 385 - 386 - 387 ******************************** - 388 * - 389 * Send SD command - 390 * Call with command in CMDHI and CMDLO - 391 * - 392 ******************************** - 393 -C9F0: 5A 394 CMD PHY -C9F1: A0 00 395 LDY #0 -C9F3: B1 40 396 :LOOP LDA (CMDLO),Y -C9F5: 9D 80 C0 397 STA DATA,X -C9F8: 3C 81 C0 398 :WAIT BIT CTRL,X ; TC is in N -C9FB: 10 FB 399 BPL :WAIT -C9FD: C8 400 INY -C9FE: C0 06 401 CPY #6 -CA00: 90 F1 402 BCC :LOOP -CA02: 7A 403 PLY -CA03: 60 404 RTS - 405 - 406 - 407 ******************************** +C9C6: A9 00 386 STATUS LDA #0 ; no error +C9C8: A2 FF 387 LDX #$FF ; 32 MB partition +C9CA: A0 FF 388 LDY #$FF + 389 +C9CC: 20 AE C9 390 JSR CARDDET +C9CF: 90 04 391 BCC :WRPROT +C9D1: A9 2F 392 LDA #$2F ; no card inserted +C9D3: 80 07 393 BRA :DONE + 394 +C9D5: 20 BA C9 395 :WRPROT JSR WRPROT +C9D8: 90 02 396 BCC :DONE +C9DA: A9 2B 397 LDA #$2B ; card write protected + 398 +C9DC: 60 399 :DONE RTS + 400 + 401 + 402 ******************************** + 403 * + 404 * Read 512 byte block + 405 * $43 Unit number DSSS0000 + 406 * $44-45 Address (LO/HI) of buffer + 407 * $46-47 Block number (LO/HI) 408 * - 409 * Get R1 - 410 * R1 is in A - 411 * - 412 ******************************** - 413 -CA04: A9 FF 414 GETR1 LDA #DUMMY -CA06: 9D 80 C0 415 STA DATA,X -CA09: 3C 81 C0 416 :WAIT BIT CTRL,X -CA0C: 10 FB 417 BPL :WAIT -CA0E: BD 80 C0 418 LDA DATA,X ; get response -CA11: 85 3C 419 STA WORK ; save R1 -CA13: 29 80 420 AND #$80 -CA15: D0 ED 421 BNE GETR1 ; wait for MSB=0 -CA17: A9 FF 422 LDA #DUMMY -CA19: 9D 80 C0 423 STA DATA,X ; send another dummy -CA1C: A5 3C 424 LDA WORK ; restore R1 -CA1E: 60 425 RTS - 426 + 409 * C Clear - No error + 410 * Set - Error + 411 * A $00 - No error + 412 * $27 - Bad block number + 413 * $28 - No card inserted + 414 * + 415 ******************************** + 416 +C9DD: 20 AE C9 417 READ JSR CARDDET +C9E0: B0 64 418 BCS :ERROR ; no card inserted + 419 +C9E2: 20 51 C9 420 JSR GETBLOCK ; calc block address + 421 +C9E5: BD 83 C0 422 LDA SS,X ; enable /CS +C9E8: 29 FE 423 AND #$FF!SS0 +C9EA: 9D 83 C0 424 STA SS,X +C9ED: A9 51 425 LDA #$51 ; send CMD17 +C9EF: 20 86 C9 426 JSR COMMAND ; send command 427 - 428 ******************************** - 429 * - 430 * Get R3 - 431 * R1 is in A - 432 * R3 is in scratchpad ram - 433 * - 434 ******************************** - 435 -CA1F: 20 04 CA 436 GETR3 JSR GETR1 ; get R1 first -CA22: 48 437 PHA ; save R1 -CA23: 5A 438 PHY ; save Y -CA24: A0 04 439 LDY #04 ; load counter -CA26: A9 FF 440 :LOOP LDA #DUMMY ; send dummy -CA28: 9D 80 C0 441 STA DATA,X -CA2B: 3C 81 C0 442 :WAIT BIT CTRL,X -CA2E: 10 FB 443 BPL :WAIT -CA30: BD 80 C0 444 LDA DATA,X -CA33: 48 445 PHA -CA34: 88 446 DEY -CA35: D0 EF 447 BNE :LOOP ; do 4 times -CA37: A4 3D 448 LDY SLOT -CA39: 68 449 PLA -CA3A: 99 F8 05 450 STA R33,Y ; save R3 -CA3D: 68 451 PLA -CA3E: 99 78 05 452 STA R32,Y -CA41: 68 453 PLA -CA42: 99 F8 04 454 STA R31,Y -CA45: 68 455 PLA -CA46: 99 78 04 456 STA R30,Y -CA49: 7A 457 PLY ; restore Y -CA4A: A9 FF 458 LDA #DUMMY -CA4C: 9D 80 C0 459 STA DATA,X ; send another dummy -CA4F: 68 460 PLA ; restore R1 -CA50: 60 461 RTS - 462 +C9F2: C9 00 428 CMP #0 ; check for error +C9F4: D0 50 429 BNE :ERROR + 430 +C9F6: A9 FF 431 :GETTOK LDA #DUMMY ; get data token +C9F8: 9D 80 C0 432 STA DATA,X +C9FB: BD 80 C0 433 LDA DATA,X ; get response +C9FE: C9 FE 434 CMP #$FE +CA00: D0 F4 435 BNE :GETTOK ; wait for $FE + 436 +CA02: A0 02 437 LDY #2 ; read data from card +CA04: BD 81 C0 438 LDA CTRL,X ; enable FRX +CA07: 09 10 439 ORA #FRX +CA09: 9D 81 C0 440 STA CTRL,X +CA0C: A9 FF 441 LDA #DUMMY +CA0E: 9D 80 C0 442 STA DATA,X +CA11: 64 3C 443 :LOOPY STZ WORK +CA13: BD 80 C0 444 :LOOPW LDA DATA,X +CA16: 92 44 445 STA (BUFFER) +CA18: E6 44 446 INC BUFFER +CA1A: D0 02 447 BNE :INW +CA1C: E6 45 448 INC BUFFER+1 ; inc msb on page boundary +CA1E: E6 3C 449 :INW INC WORK +CA20: D0 F1 450 BNE :LOOPW +CA22: 88 451 DEY +CA23: D0 EC 452 BNE :LOOPY + 453 +CA25: BD 80 C0 454 :CRC LDA DATA,X ; read two bytes crc +CA28: BD 80 C0 455 LDA DATA,X ; and ignore +CA2B: BD 80 C0 456 LDA DATA,X ; read a dummy byte + 457 +CA2E: BD 81 C0 458 LDA CTRL,X ; disable FRX +CA31: 29 EF 459 AND #$FF!FRX +CA33: 9D 81 C0 460 STA CTRL,X +CA36: 18 461 CLC ; no error +CA37: A9 00 462 LDA #0 463 - 464 ******************************** - 465 * - 466 * Calculate block address - 467 * Unit number is in $43 DSSS0000 - 468 * Block no is in $46-47 - 469 * Address is in R30-R33 - 470 * - 471 ******************************** +CA39: 08 464 :DONE PHP +CA3A: 48 465 PHA +CA3B: BD 83 C0 466 LDA SS,X +CA3E: 09 01 467 ORA #SS0 +CA40: 9D 83 C0 468 STA SS,X ; disable /CS +CA43: 68 469 PLA +CA44: 28 470 PLP +CA45: 60 471 RTS 472 -CA51: DA 473 GETBLOCK PHX ; save X -CA52: 5A 474 PHY ; save Y -CA53: A6 3D 475 LDX SLOT -CA55: A5 46 476 LDA BLOCK ; store block num -CA57: 9D F8 05 477 STA R33,X ; in R30-R33 -CA5A: A5 47 478 LDA BLOCK+1 -CA5C: 9D 78 05 479 STA R32,X -CA5F: A9 00 480 LDA #0 -CA61: 9D F8 04 481 STA R31,X -CA64: 9D 78 04 482 STA R30,X - 483 -CA67: A9 80 484 LDA #$80 ; drive number -CA69: 24 43 485 BIT $43 -CA6B: F0 05 486 BEQ :SHIFT ; D1 -CA6D: A9 01 487 LDA #1 ; D2 -CA6F: 9D F8 04 488 STA R31,X - 489 -CA72: A0 09 490 :SHIFT LDY #9 ; ASL can't be used with Y -CA74: 1E F8 05 491 :LOOP ASL R33,X ; mul block num -CA77: 3E 78 05 492 ROL R32,X ; by 512 to get -CA7A: 3E F8 04 493 ROL R31,X ; real address -CA7D: 3E 78 04 494 ROL R30,X -CA80: 88 495 DEY -CA81: D0 F1 496 BNE :LOOP -CA83: 7A 497 PLY ; restore Y -CA84: FA 498 PLX ; restore X -CA85: 60 499 RTS +CA46: 38 473 :ERROR SEC ; an error occured +CA47: A9 27 474 LDA #$27 +CA49: 80 EE 475 BRA :DONE + 476 + 477 + 478 ******************************** + 479 * + 480 * Write 512 byte block + 481 * $43 Unit number DSSS0000 + 482 * $44-45 Address (LO/HI) of buffer + 483 * $46-47 Block number (LO/HI) + 484 * + 485 * C Clear - No error + 486 * Set - Error + 487 * A $00 - No error + 488 * $27 - I/O error or bad block number + 489 * $2B - Card write protected + 490 * + 491 ******************************** + 492 +CA4B: 20 AE C9 493 WRITE JSR CARDDET +CA4E: B0 67 494 BCS :IOERROR ; no card inserted + 495 +CA50: 20 BA C9 496 JSR WRPROT +CA53: B0 67 497 BCS :WPERROR ; card write protected + 498 +CA55: 20 51 C9 499 JSR GETBLOCK ; calc block address 500 - 501 - 502 ******************************** - 503 * - 504 * Send SD command - 505 * Cmd is in A - 506 * - 507 ******************************** - 508 -CA86: 5A 509 COMMAND PHY ; save Y -CA87: A4 3D 510 LDY SLOT -CA89: 9D 80 C0 511 STA DATA,X ; send command -CA8C: B9 78 04 512 LDA R30,Y ; get arg from R30 on -CA8F: 9D 80 C0 513 STA DATA,X -CA92: B9 F8 04 514 LDA R31,Y -CA95: 9D 80 C0 515 STA DATA,X -CA98: B9 78 05 516 LDA R32,Y -CA9B: 9D 80 C0 517 STA DATA,X -CA9E: B9 F8 05 518 LDA R33,Y -CAA1: 9D 80 C0 519 STA DATA,X -CAA4: A9 FF 520 LDA #DUMMY -CAA6: 9D 80 C0 521 STA DATA,X ; dummy crc -CAA9: 20 04 CA 522 JSR GETR1 -CAAC: 7A 523 PLY ; restore Y -CAAD: 60 524 RTS - 525 +CA58: BD 83 C0 501 LDA SS,X ; enable /CS +CA5B: 29 FE 502 AND #$FF!SS0 +CA5D: 9D 83 C0 503 STA SS,X +CA60: A9 58 504 LDA #$58 ; send CMD24 +CA62: 20 86 C9 505 JSR COMMAND ; send command + 506 +CA65: C9 00 507 CMP #0 ; check for error +CA67: D0 4E 508 BNE :IOERROR + 509 +CA69: A9 FF 510 LDA #DUMMY +CA6B: 9D 80 C0 511 STA DATA,X ; send dummy +CA6E: A9 FE 512 LDA #$FE +CA70: 9D 80 C0 513 STA DATA,X ; send data token + 514 +CA73: A0 02 515 LDY #2 ; send data to card +CA75: 64 3C 516 :LOOPY STZ WORK +CA77: B2 44 517 :LOOPW LDA (BUFFER) +CA79: 9D 80 C0 518 STA DATA,X +CA7C: E6 44 519 INC BUFFER +CA7E: D0 02 520 BNE :INW +CA80: E6 45 521 INC BUFFER+1 ; inc msb on page boundary +CA82: E6 3C 522 :INW INC WORK +CA84: D0 F1 523 BNE :LOOPW +CA86: 88 524 DEY +CA87: D0 EC 525 BNE :LOOPY 526 - 527 ******************************** - 528 * - 529 * Check for card detect - 530 * - 531 * C Clear - card in slot - 532 * Set - no card in slot - 533 * - 534 ******************************** - 535 -CAAE: 48 536 CARDDET PHA -CAAF: A9 40 537 LDA #CD ; 0: card in -CAB1: 3C 83 C0 538 BIT SS,X ; 1: card out -CAB4: 18 539 CLC -CAB5: F0 01 540 BEQ :DONE ; card is in -CAB7: 38 541 SEC ; card is out -CAB8: 68 542 :DONE PLA -CAB9: 60 543 RTS - 544 +CA89: 9D 80 C0 527 :CRC STA DATA,X ; send 2 dummy crc bytes +CA8C: 9D 80 C0 528 STA DATA,X + 529 +CA8F: 9D 80 C0 530 STA DATA,X ; get data response +CA92: BD 80 C0 531 LDA DATA,X +CA95: 29 1F 532 AND #$1F +CA97: C9 05 533 CMP #$05 +CA99: D0 1C 534 BNE :IOERROR ; check for write error +CA9B: 18 535 CLC ; no error +CA9C: A9 00 536 LDA #0 + 537 +CA9E: 08 538 :DONE PHP +CA9F: 48 539 PHA +CAA0: A9 FF 540 :WAIT LDA #DUMMY +CAA2: 9D 80 C0 541 STA DATA,X ; wait for write cycle +CAA5: BD 80 C0 542 LDA DATA,X ; to complete +CAA8: C9 00 543 CMP #$00 +CAAA: F0 F4 544 BEQ :WAIT 545 - 546 ******************************** - 547 * - 548 * Check for write protect - 549 * - 550 * C Clear - card not protected - 551 * Set - card write protected - 552 * - 553 ******************************** - 554 -CABA: 48 555 WRPROT PHA -CABB: A9 20 556 LDA #WP ; 0: write enabled -CABD: 3C 83 C0 557 BIT SS,X ; 1: write disabled -CAC0: 18 558 CLC -CAC1: F0 01 559 BEQ :DONE -CAC3: 38 560 SEC -CAC4: 68 561 :DONE PLA -CAC5: 60 562 RTS - 563 - 564 - 565 ******************************** - 566 * - 567 * Status request - 568 * $43 Unit number DSSS000 - 569 * $44-45 Unused - 570 * $46-47 Unused - 571 * - 572 * C Clear - No error - 573 * Set - Error - 574 * A $00 - No error - 575 * $2B - Card write protected - 576 * $2F - No card inserted - 577 * X - Blocks avail (low byte) - 578 * Y - Blocks avail (high byte) - 579 * - 580 ******************************** - 581 -CAC6: A9 00 582 STATUS LDA #0 ; no error -CAC8: A2 FF 583 LDX #$FF ; 32 MB partition -CACA: A0 FF 584 LDY #$FF - 585 -CACC: 20 AE CA 586 JSR CARDDET -CACF: 90 04 587 BCC :WRPROT -CAD1: A9 2F 588 LDA #$2F ; no card inserted -CAD3: 80 07 589 BRA :DONE - 590 -CAD5: 20 BA CA 591 :WRPROT JSR WRPROT -CAD8: 90 02 592 BCC :DONE -CADA: A9 2B 593 LDA #$2B ; card write protected - 594 -CADC: 60 595 :DONE RTS - 596 - 597 - 598 ******************************** - 599 * - 600 * Read 512 byte block - 601 * $43 Unit number DSSS0000 - 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 - Bad block number - 609 * $28 - No card inserted - 610 * - 611 ******************************** - 612 -CADD: 20 AE CA 613 READ JSR CARDDET -CAE0: B0 64 614 BCS :ERROR ; no card inserted - 615 -CAE2: 20 51 CA 616 JSR GETBLOCK ; calc block address +CAAC: BD 83 C0 546 LDA SS,X ; disable /CS +CAAF: 09 01 547 ORA #SS0 +CAB1: 9D 83 C0 548 STA SS,X +CAB4: 68 549 PLA +CAB5: 28 550 PLP +CAB6: 60 551 RTS + 552 +CAB7: 38 553 :IOERROR SEC ; an error occured +CAB8: A9 27 554 LDA #$27 +CABA: 80 E2 555 BRA :DONE + 556 +CABC: 38 557 :WPERROR SEC +CABD: A9 2B 558 LDA #$2B +CABF: 80 DD 559 BRA :DONE + 560 + 561 + 562 + 563 ******************************** + 564 * + 565 * Format + 566 * not supported! + 567 * + 568 ******************************** + 569 +CAC1: 38 570 FORMAT SEC +CAC2: A9 01 571 LDA #$01 ; invalid command +CAC4: 60 572 RTS + 573 + 574 + 575 ******************************** + 576 * + 577 * Test routine + 578 * + 579 ******************************** + 580 + 581 DO DEBUG + 582 TEST + 583 + 584 * get buffer + 585 LDA #2 ; get 512 byte buffer + 586 JSR $BEF5 ; call GETBUFR + 587 BCS :ERROR + 588 STA BUFADD+1 + 589 STA BUFFER+1 + 590 STZ BUFADD + 591 STZ BUFFER + 592 + 593 * fill buffer + 594 LDY #0 + 595 :LOOP TYA + 596 STA (BUFFER),Y + 597 INY + 598 BNE :LOOP + 599 INC BUFFER+1 + 600 :LOOP1 TYA + 601 STA (BUFFER),Y + 602 INY + 603 BNE :LOOP1 + 604 + 605 * write to card + 606 LDA #2 ; write cmd + 607 STA DCMD + 608 LDA BUFADD ; buffer address + 609 STA BUFFER + 610 LDA BUFADD+1 + 611 STA BUFFER+1 + 612 STZ BLOCK ; block number + 613 STZ BLOCK+1 + 614 LDX SLOT16 + 615 JSR DRIVER + 616 BCS :ERROR 617 -CAE5: BD 83 C0 618 LDA SS,X ; enable /CS -CAE8: 29 FE 619 AND #$FF!SS0 -CAEA: 9D 83 C0 620 STA SS,X -CAED: A9 51 621 LDA #$51 ; send CMD17 -CAEF: 20 86 CA 622 JSR COMMAND ; send command - 623 -CAF2: C9 00 624 CMP #0 ; check for error -CAF4: D0 50 625 BNE :ERROR - 626 -CAF6: A9 FF 627 :GETTOK LDA #DUMMY ; get data token -CAF8: 9D 80 C0 628 STA DATA,X -CAFB: BD 80 C0 629 LDA DATA,X ; get response -CAFE: C9 FE 630 CMP #$FE -CB00: D0 F4 631 BNE :GETTOK ; wait for $FE - 632 -CB02: A0 02 633 LDY #2 ; read data from card -CB04: BD 81 C0 634 LDA CTRL,X ; enable FRX -CB07: 09 10 635 ORA #FRX -CB09: 9D 81 C0 636 STA CTRL,X -CB0C: A9 FF 637 LDA #DUMMY -CB0E: 9D 80 C0 638 STA DATA,X -CB11: 64 3C 639 :LOOPY STZ WORK -CB13: BD 80 C0 640 :LOOPW LDA DATA,X -CB16: 92 44 641 STA (BUFFER) -CB18: E6 44 642 INC BUFFER -CB1A: D0 02 643 BNE :INW -CB1C: E6 45 644 INC BUFFER+1 ; inc msb on page boundary -CB1E: E6 3C 645 :INW INC WORK -CB20: D0 F1 646 BNE :LOOPW -CB22: 88 647 DEY -CB23: D0 EC 648 BNE :LOOPY - 649 -CB25: BD 80 C0 650 :CRC LDA DATA,X ; read two bytes crc -CB28: BD 80 C0 651 LDA DATA,X ; and ignore -CB2B: BD 80 C0 652 LDA DATA,X ; read a dummy byte - 653 -CB2E: BD 81 C0 654 LDA CTRL,X ; disable FRX -CB31: 29 EF 655 AND #$FF!FRX -CB33: 9D 81 C0 656 STA CTRL,X -CB36: 18 657 CLC ; no error -CB37: A9 00 658 LDA #0 - 659 -CB39: 08 660 :DONE PHP -CB3A: 48 661 PHA -CB3B: BD 83 C0 662 LDA SS,X -CB3E: 09 01 663 ORA #SS0 -CB40: 9D 83 C0 664 STA SS,X ; disable /CS -CB43: 68 665 PLA -CB44: 28 666 PLP -CB45: 60 667 RTS - 668 -CB46: 38 669 :ERROR SEC ; an error occured -CB47: A9 27 670 LDA #$27 -CB49: 80 EE 671 BRA :DONE - 672 - 673 - 674 ******************************** - 675 * - 676 * Write 512 byte block - 677 * $43 Unit number DSSS0000 - 678 * $44-45 Address (LO/HI) of buffer - 679 * $46-47 Block number (LO/HI) - 680 * - 681 * C Clear - No error - 682 * Set - Error - 683 * A $00 - No error - 684 * $27 - I/O error or bad block number - 685 * $2B - Card write protected - 686 * - 687 ******************************** - 688 -CB4B: 20 AE CA 689 WRITE JSR CARDDET -CB4E: B0 67 690 BCS :IOERROR ; no card inserted + 618 * read from card + 619 LDA #1 ; read cmd + 620 STA DCMD + 621 LDA BUFADD ; buffer address + 622 STA BUFFER + 623 LDA BUFADD+1 + 624 STA BUFFER+1 + 625 STZ BLOCK ; block number + 626 STZ BLOCK+1 + 627 LDX SLOT16 + 628 JSR DRIVER + 629 BCS :ERROR + 630 + 631 * check for errors + 632 LDA BUFADD ; buffer address + 633 STA BUFFER + 634 LDA BUFADD+1 + 635 STA BUFFER+1 + 636 LDY #0 + 637 :LOOP2 TYA + 638 CMP (BUFFER),Y + 639 BNE :ERRCMP ; error in buffer + 640 INY + 641 BNE :LOOP2 + 642 INC BUFFER+1 + 643 :LOOP3 TYA + 644 CMP (BUFFER),Y + 645 BNE :ERRCMP + 646 INY + 647 BNE :LOOP3 + 648 + 649 * free buffer + 650 JSR $BEF8 ; call FREEBUFR + 651 CLC + 652 LDA #0 + 653 RTS + 654 + 655 :ERROR BRK + 656 :ERRCMP BRK + 657 + 658 BUFADD DW 0 + 659 FIN + 660 + 661 +CAC5: 40 00 00 662 CMD0 HEX 400000 +CAC8: 00 00 95 663 HEX 000095 +CACB: 41 00 00 664 CMD1 HEX 410000 +CACE: 00 00 F9 665 HEX 0000F9 +CAD1: 48 00 00 666 CMD8 HEX 480000 +CAD4: 01 AA 87 667 HEX 01AA87 +CAD7: 50 00 00 668 CMD16 HEX 500000 +CADA: 02 00 FF 669 HEX 0200FF +CADD: 77 00 00 670 CMD55 HEX 770000 +CAE0: 00 00 65 671 HEX 000065 +CAE3: 69 40 00 672 ACMD4140 HEX 694000 +CAE6: 00 00 77 673 HEX 000077 +CAE9: 69 00 00 674 ACMD410 HEX 690000 +CAEC: 00 00 FF 675 HEX 0000FF + 676 + 677 + 678 ******************************** + 679 * + 680 * This region is mapped to + 681 * the $CsXX space. On the ROM + 682 * it must appear at address $700 + 683 * + 684 ******************************** + 685 + 686 DO DEBUG-1 +CAEF: 00 00 00 687 DS \ +CAF2: 00 00 00 00 +CAF6: 00 00 00 00 +CAFA: 00 00 00 00 +CAFE: 00 00 +CB00: 00 00 00 688 DS $400 +CB03: 00 00 00 00 +CB07: 00 00 00 00 +CB0B: 00 00 00 00 +CB0F: 00 00 00 00 +CB13: 00 00 00 00 +CB17: 00 00 00 00 +CB1B: 00 00 00 00 +CB1F: 00 00 00 00 +CB23: 00 00 00 00 +CB27: 00 00 00 00 +CB2B: 00 00 00 00 +CB2F: 00 00 00 00 +CB33: 00 00 00 00 +CB37: 00 00 00 00 +CB3B: 00 00 00 00 +CB3F: 00 00 00 00 +CB43: 00 00 00 00 +CB47: 00 00 00 00 +CB4B: 00 00 00 00 +CB4F: 00 00 00 00 +CB53: 00 00 00 00 +CB57: 00 00 00 00 +CB5B: 00 00 00 00 +CB5F: 00 00 00 00 +CB63: 00 00 00 00 +CB67: 00 00 00 00 +CB6B: 00 00 00 00 +CB6F: 00 00 00 00 +CB73: 00 00 00 00 +CB77: 00 00 00 00 +CB7B: 00 00 00 00 +CB7F: 00 00 00 00 +CB83: 00 00 00 00 +CB87: 00 00 00 00 +CB8B: 00 00 00 00 +CB8F: 00 00 00 00 +CB93: 00 00 00 00 +CB97: 00 00 00 00 +CB9B: 00 00 00 00 +CB9F: 00 00 00 00 +CBA3: 00 00 00 00 +CBA7: 00 00 00 00 +CBAB: 00 00 00 00 +CBAF: 00 00 00 00 +CBB3: 00 00 00 00 +CBB7: 00 00 00 00 +CBBB: 00 00 00 00 +CBBF: 00 00 00 00 +CBC3: 00 00 00 00 +CBC7: 00 00 00 00 +CBCB: 00 00 00 00 +CBCF: 00 00 00 00 +CBD3: 00 00 00 00 +CBD7: 00 00 00 00 +CBDB: 00 00 00 00 +CBDF: 00 00 00 00 +CBE3: 00 00 00 00 +CBE7: 00 00 00 00 +CBEB: 00 00 00 00 +CBEF: 00 00 00 00 +CBF3: 00 00 00 00 +CBF7: 00 00 00 00 +CBFB: 00 00 00 00 +CBFF: 00 00 00 00 +CC03: 00 00 00 00 +CC07: 00 00 00 00 +CC0B: 00 00 00 00 +CC0F: 00 00 00 00 +CC13: 00 00 00 00 +CC17: 00 00 00 00 +CC1B: 00 00 00 00 +CC1F: 00 00 00 00 +CC23: 00 00 00 00 +CC27: 00 00 00 00 +CC2B: 00 00 00 00 +CC2F: 00 00 00 00 +CC33: 00 00 00 00 +CC37: 00 00 00 00 +CC3B: 00 00 00 00 +CC3F: 00 00 00 00 +CC43: 00 00 00 00 +CC47: 00 00 00 00 +CC4B: 00 00 00 00 +CC4F: 00 00 00 00 +CC53: 00 00 00 00 +CC57: 00 00 00 00 +CC5B: 00 00 00 00 +CC5F: 00 00 00 00 +CC63: 00 00 00 00 +CC67: 00 00 00 00 +CC6B: 00 00 00 00 +CC6F: 00 00 00 00 +CC73: 00 00 00 00 +CC77: 00 00 00 00 +CC7B: 00 00 00 00 +CC7F: 00 00 00 00 +CC83: 00 00 00 00 +CC87: 00 00 00 00 +CC8B: 00 00 00 00 +CC8F: 00 00 00 00 +CC93: 00 00 00 00 +CC97: 00 00 00 00 +CC9B: 00 00 00 00 +CC9F: 00 00 00 00 +CCA3: 00 00 00 00 +CCA7: 00 00 00 00 +CCAB: 00 00 00 00 +CCAF: 00 00 00 00 +CCB3: 00 00 00 00 +CCB7: 00 00 00 00 +CCBB: 00 00 00 00 +CCBF: 00 00 00 00 +CCC3: 00 00 00 00 +CCC7: 00 00 00 00 +CCCB: 00 00 00 00 +CCCF: 00 00 00 00 +CCD3: 00 00 00 00 +CCD7: 00 00 00 00 +CCDB: 00 00 00 00 +CCDF: 00 00 00 00 +CCE3: 00 00 00 00 +CCE7: 00 00 00 00 +CCEB: 00 00 00 00 +CCEF: 00 00 00 00 +CCF3: 00 00 00 00 +CCF7: 00 00 00 00 +CCFB: 00 00 00 00 +CCFF: 00 00 00 00 +CD03: 00 00 00 00 +CD07: 00 00 00 00 +CD0B: 00 00 00 00 +CD0F: 00 00 00 00 +CD13: 00 00 00 00 +CD17: 00 00 00 00 +CD1B: 00 00 00 00 +CD1F: 00 00 00 00 +CD23: 00 00 00 00 +CD27: 00 00 00 00 +CD2B: 00 00 00 00 +CD2F: 00 00 00 00 +CD33: 00 00 00 00 +CD37: 00 00 00 00 +CD3B: 00 00 00 00 +CD3F: 00 00 00 00 +CD43: 00 00 00 00 +CD47: 00 00 00 00 +CD4B: 00 00 00 00 +CD4F: 00 00 00 00 +CD53: 00 00 00 00 +CD57: 00 00 00 00 +CD5B: 00 00 00 00 +CD5F: 00 00 00 00 +CD63: 00 00 00 00 +CD67: 00 00 00 00 +CD6B: 00 00 00 00 +CD6F: 00 00 00 00 +CD73: 00 00 00 00 +CD77: 00 00 00 00 +CD7B: 00 00 00 00 +CD7F: 00 00 00 00 +CD83: 00 00 00 00 +CD87: 00 00 00 00 +CD8B: 00 00 00 00 +CD8F: 00 00 00 00 +CD93: 00 00 00 00 +CD97: 00 00 00 00 +CD9B: 00 00 00 00 +CD9F: 00 00 00 00 +CDA3: 00 00 00 00 +CDA7: 00 00 00 00 +CDAB: 00 00 00 00 +CDAF: 00 00 00 00 +CDB3: 00 00 00 00 +CDB7: 00 00 00 00 +CDBB: 00 00 00 00 +CDBF: 00 00 00 00 +CDC3: 00 00 00 00 +CDC7: 00 00 00 00 +CDCB: 00 00 00 00 +CDCF: 00 00 00 00 +CDD3: 00 00 00 00 +CDD7: 00 00 00 00 +CDDB: 00 00 00 00 +CDDF: 00 00 00 00 +CDE3: 00 00 00 00 +CDE7: 00 00 00 00 +CDEB: 00 00 00 00 +CDEF: 00 00 00 00 +CDF3: 00 00 00 00 +CDF7: 00 00 00 00 +CDFB: 00 00 00 00 +CDFF: 00 00 00 00 +CE03: 00 00 00 00 +CE07: 00 00 00 00 +CE0B: 00 00 00 00 +CE0F: 00 00 00 00 +CE13: 00 00 00 00 +CE17: 00 00 00 00 +CE1B: 00 00 00 00 +CE1F: 00 00 00 00 +CE23: 00 00 00 00 +CE27: 00 00 00 00 +CE2B: 00 00 00 00 +CE2F: 00 00 00 00 +CE33: 00 00 00 00 +CE37: 00 00 00 00 +CE3B: 00 00 00 00 +CE3F: 00 00 00 00 +CE43: 00 00 00 00 +CE47: 00 00 00 00 +CE4B: 00 00 00 00 +CE4F: 00 00 00 00 +CE53: 00 00 00 00 +CE57: 00 00 00 00 +CE5B: 00 00 00 00 +CE5F: 00 00 00 00 +CE63: 00 00 00 00 +CE67: 00 00 00 00 +CE6B: 00 00 00 00 +CE6F: 00 00 00 00 +CE73: 00 00 00 00 +CE77: 00 00 00 00 +CE7B: 00 00 00 00 +CE7F: 00 00 00 00 +CE83: 00 00 00 00 +CE87: 00 00 00 00 +CE8B: 00 00 00 00 +CE8F: 00 00 00 00 +CE93: 00 00 00 00 +CE97: 00 00 00 00 +CE9B: 00 00 00 00 +CE9F: 00 00 00 00 +CEA3: 00 00 00 00 +CEA7: 00 00 00 00 +CEAB: 00 00 00 00 +CEAF: 00 00 00 00 +CEB3: 00 00 00 00 +CEB7: 00 00 00 00 +CEBB: 00 00 00 00 +CEBF: 00 00 00 00 +CEC3: 00 00 00 00 +CEC7: 00 00 00 00 +CECB: 00 00 00 00 +CECF: 00 00 00 00 +CED3: 00 00 00 00 +CED7: 00 00 00 00 +CEDB: 00 00 00 00 +CEDF: 00 00 00 00 +CEE3: 00 00 00 00 +CEE7: 00 00 00 00 +CEEB: 00 00 00 00 +CEEF: 00 00 00 00 +CEF3: 00 00 00 00 +CEF7: 00 00 00 00 +CEFB: 00 00 00 00 +CEFF: 00 + 689 ERR *-1/$CF00 ; must be at $CF00 + 690 FIN 691 -CB50: 20 BA CA 692 JSR WRPROT -CB53: B0 67 693 BCS :WPERROR ; card write protected - 694 -CB55: 20 51 CA 695 JSR GETBLOCK ; calc block address - 696 -CB58: BD 83 C0 697 LDA SS,X ; enable /CS -CB5B: 29 FE 698 AND #$FF!SS0 -CB5D: 9D 83 C0 699 STA SS,X -CB60: A9 58 700 LDA #$58 ; send CMD24 -CB62: 20 86 CA 701 JSR COMMAND ; send command - 702 -CB65: C9 00 703 CMP #0 ; check for error -CB67: D0 4E 704 BNE :IOERROR - 705 -CB69: A9 FF 706 LDA #DUMMY -CB6B: 9D 80 C0 707 STA DATA,X ; send dummy -CB6E: A9 FE 708 LDA #$FE -CB70: 9D 80 C0 709 STA DATA,X ; send data token - 710 -CB73: A0 02 711 LDY #2 ; send data to card -CB75: 64 3C 712 :LOOPY STZ WORK -CB77: B2 44 713 :LOOPW LDA (BUFFER) -CB79: 9D 80 C0 714 STA DATA,X -CB7C: E6 44 715 INC BUFFER -CB7E: D0 02 716 BNE :INW -CB80: E6 45 717 INC BUFFER+1 ; inc msb on page boundary -CB82: E6 3C 718 :INW INC WORK -CB84: D0 F1 719 BNE :LOOPW -CB86: 88 720 DEY -CB87: D0 EC 721 BNE :LOOPY - 722 -CB89: 9D 80 C0 723 :CRC STA DATA,X ; send 2 dummy crc bytes -CB8C: 9D 80 C0 724 STA DATA,X - 725 -CB8F: 9D 80 C0 726 STA DATA,X ; get data response -CB92: BD 80 C0 727 LDA DATA,X -CB95: 29 1F 728 AND #$1F -CB97: C9 05 729 CMP #$05 -CB99: D0 1C 730 BNE :IOERROR ; check for write error -CB9B: 18 731 CLC ; no error -CB9C: A9 00 732 LDA #0 - 733 -CB9E: 08 734 :DONE PHP -CB9F: 48 735 PHA -CBA0: A9 FF 736 :WAIT LDA #DUMMY -CBA2: 9D 80 C0 737 STA DATA,X ; wait for write cycle -CBA5: BD 80 C0 738 LDA DATA,X ; to complete -CBA8: C9 00 739 CMP #$00 -CBAA: F0 F4 740 BEQ :WAIT + 692 * signature bytes + 693 +CF00: A2 20 694 START LDX #$20 +CF02: A0 00 695 LDY #$00 +CF04: A2 03 696 LDX #$03 +CF06: A0 FF 697 LDY #$FF ; neither 5.25 nor Smartport + 698 + 699 * find slot nr + 700 + 701 DO DEBUG + 702 LDA #$04 + 703 STA SLOT + 704 LDA #$C4 + 705 STA CURSLOT + 706 LDA #$40 + 707 + 708 ELSE +CF08: 20 58 FF 709 JSR $FF58 +CF0B: BA 710 TSX +CF0C: BD 00 01 711 LDA $0100,X +CF0F: 8D F8 07 712 STA CURSLOT ; $Cs +CF12: 29 0F 713 AND #$0F +CF14: 85 3D 714 STA SLOT ; $0s +CF16: 0A 715 ASL A +CF17: 0A 716 ASL A +CF18: 0A 717 ASL A +CF19: 0A 718 ASL A + 719 FIN + 720 +CF1A: 85 2B 721 STA SLOT16 ; $s0 +CF1C: AA 722 TAX ; X holds now SLOT16 +CF1D: 2C FF CF 723 BIT $CFFF +CF20: 20 AE C9 724 JSR CARDDET +CF23: 90 03 725 BCC :INIT +CF25: A9 27 726 LDA #$27 ; no card inserted +CF27: 00 727 BRK + 728 +CF28: 20 00 C8 729 :INIT JSR INIT + 730 + 731 + 732 ******************************** + 733 * + 734 * Install SD card driver + 735 * + 736 ******************************** + 737 + 738 DO DEBUG + 739 + 740 * see if slot has a driver already 741 -CBAC: BD 83 C0 742 LDA SS,X ; disable /CS -CBAF: 09 01 743 ORA #SS0 -CBB1: 9D 83 C0 744 STA SS,X -CBB4: 68 745 PLA -CBB5: 28 746 PLP -CBB6: 60 747 RTS - 748 -CBB7: 38 749 :IOERROR SEC ; an error occured -CBB8: A9 27 750 LDA #$27 -CBBA: 80 E2 751 BRA :DONE - 752 -CBBC: 38 753 :WPERROR SEC -CBBD: A9 2B 754 LDA #$2B -CBBF: 80 DD 755 BRA :DONE - 756 - 757 + 742 LDX $BF31 ; get devcnt + 743 INSTALL LDA $BF32,X ; get a devnum + 744 AND #$70 ; isolate slot + 745 CMP SLOT16 ; slot? + 746 BEQ :INSOUT ; yes, skip it + 747 DEX + 748 BPL INSTALL ; keep up the search + 749 + 750 * restore the devnum to the list + 751 + 752 LDX $BF31 ; get devcnt again + 753 CPX #$0D ; device table full? + 754 BNE :INST2 + 755 + 756 JSR $FF3A ; bell + 757 JMP :INSOUT ; do something! 758 - 759 ******************************** - 760 * - 761 * Format - 762 * not supported! - 763 * - 764 ******************************** - 765 -CBC1: 38 766 FORMAT SEC -CBC2: A9 01 767 LDA #$01 ; invalid command -CBC4: 60 768 RTS + 759 :INST2 LDA $BF32-1,X ; move all entries down + 760 STA $BF32,X ; to make room at front + 761 DEX ; for a new entry + 762 BNE :INST2 + 763 LDA #$04 ; ProFile type device + 764 ORA SLOT16 + 765 STA $BF32 ; slot, drive 1 at top of list + 766 INC $BF31 ; update devcnt + 767 + 768 * now insert the device driver vector 769 - 770 - 771 ******************************** - 772 * - 773 * Test routine - 774 * - 775 ******************************** - 776 - 777 DO DEBUG - 778 TEST + 770 LDA SLOT + 771 ASL + 772 TAX + 773 LDA #DRIVER + 776 STA $BF11,X + 777 :INSOUT RTS + 778 779 - 780 * get buffer - 781 LDA #2 ; get 512 byte buffer - 782 JSR $BEF5 ; call GETBUFR - 783 BCS :ERROR - 784 STA BUFADD+1 - 785 STA BUFFER+1 - 786 STZ BUFADD - 787 STZ BUFFER - 788 - 789 * fill buffer - 790 LDY #0 - 791 :LOOP TYA - 792 STA (BUFFER),Y - 793 INY - 794 BNE :LOOP - 795 INC BUFFER+1 - 796 :LOOP1 TYA - 797 STA (BUFFER),Y - 798 INY - 799 BNE :LOOP1 - 800 - 801 * write to card - 802 LDA #2 ; write cmd - 803 STA DCMD - 804 LDA BUFADD ; buffer address - 805 STA BUFFER - 806 LDA BUFADD+1 - 807 STA BUFFER+1 - 808 STZ BLOCK ; block number - 809 STZ BLOCK+1 - 810 LDX SLOT16 - 811 JSR DRIVER - 812 BCS :ERROR + 780 ******************************** + 781 * + 782 * Boot from SD card + 783 * + 784 ******************************** + 785 + 786 ELSE + 787 +CF2B: C9 00 788 BOOT CMP #0 ; check for error +CF2D: F0 01 789 BEQ :BOOT1 +CF2F: 00 790 BRK + 791 +CF30: A9 01 792 :BOOT1 LDA #$01 +CF32: 85 42 793 STA DCMD ; load command +CF34: A6 2B 794 LDX SLOT16 +CF36: 85 43 795 STA $43 ; slot number +CF38: 64 44 796 STZ BUFFER ; buffer lo +CF3A: A9 08 797 LDA #$08 +CF3C: 85 45 798 STA BUFFER+1 ; buffer hi +CF3E: 64 46 799 STZ BLOCK ; block lo +CF40: 64 47 800 STZ BLOCK+1 ; block hi +CF42: 2C FF CF 801 BIT $CFFF +CF45: 20 DD C9 802 JSR READ ; call driver +CF48: 4C 01 08 803 JMP $801 ; goto bootloader + 804 + 805 FIN + 806 + 807 + 808 ******************************** + 809 * + 810 * Jump table + 811 * + 812 ******************************** 813 - 814 * read from card - 815 LDA #1 ; read cmd - 816 STA DCMD - 817 LDA BUFADD ; buffer address - 818 STA BUFFER - 819 LDA BUFADD+1 - 820 STA BUFFER+1 - 821 STZ BLOCK ; block number - 822 STZ BLOCK+1 - 823 LDX SLOT16 - 824 JSR DRIVER - 825 BCS :ERROR - 826 - 827 * check for errors - 828 LDA BUFADD ; buffer address - 829 STA BUFFER - 830 LDA BUFADD+1 - 831 STA BUFFER+1 - 832 LDY #0 - 833 :LOOP2 TYA - 834 CMP (BUFFER),Y - 835 BNE :ERRCMP ; error in buffer - 836 INY - 837 BNE :LOOP2 - 838 INC BUFFER+1 - 839 :LOOP3 TYA - 840 CMP (BUFFER),Y - 841 BNE :ERRCMP - 842 INY - 843 BNE :LOOP3 - 844 - 845 * free buffer - 846 JSR $BEF8 ; call FREEBUFR - 847 CLC - 848 LDA #0 - 849 RTS - 850 - 851 :ERROR BRK - 852 :ERRCMP BRK - 853 - 854 BUFADD DW 0 - 855 FIN - 856 - 857 -CBC5: 40 00 00 858 CMD0 HEX 400000 -CBC8: 00 00 95 859 HEX 000095 -CBCB: 41 00 00 860 CMD1 HEX 410000 -CBCE: 00 00 F9 861 HEX 0000F9 -CBD1: 48 00 00 862 CMD8 HEX 480000 -CBD4: 01 AA 87 863 HEX 01AA87 -CBD7: 50 00 00 864 CMD16 HEX 500000 -CBDA: 02 00 FF 865 HEX 0200FF -CBDD: 77 00 00 866 CMD55 HEX 770000 -CBE0: 00 00 65 867 HEX 000065 -CBE3: 69 40 00 868 ACMD4140 HEX 694000 -CBE6: 00 00 77 869 HEX 000077 -CBE9: 69 00 00 870 ACMD410 HEX 690000 -CBEC: 00 00 FF 871 HEX 0000FF +CF4B: D8 814 DRIVER CLD + 815 + 816 DO DEBUG + 817 LDA #$04 + 818 STA SLOT + 819 LDA #$C4 + 820 STA CURSLOT + 821 LDA #$40 + 822 + 823 ELSE +CF4C: 20 58 FF 824 JSR $FF58 ; find slot nr +CF4F: BA 825 TSX +CF50: BD 00 01 826 LDA $0100,X +CF53: 8D F8 07 827 STA CURSLOT ; $Cs +CF56: 29 0F 828 AND #$0F +CF58: 85 3D 829 STA SLOT ; $0s +CF5A: 0A 830 ASL A +CF5B: 0A 831 ASL A +CF5C: 0A 832 ASL A +CF5D: 0A 833 ASL A + 834 FIN + 835 +CF5E: 85 2B 836 STA SLOT16 ; $s0 +CF60: AA 837 TAX ; X holds now SLOT16 +CF61: 2C FF CF 838 BIT $CFFF +CF64: 20 AE C9 839 JSR CARDDET +CF67: 90 04 840 BCC :INITED +CF69: A9 27 841 LDA #$27 ; no card inserted +CF6B: 80 1B 842 BRA :DONE + 843 +CF6D: A9 80 844 :INITED LDA #INITED ; check for init +CF6F: 3C 83 C0 845 BIT SS,X +CF72: F0 22 846 BEQ :INIT + 847 +CF74: A5 42 848 :CMD LDA DCMD ; get command +CF76: C9 00 849 CMP #0 +CF78: F0 10 850 BEQ :STATUS +CF7A: C9 01 851 CMP #1 +CF7C: F0 0F 852 BEQ :READ +CF7E: C9 02 853 CMP #2 +CF80: F0 0E 854 BEQ :WRITE +CF82: C9 03 855 CMP #3 +CF84: F0 0D 856 BEQ :FORMAT + 857 DO DEBUG + 858 CMP #$FF + 859 BEQ :TEST + 860 FIN +CF86: A9 01 861 LDA #1 ; unknown command + 862 +CF88: 38 863 :DONE SEC +CF89: 60 864 RTS + 865 +CF8A: 4C C6 C9 866 :STATUS JMP STATUS +CF8D: 4C DD C9 867 :READ JMP READ +CF90: 4C 4B CA 868 :WRITE JMP WRITE +CF93: 4C C1 CA 869 :FORMAT JMP FORMAT +CF96: 20 00 C8 870 :INIT JSR INIT +CF99: B0 ED 871 BCS :DONE ; init failure +CF9B: 80 D7 872 BRA :CMD + 873 + 874 DO DEBUG + 875 :TEST JMP TEST ; do device test + 876 FIN + 877 + 878 + 879 * Signature bytes + 880 +CF9D: 00 00 00 881 DS \ ; fill with zeroes +CFA0: 00 00 00 00 +CFA4: 00 00 00 00 +CFA8: 00 00 00 00 +CFAC: 00 00 00 00 +CFB0: 00 00 00 00 +CFB4: 00 00 00 00 +CFB8: 00 00 00 00 +CFBC: 00 00 00 00 +CFC0: 00 00 00 00 +CFC4: 00 00 00 00 +CFC8: 00 00 00 00 +CFCC: 00 00 00 00 +CFD0: 00 00 00 00 +CFD4: 00 00 00 00 +CFD8: 00 00 00 00 +CFDC: 00 00 00 00 +CFE0: 00 00 00 00 +CFE4: 00 00 00 00 +CFE8: 00 00 00 00 +CFEC: 00 00 00 00 +CFF0: 00 00 00 00 +CFF4: 00 00 00 00 +CFF8: 00 00 00 00 +CFFC: 00 00 00 00 + 882 DS -4 ; locate to $xxFC +CFFC: FF FF 883 DW $FFFF ; 65535 blocks +CFFE: 17 884 DB $17 ; Status bits +CFFF: 4B 885 DB #DRIVER - STA $BF11,X -:INSOUT RTS - - -******************************** -* -* Boot from SD card -* -******************************** - - ELSE - -BOOT CMP #0 ; check for error - BEQ :BOOT1 - BRK - -:BOOT1 LDA #$01 - STA DCMD ; load command - LDX SLOT16 - STA $43 ; slot number - STZ BUFFER ; buffer lo - LDA #$08 - STA BUFFER+1 ; buffer hi - STZ BLOCK ; block lo - STZ BLOCK+1 ; block hi - BIT $CFFF - JSR READ ; call driver - JMP $801 ; goto bootloader - - FIN - - -******************************** -* -* Jump table -* -******************************** - -DRIVER CLD - - DO DEBUG - LDA #$04 - STA SLOT - LDA #$C4 - STA CURSLOT - LDA #$40 - - ELSE - JSR $FF58 ; find slot nr - TSX - LDA $0100,X - STA CURSLOT ; $Cs - AND #$0F - STA SLOT ; $0s - ASL A - ASL A - ASL A - ASL A - FIN - - STA SLOT16 ; $s0 - TAX ; X holds now SLOT16 - BIT $CFFF - JSR CARDDET - BCC :INITED - LDA #$27 ; no card inserted - BRA :DONE - -:INITED LDA #INITED ; check for init - BIT SS,X - BEQ :INIT - -:CMD LDA DCMD ; get command - CMP #0 - BEQ :STATUS - CMP #1 - BEQ :READ - CMP #2 - BEQ :WRITE - CMP #3 - BEQ :FORMAT - DO DEBUG - CMP #$FF - BEQ :TEST - FIN - LDA #1 ; unknown command - -:DONE SEC - RTS - -:STATUS JMP STATUS -:READ JMP READ -:WRITE JMP WRITE -:FORMAT JMP FORMAT -:INIT JSR INIT - BCS :DONE ; init failure - BRA :CMD - - DO DEBUG -:TEST JMP TEST ; do device test - FIN - - -* Signature bytes - - DS \ ; fill with zeroes - DS -4 ; locate to $xxFC - DW $FFFF ; 65535 blocks - DB $17 ; Status bits - DB #DRIVER + STA $BF11,X +:INSOUT RTS + + +******************************** +* +* Boot from SD card +* +******************************** + + ELSE + +BOOT CMP #0 ; check for error + BEQ :BOOT1 + BRK + +:BOOT1 LDA #$01 + STA DCMD ; load command + LDX SLOT16 + STA $43 ; slot number + STZ BUFFER ; buffer lo + LDA #$08 + STA BUFFER+1 ; buffer hi + STZ BLOCK ; block lo + STZ BLOCK+1 ; block hi + BIT $CFFF + JSR READ ; call driver + JMP $801 ; goto bootloader + + FIN + + +******************************** +* +* Jump table +* +******************************** + +DRIVER CLD + + DO DEBUG + LDA #$04 + STA SLOT + LDA #$C4 + STA CURSLOT + LDA #$40 + + ELSE + JSR $FF58 ; find slot nr + TSX + LDA $0100,X + STA CURSLOT ; $Cs + AND #$0F + STA SLOT ; $0s + ASL A + ASL A + ASL A + ASL A + FIN + + STA SLOT16 ; $s0 + TAX ; X holds now SLOT16 + BIT $CFFF + JSR CARDDET + BCC :INITED + LDA #$27 ; no card inserted + BRA :DONE + +:INITED LDA #INITED ; check for init + BIT SS,X + BEQ :INIT + +:CMD LDA DCMD ; get command + CMP #0 + BEQ :STATUS + CMP #1 + BEQ :READ + CMP #2 + BEQ :WRITE + CMP #3 + BEQ :FORMAT + DO DEBUG + CMP #$FF + BEQ :TEST + FIN + LDA #1 ; unknown command + +:DONE SEC + RTS + +:STATUS JMP STATUS +:READ JMP READ +:WRITE JMP WRITE +:FORMAT JMP FORMAT +:INIT JSR INIT + BCS :DONE ; init failure + BRA :CMD + + DO DEBUG +:TEST JMP TEST ; do device test + FIN + + +* Signature bytes + + DS \ ; fill with zeroes + DS -4 ; locate to $xxFC + DW $FFFF ; 65535 blocks + DB $17 ; Status bits + DB #