*******************************************************
|
*******************************************************
|
*
|
*
|
* Bootstrap FLEX Loader
|
* Bootstrap FLEX Loader
|
*
|
*
|
* SBUG1.8 loads the bootstap loader at $C000
|
* SBUG1.8 loads the bootstap loader at $C000
|
* however the Flex adaption manual has the
|
* however the Flex adaption manual has the
|
* bootstrap loader residing at $C100
|
* bootstrap loader residing at $C100
|
*
|
*
|
******************************************************
|
******************************************************
|
*
|
*
|
* Equates
|
* Equates
|
*
|
*
|
STACK EQU $C0FF
|
STACK EQU $C0FF
|
SCTBUF EQU $C300
|
SCTBUF EQU $C300
|
*
|
*
|
* Start of Utility
|
* Start of Utility
|
*
|
*
|
ORG $C000
|
ORG $C000
|
BOOT BRA LOAD0
|
BOOT BRA LOAD0
|
FCB 0,0,0
|
FCB 0,0,0
|
TRK FCB 0 File start track
|
TRK FCB 0 File start track
|
SCT FCB 0 File start sector
|
SCT FCB 0 File start sector
|
DNS FCB 0 Density Flag (not used)
|
DNS FCB 0 Density Flag (not used)
|
TADR FDB $C000 Transfer address
|
TADR FDB $C000 Transfer address
|
LADR FDB 0 Load Address
|
LADR FDB 0 Load Address
|
DRVNUM FCB 0 Drive number 0
|
DRVNUM FCB 0 Drive number 0
|
*
|
*
|
LOAD0 LDS #STACK Set up stack
|
LOAD0 LDS #STACK Set up stack
|
LDD TRK Set up start track and sector
|
LDD TRK Set up start track and sector
|
STD SCTBUF
|
STD SCTBUF
|
LDY #SCTBUF+256
|
LDY #SCTBUF+256
|
*
|
*
|
* Perform actual file load
|
* Perform actual file load
|
*
|
*
|
LOAD1 BSR GETCH Get acharcater
|
LOAD1 BSR GETCH Get acharcater
|
CMPA #$02 Data record hearder ?
|
CMPA #$02 Data record hearder ?
|
BEQ LOAD2 Skip, is so
|
BEQ LOAD2 Skip, is so
|
CMPA #$16 Xfr address hearder ?
|
CMPA #$16 Xfr address hearder ?
|
BNE LOAD1 Loop if neither
|
BNE LOAD1 Loop if neither
|
*
|
*
|
* Get transfer address
|
* Get transfer address
|
*
|
*
|
BSR GETCH
|
BSR GETCH
|
STA TADR
|
STA TADR
|
BSR GETCH
|
BSR GETCH
|
STA TADR+1
|
STA TADR+1
|
BRA LOAD1
|
BRA LOAD1
|
*
|
*
|
* Load data record
|
* Load data record
|
*
|
*
|
LOAD2 BSR GETCH Get load address
|
LOAD2 BSR GETCH Get load address
|
STA LADR
|
STA LADR
|
BSR GETCH
|
BSR GETCH
|
STA LADR+1
|
STA LADR+1
|
BSR GETCH Get Bytes count
|
BSR GETCH Get Bytes count
|
TFR A,B
|
TFR A,B
|
TSTB
|
TSTB
|
BEQ LOAD1 Loop if count = 0
|
BEQ LOAD1 Loop if count = 0
|
LDX LADR Get load address
|
LDX LADR Get load address
|
LOAD3 PSHS B,X
|
LOAD3 PSHS B,X
|
BSR GETCH Get data character
|
BSR GETCH Get data character
|
PULS B,X
|
PULS B,X
|
STA ,X+ Store at load address
|
STA ,X+ Store at load address
|
DECB
|
DECB
|
BNE LOAD3 Loop until count = 0
|
BNE LOAD3 Loop until count = 0
|
BRA LOAD1
|
BRA LOAD1
|
*
|
*
|
* Get Character routine
|
* Get Character routine
|
* Reads a sector if needed
|
* Reads a sector if needed
|
*
|
*
|
GETCH CMPY #SCTBUF+256 out of data ?
|
GETCH CMPY #SCTBUF+256 out of data ?
|
BNE GETCH4 Go read Character if not
|
BNE GETCH4 Go read Character if not
|
GETCH2 LDX #SCTBUF Point to buffer
|
GETCH2 LDX #SCTBUF Point to buffer
|
LDD 0,X Get forward Link
|
LDD 0,X Get forward Link
|
BEQ GO if zero, file is loaded
|
BEQ GO if zero, file is loaded
|
BSR READ Read next sector
|
BSR READ Read next sector
|
BNE BOOT start over if error
|
BNE BOOT start over if error
|
LDY #SCTBUF+4 Point past link
|
LDY #SCTBUF+4 Point past link
|
GETCH4 LDA ,Y+ Else, get a character
|
GETCH4 LDA ,Y+ Else, get a character
|
RTS
|
RTS
|
*
|
*
|
* File is loaded, Jump to it
|
* File is loaded, Jump to it
|
*
|
*
|
GO JMP [TADR] Jump to transfer address
|
GO JMP [TADR] Jump to transfer address
|
|
|
*
|
*
|
** FLEX 9 COMPACT FLASH DISK DRIVERS
|
** FLEX 9 COMPACT FLASH DISK DRIVERS
|
*
|
*
|
* FOR SYS09BUG 1.2 ON THE BURCHED B5-X300
|
* FOR SYS09BUG 1.2 ON THE BURCHED B5-X300
|
* WITH I/O MAPPED AT $XE000
|
* WITH I/O MAPPED AT $XE000
|
* AND ROM MAPPED AT $XF000
|
* AND ROM MAPPED AT $XF000
|
* THE BURCHED B5-X300 HAS 256KBYTES OF SRAM
|
* THE BURCHED B5-X300 HAS 256KBYTES OF SRAM
|
* THE FIRST 64K IS USED BY FLEX,
|
* THE FIRST 64K IS USED BY FLEX,
|
* THE SECOND 192K MAY BE USED AS A RAM DISK
|
* THE SECOND 192K MAY BE USED AS A RAM 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
|
DATREG EQU $FFF0 DAT REGISTERS
|
DATREG EQU $FFF0 DAT REGISTERS
|
*
|
*
|
CF_BASE EQU $E040
|
CF_BASE EQU $E040
|
CF_DATA EQU CF_BASE+0
|
CF_DATA EQU CF_BASE+0
|
CF_ERROR EQU CF_BASE+1 ; read error
|
CF_ERROR EQU CF_BASE+1 ; read error
|
CF_FEATURE EQU CF_BASE+1 ; write feature
|
CF_FEATURE EQU CF_BASE+1 ; write feature
|
CF_SECCNT EQU CF_BASE+2
|
CF_SECCNT EQU CF_BASE+2
|
CF_SECNUM EQU CF_BASE+3
|
CF_SECNUM EQU CF_BASE+3
|
CF_CYLLO EQU CF_BASE+4
|
CF_CYLLO EQU CF_BASE+4
|
CF_CYLHI EQU CF_BASE+5
|
CF_CYLHI EQU CF_BASE+5
|
CF_HEAD EQU CF_BASE+6
|
CF_HEAD EQU CF_BASE+6
|
CF_STATUS EQU CF_BASE+7 ; read status
|
CF_STATUS EQU CF_BASE+7 ; read status
|
CF_COMAND EQU CF_BASE+7 ; write command
|
CF_COMAND EQU CF_BASE+7 ; write command
|
*
|
*
|
* 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
|
CMDFEATURE EQU $EF
|
CMDFEATURE EQU $EF
|
FEAT8BIT EQU $01 ; enable 8 bit transfers
|
FEAT8BIT EQU $01 ; enable 8 bit transfers
|
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
|
*
|
*
|
* RESTORE DISK DRIVER (SEEK TRACK 00)
|
* RESTORE DISK DRIVER (SEEK TRACK 00)
|
*
|
*
|
RESTR1 CLR DRVNUM
|
RESTR1 CLR DRVNUM
|
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
|
STB CF_SECNUM
|
STB CF_SECNUM
|
STA CF_CYLLO
|
STA CF_CYLLO
|
LDB DRVNUM
|
LDB DRVNUM
|
STB CF_CYLHI
|
STB CF_CYLHI
|
LDB #$01
|
LDB #$01
|
STB CF_SECCNT
|
STB CF_SECCNT
|
CLRB
|
CLRB
|
WARMD1 RTS
|
WARMD1 RTS
|
*
|
*
|
* READ SECTORS FROM CF
|
* READ SECTORS FROM CF
|
*
|
*
|
*
|
*
|
READ BSR SEEKTS
|
READ BSR SEEKTS
|
LDA #CMDREAD ; IDE READ MULTIPLE
|
LDA #CMDREAD ; IDE READ MULTIPLE
|
STA CF_COMAND
|
STA CF_COMAND
|
BSR WAITRDY
|
BSR WAITRDY
|
*
|
*
|
* READ LOOP
|
* READ LOOP
|
*
|
*
|
CLRB
|
CLRB
|
RDLP1 BSR WAITDRQ
|
RDLP1 BSR WAITDRQ
|
LDA CF_DATA
|
LDA CF_DATA
|
STA ,X+
|
STA ,X+
|
DECB
|
DECB
|
BNE RDLP1
|
BNE RDLP1
|
*
|
*
|
CLRB
|
CLRB
|
RDLP2 BSR WAITDRQ
|
RDLP2 BSR WAITDRQ
|
LDA CF_DATA
|
LDA CF_DATA
|
DECB
|
DECB
|
BNE RDLP2
|
BNE RDLP2
|
*
|
*
|
BSR WAITRDY
|
BSR WAITRDY
|
CLRB
|
CLRB
|
RTS
|
RTS
|
*
|
*
|
* WAIT UNTIL READY
|
* WAIT UNTIL READY
|
*
|
*
|
WAITRDY LDA CF_STATUS
|
WAITRDY LDA CF_STATUS
|
BITA #BSY
|
BITA #BSY
|
BNE WAITRDY
|
BNE WAITRDY
|
LDA CF_STATUS
|
LDA CF_STATUS
|
BITA #DRDY
|
BITA #DRDY
|
BEQ WAITRDY
|
BEQ WAITRDY
|
RTS
|
RTS
|
*
|
*
|
* WAIT FOR DATA REQUEST
|
* WAIT FOR DATA REQUEST
|
*
|
*
|
WAITDRQ LDA CF_STATUS
|
WAITDRQ LDA CF_STATUS
|
BITA #DRQ
|
BITA #DRQ
|
BEQ WAITDRQ
|
BEQ WAITDRQ
|
RTS
|
RTS
|
*
|
*
|
END
|
END
|
|
|