apple2pi/pidrive/c8rom.s

243 lines
3.2 KiB
ArmAsm
Raw Normal View History

;****************************************
;*
;* OPTION ROM SPACE @ $C800
;*
;****************************************
;*
;* RETURN SLOT*16 IN X REG, SLOT IN Y REG
;*
GETSLOT:
TSX
LDA $102,X ; GET MSB OF RETURN ADDRESS
STA IOSLOT
AND #$0F
TAY
LDA SLOT16
STA SAVE16,Y ; SAVE SLOT16 LOCATION
TYA
ASL
ASL
ASL
ASL
STA SLOT16
TAX
RTS
;*
;* OUTPUT BYTE TO ACIA
;*
SENDACC:
PHA
LDA SLOT16
ORA #$89+1 ; ACIASR
TAX
SENDWT: LDA $C000-1,X
AND #$10
BEQ SENDWT
DEX ; ACIADR
PLA
STA $C000-1,X ; AVOID PHANTOM READ OF DATA REG
RTS
;*
;* INPUT BYTE FROM ACIA
;*
RECVACC:
LDX SLOT16
RECVWT: LDA ACIASR,X
AND #$08
BEQ RECVWT
LDA ACIADR,X
RTS
;*
;* WAIT FOR DELAY
;*
WAIT: SEC
WAIT2: PHA
WAIT3: SBC #$01
BNE WAIT3
PLA
SBC #$01
BNE WAIT2
RTS
;*
;* SYNC WITH HOST
;*
SYNC: LDA INDCTR
PHA
LDA #$0B
STA ACIASR,X ; RESET STATUS REGISTER
STA ACIACR,X ; SET CONTROL REGISTER
LDA #$10
STA ACIAMR,X ; SET COMMAND REGISTER (115K BAUD)
LDA #$80
JSR WAIT
STA STROBE ; CLEAR KEYBOARD STROBE
SYNCLP: LDA #SYNC_REQ
JSR SENDACC
INY
TYA
AND #$07
TAY
LDA SPIN,Y
STA INDCTR
LDA #$FF
JSR WAIT
LDA KEYBD
BPL CHKRSP
STA STROBE
PLA
.IFNDEF DEBUG
STA INDCTR
.ENDIF
NODEV: LDA #PDNODEV
RTS
SPIN: DB $A1, $AF, $AD, $DC, $A1, $AF, $AD, $DC
CHKRSP: LDX SLOT16
LDA ACIASR,X
AND #$08
BEQ SYNCLP
LDA ACIADR,X
CMP #SYNC_ACK
BNE SYNCLP
LDA IOSLOT
AND #$0F
TAY
LDA #SYNC_ACK
STA SYNCED,Y
PLA
.IFNDEF DEBUG
STA INDCTR
.ENDIF
LDA #$00
RTS
RESYNC: JSR SYNC
BEQ DOCMD
RTS
;*
;* DO STATUS, READ, WRITE COMMAND
;*
DOCMD: LDA ACIACR,X ; CHECK FOR ANY REASON TO RESYNC
CMP #$0B
BNE RESYNC
LDA ACIAMR,X
CMP #$10
BNE RESYNC
LDA SYNCED,Y
CMP #SYNC_ACK
BNE RESYNC
LDA PDUNIT ; FORMAT COMMAND FOR SIDRIVE AND SEND IT
ASL
LDA PDCMD
ROL
ASL
ORA #$A0
JSR SENDACC
CLC
ADC #$01
STA CMDACK,Y
LDA PDBLKL
JSR SENDACC
LDA PDBLKH
JSR SENDACC
CHKACK: JSR RECVACC ; WAIT FOR CORRECT ACK (MAY BE OUTSTANDING A2PI REQUESTS)
CMP CMDACK,Y
BNE CHKACK
;*
;* BRANCH TO COMMAND HANDLER
;*
LDA PDCMD
AND #$03
TAY ; CPY #PDSTATUS
BEQ STATUS
DEY ; CPY #PDREAD
BEQ RDBLK
DEY ; CPY #PDWRITE
BEQ WRBLK
.IFDEF DEBUG
LDA #'?'
STA INDCTR+6
.ENDIF
IOERR: LDA #PDIOERR
RTS
;*
;* SIDRIVE STATUS - RETURN NUMBER OF BLOCKS OR NODEV
;*
STATUS:
.IFDEF DEBUG
LDA #'S'-$40
STA INDCTR+3
.ENDIF
LDA IOSLOT
AND #$0F
TAY
JSR RECVACC
STA SCRTCH6,Y
JSR RECVACC
STA SCRTCH7,Y
JSR RECVACC
PHA
LDX SCRTCH6,Y
LDA SCRTCH7,Y
TAY
PLA
RTS
;*
;* READ A BLOCK (512 BYTES) FROM SIDRIVE
;*
RDBLK:
.IFDEF DEBUG
LDA #'R'-$40 ; LDY #$00
STA INDCTR+4
.ENDIF
RDBLKL: JSR RECVACC
STA (PDBUFF),Y
INY
BNE RDBLKL
INC PDBUFH
RDBLKH: JSR RECVACC
STA (PDBUFF),Y
INY
BNE RDBLKH
JMP RECVACC
;*
;* WRITE A BLOCK (512 BYTES) TO SIDRIVE
;*
WRBLK:
.IFDEF DEBUG
LDA #'W'-$40 ; LDY #$00
STA INDCTR+5
.ENDIF
WRBLKL: LDA (PDBUFF),Y
JSR SENDACC
INY
BNE WRBLKL
INC PDBUFH
WRBLKH: LDA (PDBUFF),Y
JSR SENDACC
INY
BNE WRBLKH
JMP RECVACC
.IFDEF ALTBOOT
;*
;* PRINT THE BOOT MESSAGE AT THE TOP OF THE SCREEN
;*
PUTMSG: LDY #$00
PUTC: LDA MSG,Y
BMI FILLEOL
ORA #$80
STA MSGLN,Y
INY
BNE PUTC
MSG: DB "PRESS 'M' FOR BOOT MENU", $A0
;*
;* CLEAR THE MESSAGE AT THE TOP OF THE SCREEN
;*
CLRMSG: LDY #$00
LDA #$A0
FILLEOL:
STA MSGLN,Y
INY
CPY #40
BNE FILLEOL
RTS
.ENDIF