diff --git a/AppleIISd.bin b/AppleIISd.bin index ddb26b9..a8d8a7b 100644 Binary files a/AppleIISd.bin and b/AppleIISd.bin differ diff --git a/AppleIISd.hex b/AppleIISd.hex index 4f3baa3..fd2908c 100644 --- a/AppleIISd.hex +++ b/AppleIISd.hex @@ -1,70 +1,129 @@ :10000000A220A000A203A03C2058FFBABD00018D91 :10001000F807290F853D0A0A0A0A852BAA2CFFCF6B -:1000200020A7C99003A92F002000C8F00100A0005C -:10003000B9FFCAF00699D007C810F5A9018542A6F4 -:100040002B8643A90885456444644764462CFFCF4A -:1000500020CDC9A9018542A62B8643A90A854564FE -:10006000446447A90185462CFFCF20CDC9A62B4C5F -:100070000108D848A52B48A53D48A54048A54148BA -:100080002058FFBABD00018DF807290F853D0A0AE7 -:100090000A0A852BAA2CFFCF20A7C99005A92F38C3 -:1000A0008040A9803C83C0F034A542C900F015C946 -:1000B00001F016C902F017C903F018C9FFF019A919 -:1000C0000138801E20BFC9801920CDC9801420347A -:1000D000CA800F20A3CA800A20A7CA80052000C8B2 -:1000E00090C7BA9D050168854168854068853D686F -:1000F000852B68600000000000000000000007720F +:1000200020B8C99003A92F002000C8A9018542A6C5 +:100030002B8643A90885456444644764462CFFCF5A +:1000400020DEC9A9018542A62B8643A90A854564FD +:10005000446447A90185462CFFCF20DEC9A62B4C5E +:100060000108D848A52B48A53D48A54048A54148CA +:100070002058FFBABD00018DF807290F853D0A0AF7 +:100080000A0A852BAA2CFFCF20B8C99005A92F38C2 +:100090008040A9803C83C0F034A542C900F015C956 +:1000A00001F016C902F017C903F018C9FFF019A929 +:1000B0000138801E20D0C9801920DEC98014204755 +:1000C000CA800F20B8CA800A20BCCA80052000C898 +:1000D00090C7BA9D050168854168854068853D687F +:1000E000852B686000000000000000000000000098 +:1000F000000000000000000000000000FFFF876219 :10010000D8A9039D81C0BD83C009019D83C0A907F3 :100110009D82C0A00AA9FF9D80C03C81C010FB88C1 -:10012000D0F5BD83C029FE9D83C0A91F8540A9CB02 -:10013000854120EBC820FFC8C901D039A92B8540D3 -:10014000A9CB854120EBC82018C9C901D02AA937FD -:100150008540A9CB854120EBC820FFC8A93D85403B -:10016000A9CB854120EBC820FFC8C901F0E0C90038 -:10017000D0034CB2C84CD9C8A9378540A9CB85411A -:1001800020EBC8A9438540A9CB854120EBC820FFBF -:10019000C8C901F0E3C900D0034CB2C8A925854005 -:1001A000A9CB854120EBC820FFC8C901F0F6C900E2 -:1001B000D027A9318540A9CB854120EBC820FFC8B5 -:1001C000C900D015BD83C009809D83C0BD81C00911 -:1001D000049D81C018A000900338A027BD83C009EA -:1001E000019D83C0A9009D82C098605AA000B140C3 -:1001F0009D80C03C81C010FBC8C00690F17A60A908 -: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 -:1003F0000DC8D0F8C64520F8BE18A900600000C19D -:10040000F0F0ECE5DDDBD3E4A0A8E3A9B2B0B1B72E -:10041000A0C6ECEFF2E9E1EEA0D2E5E9F4FA004083 -:1004200000000000954100000000F948000001AA0A -:10043000875000000200FF7700000000656940005F -:090440000000776900000000FFD4 +:10012000D0F5BD83C029FE9D83C0A9348540A9CBED +:10013000854120F3C82007C9C901D041A9408540A5 +:10014000A9CB854120F3C82020C9C901D032A94CD0 +:100150008540A9CB854120F3C82007C9A952854015 +:10016000A9CB854120F3C82007C9C901F0E0C90027 +:10017000D00BBD83C009109D83C04CBAC84CE1C8E8 +:10018000A94C8540A9CB854120F3C8A9588540A931 +:10019000CB854120F3C82007C9C901F0E3C900D0CD +:1001A000034CBAC8A93A8540A9CB854120F3C820A1 +:1001B00007C9C901F0F6C900D027A9468540A9CBD7 +:1001C000854120F3C82007C9C900D015BD83C009E7 +:1001D000809D83C0BD81C009049D81C018A000908E +:1001E0000338A027BD83C009019D83C0A9009D825B +:1001F000C098605AA000B1409D80C03C81C010FBF7 +:10020000C8C00690F17A60A9FF9D80C03C81C010F3 +:10021000FBBD80C08980D0EF48A9FF9D80C0686089 +:100220002007C9485AA004A9FF9D80C03C81C01086 +:10023000FBBD80C04888D0EFA43D6899F805689957 +:1002400078056899F804689978047AA9FF9D80C0B8 +:100250006860DA5A8AA8A63DA5469DF805A5479D7F +:100260007805A9009DF8049D7804A9802443F00531 +:10027000A9019DF804A9103983C0D011A0091EF866 +:10028000053E78053EF8043E780488D0F17AFA609D +:100290005AA43D9D80C0B978049D80C0B9F8049DE2 +:1002A00080C0B978059D80C0B9F8059D80C0A9FFC0 +:1002B0009D80C02007C97A6048A9403C83C018F0DF +:1002C0000138686048A9203C83C018F00138686094 +:1002D000A90020C4C99002A92BA2FFA0FF60205250 +:1002E000C9BD83C029FE9D83C0A9512090C9C90002 +:1002F000D050A9FF9D80C0BD80C0C9FED0F4BD8193 +:10030000C009109D81C0A9FF9D80C0A000BD80C014 +:100310009144C8D0F8E645BD80C09144C8D0F8C625 +:1003200045BD80C0BD80C0BD80C0BD81C029EF9DDE +:1003300081C018A9000848BD83C009019D83C06819 +:10034000286038A92780EE20C4C9B0672052C9BDF3 +:1003500083C029FE9D83C0A9582090C9C900D04EF2 +:10036000A9FF9D80C0A9FE9D80C0A000B1449D80D2 +:10037000C0C8D0F8E645B1449D80C0C8D0F8C64595 +:10038000A9FF9D80C09D80C09D80C0BD80C0291FE9 +:10039000C905D01A18A9000848A9FF9D80C0BD80D2 +:1003A000C0F0F6BD83C009019D83C068286038A9EC +:1003B0002780E438A92B80DF38A90160A52B48A548 +:1003C0003D48A90220F5BEB0498545644468853D95 +:1003D00068852BA000989144C8D0FAE645989144CE +:1003E000C8D0FAC64564466447A62B2047CAB02247 +:1003F00020DEC9B01DA00098D144D017C8D0F8E6BF +:100400004598D144D00DC8D0F8C64520F8BE18A9EB +:10041000006000004170706C655D5B536420286370 +:10042000293230313720466C6F7269616E20526517 +:1004300069747A004000000000954100000000F956 +:1004400048000001AA875000000200FF770000006A +:1004500000656940000000776900000000FF0000AF +: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 +:1007000000000000000000000000000000000000E9 +:1007100000000000000000000000000000000000D9 +:1007200000000000000000000000000000000000C9 +:1007300000000000000000000000000000000000B9 +:1007400000000000000000000000000000000000A9 +:100750000000000000000000000000000000000099 +:100760000000000000000000000000000000000089 +:100770000000000000000000000000000000000079 +:100780000000000000000000000000000000000069 +:100790000000000000000000000000000000000059 +:1007A0000000000000000000000000000000000049 +:1007B0000000000000000000000000000000000039 +:1007C0000000000000000000000000000000000029 +:1007D0000000000000000000000000000000000019 +:1007E0000000000000000000000000000000000009 +:1007F00000000000000000000000000000000000F9 :00000001FF diff --git a/AppleIISd.s b/AppleIISd.s index 8ece11b..05fe6bb 100644 --- a/AppleIISd.s +++ b/AppleIISd.s @@ -1,74 +1,69 @@ -******************************** -* -* Apple][Sd Firmware -* Version 0.8 -* -* (c) Florian Reitz, 2017 -* -* X register usually contains SLOT16 -* Y register is used for counting or SLOT -* -******************************** +;******************************* +; +; Apple][Sd Firmware +; Version 0.8 +; +; (c) Florian Reitz, 2017 +; +; X register usually contains SLOT16 +; Y register is used for counting or SLOT +; +;******************************* - DAT + ;.pc02 ; enable 65C02 code +DEBUG := 0 + +;Memory defines - XC ; enable 65C02 code -DEBUG = 0 - DO DEBUG - ORG $8000 - ELSE - ORG $C700 ; Expansion ROM - FIN +SLOT16 := $2B ; $s0 -> slot * 16 +SLOT := $3D ; $0s +CMDLO := $40 +CMDHI := $41 -* Memory defines +DCMD := $42 ; Command code +BUFFER := $44 ; Buffer address +BLOCK := $46 ; Block number -SLOT16 = $2B ; $s0 -> slot * 16 -SLOT = $3D ; $0s -CMDLO = $40 -CMDHI = $41 +CURSLOT := $07F8 ; $Cs +DATA := $C080 +CTRL := DATA+1 +DIV := DATA+2 +SS := DATA+3 +R30 := $0478 +R31 := $04F8 +R32 := $0578 +R33 := $05F8 -DCMD = $42 ; Command code -BUFFER = $44 ; Buffer address -BLOCK = $46 ; Block number - -CURSLOT = $07F8 ; $Cs -DATA = $C080 -CTRL = DATA+1 -DIV = DATA+2 -SS = DATA+3 -R30 = $0478 -R31 = $04F8 -R32 = $0578 -R33 = $05F8 - -* Constants +; Constants : DUMMY = $FF FRX = $10 ; CTRL register ECE = $04 SS0 = $01 ; SS register +SDHC = $10 WP = $20 CD = $40 INITED = $80 -* signature bytes +; signature bytes + .segment "SLOTROM" LDX #$20 LDY #$00 LDX #$03 LDY #$3C -* find slot nr +; find slot nr - DO DEBUG + .if DEBUG LDA #$04 STA SLOT LDA #$C4 STA CURSLOT LDA #$40 - ELSE + .else JSR $FF58 TSX LDA $0100,X @@ -79,56 +74,56 @@ INITED = $80 ASL A ASL A ASL A - FIN + .endif STA SLOT16 ; $s0 TAX ; X holds now SLOT16 BIT $CFFF JSR CARDDET - BCC :INIT + BCC @INIT LDA #$2F ; no card inserted BRK -:INIT JSR INIT +@INIT: JSR INIT -******************************** -* -* Install SD card driver -* -******************************** +;******************************* +; +; Install SD card driver +; +;******************************* - DO DEBUG + .if DEBUG -* see if slot has a driver already +; see if slot has a driver already LDX $BF31 ; get devcnt -INSTALL LDA $BF32,X ; get a devnum +INSTALL: LDA $BF32,X ; get a devnum AND #$70 ; isolate slot CMP SLOT16 ; slot? - BEQ :INSOUT ; yes, skip it + BEQ @INSOUT ; yes, skip it DEX BPL INSTALL ; keep up the search -* restore the devnum to the list +; restore the devnum to the list LDX $BF31 ; get devcnt again CPX #$0D ; device table full? - BNE :INST2 + BNE @INST2 JSR $FF3A ; bell - JMP :INSOUT ; do something! + JMP @INSOUT ; do something! -:INST2 LDA $BF32-1,X ; move all entries down +@INST2: LDA $BF32-1,X ; move all entries down STA $BF32,X ; to make room at front DEX ; for a new entry - BNE :INST2 + BNE @INST2 LDA #$04 ; ProFile type device ORA SLOT16 STA $BF32 ; slot, drive 1 at top of list INC $BF31 ; update devcnt -* now insert the device driver vector +; now insert the device driver vector LDA SLOT ASL @@ -137,28 +132,30 @@ INSTALL LDA $BF32,X ; get a devnum STA $BF10,X ; write to driver table LDA #>DRIVER STA $BF11,X -:INSOUT RTS +@INSOUT: RTS -******************************** -* -* Boot from SD card -* -******************************** +;******************************* +; +; Boot from SD card +; +;******************************* - ELSE + .else -BOOT BEQ :DRAW ; check for error + .if 0 +BOOT: BEQ @DRAW ; check for error BRK -:DRAW LDY #0 ; display copyright message -:DRAW1 LDA TEXT,Y - BEQ :BOOT1 ; check for NULL +@DRAW: LDY #0 ; display copyright message +@DRAW1: LDA TEXT,Y + BEQ @BOOT1 ; check for NULL STA $07D0,Y ; put on last line INY - BPL :DRAW1 + BPL @DRAW1 + .endif -:BOOT1 LDA #$01 +@BOOT1: LDA #$01 STA DCMD ; load command LDX SLOT16 STX $43 ; slot number @@ -185,18 +182,18 @@ BOOT BEQ :DRAW ; check for error LDX SLOT16 JMP $801 ; goto bootloader - FIN + .endif -******************************** -* -* Jump table -* -******************************** +;******************************* +; +; Jump table +; +;******************************* -DRIVER CLD +DRIVER: CLD -:SAVEZP PHA ; make room for retval +@SAVEZP: PHA ; make room for retval LDA SLOT16 ; save all ZP locations PHA LDA SLOT @@ -206,14 +203,14 @@ DRIVER CLD LDA CMDHI PHA - DO DEBUG + .if DEBUG LDA #$04 STA SLOT LDA #$C4 STA CURSLOT LDA #$40 - ELSE + .else JSR $FF58 ; find slot nr TSX LDA $0100,X @@ -224,50 +221,50 @@ DRIVER CLD ASL A ASL A ASL A - FIN + .endif STA SLOT16 ; $s0 TAX ; X holds now SLOT16 BIT $CFFF JSR CARDDET - BCC :INITED + BCC @INITED LDA #$2F ; no card inserted SEC - BRA :RESTZP + BRA @RESTZP -:INITED LDA #INITED ; check for init +@INITED: LDA #INITED ; check for init BIT SS,X - BEQ :INIT + BEQ @INIT -:CMD LDA DCMD ; get command +@CMD: LDA DCMD ; get command CMP #0 - BEQ :STATUS + BEQ @STATUS CMP #1 - BEQ :READ + BEQ @READ CMP #2 - BEQ :WRITE + BEQ @WRITE CMP #3 - BEQ :FORMAT + BEQ @FORMAT CMP #$FF - BEQ :TEST + BEQ @TEST LDA #1 ; unknown command SEC - BRA :RESTZP + BRA @RESTZP -: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 - BCC :CMD ; init ok +@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 + BCC @CMD ; init ok -:RESTZP TSX +@RESTZP: TSX STA $105,X ; save retval on stack PLA ; restore all ZP locations STA CMDHI @@ -281,27 +278,27 @@ DRIVER CLD RTS -* Signature bytes +; Signature bytes - DS \ ; fill with zeroes - DS -4 ; locate to $xxFC - DW $0 ; use status call - DB $07 ; Status bits - DB #CMD55 STA CMDHI @@ -353,16 +350,19 @@ INIT CLD JSR SDCMD JSR GETR1 CMP #$01 - BEQ :SDV2 ; wait for ready + BEQ @SDV2 ; wait for ready CMP #0 - BNE :ERROR1 ; error! -* send CMD58 -* SD Ver. 2 initialized! - JMP :BLOCKSZ + BNE @ERROR1 ; error! +; send CMD58 +; SD Ver. 2 initialized! + LDA SS,X + ORA #SDHC + STA SS,X + JMP @BLOCKSZ -:ERROR1 JMP :IOERROR ; needed for far jump +@ERROR1: JMP @IOERROR ; needed for far jump -:SDV1 LDA #CMD55 STA CMDHI @@ -374,34 +374,34 @@ INIT CLD JSR SDCMD JSR GETR1 CMP #$01 - BEQ :SDV1 ; wait for ready + BEQ @SDV1 ; wait for ready CMP #0 - BNE :MMC ; may be MMC card -* SD Ver. 1 initialized! - JMP :BLOCKSZ + BNE @MMC ; may be MMC card +; SD Ver. 1 initialized! + JMP @BLOCKSZ -:MMC LDA #CMD1 STA CMDHI -:LOOP1 JSR SDCMD +@LOOP1: JSR SDCMD JSR GETR1 CMP #$01 - BEQ :LOOP1 ; wait for ready + BEQ @LOOP1 ; wait for ready CMP #0 - BNE :IOERROR ; error! -* MMC Ver. 3 initialized! + BNE @IOERROR ; error! +; MMC Ver. 3 initialized! -:BLOCKSZ LDA #CMD16 STA CMDHI JSR SDCMD JSR GETR1 CMP #0 - BNE :IOERROR ; error! + BNE @IOERROR ; error! -:END LDA SS,X +@END: LDA SS,X ORA #INITED ; initialized STA SS,X LDA CTRL,X @@ -409,10 +409,10 @@ INIT CLD STA CTRL,X CLC ; all ok LDY #0 - BCC :END1 -:IOERROR SEC + BCC @END1 +@IOERROR: SEC LDY #$27 ; init error -:END1 LDA SS,X ; set CS high +@END1: LDA SS,X ; set CS high ORA #SS0 STA SS,X LDA #0 ; set div to 2 @@ -421,37 +421,37 @@ INIT CLD RTS -******************************** -* -* Send SD command -* Call with command in CMDHI and CMDLO -* -******************************** +;******************************* +; +; Send SD command +; Call with command in CMDHI and CMDLO +; +;******************************* -SDCMD PHY +SDCMD: PHY LDY #0 -:LOOP LDA (CMDLO),Y +@LOOP: LDA (CMDLO),Y STA DATA,X -:WAIT BIT CTRL,X ; TC is in N - BPL :WAIT +@WAIT: BIT CTRL,X ; TC is in N + BPL @WAIT INY CPY #6 - BCC :LOOP + BCC @LOOP PLY RTS -******************************** -* -* Get R1 -* R1 is in A -* -******************************** +;******************************* +; +; Get R1 +; R1 is in A +; +;******************************* -GETR1 LDA #DUMMY +GETR1: LDA #DUMMY STA DATA,X -:WAIT BIT CTRL,X - BPL :WAIT +@WAIT: BIT CTRL,X + BPL @WAIT LDA DATA,X ; get response BIT #$80 BNE GETR1 ; wait for MSB=0 @@ -461,26 +461,26 @@ GETR1 LDA #DUMMY PLA ; restore R1 RTS -******************************** -* -* Get R3 -* R1 is in A -* R3 is in scratchpad ram -* -******************************** +;******************************* +; +; Get R3 +; R1 is in A +; R3 is in scratchpad ram +; +;******************************* -GETR3 JSR GETR1 ; get R1 first +GETR3: JSR GETR1 ; get R1 first PHA ; save R1 PHY ; save Y LDY #04 ; load counter -:LOOP LDA #DUMMY ; send dummy +@LOOP: LDA #DUMMY ; send dummy STA DATA,X -:WAIT BIT CTRL,X - BPL :WAIT +@WAIT: BIT CTRL,X + BPL @WAIT LDA DATA,X PHA DEY - BNE :LOOP ; do 4 times + BNE @LOOP ; do 4 times LDY SLOT PLA STA R33,Y ; save R3 @@ -497,17 +497,19 @@ GETR3 JSR GETR1 ; get R1 first RTS -******************************** -* -* Calculate block address -* Unit number is in $43 DSSS0000 -* Block no is in $46-47 -* Address is in R30-R33 -* -******************************** +;******************************* +; +; Calculate block address +; Unit number is in $43 DSSS0000 +; Block no is in $46-47 +; Address is in R30-R33 +; +;******************************* -GETBLOCK PHX ; save X +GETBLOCK: PHX ; save X PHY ; save Y + TXA + TAY ; SLOT16 is now in Y LDX SLOT LDA BLOCK ; store block num STA R33,X ; in R30-R33 @@ -519,30 +521,35 @@ GETBLOCK PHX ; save X LDA #$80 ; drive number BIT $43 - BEQ :SHIFT ; D1 + BEQ @SDHC ; D1 LDA #1 ; D2 STA R31,X -:SHIFT LDY #9 ; ASL can't be used with Y -:LOOP ASL R33,X ; mul block num +@SDHC: LDA #SDHC + AND SS,Y ; if card is SDHC, + BNE @END ; use block addressing + + LDY #9 ; ASL can't be used with Y +@LOOP: ASL R33,X ; mul block num ROL R32,X ; by 512 to get ROL R31,X ; real address ROL R30,X DEY - BNE :LOOP - PLY ; restore Y + BNE @LOOP + + @END: PLY ; restore Y PLX ; restore X RTS -******************************** -* -* Send SD command -* Cmd is in A -* -******************************** +;******************************* +; +; Send SD command +; Cmd is in A +; +;******************************* -COMMAND PHY ; save Y +COMMAND: PHY ; save Y LDY SLOT STA DATA,X ; send command LDA R30,Y ; get arg from R30 on @@ -560,100 +567,100 @@ COMMAND PHY ; save Y RTS -******************************** -* -* Check for card detect -* -* C Clear - card in slot -* Set - no card in slot -* -******************************** +;******************************* +; +; Check for card detect +; +; C Clear - card in slot +; Set - no card in slot +; +;******************************* -CARDDET PHA +CARDDET: PHA LDA #CD ; 0: card in BIT SS,X ; 1: card out CLC - BEQ :DONE ; card is in + BEQ @DONE ; card is in SEC ; card is out -:DONE PLA +@DONE: PLA RTS -******************************** -* -* Check for write protect -* -* C Clear - card not protected -* Set - card write protected -* -******************************** +;******************************* +; +; Check for write protect +; +; C Clear - card not protected +; Set - card write protected +; +;******************************* -WRPROT PHA +WRPROT: PHA LDA #WP ; 0: write enabled BIT SS,X ; 1: write disabled CLC - BEQ :DONE + BEQ @DONE SEC -:DONE PLA +@DONE: PLA RTS -******************************** -* -* Status request -* $43 Unit number DSSS000 -* $44-45 Unused -* $46-47 Unused -* -* C Clear - No error -* Set - Error -* A $00 - No error -* $2B - Card write protected -* $2F - No card inserted -* X - Blocks avail (low byte) -* Y - Blocks avail (high byte) -* -******************************** - -STATUS LDA #0 ; no error - LDX #$FF ; 32 MB partition - LDY #$FF +;******************************* +; +; Status request +; $43 Unit number DSSS000 +; $44-45 Unused +; $46-47 Unused +; +; C Clear - No error +; Set - Error +; A $00 - No error +; $2B - Card write protected +; $2F - No card inserted +; X - Blocks avail (low byte) +; Y - Blocks avail (high byte) +; +;******************************* +STATUS: LDA #0 ; no error JSR WRPROT - BCC :DONE + BCC @DONE LDA #$2B ; card write protected -:DONE RTS +@DONE: LDX #$FF ; 32 MB partition + LDY #$FF + RTS -******************************** -* -* Read 512 byte block -* $43 Unit number DSSS0000 -* $44-45 Address (LO/HI) of buffer -* $46-47 Block number (LO/HI) -* -* C Clear - No error -* Set - Error -* A $00 - No error -* $27 - Bad block number -* -******************************** +;******************************* +; +; Read 512 byte block +; $43 Unit number DSSS0000 +; $44-45 Address (LO/HI) of buffer +; $46-47 Block number (LO/HI) +; +; C Clear - No error +; Set - Error +; A $00 - No error +; $27 - Bad block number +; +;******************************* -READ JSR GETBLOCK ; calc block address +READ: JSR GETBLOCK ; calc block address LDA SS,X ; enable /CS - AND #$FF!SS0 + AND #<~SS0 STA SS,X LDA #$51 ; send CMD17 JSR COMMAND ; send command - BNE :ERROR ; check for error + CMP #0 + BNE @ERROR ; check for error -:GETTOK LDA #DUMMY ; get data token +@GETTOK: LDA #DUMMY ; get data token STA DATA,X LDA DATA,X ; get response CMP #$FE - BNE :GETTOK ; wait for $FE + BNE @GETTOK ; wait for $FE LDA CTRL,X ; enable FRX ORA #FRX @@ -662,28 +669,28 @@ READ JSR GETBLOCK ; calc block address STA DATA,X LDY #0 -:LOOP1 LDA DATA,X ; read data from card +@LOOP1: LDA DATA,X ; read data from card STA (BUFFER),Y INY - BNE :LOOP1 + BNE @LOOP1 INC BUFFER+1 ; inc msb on page boundary -:LOOP2 LDA DATA,X +@LOOP2: LDA DATA,X STA (BUFFER),Y INY - BNE :LOOP2 + BNE @LOOP2 DEC BUFFER+1 -:CRC LDA DATA,X ; read two bytes crc +@CRC: LDA DATA,X ; read two bytes crc LDA DATA,X ; and ignore LDA DATA,X ; read a dummy byte LDA CTRL,X ; disable FRX - AND #$FF!FRX + AND #<~FRX STA CTRL,X CLC ; no error LDA #0 -:DONE PHP +@DONE: PHP PHA LDA SS,X ORA #SS0 @@ -692,37 +699,38 @@ READ JSR GETBLOCK ; calc block address PLP RTS -:ERROR SEC ; an error occured +@ERROR: SEC ; an error occured LDA #$27 - BRA :DONE + BRA @DONE -******************************** -* -* Write 512 byte block -* $43 Unit number DSSS0000 -* $44-45 Address (LO/HI) of buffer -* $46-47 Block number (LO/HI) -* -* C Clear - No error -* Set - Error -* A $00 - No error -* $27 - I/O error or bad block number -* $2B - Card write protected -* -******************************** +;******************************* +; +; Write 512 byte block +; $43 Unit number DSSS0000 +; $44-45 Address (LO/HI) of buffer +; $46-47 Block number (LO/HI) +; +; C Clear - No error +; Set - Error +; A $00 - No error +; $27 - I/O error or bad block number +; $2B - Card write protected +; +;******************************* -WRITE JSR WRPROT - BCS :WPERROR ; card write protected +WRITE: JSR WRPROT + BCS @WPERROR ; card write protected JSR GETBLOCK ; calc block address LDA SS,X ; enable /CS - AND #$FF!SS0 + AND #<~SS0 STA SS,X LDA #$58 ; send CMD24 JSR COMMAND ; send command - BNE :IOERROR ; check for error + CMP #0 + BNE @IOERROR ; check for error LDA #DUMMY STA DATA,X ; send dummy @@ -730,18 +738,18 @@ WRITE JSR WRPROT STA DATA,X ; send data token LDY #0 -:LOOP1 LDA (BUFFER),Y - STA DATA,X : - INY - BNE :LOOP1 - INC BUFFER+1 : -:LOOP2 LDA (BUFFER),Y +@LOOP1: LDA (BUFFER),Y STA DATA,X INY - BNE :LOOP2 + BNE @LOOP1 + INC BUFFER+1 +@LOOP2: LDA (BUFFER),Y + STA DATA,X + INY + BNE @LOOP2 DEC BUFFER+1 -:CRC LDA #DUMMY +@CRC: LDA #DUMMY STA DATA,X ; send 2 dummy crc bytes STA DATA,X @@ -749,16 +757,16 @@ WRITE JSR WRPROT LDA DATA,X AND #$1F CMP #$05 - BNE :IOERROR ; check for write error + BNE @IOERROR ; check for write error CLC ; no error LDA #0 -:DONE PHP +@DONE: PHP PHA -:WAIT LDA #DUMMY +@WAIT: LDA #DUMMY STA DATA,X ; wait for write cycle LDA DATA,X ; to complete - BEQ :WAIT + BEQ @WAIT LDA SS,X ; disable /CS ORA #SS0 @@ -767,43 +775,43 @@ WRITE JSR WRPROT PLP RTS -:IOERROR SEC ; an error occured +@IOERROR: SEC ; an error occured LDA #$27 - BRA :DONE + BRA @DONE -:WPERROR SEC +@WPERROR: SEC LDA #$2B - BRA :DONE + BRA @DONE -******************************** -* -* Format -* not supported! -* -******************************** +;******************************* +; +; Format +; not supported! +; +;******************************* -FORMAT SEC +FORMAT: SEC LDA #$01 ; invalid command RTS -******************************** -* -* Test routine -* -******************************** +;******************************* +; +; Test routine +; +;******************************* -TEST LDA SLOT16 +TEST: LDA SLOT16 PHA LDA SLOT PHA -* get buffer +; get buffer LDA #2 ; get 512 byte buffer JSR $BEF5 ; call GETBUFR - BCS :ERROR + BCS @ERROR STA BUFFER+1 STZ BUFFER PLA @@ -811,70 +819,70 @@ TEST LDA SLOT16 PLA STA SLOT16 -* fill buffer +; fill buffer LDY #0 -:LOOP TYA +@LOOP: TYA STA (BUFFER),Y INY - BNE :LOOP + BNE @LOOP INC BUFFER+1 -:LOOP1 TYA +@LOOP1: TYA STA (BUFFER),Y INY - BNE :LOOP1 + BNE @LOOP1 DEC BUFFER+1 STZ BLOCK ; block number STZ BLOCK+1 LDX SLOT16 -* write to card +; write to card JSR WRITE - BCS :ERROR + BCS @ERROR -* read from card +; read from card JSR READ - BCS :ERROR + BCS @ERROR -* check for errors +; check for errors LDY #0 -:LOOP2 TYA +@LOOP2: TYA CMP (BUFFER),Y - BNE :ERRCMP ; error in buffer + BNE @ERRCMP ; error in buffer INY - BNE :LOOP2 + BNE @LOOP2 INC BUFFER+1 -:LOOP3 TYA +@LOOP3: TYA CMP (BUFFER),Y - BNE :ERRCMP + BNE @ERRCMP INY - BNE :LOOP3 + BNE @LOOP3 DEC BUFFER+1 -* free buffer +; free buffer JSR $BEF8 ; call FREEBUFR CLC LDA #0 RTS -:ERROR BRK -:ERRCMP BRK +@ERROR: BRK +@ERRCMP: BRK -TEXT ASC "Apple][Sd (c)2017 Florian Reitz",00 +TEXT: .asciiz "Apple][Sd (c)2017 Florian Reitz" -CMD0 HEX 400000 - HEX 000095 -CMD1 HEX 410000 - HEX 0000F9 -CMD8 HEX 480000 - HEX 01AA87 -CMD16 HEX 500000 - HEX 0200FF -CMD55 HEX 770000 - HEX 000065 -ACMD4140 HEX 694000 - HEX 000077 -ACMD410 HEX 690000 - HEX 0000FF +CMD0: .byt $40, $00, $00 + .byt $00, $00, $95 +CMD1: .byt $41, $00, $00 + .byt $00, $00, $F9 +CMD8: .byt $48, $00, $00 + .byt $01, $AA, $87 +CMD16: .byt $50, $00, $00 + .byt $02, $00, $FF +CMD55: .byt $77, $00, $00 + .byt $00, $00, $65 +ACMD4140: .byt $69, $40, $00 + .byt $00, $00, $77 +ACMD410: .byt $69, $00, $00 + .byt $00, $00, $FF