forked from Apple-2-HW/AppleIISd
Prepared for Smartport
This commit is contained in:
parent
31817a481c
commit
457e8bff9c
@ -9,7 +9,7 @@ MEMORY {
|
|||||||
MAIN: file = %O, define = yes, start = %S, size = $C000 - %S;
|
MAIN: file = %O, define = yes, start = %S, size = $C000 - %S;
|
||||||
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 = $00FB;
|
||||||
SLOTID: file = %O, start = $C7FB, size = $0005;
|
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;
|
||||||
}
|
}
|
||||||
|
@ -12,11 +12,12 @@
|
|||||||
;*******************************
|
;*******************************
|
||||||
|
|
||||||
; ZP locations
|
; ZP locations
|
||||||
|
PSAVE := $3D ; P save location
|
||||||
SLOT16 := $3E ; $s0 -> slot * 16
|
SLOT16 := $3E ; $s0 -> slot * 16
|
||||||
SLOT := $3F ; $0s
|
SLOT := $3F ; $0s
|
||||||
CMDLO := $40
|
CMDLO := $40
|
||||||
CMDHI := $41
|
CMDHI := $41
|
||||||
PDZPAREA = SLOT16
|
PDZPAREA = PSAVE
|
||||||
PDZPSIZE = CMDHI-PDZPAREA+1
|
PDZPSIZE = CMDHI-PDZPAREA+1
|
||||||
|
|
||||||
; ProDOS
|
; ProDOS
|
||||||
@ -42,9 +43,11 @@ R30 := $0478
|
|||||||
R31 := $04F8
|
R31 := $04F8
|
||||||
R32 := $0578
|
R32 := $0578
|
||||||
R33 := $05F8
|
R33 := $05F8
|
||||||
|
DRVNUM := $0678
|
||||||
CURSLOT := $07F8 ; $Cs
|
CURSLOT := $07F8 ; $Cs
|
||||||
|
|
||||||
; Slot equates
|
; Rom equates
|
||||||
|
KNOWNRTS := $FF58
|
||||||
OAPPLE := $C061 ; open apple key
|
OAPPLE := $C061 ; open apple key
|
||||||
DATA := $C080
|
DATA := $C080
|
||||||
CTRL := DATA+1
|
CTRL := DATA+1
|
||||||
|
@ -11,12 +11,13 @@
|
|||||||
;
|
;
|
||||||
;*******************************
|
;*******************************
|
||||||
|
|
||||||
.import PD_DISP
|
.import PRODOS
|
||||||
.import SMARTPORT
|
.import SMARTPORT
|
||||||
.import GETR1
|
.import GETR1
|
||||||
.import GETR3
|
.import GETR3
|
||||||
.import SDCMD
|
.import SDCMD
|
||||||
.import CARDDET
|
.import CARDDET
|
||||||
|
.import READ
|
||||||
|
|
||||||
.include "AppleIISd.inc"
|
.include "AppleIISd.inc"
|
||||||
|
|
||||||
@ -55,9 +56,24 @@
|
|||||||
; LDX #$00 ; is Smartport controller
|
; LDX #$00 ; is Smartport controller
|
||||||
LDX #$3C
|
LDX #$3C
|
||||||
|
|
||||||
PRODOS:
|
SEI ; find slot
|
||||||
SEI ; no interrupts if booting
|
JSR KNOWNRTS
|
||||||
|
TSX
|
||||||
|
LDA $0100,X
|
||||||
|
CLI
|
||||||
|
STA CURSLOT ; $Cs
|
||||||
|
AND #$0F
|
||||||
|
STA SLOT ; $0s
|
||||||
|
TAY ; Y holds now SLOT
|
||||||
|
ASL A
|
||||||
|
ASL A
|
||||||
|
ASL A
|
||||||
|
ASL A
|
||||||
|
STA SLOT16 ; $s0
|
||||||
|
TAX ; X holds now SLOT16
|
||||||
BIT $CFFF
|
BIT $CFFF
|
||||||
|
|
||||||
|
|
||||||
; LDY #0 ; display copyright message
|
; LDY #0 ; display copyright message
|
||||||
;@DRAW: LDA TEXT,Y
|
;@DRAW: LDA TEXT,Y
|
||||||
; BEQ @OAPPLE ; check for NULL
|
; BEQ @OAPPLE ; check for NULL
|
||||||
@ -67,7 +83,7 @@ PRODOS:
|
|||||||
; BPL @DRAW
|
; BPL @DRAW
|
||||||
|
|
||||||
@OAPPLE: BIT OAPPLE ; check for OA key
|
@OAPPLE: BIT OAPPLE ; check for OA key
|
||||||
BPL @BOOT ; and skip boot if pressed
|
BPL @INIT ; and skip boot if pressed
|
||||||
|
|
||||||
@NEXTSLOT: LDA CURSLOT ; skip boot when no card
|
@NEXTSLOT: LDA CURSLOT ; skip boot when no card
|
||||||
DEC A
|
DEC A
|
||||||
@ -75,6 +91,9 @@ PRODOS:
|
|||||||
STZ CMDLO
|
STZ CMDLO
|
||||||
JMP (CMDLO)
|
JMP (CMDLO)
|
||||||
|
|
||||||
|
@INIT: JSR INIT
|
||||||
|
CMP #NO_ERR
|
||||||
|
BNE @NEXTSLOT ; init not successful
|
||||||
|
|
||||||
;*******************************
|
;*******************************
|
||||||
;
|
;
|
||||||
@ -82,31 +101,23 @@ PRODOS:
|
|||||||
;
|
;
|
||||||
;*******************************
|
;*******************************
|
||||||
|
|
||||||
@BOOT: LDA #$01 ; READ
|
; load disk blocks 0 and 1 to $800 and $A00
|
||||||
STA DCMD ; load command
|
@BOOT: LDA #$08 ; load to $800
|
||||||
LDA #$08
|
|
||||||
STA BUFFER+1 ; buffer hi
|
STA BUFFER+1 ; buffer hi
|
||||||
STZ BUFFER ; buffer lo
|
STZ BUFFER ; buffer lo
|
||||||
STZ BLOCKNUM+1 ; block hi
|
STZ BLOCKNUM+1 ; block hi
|
||||||
STZ BLOCKNUM ; block lo
|
STZ BLOCKNUM ; block lo
|
||||||
LDA #>DRIVER
|
JSR READ
|
||||||
JSR DRIVER ; call driver
|
BCS @NEXTSLOT ; load not successful
|
||||||
CMP #0
|
|
||||||
BNE @NEXTSLOT ; init not successful
|
|
||||||
|
|
||||||
LDA #$01 ; READ
|
|
||||||
STA DCMD ; load command
|
|
||||||
STX DSNUMBER ; slot number
|
|
||||||
LDA #$0A
|
LDA #$0A
|
||||||
STA BUFFER+1 ; buffer hi
|
STA BUFFER+1 ; buffer hi
|
||||||
STZ BUFFER ; buffer lo
|
STZ BUFFER ; buffer lo
|
||||||
STZ BLOCKNUM+1 ; block hi
|
STZ BLOCKNUM+1 ; block hi
|
||||||
LDA #$01
|
LDA #$01
|
||||||
STA BLOCKNUM ; block lo
|
STA BLOCKNUM ; block lo
|
||||||
JSR DRIVER ; call driver
|
JSR READ
|
||||||
CMP #0
|
BCS @NEXTSLOT ; load not successful
|
||||||
BNE @NEXTSLOT ; init not successful
|
|
||||||
LDX SLOT16
|
|
||||||
JMP $801 ; goto bootloader
|
JMP $801 ; goto bootloader
|
||||||
|
|
||||||
|
|
||||||
@ -120,37 +131,38 @@ DRIVER: CLC ; ProDOS entry
|
|||||||
BCC @PRODOS
|
BCC @PRODOS
|
||||||
SEC ; Smartport entry
|
SEC ; Smartport entry
|
||||||
|
|
||||||
@PRODOS: PHA ; make room for retval
|
@PRODOS: PHP ; transfer P to X
|
||||||
LDY PDZPSIZE-1 ; save zeropage area for ProDOS
|
PLX
|
||||||
|
LDY #PDZPSIZE-1 ; save zeropage area for ProDOS
|
||||||
@SAVEZP: LDA PDZPAREA,Y
|
@SAVEZP: LDA PDZPAREA,Y
|
||||||
PHA
|
PHA
|
||||||
DEY
|
DEY
|
||||||
BPL @SAVEZP
|
BPL @SAVEZP
|
||||||
|
STX PSAVE ; save X (P)
|
||||||
|
|
||||||
PHP ; push twice for PD/SP switch
|
; Has this to be done every time this gets called or only on boot???
|
||||||
PHP
|
|
||||||
SEI
|
SEI
|
||||||
LDA #$60 ; opcode for RTS
|
LDA #$60 ; opcode for RTS
|
||||||
STA SLOT
|
STA SLOT
|
||||||
JSR SLOT
|
JSR SLOT
|
||||||
TSX
|
TSX
|
||||||
LDA $0100,X
|
LDA $0100,X
|
||||||
|
CLI
|
||||||
STA CURSLOT ; $Cs
|
STA CURSLOT ; $Cs
|
||||||
AND #$0F
|
AND #$0F
|
||||||
PLP
|
|
||||||
STA SLOT ; $0s
|
STA SLOT ; $0s
|
||||||
TAY ; Y holds now SLOT
|
TAY ; Y holds now SLOT
|
||||||
ASL A
|
ASL A
|
||||||
ASL A
|
ASL A
|
||||||
ASL A
|
ASL A
|
||||||
ASL A
|
ASL A
|
||||||
|
|
||||||
STA SLOT16 ; $s0
|
STA SLOT16 ; $s0
|
||||||
TAX ; X holds now SLOT16
|
TAX ; X holds now SLOT16
|
||||||
BIT $CFFF
|
BIT $CFFF
|
||||||
|
|
||||||
JSR CARDDET
|
JSR CARDDET
|
||||||
BCC @INITED
|
BCC @INITED
|
||||||
LDA ERR_OFFLINE ; no card inserted
|
LDA #ERR_OFFLINE; no card inserted
|
||||||
BRA @END
|
BRA @END
|
||||||
|
|
||||||
@INITED: LDA #INITED ; check for init
|
@INITED: LDA #INITED ; check for init
|
||||||
@ -159,7 +171,9 @@ DRIVER: CLC ; ProDOS entry
|
|||||||
JSR INIT
|
JSR INIT
|
||||||
BCS @END ; Init failed
|
BCS @END ; Init failed
|
||||||
|
|
||||||
@DISP: PLP ; get PSW from stack
|
@DISP: LDA PSAVE ; get saved P value
|
||||||
|
PHA ; and transfer to P
|
||||||
|
PLP
|
||||||
BCS @SMARTPORT ; Smartport dispatcher
|
BCS @SMARTPORT ; Smartport dispatcher
|
||||||
JSR PRODOS ; ProDOS dispatcher
|
JSR PRODOS ; ProDOS dispatcher
|
||||||
|
|
||||||
@ -178,7 +192,7 @@ DRIVER: CLC ; ProDOS entry
|
|||||||
@RESTZP: PLA ; restore zeropage area
|
@RESTZP: PLA ; restore zeropage area
|
||||||
STA PDZPAREA,Y
|
STA PDZPAREA,Y
|
||||||
INY
|
INY
|
||||||
CPY PDZPSIZE
|
CPY #PDZPSIZE
|
||||||
BCC @RESTZP
|
BCC @RESTZP
|
||||||
|
|
||||||
LDA R33,X ; get retval
|
LDA R33,X ; get retval
|
||||||
@ -337,11 +351,11 @@ INIT: LDA #$03 ; set SPI mode 3
|
|||||||
ORA #ECE ; enable 7MHz
|
ORA #ECE ; enable 7MHz
|
||||||
STA CTRL,X
|
STA CTRL,X
|
||||||
CLC ; all ok
|
CLC ; all ok
|
||||||
LDY NO_ERR
|
LDY #NO_ERR
|
||||||
BCC @END1
|
BCC @END1
|
||||||
|
|
||||||
@IOERROR: SEC
|
@IOERROR: SEC
|
||||||
LDY ERR_IOERR ; 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
|
||||||
|
@ -112,6 +112,7 @@ GETR3: JSR GETR1 ; get R1 first
|
|||||||
GETBLOCK: PHX ; save X
|
GETBLOCK: PHX ; save X
|
||||||
PHY ; save Y
|
PHY ; save Y
|
||||||
LDX SLOT ; SLOT is now in X
|
LDX SLOT ; SLOT is now in X
|
||||||
|
LDY SLOT16
|
||||||
LDA BLOCKNUM ; store block num
|
LDA BLOCKNUM ; store block num
|
||||||
STA R33,X ; in R30-R33
|
STA R33,X ; in R30-R33
|
||||||
LDA BLOCKNUM+1
|
LDA BLOCKNUM+1
|
||||||
@ -119,7 +120,7 @@ GETBLOCK: PHX ; save X
|
|||||||
STZ R31,X
|
STZ R31,X
|
||||||
STZ R30,X
|
STZ R30,X
|
||||||
|
|
||||||
TXA ; get SLOT
|
TYA ; get SLOT16
|
||||||
EOR DSNUMBER
|
EOR DSNUMBER
|
||||||
AND #$70 ; check only slot bits
|
AND #$70 ; check only slot bits
|
||||||
BEQ @DRIVE ; it is our slot
|
BEQ @DRIVE ; it is our slot
|
||||||
@ -133,7 +134,6 @@ GETBLOCK: PHX ; save X
|
|||||||
STA R31,X
|
STA R31,X
|
||||||
|
|
||||||
@SDHC: LDA #SDHC
|
@SDHC: LDA #SDHC
|
||||||
LDY SLOT16 ; SLOT16 is now in Y
|
|
||||||
AND SS,Y ; if card is SDHC,
|
AND SS,Y ; if card is SDHC,
|
||||||
BNE @END ; use block addressing
|
BNE @END ; use block addressing
|
||||||
|
|
||||||
|
12
src/ProDOS.s
12
src/ProDOS.s
@ -48,7 +48,7 @@ PRODOS: LDA DCMD ; get command
|
|||||||
BEQ @READ
|
BEQ @READ
|
||||||
CMP #2
|
CMP #2
|
||||||
BEQ @WRITE
|
BEQ @WRITE
|
||||||
LDA ERR_BADCMD ; unknown command
|
LDA #ERR_BADCMD ; unknown command
|
||||||
SEC
|
SEC
|
||||||
RTS
|
RTS
|
||||||
|
|
||||||
@ -76,7 +76,7 @@ PRODOS: LDA DCMD ; get command
|
|||||||
STATUS: LDA NO_ERR ; no error
|
STATUS: LDA NO_ERR ; no error
|
||||||
JSR WRPROT
|
JSR WRPROT
|
||||||
BCC @DONE
|
BCC @DONE
|
||||||
LDA ERR_NOWRITE ; 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
|
||||||
@ -139,7 +139,7 @@ READ: JSR GETBLOCK ; calc block address
|
|||||||
AND #<~FRX
|
AND #<~FRX
|
||||||
STA CTRL,X
|
STA CTRL,X
|
||||||
CLC ; no error
|
CLC ; no error
|
||||||
LDA NO_ERR
|
LDA #NO_ERR
|
||||||
|
|
||||||
@DONE: PHP
|
@DONE: PHP
|
||||||
PHA
|
PHA
|
||||||
@ -151,7 +151,7 @@ READ: JSR GETBLOCK ; calc block address
|
|||||||
RTS
|
RTS
|
||||||
|
|
||||||
@ERROR: SEC ; an error occured
|
@ERROR: SEC ; an error occured
|
||||||
LDA ERR_IOERR
|
LDA #ERR_IOERR
|
||||||
BRA @DONE
|
BRA @DONE
|
||||||
|
|
||||||
|
|
||||||
@ -227,9 +227,9 @@ WRITE: JSR WRPROT
|
|||||||
RTS
|
RTS
|
||||||
|
|
||||||
@IOERROR: SEC ; an error occured
|
@IOERROR: SEC ; an error occured
|
||||||
LDA ERR_IOERR
|
LDA #ERR_IOERR
|
||||||
BRA @DONE
|
BRA @DONE
|
||||||
|
|
||||||
@WPERROR: SEC
|
@WPERROR: SEC
|
||||||
LDA ERR_NOWRITE
|
LDA #ERR_NOWRITE
|
||||||
BRA @DONE
|
BRA @DONE
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
|
|
||||||
|
|
||||||
.include "AppleIISd.inc"
|
.include "AppleIISd.inc"
|
||||||
.segment "SLOTROM"
|
.segment "EXTROM"
|
||||||
|
|
||||||
|
|
||||||
;*******************************
|
;*******************************
|
||||||
|
Loading…
Reference in New Issue
Block a user