*
|
*
|
** FLEX 9 DISK DRIVERS
|
** FLEX 9 DISK DRIVERS
|
*
|
*
|
* FOR SYS09BUG ON THE DIGILENT SPARTAN 3 STARTER BOARD
|
* FOR SYS09BUG ON THE DIGILENT SPARTAN 3 STARTER BOARD
|
* WITH I/O MAPPED AT $XE000
|
* WITH I/O MAPPED AT $XE000
|
* AND ROM MAPPED AT $XF000
|
* AND ROM MAPPED AT $XF000
|
* THE DIGILENT SPARTAN 3 STARTER BOARD HAS 1MBYTE OF SRAM
|
* THE DIGILENT SPARTAN 3 STARTER BOARD HAS 1MBYTE OF SRAM
|
* THE FIRST 64K IS USED BY FLEX,
|
* THE FIRST 64K IS USED BY FLEX,
|
* THE SECOND 192K IS USED AS A ROM DISK
|
* THE SECOND 192K IS USED AS A ROM DISK
|
* THE REMAINING RAM IS USED FOR A RAM DISK
|
* THE REMAINING RAM IS USED FOR A RAM DISK
|
*
|
*
|
* These drivers should also work on the B5-X300 board
|
* These drivers should also work on the B5-X300 board
|
* although there is only enough room for the ROM Disk.
|
* although there is only enough room for the ROM Disk.
|
*
|
*
|
IMASK EQU $10 IRQ MASK CC
|
IMASK EQU $10 IRQ MASK CC
|
FMASK EQU $40 FIRQ MASK CC
|
FMASK EQU $40 FIRQ MASK CC
|
TRPAGE EQU $0E PAGE $E000 DAT ADDRESS
|
TRPAGE EQU $0E PAGE $E000 DAT ADDRESS
|
DATREG EQU $FFF0 DAT REGISTERS
|
DATREG EQU $FFF0 DAT REGISTERS
|
ORG $DE00
|
ORG $DE00
|
*
|
*
|
* DISK DRIVER JUMP TABLE LAST UPDATE: 22/12/2006
|
* DISK DRIVER JUMP TABLE LAST UPDATE: 22/12/2006
|
* Disk driver for RAM Disk.
|
* Disk driver for RAM Disk.
|
*
|
*
|
* 14 SECTORS PER TRACK
|
* 14 SECTORS PER TRACK
|
* 16 * N TRACKS PER DISK
|
* 16 * N TRACKS PER DISK
|
*
|
*
|
* ROM DISK OCCUPIES $10000 - $1E000, $20000 - $2E000, $30000 - $3E000
|
* ROM DISK OCCUPIES $10000 - $1E000, $20000 - $2E000, $30000 - $3E000
|
* RAM DISK OCCUPIES $40000 - $4E000 ... $F0000 - $FE000
|
* RAM DISK OCCUPIES $40000 - $4E000 ... $F0000 - $FE000
|
* Track Buffer page mapped at $E000 - $EFFF
|
* Track Buffer page mapped at $E000 - $EFFF
|
* TRPAGE = $0E = 14 x $1000 (4 K pages)
|
* TRPAGE = $0E = 14 x $1000 (4 K pages)
|
* LEAST SIGNIFICANT NYBBLE OF THE DAT IS INVERTED
|
* LEAST SIGNIFICANT NYBBLE OF THE DAT IS INVERTED
|
* ON SWTPC ROM AT $XF000 AND IO AT $XE000
|
* ON SWTPC ROM AT $XF000 AND IO AT $XE000
|
* APPEARS THROUGHOUT THE MEMORY SO MUST BE SKIPPED OVER
|
* APPEARS THROUGHOUT THE MEMORY SO MUST BE SKIPPED OVER
|
* WHEN USING RAM AS A RAMDISK.
|
* WHEN USING RAM AS A RAMDISK.
|
* THE MSN OF THE TRACK MAPS INTO THE MSN OF THE DAT
|
* THE MSN OF THE TRACK MAPS INTO THE MSN OF THE DAT
|
* THE LSN OF THE TRACK NUMBER INDEXES INTO THE 4K RAM PAGE
|
* THE LSN OF THE TRACK NUMBER INDEXES INTO THE 4K RAM PAGE
|
* THE SECTOR MAPS INTO THE LSN OF THE DAT WHICH IS INVERTED
|
* THE SECTOR MAPS INTO THE LSN OF THE DAT WHICH IS INVERTED
|
*
|
*
|
*
|
*
|
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
|
*
|
*
|
WRKDR FDB 0
|
WRKDR FDB 0
|
WRKTR FDB 0,0,0,0
|
WRKTR FDB 0,0,0,0
|
SECPTR FDB 0
|
SECPTR FDB 0
|
TRKCNT FCB 0
|
TRKCNT FCB 0
|
SECCNT FCB 0
|
SECCNT FCB 0
|
VERERR FCB 0
|
VERERR FCB 0
|
CCSAVE FCB 0
|
CCSAVE FCB 0
|
*
|
*
|
DRVBAS FCB $10 DRIVE 0
|
DRVBAS FCB $10 DRIVE 0
|
FCB $40 DRIVE 1
|
FCB $40 DRIVE 1
|
FCB $40 DRIVE 2
|
FCB $40 DRIVE 2
|
FCB $40 DRIVE 3
|
FCB $40 DRIVE 3
|
*
|
*
|
INITDR RTS
|
INITDR RTS
|
WARMD1 RTS
|
WARMD1 RTS
|
*
|
*
|
* Seek track and sector
|
* Seek track and sector
|
* A holds track number (0-32)
|
* A holds track number (0-32)
|
* B holds sector number (1-14)
|
* B holds sector number (1-14)
|
*
|
*
|
SEEKTS STA TRKCNT
|
SEEKTS STA TRKCNT
|
STB SECCNT
|
STB SECCNT
|
ANDCC #$FE ; CLEAR CARRY
|
ANDCC #$FE ; CLEAR CARRY
|
ORCC #$40 ; SET Z
|
ORCC #$40 ; SET Z
|
RTS
|
RTS
|
*
|
*
|
* MAP RAM DISK INTO I/O SPACE
|
* MAP RAM DISK INTO I/O SPACE
|
*
|
*
|
MAPIN TFR CC,A ; Save state of interrupt masks
|
MAPIN TFR CC,A ; Save state of interrupt masks
|
STA CCSAVE
|
STA CCSAVE
|
ORCC #FMASK+IMASK ; Mask interrupts while IO mapped out
|
ORCC #FMASK+IMASK ; Mask interrupts while IO mapped out
|
LDA TRKCNT
|
LDA TRKCNT
|
LDU #DRVBAS ; Point to Drive base offset
|
LDU #DRVBAS ; Point to Drive base offset
|
LDB WRKDR ; Get working drive number
|
LDB WRKDR ; Get working drive number
|
ADDA B,U ; Add Base offset into RAM
|
ADDA B,U ; Add Base offset into RAM
|
ANDA #$F0 ; Mask MSN
|
ANDA #$F0 ; Mask MSN
|
STA ,-S ; Save A on stack
|
STA ,-S ; Save A on stack
|
*
|
*
|
LDA SECCNT
|
LDA SECCNT
|
SUBA #1 ; Sectors 1 to 14 => 0 to 13
|
SUBA #1 ; Sectors 1 to 14 => 0 to 13
|
EORA #$0F ; Complement LSNybble
|
EORA #$0F ; Complement LSNybble
|
ANDA #$0F
|
ANDA #$0F
|
*
|
*
|
ADDA ,S+ ; Add sector to LSN of Track and pop
|
ADDA ,S+ ; Add sector to LSN of Track and pop
|
STA DATREG+TRPAGE
|
STA DATREG+TRPAGE
|
*
|
*
|
LDA TRKCNT ; LSN of Track indexes into 4K page
|
LDA TRKCNT ; LSN of Track indexes into 4K page
|
ANDA #$0F
|
ANDA #$0F
|
ADDA #TRPAGE*16
|
ADDA #TRPAGE*16
|
STA SECPTR
|
STA SECPTR
|
CLR SECPTR+1
|
CLR SECPTR+1
|
LDU SECPTR
|
LDU SECPTR
|
RTS
|
RTS
|
*
|
*
|
* MAP RAM DISK OUT OF MEMORY
|
* MAP RAM DISK OUT OF MEMORY
|
*
|
*
|
MAPOUT LDA #TRPAGE ; Point to the I/O page
|
MAPOUT LDA #TRPAGE ; Point to the I/O page
|
EORA #$0F ; Complement LSNybble
|
EORA #$0F ; Complement LSNybble
|
STA DATREG+TRPAGE ; map in I/O page
|
STA DATREG+TRPAGE ; map in I/O page
|
LDA CCSAVE ; restore interrupt masks
|
LDA CCSAVE ; restore interrupt masks
|
TFR A,CC
|
TFR A,CC
|
RTS
|
RTS
|
*
|
*
|
* READ DISK DRIVER
|
* READ DISK DRIVER
|
*
|
*
|
READSC LBSR SEEKTS ; SEEK TRACK & SECTOR
|
READSC LBSR SEEKTS ; SEEK TRACK & SECTOR
|
PSHS U,X
|
PSHS U,X
|
BSR MAPIN ; MAP RAM DISK INTO I/O SPACE
|
BSR MAPIN ; MAP RAM DISK INTO I/O SPACE
|
*
|
*
|
CLRB
|
CLRB
|
READ3 LDA ,U+
|
READ3 LDA ,U+
|
STA ,X+ ; Move Sector to FCB
|
STA ,X+ ; Move Sector to FCB
|
INCB
|
INCB
|
BNE READ3
|
BNE READ3
|
*
|
*
|
BSR MAPOUT ; MAP RAM DISK OUT OF I/O SPACE
|
BSR MAPOUT ; MAP RAM DISK OUT OF I/O SPACE
|
CLRB ; Z SET C CLEAR
|
CLRB ; Z SET C CLEAR
|
PULS U,X,PC ; Restore registers and return
|
PULS U,X,PC ; Restore registers and return
|
*
|
*
|
* WRITE DISK DRIVER
|
* WRITE DISK DRIVER
|
*
|
*
|
WRITSC BSR SEEKTS ; SEEK TRACK & SECTOR
|
WRITSC BSR SEEKTS ; SEEK TRACK & SECTOR
|
PSHS U,X
|
PSHS U,X
|
BSR MAPIN ; MAP RAM DISK INTO I/O SPACE
|
BSR MAPIN ; MAP RAM DISK INTO I/O SPACE
|
*
|
*
|
CLRB
|
CLRB
|
WRIT3 LDA ,X+ ; COPY FCB BLOCK TO RAM DISK
|
WRIT3 LDA ,X+ ; COPY FCB BLOCK TO RAM DISK
|
STA ,U+
|
STA ,U+
|
INCB
|
INCB
|
BNE WRIT3
|
BNE WRIT3
|
*
|
*
|
BSR MAPOUT ; MAP OUT RAM DISK
|
BSR MAPOUT ; MAP OUT RAM DISK
|
CLRB ; SET Z, CLEAR C
|
CLRB ; SET Z, CLEAR C
|
PULS U,X,PC ; Restore registers and return
|
PULS U,X,PC ; Restore registers and return
|
*
|
*
|
* RESTORE DISK DRIVER (SEEK TRACK 00)
|
* RESTORE DISK DRIVER (SEEK TRACK 00)
|
*
|
*
|
RESTR1 PSHS A
|
RESTR1 PSHS A
|
CLRA ; Track 0
|
CLRA ; Track 0
|
LDAB #$01 ; Sector 1
|
LDAB #$01 ; Sector 1
|
LBSR SEEKTS
|
LBSR SEEKTS
|
PULS A,PC
|
PULS A,PC
|
*
|
*
|
* 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 PSHS X
|
DRVSEL PSHS X
|
LDA 3,X GET DRIVE # FROM FCB
|
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 BSR MXWT MOVE X TO WORKING TRK
|
DRVS2 BSR MXWT MOVE X TO WORKING TRK
|
LDB TRKCNT
|
LDB TRKCNT
|
STB 0,X SAVE TRACK
|
STB 0,X SAVE TRACK
|
STA WRKDR SAVE DESIRED DRV AS WORKING DRV
|
STA WRKDR SAVE DESIRED DRV AS WORKING DRV
|
BSR MXWT MOVE X TO WORKING TRK
|
BSR MXWT MOVE X TO WORKING TRK
|
LDA 0,X GET WORKING TRK ON DESIRED DRV
|
LDA 0,X GET WORKING TRK ON DESIRED DRV
|
STA TRKCNT UPDATE 1771 TRACK REG
|
STA TRKCNT UPDATE 1771 TRACK REG
|
CLRB ; SET Z, CLEAR C
|
CLRB ; SET Z, CLEAR C
|
PULS X,PC
|
PULS X,PC
|
*
|
*
|
* MOVE INDEX REG TO POINT TO
|
* MOVE INDEX REG TO POINT TO
|
* WORKING TRACK STORAGE
|
* WORKING TRACK STORAGE
|
*
|
*
|
MXWT LDX #WRKTR POINT TO START OF STG
|
MXWT LDX #WRKTR POINT TO START OF STG
|
LDB WRKDR GET WORKING DRIVE
|
LDB WRKDR GET WORKING DRIVE
|
ABX
|
ABX
|
MXWT2 RTS
|
MXWT2 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
|
END
|
END
|
|
|