diff --git a/src/AppleIISd.cfg b/src/AppleIISd.cfg index d8c0b60..8ce9bef 100644 --- a/src/AppleIISd.cfg +++ b/src/AppleIISd.cfg @@ -10,7 +10,7 @@ MEMORY { BSS: file = "", start = __MAIN_LAST__, size = $C000 - __MAIN_LAST__; SLOTROM: file = %O, fill = yes start = $C700, size = $00FC; - SLOTID: file = %O, start = $C7FC, size = $0004; + SLOTID: file = %O, start = $C7FB, size = $0005; EXTROM: file = %O, fill = yes start = $C800, size = $0700; } SEGMENTS { diff --git a/src/AppleIISd.inc b/src/AppleIISd.inc index 5c7312d..3ff3e04 100644 --- a/src/AppleIISd.inc +++ b/src/AppleIISd.inc @@ -11,26 +11,31 @@ ; ;******************************* -; ZP equates -SLOT16 := $2B ; $s0 -> slot * 16 -SLOT := $3D ; $0s +; ZP locations +SLOT16 := $3E ; $s0 -> slot * 16 +SLOT := $3F ; $0s CMDLO := $40 CMDHI := $41 +PDZPAREA = SLOT16 +PDZPSIZE = CMDHI-PDZPAREA+1 -; ProDOS equates +; ProDOS DCMD := $42 ; Command code DSNUMBER := $43 ; drive / slot number BUFFER := $44 ; buffer pointer -BLOCK := $46 ; block number +BLOCKNUM := $46 ; block number + + +; Smartport +SMPARAM := $48 ; parameter count +SMUNIT := $49 ; unit number +SMBUFF := $4A ; buffer pointer +SMSTAT := $4B ; status / control code +SMBLOCK := $4C ; block number +SMCOUNT := $4D ; byte count +SMADDR := $4E ; address for read + -; Smartport equates -SMPARAM := $43 ; parameter count -SMUNIT := $44 ; unit number -SMBUFF := $45 ; buffer pointer -SMSTAT := $47 ; status / control code -SMBLOCK := $47 ; block number -SMCOUNT := $47 ; byte count -SMADDR := $49 ; address for read ; Ram equates R30 := $0478 @@ -58,14 +63,14 @@ INITED = $80 ; Error codes NO_ERR = $00 -ERR_BAD_CMD = $01 -ERR_BAD_PCNT = $04 -ERR_BUS_ERR = $06 -ERR_BAD_UNIT = $11 -ERR_BAD_CTL = $21 -ERR_BAD_CTL_PARM = $22 -ERR_IO_ERR = $27 -ERR_NO_DRIVE = $28 -ERR_NO_WRITE = $2B -ERR_BAD_BLOCK = $2D -ERR_OFF_LINE = $2F +ERR_BADCMD = $01 +ERR_BADPCNT = $04 +ERR_BUSERR = $06 +ERR_BADUNIT = $11 +ERR_BADCTL = $21 +ERR_BADCTLPARM = $22 +ERR_IOERR = $27 +ERR_NODRIVE = $28 +ERR_NOWRITE = $2B +ERR_BADBLOCK = $2D +ERR_OFFLINE = $2F diff --git a/src/AppleIISd.s b/src/AppleIISd.s index bbfff56..8f36275 100644 --- a/src/AppleIISd.s +++ b/src/AppleIISd.s @@ -11,14 +11,12 @@ ; ;******************************* +.import PD_DISP .import SMARTPORT .import GETR1 .import GETR3 .import SDCMD .import CARDDET -.import STATUS -.import READ -.import WRITE .include "AppleIISd.inc" @@ -30,14 +28,15 @@ ; 65535 blocks ; Removable media ; Non-interruptable -; 4 drives +; 2 drives ; Read, write and status allowed ; ;******************************* .segment "SLOTID" - .dbyt $FFFF ; 65535 blocks - .byt $B7 ; Status bits + .byt $0 ; not extended, no SCSI, no RAM + .dbyt $0 ; use status call + .byt $97 ; Status bits .byt DRIVER JSR DRIVER ; call driver CMP #0 @@ -100,9 +99,9 @@ PRODOS: LDA #$0A STA BUFFER+1 ; buffer hi STZ BUFFER ; buffer lo - STZ BLOCK+1 ; block hi + STZ BLOCKNUM+1 ; block hi LDA #$01 - STA BLOCK ; block lo + STA BLOCKNUM ; block lo JSR DRIVER ; call driver CMP #0 BNE @NEXTSLOT ; init not successful @@ -139,6 +138,7 @@ DRIVER: BRA @SAVEZP ; jump to ProDOS entry AND #$0F PLP STA SLOT ; $0s + TAY ; Y holds now SLOT ASL A ASL A ASL A @@ -149,33 +149,16 @@ DRIVER: BRA @SAVEZP ; jump to ProDOS entry BIT $CFFF JSR CARDDET BCC @INITED - LDA ERR_OFF_LINE; no card inserted + LDA ERR_OFFLINE ; no card inserted BRA @RESTZP @INITED: LDA #INITED ; check for init BIT SS,X - BEQ @INIT + BNE @PD_DISP + JSR INIT + BCS @RESTZP ; Init failed -; TODO use jump table -@CMD: LDA DCMD ; get command - BEQ @STATUS ; branch if cmd is 0 - CMP #1 - BEQ @READ - CMP #2 - BEQ @WRITE - LDA ERR_BAD_CMD ; unknown command - SEC - BRA @RESTZP - -@STATUS: JSR STATUS - BRA @RESTZP -@READ: JSR READ - BRA @RESTZP -@WRITE: JSR WRITE - BRA @RESTZP - -@INIT: JSR INIT - BCC @CMD ; init ok +@PD_DISP: JSR PD_DISP ; ProDOS dispatcher @RESTZP: TSX STA $105,X ; save retval on stack @@ -336,7 +319,7 @@ INIT: LDA #$03 ; set SPI mode 3 BCC @END1 @IOERROR: SEC - LDY ERR_IO_ERR ; init error + LDY ERR_IOERR ; init error @END1: LDA SS,X ; set CS high ORA #SS0 STA SS,X diff --git a/src/Helper.s b/src/Helper.s index 3915b5e..ac70640 100644 --- a/src/Helper.s +++ b/src/Helper.s @@ -113,34 +113,27 @@ GETBLOCK: PHX ; save X PHY ; save Y TXA TAY ; SLOT16 is now in Y - LDX SLOT - LDA BLOCK ; store block num + LDX SLOT ; SLOT is now in X + LDA BLOCKNUM ; store block num STA R33,X ; in R30-R33 - LDA BLOCK+1 + LDA BLOCKNUM+1 STA R32,X STZ R31,X STZ R30,X - LDA #$80 ; drive number - AND DSNUMBER - BEQ @SLOT ; D1 - LDA #1 ; D2 + TXA ; get SLOT + EOR DSNUMBER + AND #$70 ; check only slot bits + BEQ @DRIVE ; it is our slot + LDA #2 ; it is a phantom slot STA R31,X -@SLOT: LDA SLOT - PHA ; save SLOT - LDA #$70 ; slot number * 16 - AND DSNUMBER - STA SLOT - CPY SLOT - BEQ @RESTORE ; slot number = real slot? - LDA R31,X ; is phantom slot +@DRIVE: BIT DSNUMBER ; drive number + BPL @SDHC ; D1 + LDA R31,X ; D2 INC A STA R31,X -@RESTORE: PLA ; restore SLOT - STA SLOT - @SDHC: LDA #SDHC AND SS,Y ; if card is SDHC, BNE @END ; use block addressing diff --git a/src/ProDOS.s b/src/ProDOS.s index 7d045d0..78152bb 100644 --- a/src/ProDOS.s +++ b/src/ProDOS.s @@ -10,7 +10,8 @@ ; Y register is used for counting or SLOT ; ;******************************* - + +.export PD_DISP .export STATUS .export READ .export WRITE @@ -26,6 +27,36 @@ .segment "EXTROM" +;******************************* +; +; ProDOS command dispatcher +; +; $42-$47 MLI input locations +; X Slot*16 +; Y Slot +; +; C Clear - No error +; Set - Error +; A $00 - No error +; $01 - Unknown command +; +;******************************* + +PD_DISP: LDA DCMD ; get command + BEQ @STATUS ; branch if cmd is 0 + CMP #1 + BEQ @READ + CMP #2 + BEQ @WRITE + LDA ERR_BADCMD ; unknown command + SEC + RTS + +@STATUS: JMP STATUS +@READ: JMP READ +@WRITE: JMP WRITE + + ;******************************* ; ; Status request @@ -42,10 +73,10 @@ ; ;******************************* -STATUS: LDA NO_ERR ; no error +STATUS: LDA NO_ERR ; no error JSR WRPROT BCC @DONE - LDA ERR_NO_WRITE; card write protected + LDA ERR_NOWRITE ; card write protected @DONE: LDX #$FF ; 32 MB partition LDY #$FF @@ -120,7 +151,7 @@ READ: JSR GETBLOCK ; calc block address RTS @ERROR: SEC ; an error occured - LDA ERR_IO_ERR + LDA ERR_IOERR BRA @DONE @@ -196,9 +227,9 @@ WRITE: JSR WRPROT RTS @IOERROR: SEC ; an error occured - LDA ERR_IO_ERR + LDA ERR_IOERR BRA @DONE @WPERROR: SEC - LDA ERR_NO_WRITE + LDA ERR_NOWRITE BRA @DONE