ProDOS jump table moved

This commit is contained in:
Florian Reitz 2018-05-13 17:58:41 +02:00
parent 048d1df99a
commit 515c19684e
5 changed files with 95 additions and 83 deletions

View File

@ -10,7 +10,7 @@ MEMORY {
BSS: file = "", start = __MAIN_LAST__, size = $C000 - __MAIN_LAST__; BSS: file = "", start = __MAIN_LAST__, size = $C000 - __MAIN_LAST__;
SLOTROM: file = %O, fill = yes start = $C700, size = $00FC; 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; EXTROM: file = %O, fill = yes start = $C800, size = $0700;
} }
SEGMENTS { SEGMENTS {

View File

@ -11,26 +11,31 @@
; ;
;******************************* ;*******************************
; ZP equates ; ZP locations
SLOT16 := $2B ; $s0 -> slot * 16 SLOT16 := $3E ; $s0 -> slot * 16
SLOT := $3D ; $0s SLOT := $3F ; $0s
CMDLO := $40 CMDLO := $40
CMDHI := $41 CMDHI := $41
PDZPAREA = SLOT16
PDZPSIZE = CMDHI-PDZPAREA+1
; ProDOS equates ; ProDOS
DCMD := $42 ; Command code DCMD := $42 ; Command code
DSNUMBER := $43 ; drive / slot number DSNUMBER := $43 ; drive / slot number
BUFFER := $44 ; buffer pointer 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 ; Ram equates
R30 := $0478 R30 := $0478
@ -58,14 +63,14 @@ INITED = $80
; Error codes ; Error codes
NO_ERR = $00 NO_ERR = $00
ERR_BAD_CMD = $01 ERR_BADCMD = $01
ERR_BAD_PCNT = $04 ERR_BADPCNT = $04
ERR_BUS_ERR = $06 ERR_BUSERR = $06
ERR_BAD_UNIT = $11 ERR_BADUNIT = $11
ERR_BAD_CTL = $21 ERR_BADCTL = $21
ERR_BAD_CTL_PARM = $22 ERR_BADCTLPARM = $22
ERR_IO_ERR = $27 ERR_IOERR = $27
ERR_NO_DRIVE = $28 ERR_NODRIVE = $28
ERR_NO_WRITE = $2B ERR_NOWRITE = $2B
ERR_BAD_BLOCK = $2D ERR_BADBLOCK = $2D
ERR_OFF_LINE = $2F ERR_OFFLINE = $2F

View File

@ -11,14 +11,12 @@
; ;
;******************************* ;*******************************
.import PD_DISP
.import SMARTPORT .import SMARTPORT
.import GETR1 .import GETR1
.import GETR3 .import GETR3
.import SDCMD .import SDCMD
.import CARDDET .import CARDDET
.import STATUS
.import READ
.import WRITE
.include "AppleIISd.inc" .include "AppleIISd.inc"
@ -30,14 +28,15 @@
; 65535 blocks ; 65535 blocks
; Removable media ; Removable media
; Non-interruptable ; Non-interruptable
; 4 drives ; 2 drives
; Read, write and status allowed ; Read, write and status allowed
; ;
;******************************* ;*******************************
.segment "SLOTID" .segment "SLOTID"
.dbyt $FFFF ; 65535 blocks .byt $0 ; not extended, no SCSI, no RAM
.byt $B7 ; Status bits .dbyt $0 ; use status call
.byt $97 ; Status bits
.byt <DRIVER ; LSB of driver .byt <DRIVER ; LSB of driver
@ -53,7 +52,7 @@
LDX #$20 LDX #$20
LDX #$00 LDX #$00
LDX #$03 LDX #$03
LDX #$3C LDX #$00 ; is Smartport controller
PRODOS: PRODOS:
SEI ; no interrupts if booting SEI ; no interrupts if booting
@ -87,8 +86,8 @@ PRODOS:
LDA #$08 LDA #$08
STA BUFFER+1 ; buffer hi STA BUFFER+1 ; buffer hi
STZ BUFFER ; buffer lo STZ BUFFER ; buffer lo
STZ BLOCK+1 ; block hi STZ BLOCKNUM+1 ; block hi
STZ BLOCK ; block lo STZ BLOCKNUM ; block lo
LDA #>DRIVER LDA #>DRIVER
JSR DRIVER ; call driver JSR DRIVER ; call driver
CMP #0 CMP #0
@ -100,9 +99,9 @@ PRODOS:
LDA #$0A LDA #$0A
STA BUFFER+1 ; buffer hi STA BUFFER+1 ; buffer hi
STZ BUFFER ; buffer lo STZ BUFFER ; buffer lo
STZ BLOCK+1 ; block hi STZ BLOCKNUM+1 ; block hi
LDA #$01 LDA #$01
STA BLOCK ; block lo STA BLOCKNUM ; block lo
JSR DRIVER ; call driver JSR DRIVER ; call driver
CMP #0 CMP #0
BNE @NEXTSLOT ; init not successful BNE @NEXTSLOT ; init not successful
@ -139,6 +138,7 @@ DRIVER: BRA @SAVEZP ; jump to ProDOS entry
AND #$0F AND #$0F
PLP PLP
STA SLOT ; $0s STA SLOT ; $0s
TAY ; Y holds now SLOT
ASL A ASL A
ASL A ASL A
ASL A ASL A
@ -149,33 +149,16 @@ DRIVER: BRA @SAVEZP ; jump to ProDOS entry
BIT $CFFF BIT $CFFF
JSR CARDDET JSR CARDDET
BCC @INITED BCC @INITED
LDA ERR_OFF_LINE; no card inserted LDA ERR_OFFLINE ; no card inserted
BRA @RESTZP BRA @RESTZP
@INITED: LDA #INITED ; check for init @INITED: LDA #INITED ; check for init
BIT SS,X BIT SS,X
BEQ @INIT BNE @PD_DISP
JSR INIT
BCS @RESTZP ; Init failed
; TODO use jump table @PD_DISP: JSR PD_DISP ; ProDOS dispatcher
@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
@RESTZP: TSX @RESTZP: TSX
STA $105,X ; save retval on stack STA $105,X ; save retval on stack
@ -336,7 +319,7 @@ INIT: LDA #$03 ; set SPI mode 3
BCC @END1 BCC @END1
@IOERROR: SEC @IOERROR: SEC
LDY ERR_IO_ERR ; init error LDY ERR_IOERR ; init error
@END1: LDA SS,X ; set CS high @END1: LDA SS,X ; set CS high
ORA #SS0 ORA #SS0
STA SS,X STA SS,X

View File

@ -113,34 +113,27 @@ GETBLOCK: PHX ; save X
PHY ; save Y PHY ; save Y
TXA TXA
TAY ; SLOT16 is now in Y TAY ; SLOT16 is now in Y
LDX SLOT LDX SLOT ; SLOT is now in X
LDA BLOCK ; store block num LDA BLOCKNUM ; store block num
STA R33,X ; in R30-R33 STA R33,X ; in R30-R33
LDA BLOCK+1 LDA BLOCKNUM+1
STA R32,X STA R32,X
STZ R31,X STZ R31,X
STZ R30,X STZ R30,X
LDA #$80 ; drive number TXA ; get SLOT
AND DSNUMBER EOR DSNUMBER
BEQ @SLOT ; D1 AND #$70 ; check only slot bits
LDA #1 ; D2 BEQ @DRIVE ; it is our slot
LDA #2 ; it is a phantom slot
STA R31,X STA R31,X
@SLOT: LDA SLOT @DRIVE: BIT DSNUMBER ; drive number
PHA ; save SLOT BPL @SDHC ; D1
LDA #$70 ; slot number * 16 LDA R31,X ; D2
AND DSNUMBER
STA SLOT
CPY SLOT
BEQ @RESTORE ; slot number = real slot?
LDA R31,X ; is phantom slot
INC A INC A
STA R31,X STA R31,X
@RESTORE: PLA ; restore SLOT
STA SLOT
@SDHC: LDA #SDHC @SDHC: LDA #SDHC
AND SS,Y ; if card is SDHC, AND SS,Y ; if card is SDHC,
BNE @END ; use block addressing BNE @END ; use block addressing

View File

@ -10,7 +10,8 @@
; Y register is used for counting or SLOT ; Y register is used for counting or SLOT
; ;
;******************************* ;*******************************
.export PD_DISP
.export STATUS .export STATUS
.export READ .export READ
.export WRITE .export WRITE
@ -26,6 +27,36 @@
.segment "EXTROM" .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 ; Status request
@ -42,10 +73,10 @@
; ;
;******************************* ;*******************************
STATUS: LDA NO_ERR ; no error STATUS: LDA NO_ERR ; no error
JSR WRPROT JSR WRPROT
BCC @DONE BCC @DONE
LDA ERR_NO_WRITE; card write protected LDA ERR_NOWRITE ; card write protected
@DONE: LDX #$FF ; 32 MB partition @DONE: LDX #$FF ; 32 MB partition
LDY #$FF LDY #$FF
@ -120,7 +151,7 @@ READ: JSR GETBLOCK ; calc block address
RTS RTS
@ERROR: SEC ; an error occured @ERROR: SEC ; an error occured
LDA ERR_IO_ERR LDA ERR_IOERR
BRA @DONE BRA @DONE
@ -196,9 +227,9 @@ WRITE: JSR WRPROT
RTS RTS
@IOERROR: SEC ; an error occured @IOERROR: SEC ; an error occured
LDA ERR_IO_ERR LDA ERR_IOERR
BRA @DONE BRA @DONE
@WPERROR: SEC @WPERROR: SEC
LDA ERR_NO_WRITE LDA ERR_NOWRITE
BRA @DONE BRA @DONE