URL
                    https://opencores.org/ocsvn/System09/System09/trunk
                
            Subversion Repositories System09
[/] [System09/] [trunk/] [src/] [Flex9/] [f9-dkide.asm] - Rev 66
Compare with Previous | Blame | View Log
*** FLEX 9 COMPACT FLASH / IDE DISK DRIVERS** FOR SYS09BUG ON THE XESS XSA-3S1000 & XST3.0* WITH I/O MAPPED AT $XE000* AND ROM MAPPED AT $XF000** These drivers should work with either* an IDE disk drive or a IDE CF adapter card* It uses 16 bit transfer mode,* as some IDE drives do not support* the set feature command found on CF cards* that allows for 8 bit operation**IMASK EQU $10 IRQ MASK CCFMASK EQU $40 FIRQ MASK CC*CF_BASE EQU $E100CF_DATA EQU CF_BASE+0CF_ERROR EQU CF_BASE+2 ; read errorCF_FEATURE EQU CF_BASE+2 ; write featureCF_SECCNT EQU CF_BASE+4CF_SECNUM EQU CF_BASE+6CF_CYLLO EQU CF_BASE+8CF_CYLHI EQU CF_BASE+10CF_HEAD EQU CF_BASE+12CF_STATUS EQU CF_BASE+14 ; read statusCF_COMAND EQU CF_BASE+14 ; write commandCF_AUX EQU CF_BASE+30 ; Reset register** Command Equates*CMDREAD EQU $20 ; Read Single sectorCMDWRITE EQU $30 ; Write Single sectorAUXRESET EQU $06AUXRSTREL EQU $02HEADLBA EQU $E0** Status bit equates*BSY EQU $80DRDY EQU $40DRQ EQU $08ERR EQU $01ORG $DE00** DISK DRIVER JUMP TABLE*READ JMP READSCWRITE JMP WRITSCVERIFY JMP BUSYRESTOR JMP RESTR1DRIVE JMP DRVSELDRVRDY JMP CHKDRVQUICK JMP CHKDRVCOLDDR JMP INITDRWARMDR JMP WARMD1SEEK JMP SEEKTS** RAM SPACE*DRVNUM FCB 0*** INITIALIZE CF CARD*INITDR LDD #AUXRESETSTD CF_AUXLDD #AUXRSTRELSTD CF_AUXLDD #HEADLBASTD CF_HEADBRA WAITRDY** RESTORE DISK DRIVER (SEEK TRACK 00)*RESTR1 BSR DRVSELCLRA ; Track 0LDB #$01 ; Sector 1** Seek track and sector* A holds track number (0 - ??)* B holds sector number (1 - ??)* Sector numbers starts from 1* subtract 1 to start from sector 0 on CF*SEEKTS DECBPSHS ACLRASTD CF_SECNUMLDB ,SSTD CF_CYLLOLDB DRVNUMSTD CF_CYLHILDB #$01STD CF_SECCNTPULS ACLRBWARMD1 RTS** READ SECTORS FROM CF**READSC BSR SEEKTSLDD #CMDREAD ; IDE READ MULTIPLESTD CF_COMANDBSR WAITRDY** READ LOOP*PSHS YLDY #256RDLP1 BSR WAITDRQLDD CF_DATASTB ,X+LEAY -1,YBNE RDLP1PULS Y*BSR WAITRDYCLRBRTS** WRITE SECTOR TO CF*WRITSC BSR SEEKTS ; SEEK TRACK & SECTORLDD #CMDWRITE; IDE WRITE MULTIPLESTD CF_COMANDBSR WAITRDY** WRITE LOOP*PSHS YLDY #256CLRAWRTLP1 BSR WAITDRQLDB ,X+STD CF_DATALEAY -1,YBNE WRTLP1PULS Y*BSR WAITRDYCLRBRTS** CHECK FOR BUSY* Doubles as VERIFY*BUSY CLRB Never busyRTS** DRIVE SELECT DISK DRIVER*DRVSEL LDA 3,X GET DRIVE # FROM FCBCMPA #3BLS DRVS2 IF > 3, SET IT TO 0CLRADRVS2 STA DRVNUMCLRB ; SET Z, CLEAR CRTS** CHECK DRIVE READY DISK DRIVER*CHKDRV LDA 3,XCLRB ; CLEAR C, SET ZRTS** WAIT UNTIL READY*WAITRDY LDD CF_STATUSBITB #BSYBNE WAITRDYLDD CF_STATUSBITB #DRDYBEQ WAITRDYRTS** WAIT FOR DATA REQUEST*WAITDRQ LDD CF_STATUSBITB #DRQBEQ WAITDRQRTS*END

