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

Subversion Repositories System09

[/] [System09/] [trunk/] [src/] [fmt/] [fmt_cf8.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 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
 
 

powered by: WebSVN 2.1.0

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