OpenCores
URL https://opencores.org/ocsvn/System09/System09/trunk

Subversion Repositories System09

[/] [System09/] [trunk/] [src/] [Flex9/] [f9-dkide.asm] - Diff between revs 59 and 66

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 59 Rev 66
*
*
** 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
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.