*
|
*
|
** FLEX 9 COMPACT FLASH FORMAT PROGRAM
|
** FLEX 9 COMPACT FLASH FORMAT PROGRAM
|
*
|
*
|
* FOR B5-X300 and CF with 8 Bit Transfer interface
|
* FOR B5-X300 and CF with 8 Bit Transfer interface
|
*
|
*
|
*
|
*
|
CFLAG EQU $01 CARRY FLAG
|
CFLAG EQU $01 CARRY FLAG
|
VFLAG EQU $02 OVERFLOW FLAG
|
VFLAG EQU $02 OVERFLOW FLAG
|
ZFLAG EQU $04 ZERO FLAG
|
ZFLAG EQU $04 ZERO FLAG
|
NFLAG EQU $08 NEGATIVE FLAG
|
NFLAG EQU $08 NEGATIVE FLAG
|
IFLAG EQU $10 IRQ MASK CC
|
IFLAG EQU $10 IRQ MASK CC
|
HFLAG EQU $20 HALF CARRY
|
HFLAG EQU $20 HALF CARRY
|
FFLAG EQU $40 FIRQ MASK CC
|
FFLAG EQU $40 FIRQ MASK CC
|
EFLAG EQU $80 ENTIRE FLAG
|
EFLAG EQU $80 ENTIRE FLAG
|
*
|
*
|
MAPPAG EQU $00 PAGE $0000 DAT ADDRESS
|
MAPPAG EQU $00 PAGE $0000 DAT ADDRESS
|
*
|
*
|
* Serial Port
|
* Serial Port
|
*
|
*
|
ACIAS EQU $E000
|
ACIAS EQU $E000
|
ACIAC1 EQU ACIAS
|
ACIAC1 EQU ACIAS
|
ACIAD1 EQU ACIAS+1
|
ACIAD1 EQU ACIAS+1
|
DELCON EQU 1250 Delay (Processor clock in MHz * 50)
|
DELCON EQU 1250 Delay (Processor clock in MHz * 50)
|
*
|
*
|
* XMODEM Control characters
|
* XMODEM Control characters
|
*
|
*
|
SOH EQU $01
|
SOH EQU $01
|
EOT EQU $04
|
EOT EQU $04
|
ACK EQU $06
|
ACK EQU $06
|
NAK EQU $15
|
NAK EQU $15
|
CAN EQU $18
|
CAN EQU $18
|
*
|
*
|
* Some dummy Constants
|
* Some dummy Constants
|
*
|
*
|
RMAXTRK EQU 64
|
RMAXTRK EQU 64
|
RMAXSEC EQU 255
|
RMAXSEC EQU 255
|
RTOTSEC EQU RMAXTRK*RMAXSEC-RMAXSEC
|
RTOTSEC EQU RMAXTRK*RMAXSEC-RMAXSEC
|
*
|
*
|
* Start
|
* Start
|
*
|
*
|
ORG $0100
|
ORG $0100
|
START LBSR UFSUB
|
START LBSR UFSUB
|
JMP [$F800] Jump to monitor on Completion.
|
JMP [$F800] Jump to monitor on Completion.
|
*
|
*
|
*
|
*
|
* RAM SPACE
|
* RAM SPACE
|
*
|
*
|
DRVNUM FCB 0
|
DRVNUM FCB 0
|
TRACK FCB 0
|
TRACK FCB 0
|
SECTOR FCB 0
|
SECTOR FCB 0
|
CHKSUM FCB 0
|
CHKSUM FCB 0
|
BLKNUM FCB 0 Xmodem block number
|
BLKNUM FCB 0 Xmodem block number
|
BYTCNT FCB 0 Xmodem byte count
|
BYTCNT FCB 0 Xmodem byte count
|
XSTATE FDB 0 Xmodem State Vector
|
XSTATE FDB 0 Xmodem State Vector
|
DELCNT FCB $00,$00,$00 Xmodem Poll timer
|
DELCNT FCB $00,$00,$00 Xmodem Poll timer
|
MAXTRK FCB 0
|
MAXTRK FCB 0
|
MAXSEC FCB 0
|
MAXSEC FCB 0
|
ORG $0200
|
ORG $0200
|
*
|
*
|
* SECTOR BUFFER
|
* SECTOR BUFFER
|
*
|
*
|
BUFFER RMB 256
|
BUFFER RMB 256
|
*
|
*
|
*
|
*
|
* recieve char from remote drive.
|
* recieve char from remote drive.
|
* timeout if no response for approx 1s.
|
* timeout if no response for approx 1s.
|
* Entry: no parameters
|
* Entry: no parameters
|
* Exit: (A) = recieved char, (C)=1 if valid char, (C)=0 if timeout.
|
* Exit: (A) = recieved char, (C)=1 if valid char, (C)=0 if timeout.
|
*
|
*
|
RCHAR PSHS X,Y
|
RCHAR PSHS X,Y
|
*
|
*
|
LDX #1000 1000x inner loop
|
LDX #1000 1000x inner loop
|
RCHAR1 LDY #DELCON delay constant for inner loop (approx 1ms).
|
RCHAR1 LDY #DELCON delay constant for inner loop (approx 1ms).
|
RCHAR2 LDA ACIAC1 test for recieved char
|
RCHAR2 LDA ACIAC1 test for recieved char
|
ASRA
|
ASRA
|
BCS RCHAR3 get character
|
BCS RCHAR3 get character
|
LEAY -1,Y else, continue to count delay
|
LEAY -1,Y else, continue to count delay
|
BNE RCHAR2
|
BNE RCHAR2
|
LEAX -1,X
|
LEAX -1,X
|
BNE RCHAR1
|
BNE RCHAR1
|
PULS X,Y,PC return with error if timed out
|
PULS X,Y,PC return with error if timed out
|
*
|
*
|
RCHAR3 LDA ACIAD1 return data (carry bit still set)
|
RCHAR3 LDA ACIAD1 return data (carry bit still set)
|
PULS X,Y,PC
|
PULS X,Y,PC
|
*
|
*
|
*
|
*
|
* transmit char to remote drive.
|
* transmit char to remote drive.
|
* timeout if no response for approx 1s. (allows for use of hardware flow control)
|
* timeout if no response for approx 1s. (allows for use of hardware flow control)
|
* Entry: (A) = char to transmit
|
* Entry: (A) = char to transmit
|
* Exit: (A) = recieved char, (C)=1 if valid char, (C)=0 if timeout.
|
* Exit: (A) = recieved char, (C)=1 if valid char, (C)=0 if timeout.
|
*
|
*
|
SCHAR PSHS X,Y
|
SCHAR PSHS X,Y
|
PSHS A
|
PSHS A
|
*
|
*
|
LDX #1000 1000x inner loop
|
LDX #1000 1000x inner loop
|
SCHAR1 LDY #DELCON delay constant for inner loop (approx 1ms).
|
SCHAR1 LDY #DELCON delay constant for inner loop (approx 1ms).
|
SCHAR2 LDA ACIAC1 test for space in transmit FIFO
|
SCHAR2 LDA ACIAC1 test for space in transmit FIFO
|
ASRA
|
ASRA
|
ASRA
|
ASRA
|
BCS SCHAR3 send character
|
BCS SCHAR3 send character
|
LEAY -1,Y else, continue to count delay
|
LEAY -1,Y else, continue to count delay
|
BNE SCHAR2
|
BNE SCHAR2
|
LEAX -1,X
|
LEAX -1,X
|
BNE SCHAR1
|
BNE SCHAR1
|
PULS A
|
PULS A
|
PULS X,Y,PC return with error if timed out
|
PULS X,Y,PC return with error if timed out
|
*
|
*
|
SCHAR3 PULS A
|
SCHAR3 PULS A
|
STA ACIAD1 send data (carry bit still set)
|
STA ACIAD1 send data (carry bit still set)
|
PULS X,Y,PC
|
PULS X,Y,PC
|
*
|
*
|
* Print Data
|
* Print Data
|
*
|
*
|
PDATA0 BSR SCHAR
|
PDATA0 BSR SCHAR
|
PDATA1 LDA ,X+
|
PDATA1 LDA ,X+
|
CMPA #$04
|
CMPA #$04
|
BNE PDATA0
|
BNE PDATA0
|
RTS
|
RTS
|
*
|
*
|
** 'UF' Format RAMdisc to FLEX standard.
|
** 'UF' Format RAMdisc to FLEX standard.
|
*
|
*
|
DISFOS FCB $0A,$0D
|
DISFOS FCB $0A,$0D
|
FCC 'Formating RAMdisk... '
|
FCC 'Formating RAMdisk... '
|
FCB $0A,$0D
|
FCB $0A,$0D
|
FCC 'Drive Number ?'
|
FCC 'Drive Number ?'
|
FCB 4
|
FCB 4
|
MESS6 FCB $0A,$0D,4
|
MESS6 FCB $0A,$0D,4
|
FCC 'Ramdisk not allocated! '
|
FCC 'Ramdisk not allocated! '
|
FCB 4
|
FCB 4
|
UFMSG1 FCB $0A,$0D
|
UFMSG1 FCB $0A,$0D
|
FCC 'Format Complete'
|
FCC 'Format Complete'
|
FCB 4
|
FCB 4
|
*
|
*
|
UFSUB JSR INITDR
|
UFSUB JSR INITDR
|
LDX #DISFOS
|
LDX #DISFOS
|
JSR PDATA1
|
JSR PDATA1
|
UFSUB1 LBSR RCHAR
|
UFSUB1 LBSR RCHAR
|
BCC UFSUB1
|
BCC UFSUB1
|
LBSR SCHAR
|
LBSR SCHAR
|
CMPA #'0'
|
CMPA #'0'
|
LBLO UFEXIT
|
LBLO UFEXIT
|
CMPA #'3'
|
CMPA #'3'
|
LBHI UFEXIT
|
LBHI UFEXIT
|
SUBA #'0'
|
SUBA #'0'
|
TFR A,B
|
TFR A,B
|
STB DRVNUM
|
STB DRVNUM
|
LDX #DRVNUM-3
|
LDX #DRVNUM-3
|
JSR DRVSEL
|
JSR DRVSEL
|
*
|
*
|
* set up free chain
|
* set up free chain
|
*
|
*
|
LDX #BUFFER clear out buffer
|
LDX #BUFFER clear out buffer
|
CLRA
|
CLRA
|
CLRB
|
CLRB
|
DFL1 STA 0,X+
|
DFL1 STA 0,X+
|
DECB
|
DECB
|
BNE DFL1
|
BNE DFL1
|
*
|
*
|
CLR TRACK
|
CLR TRACK
|
LDA #1
|
LDA #1
|
STA SECTOR
|
STA SECTOR
|
DFL2 LDX #BUFFER
|
DFL2 LDX #BUFFER
|
LDA TRACK
|
LDA TRACK
|
STA 0,X
|
STA 0,X
|
LDA SECTOR
|
LDA SECTOR
|
INCA
|
INCA
|
CMPA #RMAXSEC+1 last sector on track?
|
CMPA #RMAXSEC+1 last sector on track?
|
BNE DFL3
|
BNE DFL3
|
INC 0,X
|
INC 0,X
|
LDA #1
|
LDA #1
|
DFL3 STA 1,X
|
DFL3 STA 1,X
|
LDA TRACK
|
LDA TRACK
|
LDB SECTOR
|
LDB SECTOR
|
JSR WRITSC
|
JSR WRITSC
|
INC SECTOR
|
INC SECTOR
|
LDA SECTOR
|
LDA SECTOR
|
CMPA #RMAXSEC+1
|
CMPA #RMAXSEC+1
|
BNE DFL2
|
BNE DFL2
|
LDA #1
|
LDA #1
|
STA SECTOR
|
STA SECTOR
|
INC TRACK
|
INC TRACK
|
LDA TRACK
|
LDA TRACK
|
CMPA #RMAXTRK
|
CMPA #RMAXTRK
|
BNE DFL2
|
BNE DFL2
|
* break free chain at last track/sector
|
* break free chain at last track/sector
|
LDX #BUFFER
|
LDX #BUFFER
|
LDA #RMAXTRK-1
|
LDA #RMAXTRK-1
|
LDB #RMAXSEC
|
LDB #RMAXSEC
|
JSR READSC
|
JSR READSC
|
LDX #BUFFER
|
LDX #BUFFER
|
CLR 0,X
|
CLR 0,X
|
CLR 1,X
|
CLR 1,X
|
LDA #RMAXTRK-1
|
LDA #RMAXTRK-1
|
LDB #RMAXSEC
|
LDB #RMAXSEC
|
JSR WRITSC
|
JSR WRITSC
|
* set up sector structure, SIR, directory etc
|
* set up sector structure, SIR, directory etc
|
LDX #BUFFER
|
LDX #BUFFER
|
CLRA
|
CLRA
|
LDB #RMAXSEC
|
LDB #RMAXSEC
|
JSR READSC
|
JSR READSC
|
LDX #BUFFER
|
LDX #BUFFER
|
CLR 0,X break end of directory chain
|
CLR 0,X break end of directory chain
|
CLR 1,X
|
CLR 1,X
|
CLRA
|
CLRA
|
LDB #RMAXSEC
|
LDB #RMAXSEC
|
JSR WRITSC
|
JSR WRITSC
|
*
|
*
|
LDX #BUFFER
|
LDX #BUFFER
|
CLRA
|
CLRA
|
LDB #3 set up SIR
|
LDB #3 set up SIR
|
JSR READSC
|
JSR READSC
|
LDX #BUFFER
|
LDX #BUFFER
|
CLR 0,X break forward link
|
CLR 0,X break forward link
|
CLR 1,X
|
CLR 1,X
|
LDD #$5241 set volume name (RAMDISK )
|
LDD #$5241 set volume name (RAMDISK )
|
STD 16,X
|
STD 16,X
|
LDD #$4D44
|
LDD #$4D44
|
STD 18,X
|
STD 18,X
|
LDD #$4953
|
LDD #$4953
|
STD 20,X
|
STD 20,X
|
LDD #$4B20
|
LDD #$4B20
|
STD 22,X
|
STD 22,X
|
LDD #1 volume number
|
LDD #1 volume number
|
STD 27,X
|
STD 27,X
|
LDD #$0101 first trk/sec 01-01
|
LDD #$0101 first trk/sec 01-01
|
STD 29,X
|
STD 29,X
|
LDA #RMAXTRK-1
|
LDA #RMAXTRK-1
|
LDB #RMAXSEC
|
LDB #RMAXSEC
|
STD 31,X
|
STD 31,X
|
STD 38,X
|
STD 38,X
|
LDD #RTOTSEC total DATA sectors (2912-14)
|
LDD #RTOTSEC total DATA sectors (2912-14)
|
STD 33,X
|
STD 33,X
|
*
|
*
|
LDA #01 month set default creation date (SYS09's birthday!)
|
LDA #01 month set default creation date (SYS09's birthday!)
|
STA 35,X
|
STA 35,X
|
LDA #07 day
|
LDA #07 day
|
STA 36,X
|
STA 36,X
|
LDA #07 year
|
LDA #07 year
|
STA 37,X
|
STA 37,X
|
*
|
*
|
RF3 CLRA
|
RF3 CLRA
|
LDB #3
|
LDB #3
|
JSR WRITSC
|
JSR WRITSC
|
*
|
*
|
* LDX #BUFFER
|
* LDX #BUFFER
|
* CLRA
|
* CLRA
|
* LDB #1
|
* LDB #1
|
* JSR READSC
|
* JSR READSC
|
* LDX #BUFFER
|
* LDX #BUFFER
|
* LDA #$AA set the init flag
|
* LDA #$AA set the init flag
|
* STA 0,X
|
* STA 0,X
|
* LDA #$55
|
* LDA #$55
|
* STA 1,X
|
* STA 1,X
|
* CLRA
|
* CLRA
|
* LDB #1
|
* LDB #1
|
* JSR WRITSC
|
* JSR WRITSC
|
*
|
*
|
* Write Boot sector
|
* Write Boot sector
|
*
|
*
|
LDX #$C000
|
LDX #$C000
|
CLRA TRACK 0
|
CLRA TRACK 0
|
LDB #$01 SECTOR 1
|
LDB #$01 SECTOR 1
|
STA TRACK
|
STA TRACK
|
STB SECTOR
|
STB SECTOR
|
LBSR WRITSC
|
LBSR WRITSC
|
*
|
*
|
UFEXIT LDX #UFMSG1
|
UFEXIT LDX #UFMSG1
|
JMP PDATA1
|
JMP PDATA1
|
*
|
*
|
*
|
*
|
** 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_SCNT EQU CF_BASE+2
|
CF_SCNT EQU CF_BASE+2
|
CF_SNUM EQU CF_BASE+3
|
CF_SNUM EQU CF_BASE+3
|
CF_CLO EQU CF_BASE+4
|
CF_CLO EQU CF_BASE+4
|
CF_CHI EQU CF_BASE+5
|
CF_CHI 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
|
*
|
*
|
*
|
*
|
* INITIALIZE CF CARD FOR 8 BIT LBA MODE
|
* INITIALIZE CF CARD FOR 8 BIT LBA MODE
|
*
|
*
|
INITDR BSR WAITRDY
|
INITDR BSR WAITRDY
|
LDA #HEADLBA
|
LDA #HEADLBA
|
STA CF_HEAD
|
STA CF_HEAD
|
LDA #FEAT8BIT
|
LDA #FEAT8BIT
|
STA CF_FEATURE
|
STA CF_FEATURE
|
LDA #CMDFEATURE
|
LDA #CMDFEATURE
|
STA CF_COMAND
|
STA CF_COMAND
|
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
|
STB CF_SNUM
|
STB CF_SNUM
|
STA CF_CLO
|
STA CF_CLO
|
LDB DRVNUM
|
LDB DRVNUM
|
STB CF_CHI
|
STB CF_CHI
|
LDB #$01
|
LDB #$01
|
STB CF_SCNT
|
STB CF_SCNT
|
CLRB
|
CLRB
|
RTS
|
RTS
|
*
|
*
|
* READ SECTORS FROM CF
|
* READ SECTORS FROM CF
|
*
|
*
|
*
|
*
|
READSC BSR SEEKTS
|
READSC 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
|
*
|
*
|
* WRITE SECTOR TO CF
|
* WRITE SECTOR TO CF
|
*
|
*
|
WRITSC BSR SEEKTS ; SEEK TRACK & SECTOR
|
WRITSC BSR SEEKTS ; SEEK TRACK & SECTOR
|
LDA #CMDWRITE ; IDE WRITE MULTIPLE
|
LDA #CMDWRITE ; IDE WRITE MULTIPLE
|
STA CF_COMAND
|
STA CF_COMAND
|
BSR WAITRDY
|
BSR WAITRDY
|
*
|
*
|
* WRITE LOOP
|
* WRITE LOOP
|
*
|
*
|
CLRB
|
CLRB
|
WRTLP1 BSR WAITDRQ
|
WRTLP1 BSR WAITDRQ
|
LDA ,X+
|
LDA ,X+
|
STA CF_DATA
|
STA CF_DATA
|
DECB
|
DECB
|
BNE WRTLP1
|
BNE WRTLP1
|
*
|
*
|
CLRB
|
CLRB
|
WRTLP2 BSR WAITDRQ
|
WRTLP2 BSR WAITDRQ
|
CLRA
|
CLRA
|
STA CF_DATA
|
STA CF_DATA
|
DECB
|
DECB
|
BNE WRTLP2
|
BNE WRTLP2
|
*
|
*
|
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 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
|
*
|
*
|
*******************************************************
|
*******************************************************
|
*
|
*
|
* 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
|
DRNUM FCB 0 Drive number 0
|
DRNUM 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_SCNT EQU CF_BASE+2
|
*CF_SCNT EQU CF_BASE+2
|
*CF_SNUM EQU CF_BASE+3
|
*CF_SNUM EQU CF_BASE+3
|
*CF_CLO EQU CF_BASE+4
|
*CF_CLO EQU CF_BASE+4
|
*CF_CHI EQU CF_BASE+5
|
*CF_CHI 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
|
*
|
*
|
* 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
|
*
|
*
|
SEEK DECB
|
SEEK DECB
|
STB CF_SNUM
|
STB CF_SNUM
|
STA CF_CLO
|
STA CF_CLO
|
LDB DRNUM
|
LDB DRNUM
|
STB CF_CHI
|
STB CF_CHI
|
LDB #$01
|
LDB #$01
|
STB CF_SCNT
|
STB CF_SCNT
|
CLRB
|
CLRB
|
RTS
|
RTS
|
*
|
*
|
* READ SECTORS FROM CF
|
* READ SECTORS FROM CF
|
*
|
*
|
*
|
*
|
READ BSR SEEK
|
READ BSR SEEK
|
LDA #CMDREAD ; IDE READ MULTIPLE
|
LDA #CMDREAD ; IDE READ MULTIPLE
|
STA CF_COMAND
|
STA CF_COMAND
|
BSR WTRDY
|
BSR WTRDY
|
*
|
*
|
* READ LOOP
|
* READ LOOP
|
*
|
*
|
CLRB
|
CLRB
|
READ1 BSR WTDRQ
|
READ1 BSR WTDRQ
|
LDA CF_DATA
|
LDA CF_DATA
|
STA ,X+
|
STA ,X+
|
DECB
|
DECB
|
BNE READ1
|
BNE READ1
|
*
|
*
|
CLRB
|
CLRB
|
READ2 BSR WTDRQ
|
READ2 BSR WTDRQ
|
LDA CF_DATA
|
LDA CF_DATA
|
DECB
|
DECB
|
BNE READ2
|
BNE READ2
|
*
|
*
|
BSR WTRDY
|
BSR WTRDY
|
CLRB
|
CLRB
|
RTS
|
RTS
|
*
|
*
|
* WAIT UNTIL READY
|
* WAIT UNTIL READY
|
*
|
*
|
WTRDY LDA CF_STATUS
|
WTRDY LDA CF_STATUS
|
BITA #BSY
|
BITA #BSY
|
BNE WTRDY
|
BNE WTRDY
|
LDA CF_STATUS
|
LDA CF_STATUS
|
BITA #DRDY
|
BITA #DRDY
|
BEQ WTRDY
|
BEQ WTRDY
|
RTS
|
RTS
|
*
|
*
|
* WAIT FOR DATA REQUEST
|
* WAIT FOR DATA REQUEST
|
*
|
*
|
WTDRQ LDA CF_STATUS
|
WTDRQ LDA CF_STATUS
|
BITA #DRQ
|
BITA #DRQ
|
BEQ WTDRQ
|
BEQ WTDRQ
|
RTS
|
RTS
|
*
|
*
|
END START
|
END START
|
|
|