From 4be091a1cb34235be4b2895f7c2be5f35d9e6deb Mon Sep 17 00:00:00 2001 From: Florian Reitz Date: Sun, 3 Dec 2017 22:18:37 +0100 Subject: [PATCH 1/3] Helper and include files added --- AppleIISd.bin | Bin 2048 -> 2048 bytes AppleIISd.vcxproj | 2 + AppleIISd.vcxproj.filters | 6 + src/AppleIISd.inc | 44 ++++++++ src/AppleIISd.s | 229 ++------------------------------------ src/Helper.s | 206 ++++++++++++++++++++++++++++++++++ 6 files changed, 268 insertions(+), 219 deletions(-) create mode 100644 src/AppleIISd.inc create mode 100644 src/Helper.s diff --git a/AppleIISd.bin b/AppleIISd.bin index bed161494752fb5c3d4f8aa82a3888f38b455230..f47849fb9937d5c11f941b78600b1207c59e7630 100644 GIT binary patch delta 355 zcmZn=Xb_m7C35TJ2M*4LnE~u41U~B|9xz~4_;6~XotiYm$(4+)PRq30oL6$Sx~90K zxC8laI{(irFifmBVFD`JD$n!jL<7G9!^s9Nh0K!^A9&R>wmPgl)#|9AeM-Up)Jet* zjw^W)A`u`Fqm_~f5&Kgs<&k+O89zKY$#8*tZ}S08fw|2Ge0HAjd2j+r$4XT+<&S~N znSshyvV$b#5LSQq29!}>DU7Us@^MCOxs?nGe@;zcTB*J0|APMs3SFmwmTCS2TDCG! z;l!!QZ<(S*{+!y7jw}%Yl89zrJNXl%9+Um4$x2KUW$aH?C3viKuxUOZ@qy7I1ISi@ Pvo{N}yl0-Qz`_XtHbtH> delta 333 zcmZn=Xb_m7C9?h02M*4LnE~u41U~B|9xz~4*nV=NotpIBlPeipotA00Ij`hubxm6~5)pH3*Sojl2S z!Exm)gor#y#AxL=gb3Tom4A?VCmBCHILUB + + {9EA7EC3D-1771-420F-932F-231A35ED1200} diff --git a/AppleIISd.vcxproj.filters b/AppleIISd.vcxproj.filters index 2f91e44..9a84f19 100644 --- a/AppleIISd.vcxproj.filters +++ b/AppleIISd.vcxproj.filters @@ -10,6 +10,12 @@ + + src + + + src + diff --git a/src/AppleIISd.inc b/src/AppleIISd.inc new file mode 100644 index 0000000..47a9012 --- /dev/null +++ b/src/AppleIISd.inc @@ -0,0 +1,44 @@ +;******************************* +; +; Apple][Sd Firmware +; Version 1.0 +; +; (c) Florian Reitz, 2017 +; +; X register usually contains SLOT16 +; Y register is used for counting or SLOT +; +;******************************* + +; Memory defines + +SLOT16 := $2B ; $s0 -> slot * 16 +SLOT := $3D ; $0s +CMDLO := $40 +CMDHI := $41 + +DCMD := $42 ; Command code +BUFFER := $44 ; Buffer address +BLOCK := $46 ; Block number + +R30 := $0478 +R31 := $04F8 +R32 := $0578 +R33 := $05F8 +CURSLOT := $07F8 ; $Cs +OAPPLE := $C061 ; open apple key +DATA := $C080 +CTRL := DATA+1 +DIV := DATA+2 +SS := DATA+3 + +; Constants + +DUMMY = $FF +FRX = $10 ; CTRL register +ECE = $04 +SS0 = $01 ; SS register +SDHC = $10 +WP = $20 +CD = $40 +INITED = $80 diff --git a/src/AppleIISd.s b/src/AppleIISd.s index 28e6426..78bd3d4 100644 --- a/src/AppleIISd.s +++ b/src/AppleIISd.s @@ -10,41 +10,17 @@ ; ;******************************* +.import COMMAND +.import SDCMD +.import GETBLOCK +.import CARDDET +.import WRPROT +.import GETR1 +.import GETR3 + +.include "AppleIISd.inc" + .define DEBUG 0 - -; Memory defines - -SLOT16 := $2B ; $s0 -> slot * 16 -SLOT := $3D ; $0s -CMDLO := $40 -CMDHI := $41 - -DCMD := $42 ; Command code -BUFFER := $44 ; Buffer address -BLOCK := $46 ; Block number - -R30 := $0478 -R31 := $04F8 -R32 := $0578 -R33 := $05F8 -CURSLOT := $07F8 ; $Cs -OAPPLE := $C061 ; open apple key -DATA := $C080 -CTRL := DATA+1 -DIV := DATA+2 -SS := DATA+3 - -; Constants - -DUMMY = $FF -FRX = $10 ; CTRL register -ECE = $04 -SS0 = $01 ; SS register -SDHC = $10 -WP = $20 -CD = $40 -INITED = $80 - ; signature bytes @@ -431,190 +407,6 @@ INIT: LDA #$03 ; set SPI mode 3 RTS -;******************************* -; -; Send SD command -; Call with command in CMDHI and CMDLO -; -;******************************* - -SDCMD: PHY - LDY #0 -@LOOP: LDA (CMDLO),Y - STA DATA,X -@WAIT: BIT CTRL,X ; TC is in N - BPL @WAIT - INY - CPY #6 - BCC @LOOP - PLY - RTS - - -;******************************* -; -; Get R1 -; R1 is in A -; -;******************************* - -GETR1: LDA #DUMMY - STA DATA,X -@WAIT: BIT CTRL,X - BPL @WAIT - LDA DATA,X ; get response - BIT #$80 - BNE GETR1 ; wait for MSB=0 - PHA - LDA #DUMMY - STA DATA,X ; send another dummy - PLA ; restore R1 - RTS - -;******************************* -; -; Get R3 -; R1 is in A -; R3 is in scratchpad ram -; -;******************************* - -GETR3: JSR GETR1 ; get R1 first - PHA ; save R1 - PHY ; save Y - LDY #04 ; load counter -@LOOP: LDA #DUMMY ; send dummy - STA DATA,X -@WAIT: BIT CTRL,X - BPL @WAIT - LDA DATA,X - PHA - DEY - BNE @LOOP ; do 4 times - LDY SLOT - PLA - STA R33,Y ; save R3 - PLA - STA R32,Y - PLA - STA R31,Y - PLA - STA R30,Y - PLY ; restore Y - LDA #DUMMY - STA DATA,X ; send another dummy - PLA ; restore R1 - RTS - - -;******************************* -; -; Calculate block address -; Unit number is in $43 DSSS0000 -; Block no is in $46-47 -; Address is in R30-R33 -; -;******************************* - -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 - LDA BLOCK+1 - STA R32,X - LDA #0 - STA R31,X - STA R30,X - - LDA #$80 ; drive number - AND $43 - BEQ @SDHC ; D1 - LDA #1 ; D2 - STA R31,X - -@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 - - @END: PLY ; restore Y - PLX ; restore X - RTS - - -;******************************* -; -; Send SD command -; Cmd is in A -; -;******************************* - -COMMAND: PHY ; save Y - LDY SLOT - STA DATA,X ; send command - LDA R30,Y ; get arg from R30 on - STA DATA,X - LDA R31,Y - STA DATA,X - LDA R32,Y - STA DATA,X - LDA R33,Y - STA DATA,X - LDA #DUMMY - STA DATA,X ; dummy crc - JSR GETR1 - PLY ; restore Y - RTS - - -;******************************* -; -; Check for card detect -; -; C Clear - card in slot -; Set - no card in slot -; -;******************************* - -CARDDET: PHA - LDA #CD ; 0: card in - BIT SS,X ; 1: card out - CLC - BEQ @DONE ; card is in - SEC ; card is out -@DONE: PLA - RTS - - -;******************************* -; -; Check for write protect -; -; C Clear - card not protected -; Set - card write protected -; -;******************************* - -WRPROT: PHA - LDA #WP ; 0: write enabled - BIT SS,X ; 1: write disabled - CLC - BEQ @DONE - SEC -@DONE: PLA - RTS - - ;******************************* ; ; Status request @@ -885,4 +677,3 @@ ACMD4140: .byt $69, $40, $00 .byt $00, $00, $77 ACMD410: .byt $69, $00, $00 .byt $00, $00, $FF - diff --git a/src/Helper.s b/src/Helper.s new file mode 100644 index 0000000..1855d46 --- /dev/null +++ b/src/Helper.s @@ -0,0 +1,206 @@ +;******************************* +; +; Apple][Sd Firmware +; Version 1.0 +; +; (c) Florian Reitz, 2017 +; +; X register usually contains SLOT16 +; Y register is used for counting or SLOT +; +;******************************* + +.export COMMAND +.export SDCMD +.export GETBLOCK +.export CARDDET +.export WRPROT +.export GETR1 +.export GETR3 + +.include "AppleIISd.inc" +.segment "EXTROM" + + +;******************************* +; +; Send SD command +; Call with command in CMDHI and CMDLO +; +;******************************* + +SDCMD: PHY + LDY #0 +@LOOP: LDA (CMDLO),Y + STA DATA,X +@WAIT: BIT CTRL,X ; TC is in N + BPL @WAIT + INY + CPY #6 + BCC @LOOP + PLY + RTS + + +;******************************* +; +; Get R1 +; R1 is in A +; +;******************************* + +GETR1: LDA #DUMMY + STA DATA,X +@WAIT: BIT CTRL,X + BPL @WAIT + LDA DATA,X ; get response + BIT #$80 + BNE GETR1 ; wait for MSB=0 + PHA + LDA #DUMMY + STA DATA,X ; send another dummy + PLA ; restore R1 + RTS + +;******************************* +; +; Get R3 +; R1 is in A +; R3 is in scratchpad ram +; +;******************************* + +GETR3: JSR GETR1 ; get R1 first + PHA ; save R1 + PHY ; save Y + LDY #04 ; load counter +@LOOP: LDA #DUMMY ; send dummy + STA DATA,X +@WAIT: BIT CTRL,X + BPL @WAIT + LDA DATA,X + PHA + DEY + BNE @LOOP ; do 4 times + LDY SLOT + PLA + STA R33,Y ; save R3 + PLA + STA R32,Y + PLA + STA R31,Y + PLA + STA R30,Y + PLY ; restore Y + LDA #DUMMY + STA DATA,X ; send another dummy + PLA ; restore R1 + RTS + + +;******************************* +; +; Calculate block address +; Unit number is in $43 DSSS0000 +; Block no is in $46-47 +; Address is in R30-R33 +; +;******************************* + +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 + LDA BLOCK+1 + STA R32,X + LDA #0 + STA R31,X + STA R30,X + + LDA #$80 ; drive number + AND $43 + BEQ @SDHC ; D1 + LDA #1 ; D2 + STA R31,X + +@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 + + @END: PLY ; restore Y + PLX ; restore X + RTS + + +;******************************* +; +; Send SD command +; Cmd is in A +; +;******************************* + +COMMAND: PHY ; save Y + LDY SLOT + STA DATA,X ; send command + LDA R30,Y ; get arg from R30 on + STA DATA,X + LDA R31,Y + STA DATA,X + LDA R32,Y + STA DATA,X + LDA R33,Y + STA DATA,X + LDA #DUMMY + STA DATA,X ; dummy crc + JSR GETR1 + PLY ; restore Y + RTS + + +;******************************* +; +; Check for card detect +; +; C Clear - card in slot +; Set - no card in slot +; +;******************************* + +CARDDET: PHA + LDA #CD ; 0: card in + BIT SS,X ; 1: card out + CLC + BEQ @DONE ; card is in + SEC ; card is out +@DONE: PLA + RTS + + +;******************************* +; +; Check for write protect +; +; C Clear - card not protected +; Set - card write protected +; +;******************************* + +WRPROT: PHA + LDA #WP ; 0: write enabled + BIT SS,X ; 1: write disabled + CLC + BEQ @DONE + SEC +@DONE: PLA + RTS From f656800697b94221d86cfb3568c49f53012d22a2 Mon Sep 17 00:00:00 2001 From: Florian Reitz Date: Sun, 17 Dec 2017 20:21:30 +0100 Subject: [PATCH 2/3] Updated to V1.1 --- src/AppleIISd.s | 52 +++++++++++++++++++++++++++++++++++++++---------- src/Helper.s | 8 +++++--- 2 files changed, 47 insertions(+), 13 deletions(-) diff --git a/src/AppleIISd.s b/src/AppleIISd.s index 78bd3d4..9fc3ce3 100644 --- a/src/AppleIISd.s +++ b/src/AppleIISd.s @@ -1,7 +1,8 @@ ;******************************* ; ; Apple][Sd Firmware -; Version 1.0 +; Version 1.1 +; Main source ; ; (c) Florian Reitz, 2017 ; @@ -138,6 +139,8 @@ ;******************************* .else +;@BOOT: CMP #0 +; BNE @NEXTSLOT ; init not successful @BOOT: LDA #$01 STA DCMD ; load command LDX SLOT16 @@ -264,7 +267,17 @@ DRIVER: CLD RTS -; Signature bytes +;******************************* +; +; Signature bytes +; +; 65535 blocks +; Removable media +; Non-interruptable +; 2 drives +; Read, write and status allowed +; +;******************************* .segment "SLOTID" .dbyt $FFFF ; 65535 blocks @@ -317,18 +330,22 @@ INIT: LDA #$03 ; set SPI mode 3 LDA #>CMD8 STA CMDHI JSR SDCMD - JSR GETR3 + JSR GETR3 ; R7 is also 1+4 bytes CMP #$01 BNE @SDV1 ; may be SD Ver. 1 -; check for $01aa match! + LDY SLOT ; check for $aa in R33 + LDA R33,Y + CMP #$AA + BNE @ERROR1 ; error! + @SDV2: LDA #CMD55 STA CMDHI JSR SDCMD JSR GETR1 - LDA #ACMD4140 STA CMDHI @@ -338,12 +355,25 @@ INIT: LDA #$03 ; set SPI mode 3 BEQ @SDV2 ; wait for ready CMP #0 BNE @ERROR1 ; error! -; send CMD58 + ; SD Ver. 2 initialized! - LDA SS,X + LDA #CMD58 + STA CMDHI + JSR SDCMD + JSR GETR3 + CMP #0 + BNE @ERROR1 ; error! + LDY SLOT + LDA R30,Y + AND #$40 ; check CCS + BEQ @BLOCKSZ + + LDA SS,X ; card is SDHC ORA #SDHC STA SS,X - JMP @BLOCKSZ + JMP @END @ERROR1: JMP @IOERROR ; needed for far jump @@ -661,7 +691,7 @@ TEST: LDA SLOT16 .endif -TEXT: .asciiz " Apple][Sd v1.0 (c)2017 Florian Reitz" +TEXT: .asciiz " Apple][Sd v1.1 (c)2017 Florian Reitz" CMD0: .byt $40, $00, $00 .byt $00, $00, $95 @@ -672,7 +702,9 @@ CMD8: .byt $48, $00, $00 CMD16: .byt $50, $00, $00 .byt $02, $00, $FF CMD55: .byt $77, $00, $00 - .byt $00, $00, $65 + .byt $00, $00, $FF +CMD58: .byt $7A, $00, $00 + .byt $00, $00, $FF ACMD4140: .byt $69, $40, $00 .byt $00, $00, $77 ACMD410: .byt $69, $00, $00 diff --git a/src/Helper.s b/src/Helper.s index 1855d46..4f7061c 100644 --- a/src/Helper.s +++ b/src/Helper.s @@ -1,7 +1,8 @@ ;******************************* ; ; Apple][Sd Firmware -; Version 1.0 +; Version 1.1 +; Helper functions ; ; (c) Florian Reitz, 2017 ; @@ -64,7 +65,7 @@ GETR1: LDA #DUMMY ;******************************* ; -; Get R3 +; Get R3 or R7 ; R1 is in A ; R3 is in scratchpad ram ; @@ -74,6 +75,7 @@ GETR3: JSR GETR1 ; get R1 first PHA ; save R1 PHY ; save Y LDY #04 ; load counter + JMP @WAIT ; first byte is already there @LOOP: LDA #DUMMY ; send dummy STA DATA,X @WAIT: BIT CTRL,X @@ -90,7 +92,7 @@ GETR3: JSR GETR1 ; get R1 first PLA STA R31,Y PLA - STA R30,Y + STA R30,Y ; R30 is MSB PLY ; restore Y LDA #DUMMY STA DATA,X ; send another dummy From 13bfa3022725b36d201c33b9512637673ef36d4c Mon Sep 17 00:00:00 2001 From: Florian Reitz Date: Sun, 17 Dec 2017 20:39:59 +0100 Subject: [PATCH 3/3] ProDOS functions moved to separate file Debug functions removed --- AppleIISd.bin | Bin 2048 -> 2048 bytes AppleIISd.vcxproj | 1 + AppleIISd.vcxproj.filters | 3 + src/AppleIISd.inc | 3 +- src/AppleIISd.s | 386 +++----------------------------------- src/ProDOS.s | 205 ++++++++++++++++++++ 6 files changed, 241 insertions(+), 357 deletions(-) create mode 100644 src/ProDOS.s diff --git a/AppleIISd.bin b/AppleIISd.bin index f47849fb9937d5c11f941b78600b1207c59e7630..7fd67506259b4d507a13624229f075c668604caf 100644 GIT binary patch delta 398 zcmZn=Xb_m7B`kLG0|#fr%mDTi0-tpf4;Zj2m`=1+mx(^LlCjlknRc7=O0HJd6qgit zAm2^r|9OSzQxhAE8BHf{QQ+}C)xZzrH*hH&IW_TtSG{ek!^)GbjtaRa6&g>TWW12N z(i0&v3nUV@#CGQo)|0C)c&!XYNHv~ZnTX6g$@t;HNrnq*E29yjK^Cy8$)cgl@;>th;-pTw-(ZY_WHl!nqM*ziZnPN8! IvYciH0BI<&i~s-t delta 379 zcmZn=Xb_m7C4B4T2M*4LnE~u41U~B|9xz~4_%P8{U54T0O2$^FW!i1dE4f--Q(RKq zfqXZe|K}ALPEKqvX8bU5ivrK56Ak=8egl_6=E;c{i&7m$h?z`A0C`!xWK))`2eTD+~xy5J5TsLIDw>Nr7D{8$3W%G zKxHf0K@xHZt3P}L%BZgtMpi%hHKVrdN(O~LrzSA1)L!&|!T$t>u2VqEH2(oDTN$Wu zVsaL9wD6x(8`6=*BY@&Jm}3PL6dVf*a#CZXgHsgB4D}2qt1+1{rcO>|vSPD8 + {9EA7EC3D-1771-420F-932F-231A35ED1200} diff --git a/AppleIISd.vcxproj.filters b/AppleIISd.vcxproj.filters index 9a84f19..5c8a181 100644 --- a/AppleIISd.vcxproj.filters +++ b/AppleIISd.vcxproj.filters @@ -16,6 +16,9 @@ src + + src + diff --git a/src/AppleIISd.inc b/src/AppleIISd.inc index 47a9012..1492ace 100644 --- a/src/AppleIISd.inc +++ b/src/AppleIISd.inc @@ -1,7 +1,8 @@ ;******************************* ; ; Apple][Sd Firmware -; Version 1.0 +; Version 1.1 +; Defines ; ; (c) Florian Reitz, 2017 ; diff --git a/src/AppleIISd.s b/src/AppleIISd.s index 9fc3ce3..9e3c3a2 100644 --- a/src/AppleIISd.s +++ b/src/AppleIISd.s @@ -11,19 +11,42 @@ ; ;******************************* -.import COMMAND -.import SDCMD -.import GETBLOCK -.import CARDDET -.import WRPROT .import GETR1 .import GETR3 +.import SDCMD +.import CARDDET +.import STATUS +.import READ +.import WRITE .include "AppleIISd.inc" -.define DEBUG 0 -; signature bytes +;******************************* +; +; Signature bytes +; +; 65535 blocks +; Removable media +; Non-interruptable +; 2 drives +; Read, write and status allowed +; +;******************************* + + .segment "SLOTID" + .dbyt $FFFF ; 65535 blocks + .byt $97 ; Status bits + .byt DRIVER - STA $BF11,X -@INSOUT: RTS - - ;******************************* ; ; Boot from SD card ; ;******************************* - .else ;@BOOT: CMP #0 ; BNE @NEXTSLOT ; init not successful @BOOT: LDA #$01 @@ -167,7 +131,6 @@ JSR READ ; call driver LDX SLOT16 JMP $801 ; goto bootloader - .endif ;******************************* @@ -187,15 +150,6 @@ DRIVER: CLD PHA LDA CMDHI PHA - - .if DEBUG - LDA #$04 - STA SLOT - LDA #$C4 - STA CURSLOT - LDA #$40 - - .else PHP SEI LDA #$60 ; opcode for RTS @@ -211,7 +165,6 @@ DRIVER: CLD ASL A ASL A ASL A - .endif STA SLOT16 ; $s0 TAX ; X holds now SLOT16 @@ -231,10 +184,6 @@ DRIVER: CLD BEQ @READ CMP #2 BEQ @WRITE - .if DEBUG - CMP #$FF - BEQ @TEST - .endif LDA #1 ; unknown command SEC BRA @RESTZP @@ -245,10 +194,6 @@ DRIVER: CLD BRA @RESTZP @WRITE: JSR WRITE BRA @RESTZP - .if DEBUG -@TEST: JSR TEST ; do device test - BRA @RESTZP - .endif @INIT: JSR INIT BCC @CMD ; init ok @@ -267,23 +212,6 @@ DRIVER: CLD RTS -;******************************* -; -; Signature bytes -; -; 65535 blocks -; Removable media -; Non-interruptable -; 2 drives -; Read, write and status allowed -; -;******************************* - - .segment "SLOTID" - .dbyt $FFFF ; 65535 blocks - .byt $97 ; Status bits - .byt