mirror of
https://github.com/freitz85/AppleIISd.git
synced 2024-09-29 20:54:26 +00:00
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__;
|
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 {
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
29
src/Helper.s
29
src/Helper.s
@ -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
|
||||||
|
39
src/ProDOS.s
39
src/ProDOS.s
@ -11,6 +11,7 @@
|
|||||||
;
|
;
|
||||||
;*******************************
|
;*******************************
|
||||||
|
|
||||||
|
.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
|
||||||
@ -45,7 +76,7 @@
|
|||||||
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
|
||||||
|
Loading…
Reference in New Issue
Block a user