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__;
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 {

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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