forked from Apple-2-HW/AppleIISd
ProDOS jump table moved
This commit is contained in:
parent
048d1df99a
commit
515c19684e
@ -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 {
|
||||
|
@ -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
|
||||
|
@ -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 ; LSB of driver
|
||||
|
||||
|
||||
@ -53,7 +52,7 @@
|
||||
LDX #$20
|
||||
LDX #$00
|
||||
LDX #$03
|
||||
LDX #$3C
|
||||
LDX #$00 ; is Smartport controller
|
||||
|
||||
PRODOS:
|
||||
SEI ; no interrupts if booting
|
||||
@ -87,8 +86,8 @@ PRODOS:
|
||||
LDA #$08
|
||||
STA BUFFER+1 ; buffer hi
|
||||
STZ BUFFER ; buffer lo
|
||||
STZ BLOCK+1 ; block hi
|
||||
STZ BLOCK ; block lo
|
||||
STZ BLOCKNUM+1 ; block hi
|
||||
STZ BLOCKNUM ; block lo
|
||||
LDA #>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
|
||||
|
29
src/Helper.s
29
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
|
||||
|
39
src/ProDOS.s
39
src/ProDOS.s
@ -11,6 +11,7 @@
|
||||
;
|
||||
;*******************************
|
||||
|
||||
.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
|
||||
@ -45,7 +76,7 @@
|
||||
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
|
||||
|
Loading…
Reference in New Issue
Block a user