*
|
*
|
** FLEX 9 COMPACT FLASH / IDE DISK DRIVERS
|
** FLEX 9 COMPACT FLASH / IDE DISK DRIVERS
|
*
|
*
|
* FOR SYS09BUG ON THE XESS XSA-3S1000 & XST3.0
|
* FOR SYS09BUG ON THE XESS XSA-3S1000 & XST3.0
|
* WITH I/O MAPPED AT $XE000
|
* WITH I/O MAPPED AT $XE000
|
* AND ROM MAPPED AT $XF000
|
* AND ROM MAPPED AT $XF000
|
*
|
*
|
* These drivers should work with either
|
* These drivers should work with either
|
* an IDE disk drive or a IDE CF adapter card
|
* an IDE disk drive or a IDE CF adapter card
|
* It uses 16 bit transfer mode,
|
* It uses 16 bit transfer mode,
|
* as some IDE drives do not support
|
* as some IDE drives do not support
|
* the set feature command found on CF cards
|
* the set feature command found on CF cards
|
* that allows for 8 bit operation
|
* that allows for 8 bit operation
|
*
|
*
|
*
|
*
|
IMASK EQU $10 IRQ MASK CC
|
IMASK EQU $10 IRQ MASK CC
|
FMASK EQU $40 FIRQ MASK CC
|
FMASK EQU $40 FIRQ MASK CC
|
*
|
*
|
CF_BASE EQU $E100
|
CF_BASE EQU $E100
|
CF_DATA EQU CF_BASE+0
|
CF_DATA EQU CF_BASE+0
|
CF_ERROR EQU CF_BASE+2 ; read error
|
CF_ERROR EQU CF_BASE+2 ; read error
|
CF_FEATURE EQU CF_BASE+2 ; write feature
|
CF_FEATURE EQU CF_BASE+2 ; write feature
|
CF_SECCNT EQU CF_BASE+4
|
CF_SECCNT EQU CF_BASE+4
|
CF_SECNUM EQU CF_BASE+6
|
CF_SECNUM EQU CF_BASE+6
|
CF_CYLLO EQU CF_BASE+8
|
CF_CYLLO EQU CF_BASE+8
|
CF_CYLHI EQU CF_BASE+10
|
CF_CYLHI EQU CF_BASE+10
|
CF_HEAD EQU CF_BASE+12
|
CF_HEAD EQU CF_BASE+12
|
CF_STATUS EQU CF_BASE+14 ; read status
|
CF_STATUS EQU CF_BASE+14 ; read status
|
CF_COMAND EQU CF_BASE+14 ; write command
|
CF_COMAND EQU CF_BASE+14 ; write command
|
CF_AUX EQU CF_BASE+30 ; Reset register
|
CF_AUX EQU CF_BASE+30 ; Reset register
|
*
|
*
|
* Command Equates
|
* Command Equates
|
*
|
*
|
CMDREAD EQU $20 ; Read Single sector
|
CMDREAD EQU $20 ; Read Single sector
|
CMDWRITE EQU $30 ; Write Single sector
|
CMDWRITE EQU $30 ; Write Single sector
|
AUXRESET EQU $06
|
AUXRESET EQU $06
|
AUXRSTREL EQU $02
|
AUXRSTREL EQU $02
|
HEADLBA EQU $E0
|
HEADLBA EQU $E0
|
*
|
*
|
* Status bit equates
|
* Status bit equates
|
*
|
*
|
BSY EQU $80
|
BSY EQU $80
|
DRDY EQU $40
|
DRDY EQU $40
|
DRQ EQU $08
|
DRQ EQU $08
|
ERR EQU $01
|
ERR EQU $01
|
ORG $DE00
|
ORG $DE00
|
*
|
*
|
* DISK DRIVER JUMP TABLE
|
* DISK DRIVER JUMP TABLE
|
*
|
*
|
READ JMP READSC
|
READ JMP READSC
|
WRITE JMP WRITSC
|
WRITE JMP WRITSC
|
VERIFY JMP BUSY
|
VERIFY JMP BUSY
|
RESTOR JMP RESTR1
|
RESTOR JMP RESTR1
|
DRIVE JMP DRVSEL
|
DRIVE JMP DRVSEL
|
DRVRDY JMP CHKDRV
|
DRVRDY JMP CHKDRV
|
QUICK JMP CHKDRV
|
QUICK JMP CHKDRV
|
COLDDR JMP INITDR
|
COLDDR JMP INITDR
|
WARMDR JMP WARMD1
|
WARMDR JMP WARMD1
|
SEEK JMP SEEKTS
|
SEEK JMP SEEKTS
|
*
|
*
|
* RAM SPACE
|
* RAM SPACE
|
*
|
*
|
DRVNUM FCB 0
|
DRVNUM FCB 0
|
*
|
*
|
*
|
*
|
* INITIALIZE CF CARD
|
* INITIALIZE CF CARD
|
*
|
*
|
INITDR LDD #AUXRESET
|
INITDR LDD #AUXRESET
|
STD CF_AUX
|
STD CF_AUX
|
LDD #AUXRSTREL
|
LDD #AUXRSTREL
|
STD CF_AUX
|
STD CF_AUX
|
LDD #HEADLBA
|
LDD #HEADLBA
|
STD CF_HEAD
|
STD CF_HEAD
|
BRA WAITRDY
|
BRA WAITRDY
|
*
|
*
|
* RESTORE DISK DRIVER (SEEK TRACK 00)
|
* RESTORE DISK DRIVER (SEEK TRACK 00)
|
*
|
*
|
RESTR1 BSR DRVSEL
|
RESTR1 BSR DRVSEL
|
CLRA ; Track 0
|
CLRA ; Track 0
|
LDB #$01 ; Sector 1
|
LDB #$01 ; Sector 1
|
*
|
*
|
* Seek track and sector
|
* Seek track and sector
|
* A holds track number (0 - ??)
|
* A holds track number (0 - ??)
|
* B holds sector number (1 - ??)
|
* B holds sector number (1 - ??)
|
* Sector numbers starts from 1
|
* Sector numbers starts from 1
|
* subtract 1 to start from sector 0 on CF
|
* subtract 1 to start from sector 0 on CF
|
*
|
*
|
SEEKTS DECB
|
SEEKTS DECB
|
PSHS A
|
PSHS A
|
CLRA
|
CLRA
|
STD CF_SECNUM
|
STD CF_SECNUM
|
LDB ,S
|
LDB ,S
|
STD CF_CYLLO
|
STD CF_CYLLO
|
LDB DRVNUM
|
LDB DRVNUM
|
STD CF_CYLHI
|
STD CF_CYLHI
|
LDB #$01
|
LDB #$01
|
STD CF_SECCNT
|
STD CF_SECCNT
|
PULS A
|
PULS A
|
CLRB
|
CLRB
|
WARMD1 RTS
|
WARMD1 RTS
|
*
|
*
|
* READ SECTORS FROM CF
|
* READ SECTORS FROM CF
|
*
|
*
|
*
|
*
|
READSC BSR SEEKTS
|
READSC BSR SEEKTS
|
LDD #CMDREAD ; IDE READ MULTIPLE
|
LDD #CMDREAD ; IDE READ MULTIPLE
|
STD CF_COMAND
|
STD CF_COMAND
|
BSR WAITRDY
|
BSR WAITRDY
|
*
|
*
|
* READ LOOP
|
* READ LOOP
|
*
|
*
|
PSHS Y
|
PSHS Y
|
LDY #256
|
LDY #256
|
RDLP1 BSR WAITDRQ
|
RDLP1 BSR WAITDRQ
|
LDD CF_DATA
|
LDD CF_DATA
|
STB ,X+
|
STB ,X+
|
LEAY -1,Y
|
LEAY -1,Y
|
BNE RDLP1
|
BNE RDLP1
|
PULS Y
|
PULS Y
|
*
|
*
|
BSR WAITRDY
|
BSR WAITRDY
|
CLRB
|
CLRB
|
RTS
|
RTS
|
*
|
*
|
* WRITE SECTOR TO CF
|
* WRITE SECTOR TO CF
|
*
|
*
|
WRITSC BSR SEEKTS ; SEEK TRACK & SECTOR
|
WRITSC BSR SEEKTS ; SEEK TRACK & SECTOR
|
LDD #CMDWRITE; IDE WRITE MULTIPLE
|
LDD #CMDWRITE; IDE WRITE MULTIPLE
|
STD CF_COMAND
|
STD CF_COMAND
|
BSR WAITRDY
|
BSR WAITRDY
|
*
|
*
|
* WRITE LOOP
|
* WRITE LOOP
|
*
|
*
|
PSHS Y
|
PSHS Y
|
LDY #256
|
LDY #256
|
CLRA
|
CLRA
|
WRTLP1 BSR WAITDRQ
|
WRTLP1 BSR WAITDRQ
|
LDB ,X+
|
LDB ,X+
|
STD CF_DATA
|
STD CF_DATA
|
LEAY -1,Y
|
LEAY -1,Y
|
BNE WRTLP1
|
BNE WRTLP1
|
PULS Y
|
PULS Y
|
*
|
*
|
BSR WAITRDY
|
BSR WAITRDY
|
CLRB
|
CLRB
|
RTS
|
RTS
|
*
|
*
|
* CHECK FOR BUSY
|
* CHECK FOR BUSY
|
* Doubles as VERIFY
|
* Doubles as VERIFY
|
*
|
*
|
BUSY CLRB Never busy
|
BUSY CLRB Never busy
|
RTS
|
RTS
|
*
|
*
|
* DRIVE SELECT DISK DRIVER
|
* DRIVE SELECT DISK DRIVER
|
*
|
*
|
DRVSEL LDA 3,X GET DRIVE # FROM FCB
|
DRVSEL LDA 3,X GET DRIVE # FROM FCB
|
CMPA #3
|
CMPA #3
|
BLS DRVS2 IF > 3, SET IT TO 0
|
BLS DRVS2 IF > 3, SET IT TO 0
|
CLRA
|
CLRA
|
DRVS2 STA DRVNUM
|
DRVS2 STA DRVNUM
|
CLRB ; SET Z, CLEAR C
|
CLRB ; SET Z, CLEAR C
|
RTS
|
RTS
|
*
|
*
|
* CHECK DRIVE READY DISK DRIVER
|
* CHECK DRIVE READY DISK DRIVER
|
*
|
*
|
CHKDRV LDA 3,X
|
CHKDRV LDA 3,X
|
CLRB ; CLEAR C, SET Z
|
CLRB ; CLEAR C, SET Z
|
RTS
|
RTS
|
*
|
*
|
* WAIT UNTIL READY
|
* WAIT UNTIL READY
|
*
|
*
|
WAITRDY LDD CF_STATUS
|
WAITRDY LDD CF_STATUS
|
BITB #BSY
|
BITB #BSY
|
BNE WAITRDY
|
BNE WAITRDY
|
LDD CF_STATUS
|
LDD CF_STATUS
|
BITB #DRDY
|
BITB #DRDY
|
BEQ WAITRDY
|
BEQ WAITRDY
|
RTS
|
RTS
|
*
|
*
|
* WAIT FOR DATA REQUEST
|
* WAIT FOR DATA REQUEST
|
*
|
*
|
WAITDRQ LDD CF_STATUS
|
WAITDRQ LDD CF_STATUS
|
BITB #DRQ
|
BITB #DRQ
|
BEQ WAITDRQ
|
BEQ WAITDRQ
|
RTS
|
RTS
|
*
|
*
|
END
|
END
|
|
|
|
|