diff --git a/AppleIISd.bin b/AppleIISd.bin index 33a4b37..c24345f 100644 Binary files a/AppleIISd.bin and b/AppleIISd.bin differ diff --git a/AppleIISd.hex b/AppleIISd.hex index 1113526..99c386c 100644 --- a/AppleIISd.hex +++ b/AppleIISd.hex @@ -1,71 +1,68 @@ :10000000A220A000A203A0FF2058FFBABD00018DCE :10001000F807290F853D0A0A0A0A852BAA2CFFCF6B -:1000200020A9C99003A92F002000C8C900F0010031 -:10003000A9018542A62B85436444A90885456446E9 -:1000400064472CFFCF20CFC94C0108D82058FFBAF5 -:10005000BD00018DF807290F853D0A0A0A0A852B84 -:10006000AA2CFFCF20A9C99004A92F801FA9803CEA -:1000700083C0F029A542C900F014C901F013C902D8 -:10008000F012C903F011C9FFF010A90138604CC18A -:10009000C94CCFC94C38CA4CA9CA4CADCA2000C8FB -:1000A000B0EA80D000000000000000000000000066 -:1000B0000000000000000000000000000000000040 -:1000C0000000000000000000000000000000000030 +:1000200020A7C99003A92F002000C8F00100A90152 +:100030008542A62B8543A9088545644464476446E8 +:100040002CFFCF20CDC94C0108D848A52B48A53D91 +:1000500048A54048A541482058FFBABD00018DF889 +:1000600007290F853D0A0A0A0A852BAA2CFFCF20F3 +:10007000A7C99005A92F388040A9803C83C0F034DF +:10008000A542C900F015C901F016C902F017C9034D +:10009000F018C9FFF019A90138801E20BFC98019C6 +:1000A00020CDC980142034CA800F20A3CA800A2022 +:1000B000A7CA80052000C890C7BA9D050168854180 +:1000C00068854068853D68852B68600000000000F9 :1000D0000000000000000000000000000000000020 :1000E0000000000000000000000000000000000010 -:1000F000000000000000000000000000FFFF174BA0 +:1000F000000000000000000000000000FFFF1749A2 :10010000D8A9039D81C0BD83C009019D83C0A907F3 :100110009D82C0A00AA9FF9D80C03C81C010FB88C1 -:10012000D0F5BD83C029FE9D83C0A9318540A9CBF0 -:10013000854120EBC820FFC8C901D039A93D8540C1 -:10014000A9CB854120EBC8201AC9C901D02AA949E9 -:100150008540A9CB854120EBC820FFC8A94F854029 +:10012000D0F5BD83C029FE9D83C0A9FF8540A9CA23 +:10013000854120EBC820FFC8C901D039A90B8540F3 +:10014000A9CB854120EBC82018C9C901D02AA9171D +:100150008540A9CB854120EBC820FFC8A91D85405B :10016000A9CB854120EBC820FFC8C901F0E0C90038 -:10017000D0034CB2C84CD9C8A9498540A9CB854108 -:1001800020EBC8A9558540A9CB854120EBC820FFAD -:10019000C8C901F0E3C900D0034CB2C8A9378540F3 +:10017000D0034CB2C84CD9C8A9178540A9CB85413A +:1001800020EBC8A9238540A9CB854120EBC820FFDF +:10019000C8C901F0E3C900D0034CB2C8A905854025 :1001A000A9CB854120EBC820FFC8C901F0F6C900E2 -:1001B000D027A9438540A9CB854120EBC820FFC8A3 +:1001B000D027A9118540A9CB854120EBC820FFC8D5 :1001C000C900D015BD83C009809D83C0BD81C00911 :1001D000049D81C018A000900338A027BD83C009EA :1001E000019D83C0A9009D82C098605AA000B140C3 :1001F0009D80C03C81C010FBC8C00690F17A60A908 -:10020000FF9D80C03C81C010FBBD80C0853C298023 -:10021000D0EDA9FF9D80C0A53C6020FFC8485AA032 -:1002200004A9FF9D80C03C81C010FBBD80C04888F0 -:10023000D0EFA43D6899F805689978056899F804A5 -:10024000689978047AA9FF9D80C06860DA5AA63D53 -:10025000A5469DF805A5479D7805A9009DF8049D34 -:100260007804A9802443F005A9019DF804A0091E83 -:10027000F8053E78053EF8043E780488D0F17AFA15 -:10028000605AA43D9D80C0B978049D80C0B9F8042F -:100290009D80C0B978059D80C0B9F8059D80C0A932 -:1002A000FF9D80C020FFC87A6048A9403C83C018E9 -:1002B000F00138686048A9203C83C018F001386814 -:1002C00060A900A2FFA0FF20B5C99002A92B602061 -:1002D0004CC9BD83C029FE9D83C0A9512081C9C9D5 -:1002E00000D050A9FF9D80C0BD80C0C9FED0F4A041 -:1002F00002BD81C009109D81C0A9FF9D80C0643CE2 -:10030000BD80C09244E644D002E645E63CD0F18888 -:10031000D0ECBD80C0BD80C0BD80C0BD81C029EF14 -:100320009D81C018A9000848BD83C009019D83C0F4 -:1003300068286038A92780EE20B5C9B067204CC96D -:10034000BD83C029FE9D83C0A9582081C9C900D0A2 -:100350004EA9FF9D80C0A9FE9D80C0A002643CB252 -:10036000449D80C0E644D002E645E63CD0F188D00A -:10037000EC9D80C09D80C09D80C0BD80C0291FC9EC -:1003800005D01C18A9000848A9FF9D80C0BD80C0E9 -:10039000C900F0F4BD83C009019D83C0682860389E -:1003A000A92780E238A92B80DD38A90160A43DA9E6 -:1003B0000220F5BEB07999F8068545A9009978061E -:1003C0008544A000989144C8D0FAE645989144C865 -:1003D000D0FAA902A43D8542AD78068544B9F80655 -:1003E000854564466447A62B204BC7B042A901A4AB -:1003F0003D8542B978068544B9F80685456446646A -:1004000047A62B204BC7B027A43DB978068544B931 -:10041000F8068545A00098D144D015C8D0F8E64527 -:1004200098D144D00BC8D0F820F8BE18A9006000BD -:10043000004000000000954100000000F948000065 -:1004400001AA875000000200FF77000000006569E4 -:0B04500040000000776900000000FF82 +:10020000FF9D80C03C81C010FBBD80C08980D0EFC5 +:1002100048A9FF9D80C0686020FFC8485AA004A973 +:10022000FF9D80C03C81C010FBBD80C04888D0EFDE +:10023000A43D6899F805689978056899F804689963 +:1002400078047AA9FF9D80C06860DA5AA63DA54669 +:100250009DF805A5479D7805A9009DF8049D7804A3 +:10026000A9802443F005A9019DF804A0091EF80502 +:100270003E78053EF8043E780488D0F17AFA605A58 +:10028000A43D9D80C0B978049D80C0B9F8049D80CC +:10029000C0B978059D80C0B9F8059D80C0A9FF9DB3 +:1002A00080C020FFC87A6048A9403C83C018F00194 +:1002B00038686048A9203C83C018F001386860A9FC +:1002C00000A2FFA0FF20B3C99002A92B60204AC959 +:1002D000BD83C029FE9D83C0A951207FC9D050A9EC +:1002E000FF9D80C0BD80C0C9FED0F4BD81C0091093 +:1002F0009D81C0A9FF9D80C0A000BD80C09144C861 +:10030000D0F8E645BD80C09144C8D0F8C645BD8050 +:10031000C0BD80C0BD80C0BD81C029EF9D81C01817 +:10032000A9000848BD83C009019D83C068286038C2 +:10033000A92780EE20B3C9B065204AC9BD83C02972 +:10034000FE9D83C0A958207FC9D04EA9FF9D80C0C3 +:10035000A9FE9D80C0A000B1449D80C0C8D0F8E631 +:1003600045B1449D80C0C8D0F8C645A9FF9D80C056 +:100370009D80C09D80C0BD80C0291FC905D01A18AE +:10038000A9000848A9FF9D80C0BD80C0F0F6BD83CC +:10039000C009019D83C068286038A92780E438A976 +:1003A0002B80DF38A90160A52B48A53D48A9022074 +:1003B000F5BEB0498545644468853D68852BA0003D +:1003C000989144C8D0FAE645989144C8D0FAC645F9 +:1003D00064466447A62B2034CAB02220CDC9B01D84 +:1003E000A00098D144D017C8D0F8E64598D144D0A1 +:1003F0000DC8D0F8C64520F8BE18A900600000401E +:1004000000000000954100000000F948000001AA2A +:10041000875000000200FF7700000000656940007F +:090420000000776900000000FFF4 :00000001FF diff --git a/AppleIISd.lst b/AppleIISd.lst index 8f6b4eb..64acff8 100644 --- a/AppleIISd.lst +++ b/AppleIISd.lst @@ -1,7 +1,7 @@ 1 ******************************** 2 * 3 * Apple][Sd Firmware - 4 * Version 0.7 + 4 * Version 0.8 5 * 6 * (c) Florian Reitz, 2017 7 * @@ -10,7 +10,7 @@ 10 * 11 ******************************** 12 - 22-OCT-17 20:21 + 1-NOV-17 16:06 14 15 XC ; enable 65C02 code 16 DEBUG = 0 @@ -23,892 +23,905 @@ 23 * Memory defines 24 25 SLOT16 = $2B ; $s0 -> slot * 16 - 26 WORK = $3C - 27 SLOT = $3D ; $0s - 28 CMDLO = $40 - 29 CMDHI = $41 - 30 - 31 DCMD = $42 ; Command code - 32 BUFFER = $44 ; Buffer address - 33 BLOCK = $46 ; Block number - 34 - 35 CURSLOT = $07F8 ; $Cs - 36 DATA = $C080 - 37 CTRL = DATA+1 - 38 DIV = DATA+2 - 39 SS = DATA+3 - 40 R30 = $0478 - 41 R31 = $04F8 - 42 R32 = $0578 - 43 R33 = $05F8 - 44 RAM0 = $0678 - 45 RAM1 = $06F8 - 46 - 47 * Constants - 48 - 49 DUMMY = $FF - 50 FRX = $10 ; CTRL register - 51 ECE = $04 - 52 SS0 = $01 ; SS register - 53 WP = $20 - 54 CD = $40 - 55 INITED = $80 + 26 SLOT = $3D ; $0s + 27 CMDLO = $40 + 28 CMDHI = $41 + 29 + 30 DCMD = $42 ; Command code + 31 BUFFER = $44 ; Buffer address + 32 BLOCK = $46 ; Block number + 33 + 34 CURSLOT = $07F8 ; $Cs + 35 DATA = $C080 + 36 CTRL = DATA+1 + 37 DIV = DATA+2 + 38 SS = DATA+3 + 39 R30 = $0478 + 40 R31 = $04F8 + 41 R32 = $0578 + 42 R33 = $05F8 + 43 + 44 * Constants + 45 + 46 DUMMY = $FF + 47 FRX = $10 ; CTRL register + 48 ECE = $04 + 49 SS0 = $01 ; SS register + 50 WP = $20 + 51 CD = $40 + 52 INITED = $80 + 53 + 54 + 55 * signature bytes 56 - 57 - 58 * signature bytes - 59 -C700: A2 20 60 LDX #$20 -C702: A0 00 61 LDY #$00 -C704: A2 03 62 LDX #$03 -C706: A0 FF 63 LDY #$FF ; neither 5.25 nor Smartport - 64 - 65 * find slot nr - 66 - 67 DO DEBUG - 68 LDA #$04 - 69 STA SLOT - 70 LDA #$C4 - 71 STA CURSLOT - 72 LDA #$40 - 73 - 74 ELSE -C708: 20 58 FF 75 JSR $FF58 -C70B: BA 76 TSX -C70C: BD 00 01 77 LDA $0100,X -C70F: 8D F8 07 78 STA CURSLOT ; $Cs -C712: 29 0F 79 AND #$0F -C714: 85 3D 80 STA SLOT ; $0s -C716: 0A 81 ASL A -C717: 0A 82 ASL A -C718: 0A 83 ASL A -C719: 0A 84 ASL A - 85 FIN - 86 -C71A: 85 2B 87 STA SLOT16 ; $s0 -C71C: AA 88 TAX ; X holds now SLOT16 -C71D: 2C FF CF 89 BIT $CFFF -C720: 20 A9 C9 90 JSR CARDDET -C723: 90 03 91 BCC :INIT -C725: A9 2F 92 LDA #$2F ; no card inserted -C727: 00 93 BRK +C700: A2 20 57 LDX #$20 +C702: A0 00 58 LDY #$00 +C704: A2 03 59 LDX #$03 +C706: A0 FF 60 LDY #$FF ; neither 5.25 nor Smartport + 61 + 62 * find slot nr + 63 + 64 DO DEBUG + 65 LDA #$04 + 66 STA SLOT + 67 LDA #$C4 + 68 STA CURSLOT + 69 LDA #$40 + 70 + 71 ELSE +C708: 20 58 FF 72 JSR $FF58 +C70B: BA 73 TSX +C70C: BD 00 01 74 LDA $0100,X +C70F: 8D F8 07 75 STA CURSLOT ; $Cs +C712: 29 0F 76 AND #$0F +C714: 85 3D 77 STA SLOT ; $0s +C716: 0A 78 ASL A +C717: 0A 79 ASL A +C718: 0A 80 ASL A +C719: 0A 81 ASL A + 82 FIN + 83 +C71A: 85 2B 84 STA SLOT16 ; $s0 +C71C: AA 85 TAX ; X holds now SLOT16 +C71D: 2C FF CF 86 BIT $CFFF +C720: 20 A7 C9 87 JSR CARDDET +C723: 90 03 88 BCC :INIT +C725: A9 2F 89 LDA #$2F ; no card inserted +C727: 00 90 BRK + 91 +C728: 20 00 C8 92 :INIT JSR INIT + 93 94 -C728: 20 00 C8 95 :INIT JSR INIT - 96 - 97 - 98 ******************************** - 99 * - 100 * Install SD card driver - 101 * - 102 ******************************** - 103 - 104 DO DEBUG - 105 - 106 * see if slot has a driver already - 107 - 108 LDX $BF31 ; get devcnt - 109 INSTALL LDA $BF32,X ; get a devnum - 110 AND #$70 ; isolate slot - 111 CMP SLOT16 ; slot? - 112 BEQ :INSOUT ; yes, skip it - 113 DEX - 114 BPL INSTALL ; keep up the search - 115 - 116 * restore the devnum to the list - 117 - 118 LDX $BF31 ; get devcnt again - 119 CPX #$0D ; device table full? - 120 BNE :INST2 + 95 ******************************** + 96 * + 97 * Install SD card driver + 98 * + 99 ******************************** + 100 + 101 DO DEBUG + 102 + 103 * see if slot has a driver already + 104 + 105 LDX $BF31 ; get devcnt + 106 INSTALL LDA $BF32,X ; get a devnum + 107 AND #$70 ; isolate slot + 108 CMP SLOT16 ; slot? + 109 BEQ :INSOUT ; yes, skip it + 110 DEX + 111 BPL INSTALL ; keep up the search + 112 + 113 * restore the devnum to the list + 114 + 115 LDX $BF31 ; get devcnt again + 116 CPX #$0D ; device table full? + 117 BNE :INST2 + 118 + 119 JSR $FF3A ; bell + 120 JMP :INSOUT ; do something! 121 - 122 JSR $FF3A ; bell - 123 JMP :INSOUT ; do something! - 124 - 125 :INST2 LDA $BF32-1,X ; move all entries down - 126 STA $BF32,X ; to make room at front - 127 DEX ; for a new entry - 128 BNE :INST2 - 129 LDA #$04 ; ProFile type device - 130 ORA SLOT16 - 131 STA $BF32 ; slot, drive 1 at top of list - 132 INC $BF31 ; update devcnt - 133 - 134 * now insert the device driver vector - 135 - 136 LDA SLOT - 137 ASL - 138 TAX - 139 LDA #DRIVER - 142 STA $BF11,X - 143 :INSOUT RTS - 144 - 145 - 146 ******************************** - 147 * - 148 * Boot from SD card - 149 * - 150 ******************************** - 151 - 152 ELSE + 122 :INST2 LDA $BF32-1,X ; move all entries down + 123 STA $BF32,X ; to make room at front + 124 DEX ; for a new entry + 125 BNE :INST2 + 126 LDA #$04 ; ProFile type device + 127 ORA SLOT16 + 128 STA $BF32 ; slot, drive 1 at top of list + 129 INC $BF31 ; update devcnt + 130 + 131 * now insert the device driver vector + 132 + 133 LDA SLOT + 134 ASL + 135 TAX + 136 LDA #DRIVER + 139 STA $BF11,X + 140 :INSOUT RTS + 141 + 142 + 143 ******************************** + 144 * + 145 * Boot from SD card + 146 * + 147 ******************************** + 148 + 149 ELSE + 150 +C72B: F0 01 151 BOOT BEQ :BOOT1 ; check for error +C72D: 00 152 BRK 153 -C72B: C9 00 154 BOOT CMP #0 ; check for error -C72D: F0 01 155 BEQ :BOOT1 -C72F: 00 156 BRK - 157 -C730: A9 01 158 :BOOT1 LDA #$01 -C732: 85 42 159 STA DCMD ; load command -C734: A6 2B 160 LDX SLOT16 -C736: 85 43 161 STA $43 ; slot number -C738: 64 44 162 STZ BUFFER ; buffer lo -C73A: A9 08 163 LDA #$08 -C73C: 85 45 164 STA BUFFER+1 ; buffer hi -C73E: 64 46 165 STZ BLOCK ; block lo -C740: 64 47 166 STZ BLOCK+1 ; block hi -C742: 2C FF CF 167 BIT $CFFF -C745: 20 CF C9 168 JSR READ ; call driver -C748: 4C 01 08 169 JMP $801 ; goto bootloader - 170 - 171 FIN - 172 - 173 +C72E: A9 01 154 :BOOT1 LDA #$01 +C730: 85 42 155 STA DCMD ; load command +C732: A6 2B 156 LDX SLOT16 +C734: 85 43 157 STA $43 ; slot number +C736: A9 08 158 LDA #$08 +C738: 85 45 159 STA BUFFER+1 ; buffer hi +C73A: 64 44 160 STZ BUFFER ; buffer lo +C73C: 64 47 161 STZ BLOCK+1 ; block hi +C73E: 64 46 162 STZ BLOCK ; block lo +C740: 2C FF CF 163 BIT $CFFF +C743: 20 CD C9 164 JSR READ ; call driver +C746: 4C 01 08 165 JMP $801 ; goto bootloader + 166 + 167 FIN + 168 + 169 + 170 ******************************** + 171 * + 172 * Jump table + 173 * 174 ******************************** - 175 * - 176 * Jump table - 177 * - 178 ******************************** - 179 -C74B: D8 180 DRIVER CLD - 181 - 182 DO DEBUG - 183 LDA #$04 - 184 STA SLOT - 185 LDA #$C4 - 186 STA CURSLOT - 187 LDA #$40 - 188 - 189 ELSE -C74C: 20 58 FF 190 JSR $FF58 ; find slot nr -C74F: BA 191 TSX -C750: BD 00 01 192 LDA $0100,X -C753: 8D F8 07 193 STA CURSLOT ; $Cs -C756: 29 0F 194 AND #$0F -C758: 85 3D 195 STA SLOT ; $0s -C75A: 0A 196 ASL A -C75B: 0A 197 ASL A -C75C: 0A 198 ASL A -C75D: 0A 199 ASL A - 200 FIN - 201 -C75E: 85 2B 202 STA SLOT16 ; $s0 -C760: AA 203 TAX ; X holds now SLOT16 -C761: 2C FF CF 204 BIT $CFFF -C764: 20 A9 C9 205 JSR CARDDET -C767: 90 04 206 BCC :INITED -C769: A9 2F 207 LDA #$2F ; no card inserted -C76B: 80 1F 208 BRA :DONE - 209 -C76D: A9 80 210 :INITED LDA #INITED ; check for init -C76F: 3C 83 C0 211 BIT SS,X -C772: F0 29 212 BEQ :INIT - 213 -C774: A5 42 214 :CMD LDA DCMD ; get command -C776: C9 00 215 CMP #0 -C778: F0 14 216 BEQ :STATUS -C77A: C9 01 217 CMP #1 -C77C: F0 13 218 BEQ :READ -C77E: C9 02 219 CMP #2 -C780: F0 12 220 BEQ :WRITE -C782: C9 03 221 CMP #3 -C784: F0 11 222 BEQ :FORMAT -C786: C9 FF 223 CMP #$FF -C788: F0 10 224 BEQ :TEST -C78A: A9 01 225 LDA #1 ; unknown command - 226 -C78C: 38 227 :DONE SEC -C78D: 60 228 RTS - 229 -C78E: 4C C1 C9 230 :STATUS JMP STATUS -C791: 4C CF C9 231 :READ JMP READ -C794: 4C 38 CA 232 :WRITE JMP WRITE -C797: 4C A9 CA 233 :FORMAT JMP FORMAT -C79A: 4C AD CA 234 :TEST JMP TEST ; do device test -C79D: 20 00 C8 235 :INIT JSR INIT -C7A0: B0 EA 236 BCS :DONE ; init failure -C7A2: 80 D0 237 BRA :CMD - 238 - 239 - 240 * Signature bytes - 241 -C7A4: 00 00 00 242 DS \ ; fill with zeroes -C7A7: 00 00 00 00 -C7AB: 00 00 00 00 -C7AF: 00 00 00 00 -C7B3: 00 00 00 00 -C7B7: 00 00 00 00 -C7BB: 00 00 00 00 -C7BF: 00 00 00 00 -C7C3: 00 00 00 00 -C7C7: 00 00 00 00 -C7CB: 00 00 00 00 -C7CF: 00 00 00 00 -C7D3: 00 00 00 00 -C7D7: 00 00 00 00 -C7DB: 00 00 00 00 -C7DF: 00 00 00 00 -C7E3: 00 00 00 00 -C7E7: 00 00 00 00 -C7EB: 00 00 00 00 -C7EF: 00 00 00 00 -C7F3: 00 00 00 00 -C7F7: 00 00 00 00 -C7FB: 00 00 00 00 -C7FF: 00 - 243 DS -4 ; locate to $xxFC -C7FC: FF FF 244 DW $FFFF ; 65535 blocks -C7FE: 17 245 DB $17 ; Status bits -C7FF: 4B 246 DB #CMD0 -C830: 85 41 283 STA CMDHI -C832: 20 EB C8 284 JSR CMD -C835: 20 FF C8 285 JSR GETR1 ; get response -C838: C9 01 286 CMP #$01 -C83A: D0 39 287 BNE :ERROR1 ; error! - 288 -C83C: A9 3D 289 LDA #CMD8 -C842: 85 41 292 STA CMDHI -C844: 20 EB C8 293 JSR CMD -C847: 20 1A C9 294 JSR GETR3 -C84A: C9 01 295 CMP #$01 -C84C: D0 2A 296 BNE :SDV1 ; may be SD Ver. 1 - 297 - 298 * check for $01aa match! -C84E: A9 49 299 :SDV2 LDA #CMD55 -C854: 85 41 302 STA CMDHI -C856: 20 EB C8 303 JSR CMD -C859: 20 FF C8 304 JSR GETR1 -C85C: A9 4F 305 LDA #ACMD4140 -C862: 85 41 308 STA CMDHI -C864: 20 EB C8 309 JSR CMD -C867: 20 FF C8 310 JSR GETR1 -C86A: C9 01 311 CMP #$01 -C86C: F0 E0 312 BEQ :SDV2 ; wait for ready -C86E: C9 00 313 CMP #$00 -C870: D0 03 314 BNE :ERROR1 ; error! - 315 * send CMD58 - 316 * SD Ver. 2 initialized! -C872: 4C B2 C8 317 JMP :BLOCKSZ - 318 -C875: 4C D9 C8 319 :ERROR1 JMP :IOERROR ; needed for far jump + 271 ******************************** + 272 * + 273 * Initialize SD card + 274 * + 275 * C Clear - No error + 276 * Set - Error + 277 * A $00 - No error + 278 * $27 - I/O error - Init failed + 279 * $2F - No card inserted + 280 * + 281 ******************************** + 282 +C800: D8 283 INIT CLD +C801: A9 03 284 LDA #$03 ; set SPI mode 3 +C803: 9D 81 C0 285 STA CTRL,X +C806: BD 83 C0 286 LDA SS,X +C809: 09 01 287 ORA #SS0 ; set CS high +C80B: 9D 83 C0 288 STA SS,X +C80E: A9 07 289 LDA #7 +C810: 9D 82 C0 290 STA DIV,X +C813: A0 0A 291 LDY #10 +C815: A9 FF 292 LDA #DUMMY + 293 +C817: 9D 80 C0 294 :LOOP STA DATA,X +C81A: 3C 81 C0 295 :WAIT BIT CTRL,X +C81D: 10 FB 296 BPL :WAIT +C81F: 88 297 DEY +C820: D0 F5 298 BNE :LOOP ; do 10 times +C822: BD 83 C0 299 LDA SS,X +C825: 29 FE 300 AND #$FF!SS0 ; set CS low +C827: 9D 83 C0 301 STA SS,X + 302 +C82A: A9 FF 303 LDA #CMD0 +C830: 85 41 306 STA CMDHI +C832: 20 EB C8 307 JSR SDCMD +C835: 20 FF C8 308 JSR GETR1 ; get response +C838: C9 01 309 CMP #$01 +C83A: D0 39 310 BNE :ERROR1 ; error! + 311 +C83C: A9 0B 312 LDA #CMD8 +C842: 85 41 315 STA CMDHI +C844: 20 EB C8 316 JSR SDCMD +C847: 20 18 C9 317 JSR GETR3 +C84A: C9 01 318 CMP #$01 +C84C: D0 2A 319 BNE :SDV1 ; may be SD Ver. 1 320 -C878: A9 49 321 :SDV1 LDA #CMD55 -C87E: 85 41 324 STA CMDHI -C880: 20 EB C8 325 JSR CMD ; ignore response -C883: A9 55 326 LDA #ACMD410 -C889: 85 41 329 STA CMDHI -C88B: 20 EB C8 330 JSR CMD -C88E: 20 FF C8 331 JSR GETR1 -C891: C9 01 332 CMP #$01 -C893: F0 E3 333 BEQ :SDV1 ; wait for ready -C895: C9 00 334 CMP #$00 -C897: D0 03 335 BNE :MMC ; may be MMC card - 336 * SD Ver. 1 initialized! -C899: 4C B2 C8 337 JMP :BLOCKSZ - 338 -C89C: A9 37 339 :MMC LDA #CMD1 -C8A2: 85 41 342 STA CMDHI -C8A4: 20 EB C8 343 :LOOP1 JSR CMD -C8A7: 20 FF C8 344 JSR GETR1 -C8AA: C9 01 345 CMP #$01 -C8AC: F0 F6 346 BEQ :LOOP1 ; wait for ready -C8AE: C9 00 347 CMP #$00 -C8B0: D0 27 348 BNE :IOERROR ; error! - 349 * MMC Ver. 3 initialized! - 350 -C8B2: A9 43 351 :BLOCKSZ LDA #CMD16 -C8B8: 85 41 354 STA CMDHI -C8BA: 20 EB C8 355 JSR CMD -C8BD: 20 FF C8 356 JSR GETR1 -C8C0: C9 00 357 CMP #$00 -C8C2: D0 15 358 BNE :IOERROR ; error! - 359 -C8C4: BD 83 C0 360 :END LDA SS,X -C8C7: 09 80 361 ORA #INITED ; initialized -C8C9: 9D 83 C0 362 STA SS,X -C8CC: BD 81 C0 363 LDA CTRL,X -C8CF: 09 04 364 ORA #ECE ; enable 7MHz -C8D1: 9D 81 C0 365 STA CTRL,X -C8D4: 18 366 CLC ; all ok -C8D5: A0 00 367 LDY #0 -C8D7: 90 03 368 BCC :END1 -C8D9: 38 369 :IOERROR SEC -C8DA: A0 27 370 LDY #$27 ; init error -C8DC: BD 83 C0 371 :END1 LDA SS,X ; set CS high -C8DF: 09 01 372 ORA #SS0 -C8E1: 9D 83 C0 373 STA SS,X -C8E4: A9 00 374 LDA #0 ; set div to 2 -C8E6: 9D 82 C0 375 STA DIV,X -C8E9: 98 376 TYA ; retval in A -C8EA: 60 377 RTS - 378 - 379 - 380 ******************************** - 381 * - 382 * Send SD command - 383 * Call with command in CMDHI and CMDLO - 384 * - 385 ******************************** - 386 -C8EB: 5A 387 CMD PHY -C8EC: A0 00 388 LDY #0 -C8EE: B1 40 389 :LOOP LDA (CMDLO),Y -C8F0: 9D 80 C0 390 STA DATA,X -C8F3: 3C 81 C0 391 :WAIT BIT CTRL,X ; TC is in N -C8F6: 10 FB 392 BPL :WAIT -C8F8: C8 393 INY -C8F9: C0 06 394 CPY #6 -C8FB: 90 F1 395 BCC :LOOP -C8FD: 7A 396 PLY -C8FE: 60 397 RTS - 398 - 399 - 400 ******************************** - 401 * - 402 * Get R1 - 403 * R1 is in A + 321 * check for $01aa match! +C84E: A9 17 322 :SDV2 LDA #CMD55 +C854: 85 41 325 STA CMDHI +C856: 20 EB C8 326 JSR SDCMD +C859: 20 FF C8 327 JSR GETR1 +C85C: A9 1D 328 LDA #ACMD4140 +C862: 85 41 331 STA CMDHI +C864: 20 EB C8 332 JSR SDCMD +C867: 20 FF C8 333 JSR GETR1 +C86A: C9 01 334 CMP #$01 +C86C: F0 E0 335 BEQ :SDV2 ; wait for ready +C86E: C9 00 336 CMP #0 +C870: D0 03 337 BNE :ERROR1 ; error! + 338 * send CMD58 + 339 * SD Ver. 2 initialized! +C872: 4C B2 C8 340 JMP :BLOCKSZ + 341 +C875: 4C D9 C8 342 :ERROR1 JMP :IOERROR ; needed for far jump + 343 +C878: A9 17 344 :SDV1 LDA #CMD55 +C87E: 85 41 347 STA CMDHI +C880: 20 EB C8 348 JSR SDCMD ; ignore response +C883: A9 23 349 LDA #ACMD410 +C889: 85 41 352 STA CMDHI +C88B: 20 EB C8 353 JSR SDCMD +C88E: 20 FF C8 354 JSR GETR1 +C891: C9 01 355 CMP #$01 +C893: F0 E3 356 BEQ :SDV1 ; wait for ready +C895: C9 00 357 CMP #0 +C897: D0 03 358 BNE :MMC ; may be MMC card + 359 * SD Ver. 1 initialized! +C899: 4C B2 C8 360 JMP :BLOCKSZ + 361 +C89C: A9 05 362 :MMC LDA #CMD1 +C8A2: 85 41 365 STA CMDHI +C8A4: 20 EB C8 366 :LOOP1 JSR SDCMD +C8A7: 20 FF C8 367 JSR GETR1 +C8AA: C9 01 368 CMP #$01 +C8AC: F0 F6 369 BEQ :LOOP1 ; wait for ready +C8AE: C9 00 370 CMP #0 +C8B0: D0 27 371 BNE :IOERROR ; error! + 372 * MMC Ver. 3 initialized! + 373 +C8B2: A9 11 374 :BLOCKSZ LDA #CMD16 +C8B8: 85 41 377 STA CMDHI +C8BA: 20 EB C8 378 JSR SDCMD +C8BD: 20 FF C8 379 JSR GETR1 +C8C0: C9 00 380 CMP #0 +C8C2: D0 15 381 BNE :IOERROR ; error! + 382 +C8C4: BD 83 C0 383 :END LDA SS,X +C8C7: 09 80 384 ORA #INITED ; initialized +C8C9: 9D 83 C0 385 STA SS,X +C8CC: BD 81 C0 386 LDA CTRL,X +C8CF: 09 04 387 ORA #ECE ; enable 7MHz +C8D1: 9D 81 C0 388 STA CTRL,X +C8D4: 18 389 CLC ; all ok +C8D5: A0 00 390 LDY #0 +C8D7: 90 03 391 BCC :END1 +C8D9: 38 392 :IOERROR SEC +C8DA: A0 27 393 LDY #$27 ; init error +C8DC: BD 83 C0 394 :END1 LDA SS,X ; set CS high +C8DF: 09 01 395 ORA #SS0 +C8E1: 9D 83 C0 396 STA SS,X +C8E4: A9 00 397 LDA #0 ; set div to 2 +C8E6: 9D 82 C0 398 STA DIV,X +C8E9: 98 399 TYA ; retval in A +C8EA: 60 400 RTS + 401 + 402 + 403 ******************************** 404 * - 405 ******************************** - 406 -C8FF: A9 FF 407 GETR1 LDA #DUMMY -C901: 9D 80 C0 408 STA DATA,X -C904: 3C 81 C0 409 :WAIT BIT CTRL,X -C907: 10 FB 410 BPL :WAIT -C909: BD 80 C0 411 LDA DATA,X ; get response -C90C: 85 3C 412 STA WORK ; save R1 -C90E: 29 80 413 AND #$80 -C910: D0 ED 414 BNE GETR1 ; wait for MSB=0 -C912: A9 FF 415 LDA #DUMMY -C914: 9D 80 C0 416 STA DATA,X ; send another dummy -C917: A5 3C 417 LDA WORK ; restore R1 -C919: 60 418 RTS - 419 - 420 - 421 ******************************** - 422 * - 423 * Get R3 - 424 * R1 is in A - 425 * R3 is in scratchpad ram - 426 * - 427 ******************************** - 428 -C91A: 20 FF C8 429 GETR3 JSR GETR1 ; get R1 first -C91D: 48 430 PHA ; save R1 -C91E: 5A 431 PHY ; save Y -C91F: A0 04 432 LDY #04 ; load counter -C921: A9 FF 433 :LOOP LDA #DUMMY ; send dummy -C923: 9D 80 C0 434 STA DATA,X -C926: 3C 81 C0 435 :WAIT BIT CTRL,X -C929: 10 FB 436 BPL :WAIT -C92B: BD 80 C0 437 LDA DATA,X -C92E: 48 438 PHA -C92F: 88 439 DEY -C930: D0 EF 440 BNE :LOOP ; do 4 times -C932: A4 3D 441 LDY SLOT -C934: 68 442 PLA -C935: 99 F8 05 443 STA R33,Y ; save R3 -C938: 68 444 PLA -C939: 99 78 05 445 STA R32,Y -C93C: 68 446 PLA -C93D: 99 F8 04 447 STA R31,Y -C940: 68 448 PLA -C941: 99 78 04 449 STA R30,Y -C944: 7A 450 PLY ; restore Y -C945: A9 FF 451 LDA #DUMMY -C947: 9D 80 C0 452 STA DATA,X ; send another dummy -C94A: 68 453 PLA ; restore R1 -C94B: 60 454 RTS - 455 - 456 - 457 ******************************** - 458 * - 459 * Calculate block address - 460 * Unit number is in $43 DSSS0000 - 461 * Block no is in $46-47 - 462 * Address is in R30-R33 - 463 * - 464 ******************************** - 465 -C94C: DA 466 GETBLOCK PHX ; save X -C94D: 5A 467 PHY ; save Y -C94E: A6 3D 468 LDX SLOT -C950: A5 46 469 LDA BLOCK ; store block num -C952: 9D F8 05 470 STA R33,X ; in R30-R33 -C955: A5 47 471 LDA BLOCK+1 -C957: 9D 78 05 472 STA R32,X -C95A: A9 00 473 LDA #0 -C95C: 9D F8 04 474 STA R31,X -C95F: 9D 78 04 475 STA R30,X - 476 -C962: A9 80 477 LDA #$80 ; drive number -C964: 24 43 478 BIT $43 -C966: F0 05 479 BEQ :SHIFT ; D1 -C968: A9 01 480 LDA #1 ; D2 -C96A: 9D F8 04 481 STA R31,X - 482 -C96D: A0 09 483 :SHIFT LDY #9 ; ASL can't be used with Y -C96F: 1E F8 05 484 :LOOP ASL R33,X ; mul block num -C972: 3E 78 05 485 ROL R32,X ; by 512 to get -C975: 3E F8 04 486 ROL R31,X ; real address -C978: 3E 78 04 487 ROL R30,X -C97B: 88 488 DEY -C97C: D0 F1 489 BNE :LOOP -C97E: 7A 490 PLY ; restore Y -C97F: FA 491 PLX ; restore X -C980: 60 492 RTS - 493 - 494 - 495 ******************************** - 496 * - 497 * Send SD command - 498 * Cmd is in A - 499 * - 500 ******************************** - 501 -C981: 5A 502 COMMAND PHY ; save Y -C982: A4 3D 503 LDY SLOT -C984: 9D 80 C0 504 STA DATA,X ; send command -C987: B9 78 04 505 LDA R30,Y ; get arg from R30 on -C98A: 9D 80 C0 506 STA DATA,X -C98D: B9 F8 04 507 LDA R31,Y -C990: 9D 80 C0 508 STA DATA,X -C993: B9 78 05 509 LDA R32,Y -C996: 9D 80 C0 510 STA DATA,X -C999: B9 F8 05 511 LDA R33,Y -C99C: 9D 80 C0 512 STA DATA,X -C99F: A9 FF 513 LDA #DUMMY -C9A1: 9D 80 C0 514 STA DATA,X ; dummy crc -C9A4: 20 FF C8 515 JSR GETR1 -C9A7: 7A 516 PLY ; restore Y -C9A8: 60 517 RTS - 518 - 519 - 520 ******************************** + 405 * Send SD command + 406 * Call with command in CMDHI and CMDLO + 407 * + 408 ******************************** + 409 +C8EB: 5A 410 SDCMD PHY +C8EC: A0 00 411 LDY #0 +C8EE: B1 40 412 :LOOP LDA (CMDLO),Y +C8F0: 9D 80 C0 413 STA DATA,X +C8F3: 3C 81 C0 414 :WAIT BIT CTRL,X ; TC is in N +C8F6: 10 FB 415 BPL :WAIT +C8F8: C8 416 INY +C8F9: C0 06 417 CPY #6 +C8FB: 90 F1 418 BCC :LOOP +C8FD: 7A 419 PLY +C8FE: 60 420 RTS + 421 + 422 + 423 ******************************** + 424 * + 425 * Get R1 + 426 * R1 is in A + 427 * + 428 ******************************** + 429 +C8FF: A9 FF 430 GETR1 LDA #DUMMY +C901: 9D 80 C0 431 STA DATA,X +C904: 3C 81 C0 432 :WAIT BIT CTRL,X +C907: 10 FB 433 BPL :WAIT +C909: BD 80 C0 434 LDA DATA,X ; get response +C90C: 89 80 435 BIT #$80 +C90E: D0 EF 436 BNE GETR1 ; wait for MSB=0 +C910: 48 437 PHA +C911: A9 FF 438 LDA #DUMMY +C913: 9D 80 C0 439 STA DATA,X ; send another dummy +C916: 68 440 PLA ; restore R1 +C917: 60 441 RTS + 442 + 443 ******************************** + 444 * + 445 * Get R3 + 446 * R1 is in A + 447 * R3 is in scratchpad ram + 448 * + 449 ******************************** + 450 +C918: 20 FF C8 451 GETR3 JSR GETR1 ; get R1 first +C91B: 48 452 PHA ; save R1 +C91C: 5A 453 PHY ; save Y +C91D: A0 04 454 LDY #04 ; load counter +C91F: A9 FF 455 :LOOP LDA #DUMMY ; send dummy +C921: 9D 80 C0 456 STA DATA,X +C924: 3C 81 C0 457 :WAIT BIT CTRL,X +C927: 10 FB 458 BPL :WAIT +C929: BD 80 C0 459 LDA DATA,X +C92C: 48 460 PHA +C92D: 88 461 DEY +C92E: D0 EF 462 BNE :LOOP ; do 4 times +C930: A4 3D 463 LDY SLOT +C932: 68 464 PLA +C933: 99 F8 05 465 STA R33,Y ; save R3 +C936: 68 466 PLA +C937: 99 78 05 467 STA R32,Y +C93A: 68 468 PLA +C93B: 99 F8 04 469 STA R31,Y +C93E: 68 470 PLA +C93F: 99 78 04 471 STA R30,Y +C942: 7A 472 PLY ; restore Y +C943: A9 FF 473 LDA #DUMMY +C945: 9D 80 C0 474 STA DATA,X ; send another dummy +C948: 68 475 PLA ; restore R1 +C949: 60 476 RTS + 477 + 478 + 479 ******************************** + 480 * + 481 * Calculate block address + 482 * Unit number is in $43 DSSS0000 + 483 * Block no is in $46-47 + 484 * Address is in R30-R33 + 485 * + 486 ******************************** + 487 +C94A: DA 488 GETBLOCK PHX ; save X +C94B: 5A 489 PHY ; save Y +C94C: A6 3D 490 LDX SLOT +C94E: A5 46 491 LDA BLOCK ; store block num +C950: 9D F8 05 492 STA R33,X ; in R30-R33 +C953: A5 47 493 LDA BLOCK+1 +C955: 9D 78 05 494 STA R32,X +C958: A9 00 495 LDA #0 +C95A: 9D F8 04 496 STA R31,X +C95D: 9D 78 04 497 STA R30,X + 498 +C960: A9 80 499 LDA #$80 ; drive number +C962: 24 43 500 BIT $43 +C964: F0 05 501 BEQ :SHIFT ; D1 +C966: A9 01 502 LDA #1 ; D2 +C968: 9D F8 04 503 STA R31,X + 504 +C96B: A0 09 505 :SHIFT LDY #9 ; ASL can't be used with Y +C96D: 1E F8 05 506 :LOOP ASL R33,X ; mul block num +C970: 3E 78 05 507 ROL R32,X ; by 512 to get +C973: 3E F8 04 508 ROL R31,X ; real address +C976: 3E 78 04 509 ROL R30,X +C979: 88 510 DEY +C97A: D0 F1 511 BNE :LOOP +C97C: 7A 512 PLY ; restore Y +C97D: FA 513 PLX ; restore X +C97E: 60 514 RTS + 515 + 516 + 517 ******************************** + 518 * + 519 * Send SD command + 520 * Cmd is in A 521 * - 522 * Check for card detect - 523 * - 524 * C Clear - card in slot - 525 * Set - no card in slot - 526 * - 527 ******************************** - 528 -C9A9: 48 529 CARDDET PHA -C9AA: A9 40 530 LDA #CD ; 0: card in -C9AC: 3C 83 C0 531 BIT SS,X ; 1: card out -C9AF: 18 532 CLC -C9B0: F0 01 533 BEQ :DONE ; card is in -C9B2: 38 534 SEC ; card is out -C9B3: 68 535 :DONE PLA -C9B4: 60 536 RTS - 537 - 538 - 539 ******************************** - 540 * - 541 * Check for write protect - 542 * - 543 * C Clear - card not protected - 544 * Set - card write protected + 522 ******************************** + 523 +C97F: 5A 524 COMMAND PHY ; save Y +C980: A4 3D 525 LDY SLOT +C982: 9D 80 C0 526 STA DATA,X ; send command +C985: B9 78 04 527 LDA R30,Y ; get arg from R30 on +C988: 9D 80 C0 528 STA DATA,X +C98B: B9 F8 04 529 LDA R31,Y +C98E: 9D 80 C0 530 STA DATA,X +C991: B9 78 05 531 LDA R32,Y +C994: 9D 80 C0 532 STA DATA,X +C997: B9 F8 05 533 LDA R33,Y +C99A: 9D 80 C0 534 STA DATA,X +C99D: A9 FF 535 LDA #DUMMY +C99F: 9D 80 C0 536 STA DATA,X ; dummy crc +C9A2: 20 FF C8 537 JSR GETR1 +C9A5: 7A 538 PLY ; restore Y +C9A6: 60 539 RTS + 540 + 541 + 542 ******************************** + 543 * + 544 * Check for card detect 545 * - 546 ******************************** - 547 -C9B5: 48 548 WRPROT PHA -C9B6: A9 20 549 LDA #WP ; 0: write enabled -C9B8: 3C 83 C0 550 BIT SS,X ; 1: write disabled -C9BB: 18 551 CLC -C9BC: F0 01 552 BEQ :DONE -C9BE: 38 553 SEC -C9BF: 68 554 :DONE PLA -C9C0: 60 555 RTS - 556 - 557 - 558 ******************************** - 559 * - 560 * Status request - 561 * $43 Unit number DSSS000 - 562 * $44-45 Unused - 563 * $46-47 Unused + 546 * C Clear - card in slot + 547 * Set - no card in slot + 548 * + 549 ******************************** + 550 +C9A7: 48 551 CARDDET PHA +C9A8: A9 40 552 LDA #CD ; 0: card in +C9AA: 3C 83 C0 553 BIT SS,X ; 1: card out +C9AD: 18 554 CLC +C9AE: F0 01 555 BEQ :DONE ; card is in +C9B0: 38 556 SEC ; card is out +C9B1: 68 557 :DONE PLA +C9B2: 60 558 RTS + 559 + 560 + 561 ******************************** + 562 * + 563 * Check for write protect 564 * - 565 * C Clear - No error - 566 * Set - Error - 567 * A $00 - No error - 568 * $2B - Card write protected - 569 * $2F - No card inserted - 570 * X - Blocks avail (low byte) - 571 * Y - Blocks avail (high byte) - 572 * - 573 ******************************** - 574 -C9C1: A9 00 575 STATUS LDA #0 ; no error -C9C3: A2 FF 576 LDX #$FF ; 32 MB partition -C9C5: A0 FF 577 LDY #$FF + 565 * C Clear - card not protected + 566 * Set - card write protected + 567 * + 568 ******************************** + 569 +C9B3: 48 570 WRPROT PHA +C9B4: A9 20 571 LDA #WP ; 0: write enabled +C9B6: 3C 83 C0 572 BIT SS,X ; 1: write disabled +C9B9: 18 573 CLC +C9BA: F0 01 574 BEQ :DONE +C9BC: 38 575 SEC +C9BD: 68 576 :DONE PLA +C9BE: 60 577 RTS 578 -C9C7: 20 B5 C9 579 JSR WRPROT -C9CA: 90 02 580 BCC :DONE -C9CC: A9 2B 581 LDA #$2B ; card write protected - 582 -C9CE: 60 583 :DONE RTS - 584 - 585 - 586 ******************************** - 587 * - 588 * Read 512 byte block - 589 * $43 Unit number DSSS0000 - 590 * $44-45 Address (LO/HI) of buffer - 591 * $46-47 Block number (LO/HI) - 592 * - 593 * C Clear - No error - 594 * Set - Error - 595 * A $00 - No error - 596 * $27 - Bad block number - 597 * - 598 ******************************** - 599 -C9CF: 20 4C C9 600 READ JSR GETBLOCK ; calc block address - 601 -C9D2: BD 83 C0 602 LDA SS,X ; enable /CS -C9D5: 29 FE 603 AND #$FF!SS0 -C9D7: 9D 83 C0 604 STA SS,X -C9DA: A9 51 605 LDA #$51 ; send CMD17 -C9DC: 20 81 C9 606 JSR COMMAND ; send command + 579 + 580 ******************************** + 581 * + 582 * Status request + 583 * $43 Unit number DSSS000 + 584 * $44-45 Unused + 585 * $46-47 Unused + 586 * + 587 * C Clear - No error + 588 * Set - Error + 589 * A $00 - No error + 590 * $2B - Card write protected + 591 * $2F - No card inserted + 592 * X - Blocks avail (low byte) + 593 * Y - Blocks avail (high byte) + 594 * + 595 ******************************** + 596 +C9BF: A9 00 597 STATUS LDA #0 ; no error +C9C1: A2 FF 598 LDX #$FF ; 32 MB partition +C9C3: A0 FF 599 LDY #$FF + 600 +C9C5: 20 B3 C9 601 JSR WRPROT +C9C8: 90 02 602 BCC :DONE +C9CA: A9 2B 603 LDA #$2B ; card write protected + 604 +C9CC: 60 605 :DONE RTS + 606 607 -C9DF: C9 00 608 CMP #0 ; check for error -C9E1: D0 50 609 BNE :ERROR - 610 -C9E3: A9 FF 611 :GETTOK LDA #DUMMY ; get data token -C9E5: 9D 80 C0 612 STA DATA,X -C9E8: BD 80 C0 613 LDA DATA,X ; get response -C9EB: C9 FE 614 CMP #$FE -C9ED: D0 F4 615 BNE :GETTOK ; wait for $FE - 616 -C9EF: A0 02 617 LDY #2 ; read data from card -C9F1: BD 81 C0 618 LDA CTRL,X ; enable FRX -C9F4: 09 10 619 ORA #FRX -C9F6: 9D 81 C0 620 STA CTRL,X -C9F9: A9 FF 621 LDA #DUMMY -C9FB: 9D 80 C0 622 STA DATA,X -C9FE: 64 3C 623 :LOOPY STZ WORK -CA00: BD 80 C0 624 :LOOPW LDA DATA,X -CA03: 92 44 625 STA (BUFFER) -CA05: E6 44 626 INC BUFFER -CA07: D0 02 627 BNE :INW -CA09: E6 45 628 INC BUFFER+1 ; inc msb on page boundary -CA0B: E6 3C 629 :INW INC WORK -CA0D: D0 F1 630 BNE :LOOPW -CA0F: 88 631 DEY -CA10: D0 EC 632 BNE :LOOPY - 633 -CA12: BD 80 C0 634 :CRC LDA DATA,X ; read two bytes crc -CA15: BD 80 C0 635 LDA DATA,X ; and ignore -CA18: BD 80 C0 636 LDA DATA,X ; read a dummy byte - 637 -CA1B: BD 81 C0 638 LDA CTRL,X ; disable FRX -CA1E: 29 EF 639 AND #$FF!FRX -CA20: 9D 81 C0 640 STA CTRL,X -CA23: 18 641 CLC ; no error -CA24: A9 00 642 LDA #0 - 643 -CA26: 08 644 :DONE PHP -CA27: 48 645 PHA -CA28: BD 83 C0 646 LDA SS,X -CA2B: 09 01 647 ORA #SS0 -CA2D: 9D 83 C0 648 STA SS,X ; disable /CS -CA30: 68 649 PLA -CA31: 28 650 PLP -CA32: 60 651 RTS - 652 -CA33: 38 653 :ERROR SEC ; an error occured -CA34: A9 27 654 LDA #$27 -CA36: 80 EE 655 BRA :DONE - 656 - 657 - 658 ******************************** - 659 * - 660 * Write 512 byte block - 661 * $43 Unit number DSSS0000 - 662 * $44-45 Address (LO/HI) of buffer - 663 * $46-47 Block number (LO/HI) - 664 * - 665 * C Clear - No error - 666 * Set - Error - 667 * A $00 - No error - 668 * $27 - I/O error or bad block number - 669 * $2B - Card write protected - 670 * - 671 ******************************** - 672 -CA38: 20 B5 C9 673 WRITE JSR WRPROT -CA3B: B0 67 674 BCS :WPERROR ; card write protected - 675 -CA3D: 20 4C C9 676 JSR GETBLOCK ; calc block address + 608 ******************************** + 609 * + 610 * Read 512 byte block + 611 * $43 Unit number DSSS0000 + 612 * $44-45 Address (LO/HI) of buffer + 613 * $46-47 Block number (LO/HI) + 614 * + 615 * C Clear - No error + 616 * Set - Error + 617 * A $00 - No error + 618 * $27 - Bad block number + 619 * + 620 ******************************** + 621 +C9CD: 20 4A C9 622 READ JSR GETBLOCK ; calc block address + 623 +C9D0: BD 83 C0 624 LDA SS,X ; enable /CS +C9D3: 29 FE 625 AND #$FF!SS0 +C9D5: 9D 83 C0 626 STA SS,X +C9D8: A9 51 627 LDA #$51 ; send CMD17 +C9DA: 20 7F C9 628 JSR COMMAND ; send command +C9DD: D0 50 629 BNE :ERROR ; check for error + 630 +C9DF: A9 FF 631 :GETTOK LDA #DUMMY ; get data token +C9E1: 9D 80 C0 632 STA DATA,X +C9E4: BD 80 C0 633 LDA DATA,X ; get response +C9E7: C9 FE 634 CMP #$FE +C9E9: D0 F4 635 BNE :GETTOK ; wait for $FE + 636 +C9EB: BD 81 C0 637 LDA CTRL,X ; enable FRX +C9EE: 09 10 638 ORA #FRX +C9F0: 9D 81 C0 639 STA CTRL,X +C9F3: A9 FF 640 LDA #DUMMY +C9F5: 9D 80 C0 641 STA DATA,X + 642 +C9F8: A0 00 643 LDY #0 +C9FA: BD 80 C0 644 :LOOP1 LDA DATA,X ; read data from card +C9FD: 91 44 645 STA (BUFFER),Y +C9FF: C8 646 INY +CA00: D0 F8 647 BNE :LOOP1 +CA02: E6 45 648 INC BUFFER+1 ; inc msb on page boundary +CA04: BD 80 C0 649 :LOOP2 LDA DATA,X +CA07: 91 44 650 STA (BUFFER),Y +CA09: C8 651 INY +CA0A: D0 F8 652 BNE :LOOP2 +CA0C: C6 45 653 DEC BUFFER+1 + 654 +CA0E: BD 80 C0 655 :CRC LDA DATA,X ; read two bytes crc +CA11: BD 80 C0 656 LDA DATA,X ; and ignore +CA14: BD 80 C0 657 LDA DATA,X ; read a dummy byte + 658 +CA17: BD 81 C0 659 LDA CTRL,X ; disable FRX +CA1A: 29 EF 660 AND #$FF!FRX +CA1C: 9D 81 C0 661 STA CTRL,X +CA1F: 18 662 CLC ; no error +CA20: A9 00 663 LDA #0 + 664 +CA22: 08 665 :DONE PHP +CA23: 48 666 PHA +CA24: BD 83 C0 667 LDA SS,X +CA27: 09 01 668 ORA #SS0 +CA29: 9D 83 C0 669 STA SS,X ; disable /CS +CA2C: 68 670 PLA +CA2D: 28 671 PLP +CA2E: 60 672 RTS + 673 +CA2F: 38 674 :ERROR SEC ; an error occured +CA30: A9 27 675 LDA #$27 +CA32: 80 EE 676 BRA :DONE 677 -CA40: BD 83 C0 678 LDA SS,X ; enable /CS -CA43: 29 FE 679 AND #$FF!SS0 -CA45: 9D 83 C0 680 STA SS,X -CA48: A9 58 681 LDA #$58 ; send CMD24 -CA4A: 20 81 C9 682 JSR COMMAND ; send command - 683 -CA4D: C9 00 684 CMP #0 ; check for error -CA4F: D0 4E 685 BNE :IOERROR - 686 -CA51: A9 FF 687 LDA #DUMMY -CA53: 9D 80 C0 688 STA DATA,X ; send dummy -CA56: A9 FE 689 LDA #$FE -CA58: 9D 80 C0 690 STA DATA,X ; send data token - 691 -CA5B: A0 02 692 LDY #2 ; send data to card -CA5D: 64 3C 693 :LOOPY STZ WORK -CA5F: B2 44 694 :LOOPW LDA (BUFFER) -CA61: 9D 80 C0 695 STA DATA,X -CA64: E6 44 696 INC BUFFER -CA66: D0 02 697 BNE :INW -CA68: E6 45 698 INC BUFFER+1 ; inc msb on page boundary -CA6A: E6 3C 699 :INW INC WORK -CA6C: D0 F1 700 BNE :LOOPW -CA6E: 88 701 DEY -CA6F: D0 EC 702 BNE :LOOPY - 703 -CA71: 9D 80 C0 704 :CRC STA DATA,X ; send 2 dummy crc bytes -CA74: 9D 80 C0 705 STA DATA,X - 706 -CA77: 9D 80 C0 707 STA DATA,X ; get data response -CA7A: BD 80 C0 708 LDA DATA,X -CA7D: 29 1F 709 AND #$1F -CA7F: C9 05 710 CMP #$05 -CA81: D0 1C 711 BNE :IOERROR ; check for write error -CA83: 18 712 CLC ; no error -CA84: A9 00 713 LDA #0 - 714 -CA86: 08 715 :DONE PHP -CA87: 48 716 PHA -CA88: A9 FF 717 :WAIT LDA #DUMMY -CA8A: 9D 80 C0 718 STA DATA,X ; wait for write cycle -CA8D: BD 80 C0 719 LDA DATA,X ; to complete -CA90: C9 00 720 CMP #$00 -CA92: F0 F4 721 BEQ :WAIT + 678 + 679 ******************************** + 680 * + 681 * Write 512 byte block + 682 * $43 Unit number DSSS0000 + 683 * $44-45 Address (LO/HI) of buffer + 684 * $46-47 Block number (LO/HI) + 685 * + 686 * C Clear - No error + 687 * Set - Error + 688 * A $00 - No error + 689 * $27 - I/O error or bad block number + 690 * $2B - Card write protected + 691 * + 692 ******************************** + 693 +CA34: 20 B3 C9 694 WRITE JSR WRPROT +CA37: B0 65 695 BCS :WPERROR ; card write protected + 696 +CA39: 20 4A C9 697 JSR GETBLOCK ; calc block address + 698 +CA3C: BD 83 C0 699 LDA SS,X ; enable /CS +CA3F: 29 FE 700 AND #$FF!SS0 +CA41: 9D 83 C0 701 STA SS,X +CA44: A9 58 702 LDA #$58 ; send CMD24 +CA46: 20 7F C9 703 JSR COMMAND ; send command +CA49: D0 4E 704 BNE :IOERROR ; check for error + 705 +CA4B: A9 FF 706 LDA #DUMMY +CA4D: 9D 80 C0 707 STA DATA,X ; send dummy +CA50: A9 FE 708 LDA #$FE +CA52: 9D 80 C0 709 STA DATA,X ; send data token + 710 +CA55: A0 00 711 LDY #0 +CA57: B1 44 712 :LOOP1 LDA (BUFFER),Y +CA59: 9D 80 C0 713 STA DATA,X : send data to card +CA5C: C8 714 INY +CA5D: D0 F8 715 BNE :LOOP1 +CA5F: E6 45 716 INC BUFFER+1 : inc msb on page boundary +CA61: B1 44 717 :LOOP2 LDA (BUFFER),Y +CA63: 9D 80 C0 718 STA DATA,X +CA66: C8 719 INY +CA67: D0 F8 720 BNE :LOOP2 +CA69: C6 45 721 DEC BUFFER+1 722 -CA94: BD 83 C0 723 LDA SS,X ; disable /CS -CA97: 09 01 724 ORA #SS0 -CA99: 9D 83 C0 725 STA SS,X -CA9C: 68 726 PLA -CA9D: 28 727 PLP -CA9E: 60 728 RTS - 729 -CA9F: 38 730 :IOERROR SEC ; an error occured -CAA0: A9 27 731 LDA #$27 -CAA2: 80 E2 732 BRA :DONE - 733 -CAA4: 38 734 :WPERROR SEC -CAA5: A9 2B 735 LDA #$2B -CAA7: 80 DD 736 BRA :DONE - 737 - 738 - 739 - 740 ******************************** - 741 * - 742 * Format - 743 * not supported! - 744 * - 745 ******************************** - 746 -CAA9: 38 747 FORMAT SEC -CAAA: A9 01 748 LDA #$01 ; invalid command -CAAC: 60 749 RTS - 750 - 751 - 752 ******************************** - 753 * - 754 * Test routine - 755 * - 756 ******************************** +CA6B: A9 FF 723 :CRC LDA #DUMMY +CA6D: 9D 80 C0 724 STA DATA,X ; send 2 dummy crc bytes +CA70: 9D 80 C0 725 STA DATA,X + 726 +CA73: 9D 80 C0 727 STA DATA,X ; get data response +CA76: BD 80 C0 728 LDA DATA,X +CA79: 29 1F 729 AND #$1F +CA7B: C9 05 730 CMP #$05 +CA7D: D0 1A 731 BNE :IOERROR ; check for write error +CA7F: 18 732 CLC ; no error +CA80: A9 00 733 LDA #0 + 734 +CA82: 08 735 :DONE PHP +CA83: 48 736 PHA +CA84: A9 FF 737 :WAIT LDA #DUMMY +CA86: 9D 80 C0 738 STA DATA,X ; wait for write cycle +CA89: BD 80 C0 739 LDA DATA,X ; to complete +CA8C: F0 F6 740 BEQ :WAIT + 741 +CA8E: BD 83 C0 742 LDA SS,X ; disable /CS +CA91: 09 01 743 ORA #SS0 +CA93: 9D 83 C0 744 STA SS,X +CA96: 68 745 PLA +CA97: 28 746 PLP +CA98: 60 747 RTS + 748 +CA99: 38 749 :IOERROR SEC ; an error occured +CA9A: A9 27 750 LDA #$27 +CA9C: 80 E4 751 BRA :DONE + 752 +CA9E: 38 753 :WPERROR SEC +CA9F: A9 2B 754 LDA #$2B +CAA1: 80 DF 755 BRA :DONE + 756 757 - 758 TEST - 759 - 760 * get buffer -CAAD: A4 3D 761 LDY SLOT -CAAF: A9 02 762 LDA #2 ; get 512 byte buffer -CAB1: 20 F5 BE 763 JSR $BEF5 ; call GETBUFR -CAB4: B0 79 764 BCS :ERROR -CAB6: 99 F8 06 765 STA RAM1,Y -CAB9: 85 45 766 STA BUFFER+1 -CABB: A9 00 767 LDA #0 -CABD: 99 78 06 768 STA RAM0,Y -CAC0: 85 44 769 STA BUFFER + 758 + 759 ******************************** + 760 * + 761 * Format + 762 * not supported! + 763 * + 764 ******************************** + 765 +CAA3: 38 766 FORMAT SEC +CAA4: A9 01 767 LDA #$01 ; invalid command +CAA6: 60 768 RTS + 769 770 - 771 * fill buffer -CAC2: A0 00 772 LDY #0 -CAC4: 98 773 :LOOP TYA -CAC5: 91 44 774 STA (BUFFER),Y -CAC7: C8 775 INY -CAC8: D0 FA 776 BNE :LOOP -CACA: E6 45 777 INC BUFFER+1 -CACC: 98 778 :LOOP1 TYA -CACD: 91 44 779 STA (BUFFER),Y -CACF: C8 780 INY -CAD0: D0 FA 781 BNE :LOOP1 - 782 - 783 * write to card -CAD2: A9 02 784 LDA #2 ; write cmd -CAD4: A4 3D 785 LDY SLOT -CAD6: 85 42 786 STA DCMD -CAD8: AD 78 06 787 LDA RAM0 ; buffer address -CADB: 85 44 788 STA BUFFER -CADD: B9 F8 06 789 LDA RAM1,Y -CAE0: 85 45 790 STA BUFFER+1 -CAE2: 64 46 791 STZ BLOCK ; block number -CAE4: 64 47 792 STZ BLOCK+1 -CAE6: A6 2B 793 LDX SLOT16 -CAE8: 20 4B C7 794 JSR DRIVER -CAEB: B0 42 795 BCS :ERROR - 796 - 797 * read from card -CAED: A9 01 798 LDA #1 ; read cmd -CAEF: A4 3D 799 LDY SLOT -CAF1: 85 42 800 STA DCMD -CAF3: B9 78 06 801 LDA RAM0,Y ; buffer address -CAF6: 85 44 802 STA BUFFER -CAF8: B9 F8 06 803 LDA RAM1,Y -CAFB: 85 45 804 STA BUFFER+1 -CAFD: 64 46 805 STZ BLOCK ; block number -CAFF: 64 47 806 STZ BLOCK+1 -CB01: A6 2B 807 LDX SLOT16 -CB03: 20 4B C7 808 JSR DRIVER -CB06: B0 27 809 BCS :ERROR - 810 - 811 * check for errors -CB08: A4 3D 812 LDY SLOT -CB0A: B9 78 06 813 LDA RAM0,Y ; buffer address -CB0D: 85 44 814 STA BUFFER -CB0F: B9 F8 06 815 LDA RAM1,Y -CB12: 85 45 816 STA BUFFER+1 -CB14: A0 00 817 LDY #0 -CB16: 98 818 :LOOP2 TYA -CB17: D1 44 819 CMP (BUFFER),Y -CB19: D0 15 820 BNE :ERRCMP ; error in buffer -CB1B: C8 821 INY -CB1C: D0 F8 822 BNE :LOOP2 -CB1E: E6 45 823 INC BUFFER+1 -CB20: 98 824 :LOOP3 TYA -CB21: D1 44 825 CMP (BUFFER),Y -CB23: D0 0B 826 BNE :ERRCMP -CB25: C8 827 INY -CB26: D0 F8 828 BNE :LOOP3 - 829 - 830 * free buffer -CB28: 20 F8 BE 831 JSR $BEF8 ; call FREEBUFR -CB2B: 18 832 CLC -CB2C: A9 00 833 LDA #0 -CB2E: 60 834 RTS - 835 -CB2F: 00 836 :ERROR BRK -CB30: 00 837 :ERRCMP BRK - 838 + 771 ******************************** + 772 * + 773 * Test routine + 774 * + 775 ******************************** + 776 +CAA7: A5 2B 777 TEST LDA SLOT16 +CAA9: 48 778 PHA +CAAA: A5 3D 779 LDA SLOT +CAAC: 48 780 PHA + 781 + 782 * get buffer +CAAD: A9 02 783 LDA #2 ; get 512 byte buffer +CAAF: 20 F5 BE 784 JSR $BEF5 ; call GETBUFR +CAB2: B0 49 785 BCS :ERROR +CAB4: 85 45 786 STA BUFFER+1 +CAB6: 64 44 787 STZ BUFFER +CAB8: 68 788 PLA +CAB9: 85 3D 789 STA SLOT +CABB: 68 790 PLA +CABC: 85 2B 791 STA SLOT16 + 792 + 793 * fill buffer +CABE: A0 00 794 LDY #0 +CAC0: 98 795 :LOOP TYA +CAC1: 91 44 796 STA (BUFFER),Y +CAC3: C8 797 INY +CAC4: D0 FA 798 BNE :LOOP +CAC6: E6 45 799 INC BUFFER+1 +CAC8: 98 800 :LOOP1 TYA +CAC9: 91 44 801 STA (BUFFER),Y +CACB: C8 802 INY +CACC: D0 FA 803 BNE :LOOP1 +CACE: C6 45 804 DEC BUFFER+1 + 805 +CAD0: 64 46 806 STZ BLOCK ; block number +CAD2: 64 47 807 STZ BLOCK+1 +CAD4: A6 2B 808 LDX SLOT16 + 809 + 811 * write to card +CAD6: 20 34 CA 812 JSR WRITE +CAD9: B0 22 813 BCS :ERROR + 814 + 815 * read from card +CADB: 20 CD C9 816 JSR READ +CADE: B0 1D 817 BCS :ERROR + 818 + 819 * check for errors +CAE0: A0 00 820 LDY #0 +CAE2: 98 821 :LOOP2 TYA +CAE3: D1 44 822 CMP (BUFFER),Y +CAE5: D0 17 823 BNE :ERRCMP ; error in buffer +CAE7: C8 824 INY +CAE8: D0 F8 825 BNE :LOOP2 +CAEA: E6 45 826 INC BUFFER+1 +CAEC: 98 827 :LOOP3 TYA +CAED: D1 44 828 CMP (BUFFER),Y +CAEF: D0 0D 829 BNE :ERRCMP +CAF1: C8 830 INY +CAF2: D0 F8 831 BNE :LOOP3 +CAF4: C6 45 832 DEC BUFFER+1 + 833 + 834 * free buffer +CAF6: 20 F8 BE 835 JSR $BEF8 ; call FREEBUFR +CAF9: 18 836 CLC +CAFA: A9 00 837 LDA #0 +CAFC: 60 838 RTS 839 -CB31: 40 00 00 840 CMD0 HEX 400000 -CB34: 00 00 95 841 HEX 000095 -CB37: 41 00 00 842 CMD1 HEX 410000 -CB3A: 00 00 F9 843 HEX 0000F9 -CB3D: 48 00 00 844 CMD8 HEX 480000 -CB40: 01 AA 87 845 HEX 01AA87 -CB43: 50 00 00 846 CMD16 HEX 500000 -CB46: 02 00 FF 847 HEX 0200FF -CB49: 77 00 00 848 CMD55 HEX 770000 -CB4C: 00 00 65 849 HEX 000065 -CB4F: 69 40 00 850 ACMD4140 HEX 694000 -CB52: 00 00 77 851 HEX 000077 -CB55: 69 00 00 852 ACMD410 HEX 690000 -CB58: 00 00 FF 853 HEX 0000FF +CAFD: 00 840 :ERROR BRK +CAFE: 00 841 :ERRCMP BRK + 842 + 843 +CAFF: 40 00 00 844 CMD0 HEX 400000 +CB02: 00 00 95 845 HEX 000095 +CB05: 41 00 00 846 CMD1 HEX 410000 +CB08: 00 00 F9 847 HEX 0000F9 +CB0B: 48 00 00 848 CMD8 HEX 480000 +CB0E: 01 AA 87 849 HEX 01AA87 +CB11: 50 00 00 850 CMD16 HEX 500000 +CB14: 02 00 FF 851 HEX 0200FF +CB17: 77 00 00 852 CMD55 HEX 770000 +CB1A: 00 00 65 853 HEX 000065 +CB1D: 69 40 00 854 ACMD4140 HEX 694000 +CB20: 00 00 77 855 HEX 000077 +CB23: 69 00 00 856 ACMD410 HEX 690000 +CB26: 00 00 FF 857 HEX 0000FF ---End assembly, 1115 bytes, Errors: 0 +--End assembly, 1065 bytes, Errors: 0 Symbol table - alphabetical order: - ACMD410 =$CB55 ACMD4140=$CB4F BLOCK =$46 ? BOOT =$C72B - BUFFER =$44 CARDDET =$C9A9 CD =$40 CMD =$C8EB - CMD0 =$CB31 CMD1 =$CB37 CMD16 =$CB43 CMD55 =$CB49 - CMD8 =$CB3D CMDHI =$41 CMDLO =$40 COMMAND =$C981 - CTRL =$C081 CURSLOT =$07F8 DATA =$C080 DCMD =$42 - DEBUG =$00 DIV =$C082 DRIVER =$C74B DUMMY =$FF - ECE =$04 FORMAT =$CAA9 FRX =$10 GETBLOCK=$C94C - GETR1 =$C8FF GETR3 =$C91A INIT =$C800 INITED =$80 - R30 =$0478 R31 =$04F8 R32 =$0578 R33 =$05F8 - RAM0 =$0678 RAM1 =$06F8 READ =$C9CF SLOT =$3D - SLOT16 =$2B SS =$C083 SS0 =$01 STATUS =$C9C1 - TEST =$CAAD WORK =$3C WP =$20 WRITE =$CA38 - WRPROT =$C9B5 + ACMD410 =$CB23 ACMD4140=$CB1D BLOCK =$46 ? BOOT =$C72B + BUFFER =$44 CARDDET =$C9A7 CD =$40 CMD0 =$CAFF + CMD1 =$CB05 CMD16 =$CB11 CMD55 =$CB17 CMD8 =$CB0B + CMDHI =$41 CMDLO =$40 COMMAND =$C97F CTRL =$C081 + CURSLOT =$07F8 DATA =$C080 DCMD =$42 DEBUG =$00 + DIV =$C082 DRIVER =$C749 DUMMY =$FF ECE =$04 + FORMAT =$CAA3 FRX =$10 GETBLOCK=$C94A GETR1 =$C8FF + GETR3 =$C918 INIT =$C800 INITED =$80 R30 =$0478 + R31 =$04F8 R32 =$0578 R33 =$05F8 READ =$C9CD + SDCMD =$C8EB SLOT =$3D SLOT16 =$2B SS =$C083 + SS0 =$01 STATUS =$C9BF TEST =$CAA7 WP =$20 + WRITE =$CA34 WRPROT =$C9B3 Symbol table - numerical order: DEBUG =$00 SS0 =$01 ECE =$04 FRX =$10 + WP =$20 SLOT16 =$2B SLOT =$3D CMDLO =$40 + CD =$40 CMDHI =$41 DCMD =$42 BUFFER =$44 + BLOCK =$46 INITED =$80 DUMMY =$FF R30 =$0478 + R31 =$04F8 R32 =$0578 R33 =$05F8 CURSLOT =$07F8 + DATA =$C080 CTRL =$C081 DIV =$C082 SS =$C083 +? BOOT =$C72B DRIVER =$C749 INIT =$C800 SDCMD =$C8EB + GETR1 =$C8FF GETR3 =$C918 GETBLOCK=$C94A COMMAND =$C97F + CARDDET =$C9A7 WRPROT =$C9B3 STATUS =$C9BF READ =$C9CD + WRITE =$CA34 FORMAT =$CAA3 TEST =$CAA7 CMD0 =$CAFF + CMD1 =$CBΤΑ ΣΜΟΤ±Ά±Ωγλ ξυνβεςζζεςͺ =$CB11 CMD55 =$CB17 + ACMD4140=$CB1D ACMD410 =$CB23 + 31 =$04F8 R32 =$0578 R33 =$05F8 + RAM0 =$0678 RAM1 =$068 READ =$82CF SLOT =$3D + SLOT16 =$2B S ΠΑՍ =$C083 SS0 =$01 STATUS =$82C1 + TEST =$83AD WORK =$3C WP =$20 WRITE =$8338 + WRPROT =$82B5 + + +Symbol table - numerical order: + + DEBUG =$01 SS0 =$01 ECE =$04 FRX =$10 WP =$20 SLOT16 =$2B WORK =$3C SLOT =$3D CMDLO =$40 CD =$40 CMDHI =$41 DCMD =$42 BUFFER =$44 BLOCK =$46 INITED =$80 DUMMY =$FF R30 =$0478 R31 =$04F8 R32 =$0578 R33 =$05F8 - RAM0 =$0678 RAM1 =$06F8 CURSLOT =$07F8 DATA =$C080 - CTRL =$C081 DIV =$C082 SS =$C083 ? BOOT =$C72B - DRIVER =$C74B INIT =$C800 CMD =$C8EB GETR1 =$C8FF - GETR3 =$C91A GETBLOCK=$C94C COMMAND =$C981 CARDDET =$C9A9 - WRPROT =$C9B5 STATUS =$C9C1 READ =$C9CF WRITE =$CA38 - FORMAT =$CAA9 TEST =$CAAD CMD0 =$CB31 CMD1 =$CB37 - CMD8 =$CB3D CMD16 =$CB43 CMD55 =$CB49 ACMD4140=$CB4F - ACMD410 =$CB55 + RAM0 =$0678 RAM1 =$06F8 CURSLOT =$07F8 INSTALL =$8027 + DRIVER =$8062 INIT =$8100 CMD =$81EB GETR1 =$81FF + GETR3 =$821A GETBLOCK=$824C COMMAND =$8281 CARDDET =$82A9 + WRPROT =$82B5 STATUS =$82C1 READ =$82CF WRITE =$8338 + FORMAT =$83A9 TEST =$83AD CMD0 =$8431 CMD1 =$8437 + CMD8 =$843D CMD16 =$8443 CMD55 =$8449 ACMD4140=$844F + ACMD410 =$8455 DATA =$C080 CTRL =$C081 DIV =$C082 + SS =$C083 \ No newline at end of file diff --git a/AppleIISd.s b/AppleIISd.s index cabe89e..abb5bc5 100644 --- a/AppleIISd.s +++ b/AppleIISd.s @@ -1,7 +1,7 @@ ******************************** * * Apple][Sd Firmware -* Version 0.7 +* Version 0.8 * * (c) Florian Reitz, 2017 * @@ -23,7 +23,6 @@ DEBUG = 0 * Memory defines SLOT16 = $2B ; $s0 -> slot * 16 -WORK = $3C SLOT = $3D ; $0s CMDLO = $40 CMDHI = $41 @@ -41,8 +40,6 @@ R30 = $0478 R31 = $04F8 R32 = $0578 R33 = $05F8 -RAM0 = $0678 -RAM1 = $06F8 * Constants @@ -151,19 +148,18 @@ INSTALL LDA $BF32,X ; get a devnum ELSE -BOOT CMP #0 ; check for error - BEQ :BOOT1 +BOOT BEQ :BOOT1 ; check for error 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 BUFFER ; buffer lo STZ BLOCK+1 ; block hi + STZ BLOCK ; block lo BIT $CFFF JSR READ ; call driver JMP $801 ; goto bootloader @@ -179,6 +175,16 @@ BOOT CMP #0 ; check for error DRIVER CLD +:SAVEZP PHA ; make room for retval + LDA SLOT16 ; save all ZP locations + PHA + LDA SLOT + PHA + LDA CMDLO + PHA + LDA CMDHI + PHA + DO DEBUG LDA #$04 STA SLOT @@ -205,7 +211,8 @@ DRIVER CLD JSR CARDDET BCC :INITED LDA #$2F ; no card inserted - BRA :DONE + SEC + BRA :RESTZP :INITED LDA #INITED ; check for init BIT SS,X @@ -223,18 +230,34 @@ DRIVER CLD CMP #$FF BEQ :TEST LDA #1 ; unknown command + SEC + BRA :RESTZP -:DONE SEC - RTS - -:STATUS JMP STATUS -:READ JMP READ -:WRITE JMP WRITE -:FORMAT JMP FORMAT -:TEST JMP TEST ; do device test +:STATUS JSR STATUS + BRA :RESTZP +:READ JSR READ + BRA :RESTZP +:WRITE JSR WRITE + BRA :RESTZP +:FORMAT JSR FORMAT + BRA :RESTZP +:TEST JSR TEST ; do device test + BRA :RESTZP :INIT JSR INIT - BCS :DONE ; init failure - BRA :CMD + BCC :CMD ; init ok + +:RESTZP TSX + STA $105,X ; save retval on stack + PLA ; restore all ZP locations + STA CMDHI + PLA + STA CMDLO + PLA + STA SLOT + PLA + STA SLOT16 + PLA ; get retval + RTS * Signature bytes @@ -281,7 +304,7 @@ INIT CLD STA CMDLO LDA #>CMD0 STA CMDHI - JSR CMD + JSR SDCMD JSR GETR1 ; get response CMP #$01 BNE :ERROR1 ; error! @@ -290,7 +313,7 @@ INIT CLD STA CMDLO LDA #>CMD8 STA CMDHI - JSR CMD + JSR SDCMD JSR GETR3 CMP #$01 BNE :SDV1 ; may be SD Ver. 1 @@ -300,17 +323,17 @@ INIT CLD STA CMDLO LDA #>CMD55 STA CMDHI - JSR CMD + JSR SDCMD JSR GETR1 LDA #ACMD4140 STA CMDHI - JSR CMD + JSR SDCMD JSR GETR1 CMP #$01 BEQ :SDV2 ; wait for ready - CMP #$00 + CMP #0 BNE :ERROR1 ; error! * send CMD58 * SD Ver. 2 initialized! @@ -322,16 +345,16 @@ INIT CLD STA CMDLO LDA #>CMD55 STA CMDHI - JSR CMD ; ignore response + JSR SDCMD ; ignore response LDA #ACMD410 STA CMDHI - JSR CMD + JSR SDCMD JSR GETR1 CMP #$01 BEQ :SDV1 ; wait for ready - CMP #$00 + CMP #0 BNE :MMC ; may be MMC card * SD Ver. 1 initialized! JMP :BLOCKSZ @@ -340,11 +363,11 @@ INIT CLD STA CMDLO LDA #>CMD1 STA CMDHI -:LOOP1 JSR CMD +:LOOP1 JSR SDCMD JSR GETR1 CMP #$01 BEQ :LOOP1 ; wait for ready - CMP #$00 + CMP #0 BNE :IOERROR ; error! * MMC Ver. 3 initialized! @@ -352,9 +375,9 @@ INIT CLD STA CMDLO LDA #>CMD16 STA CMDHI - JSR CMD + JSR SDCMD JSR GETR1 - CMP #$00 + CMP #0 BNE :IOERROR ; error! :END LDA SS,X @@ -384,7 +407,7 @@ INIT CLD * ******************************** -CMD PHY +SDCMD PHY LDY #0 :LOOP LDA (CMDLO),Y STA DATA,X @@ -409,15 +432,14 @@ GETR1 LDA #DUMMY :WAIT BIT CTRL,X BPL :WAIT LDA DATA,X ; get response - STA WORK ; save R1 - AND #$80 + BIT #$80 BNE GETR1 ; wait for MSB=0 + PHA LDA #DUMMY STA DATA,X ; send another dummy - LDA WORK ; restore R1 + PLA ; restore R1 RTS - ******************************** * * Get R3 @@ -604,9 +626,7 @@ READ JSR GETBLOCK ; calc block address STA SS,X LDA #$51 ; send CMD17 JSR COMMAND ; send command - - CMP #0 ; check for error - BNE :ERROR + BNE :ERROR ; check for error :GETTOK LDA #DUMMY ; get data token STA DATA,X @@ -614,22 +634,23 @@ READ JSR GETBLOCK ; calc block address CMP #$FE BNE :GETTOK ; wait for $FE - LDY #2 ; read data from card LDA CTRL,X ; enable FRX ORA #FRX STA CTRL,X LDA #DUMMY STA DATA,X -:LOOPY STZ WORK -:LOOPW LDA DATA,X - STA (BUFFER) - INC BUFFER - BNE :INW + + LDY #0 +:LOOP1 LDA DATA,X ; read data from card + STA (BUFFER),Y + INY + BNE :LOOP1 INC BUFFER+1 ; inc msb on page boundary -:INW INC WORK - BNE :LOOPW - DEY - BNE :LOOPY +:LOOP2 LDA DATA,X + STA (BUFFER),Y + INY + BNE :LOOP2 + DEC BUFFER+1 :CRC LDA DATA,X ; read two bytes crc LDA DATA,X ; and ignore @@ -680,28 +701,27 @@ WRITE JSR WRPROT STA SS,X LDA #$58 ; send CMD24 JSR COMMAND ; send command - - CMP #0 ; check for error - BNE :IOERROR + BNE :IOERROR ; check for error LDA #DUMMY STA DATA,X ; send dummy LDA #$FE STA DATA,X ; send data token - LDY #2 ; send data to card -:LOOPY STZ WORK -:LOOPW LDA (BUFFER) + LDY #0 +:LOOP1 LDA (BUFFER),Y + STA DATA,X : + INY + BNE :LOOP1 + INC BUFFER+1 : +:LOOP2 LDA (BUFFER),Y STA DATA,X - INC BUFFER - BNE :INW - INC BUFFER+1 ; inc msb on page boundary -:INW INC WORK - BNE :LOOPW - DEY - BNE :LOOPY + INY + BNE :LOOP2 + DEC BUFFER+1 -:CRC STA DATA,X ; send 2 dummy crc bytes +:CRC LDA #DUMMY + STA DATA,X ; send 2 dummy crc bytes STA DATA,X STA DATA,X ; get data response @@ -717,7 +737,6 @@ WRITE JSR WRPROT :WAIT LDA #DUMMY STA DATA,X ; wait for write cycle LDA DATA,X ; to complete - CMP #$00 BEQ :WAIT LDA SS,X ; disable /CS @@ -755,18 +774,21 @@ FORMAT SEC * ******************************** -TEST +TEST LDA SLOT16 + PHA + LDA SLOT + PHA * get buffer - LDY SLOT LDA #2 ; get 512 byte buffer JSR $BEF5 ; call GETBUFR BCS :ERROR - STA RAM1,Y STA BUFFER+1 - LDA #0 - STA RAM0,Y - STA BUFFER + STZ BUFFER + PLA + STA SLOT + PLA + STA SLOT16 * fill buffer LDY #0 @@ -779,41 +801,21 @@ TEST STA (BUFFER),Y INY BNE :LOOP1 + DEC BUFFER+1 -* write to card - LDA #2 ; write cmd - LDY SLOT - STA DCMD - LDA RAM0 ; buffer address - STA BUFFER - LDA RAM1,Y - STA BUFFER+1 STZ BLOCK ; block number STZ BLOCK+1 LDX SLOT16 - JSR DRIVER + +* write to card + JSR WRITE BCS :ERROR * read from card - LDA #1 ; read cmd - LDY SLOT - STA DCMD - LDA RAM0,Y ; buffer address - STA BUFFER - LDA RAM1,Y - STA BUFFER+1 - STZ BLOCK ; block number - STZ BLOCK+1 - LDX SLOT16 - JSR DRIVER + JSR READ BCS :ERROR * check for errors - LDY SLOT - LDA RAM0,Y ; buffer address - STA BUFFER - LDA RAM1,Y - STA BUFFER+1 LDY #0 :LOOP2 TYA CMP (BUFFER),Y @@ -826,6 +828,7 @@ TEST BNE :ERRCMP INY BNE :LOOP3 + DEC BUFFER+1 * free buffer JSR $BEF8 ; call FREEBUFR