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

Subversion Repositories System09

[/] [System09/] [rev_86/] [src/] [sys09bug/] [sys09ide.asm] - Diff between revs 66 and 112

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 66 Rev 112
*
*
** SYS09BUG MONITOR EXTENSIONS
** SYS09BUG MONITOR EXTENSIONS
*
*
* FOR SYS09BUG ON THE XESS XSA-3S100 / XST-3.0
* FOR SYS09BUG ON THE XESS XSA-3S100 / XST-3.0
* WITH I/O MAPPED AT $XE000
* WITH I/O MAPPED AT $XE000
* 16 BIT IDE MAPPED AT $E100
* 16 BIT IDE MAPPED AT $E100
* AND ROM MAPPED AT $XF000
* AND ROM MAPPED AT $XF000
*
*
*
*
 PAGE
 PAGE
*
*
***************************************************
***************************************************
* Serial PROM register
* Serial PROM register
***************************************************
***************************************************
*
*
** CONFIGURATION PROM DEFINITIONS
** CONFIGURATION PROM DEFINITIONS
*
*
PROMREG EQU MONIO+$C0
PROMREG EQU MONIO+$C0
PCLKHI  EQU $01     Toggle PROM Clock High
PCLKHI  EQU $01     Toggle PROM Clock High
PCLKLO  EQU $00     Toggle PROM Clock Low
PCLKLO  EQU $00     Toggle PROM Clock Low
PRSTHI  EQU $02     Toggle PROM Reset High
PRSTHI  EQU $02     Toggle PROM Reset High
PRSTLO  EQU $00     Toggle PROM Reset Low
PRSTLO  EQU $00     Toggle PROM Reset Low
SYNCHI  EQU $AA55   Synch Pattern High Word
SYNCHI  EQU $AA55   Synch Pattern High Word
SYNCLO  EQU $FF00   Synch Pattern Low Word
SYNCLO  EQU $FF00   Synch Pattern Low Word
*
*
*
*
***************************************************
***************************************************
*   START OF ROM                                  *
*   START OF ROM                                  *
***************************************************
***************************************************
*
*
MONITV EQU MONROM+0  FDB MONITOR
MONITV EQU MONROM+0  FDB MONITOR
NXTCMV EQU MONROM+2  FDB NEXTCMD
NXTCMV EQU MONROM+2  FDB NEXTCMD
INCHV  EQU MONROM+4  FDB INCH
INCHV  EQU MONROM+4  FDB INCH
INCHEV EQU MONROM+6  FDB INCHE
INCHEV EQU MONROM+6  FDB INCHE
INCHKV EQU MONROM+8  FDB INCHEK
INCHKV EQU MONROM+8  FDB INCHEK
OUTCHV EQU MONROM+10 FDB OUTCH
OUTCHV EQU MONROM+10 FDB OUTCH
PDATAV EQU MONROM+12 FDB PDATA
PDATAV EQU MONROM+12 FDB PDATA
PCRLFV EQU MONROM+14 FDB PCRLF
PCRLFV EQU MONROM+14 FDB PCRLF
PSTRGV EQU MONROM+16 FDB PSTRNG
PSTRGV EQU MONROM+16 FDB PSTRNG
LRAV   EQU MONROM+18 FDB LRA
LRAV   EQU MONROM+18 FDB LRA
*
*
* Condition code flags
* Condition code flags
*
*
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
*
*
* Serial Port
* Serial Port
*
*
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 Disk Constants
* Some Disk Constants
*
*
RMAXTRK EQU 256
RMAXTRK EQU 256
RMAXSEC EQU 255
RMAXSEC EQU 255
RTOTSEC EQU RMAXTRK*RMAXSEC-RMAXSEC
RTOTSEC EQU RMAXTRK*RMAXSEC-RMAXSEC
*
*
* RAM SPACE
* RAM SPACE
*
*
* PUT THIS DOWN THE BOTTOM OF MEMORY
* PUT THIS DOWN THE BOTTOM OF MEMORY
*
*
        ORG  $0100
        ORG  $0100
DRVNUM  RMB 1
DRVNUM  RMB 1
TRACK   RMB 1
TRACK   RMB 1
SECTOR  RMB 1
SECTOR  RMB 1
CHKSUM  RMB 1
CHKSUM  RMB 1
BLKNUM  RMB 1 Xmodem block number
BLKNUM  RMB 1 Xmodem block number
BYTCNT  RMB 1 Xmodem byte count
BYTCNT  RMB 1 Xmodem byte count
XSTATE  RMB 2 Xmodem State Vector
XSTATE  RMB 2 Xmodem State Vector
DELCNT  RMB 3  $00,$00,$00 Xmodem Poll timer
DELCNT  RMB 3  $00,$00,$00 Xmodem Poll timer
MAXTRK  RMB 1
MAXTRK  RMB 1
MAXSEC  RMB 1
MAXSEC  RMB 1
        ORG  $0200
        ORG  $0200
*
*
* SECTOR BUFFER
* SECTOR BUFFER
*
*
BUFFER  RMB  256
BUFFER  RMB  256
*
*
****************************************
****************************************
*
*
* START OF EXTENSION COMMANDS
* START OF EXTENSION COMMANDS
*
*
****************************************
****************************************
*
*
        ORG MONEXT
        ORG MONEXT
        FDB NEXTEXT   Jump to next extended command
        FDB NEXTEXT   Jump to next extended command
*
*
***** NEXTCMD *****
***** NEXTCMD *****
*
*
NEXTEXT JSR [INCHEV]  GET ONE CHAR. FROM TERMINAL
NEXTEXT JSR [INCHEV]  GET ONE CHAR. FROM TERMINAL
        ANDA #$7F STRIP PARITY FROM CHAR.
        ANDA #$7F STRIP PARITY FROM CHAR.
        TFR  A,B
        TFR  A,B
        LDA  #$20
        LDA  #$20
        JSR [OUTCHV] PRNT SPACE
        JSR [OUTCHV] PRNT SPACE
        CMPB #$60
        CMPB #$60
        BLE NXTEX0
        BLE NXTEX0
        SUBB #$20
        SUBB #$20
*
*
***** DO TABLE LOOKUP *****
***** DO TABLE LOOKUP *****
*   FOR COMMAND FUNCTIONS
*   FOR COMMAND FUNCTIONS
*
*
NXTEX0  LDX #EXTTAB    POINT TO JUMP TABLE
NXTEX0  LDX #EXTTAB    POINT TO JUMP TABLE
NXTEX1  CMPB ,X+       DOES COMMAND MATCH TABLE ENTRY ?
NXTEX1  CMPB ,X+       DOES COMMAND MATCH TABLE ENTRY ?
        BEQ  JMPEXT    BRANCH IF MATCH FOUND
        BEQ  JMPEXT    BRANCH IF MATCH FOUND
        LEAX 2,X       POINT TO NEXT ENTRY IN TABLE
        LEAX 2,X       POINT TO NEXT ENTRY IN TABLE
        CMPX #EXTEND   REACHED END OF TABLE YET ?
        CMPX #EXTEND   REACHED END OF TABLE YET ?
        BNE  NXTEX1    IF NOT END, CHECK NEXT ENTRY
        BNE  NXTEX1    IF NOT END, CHECK NEXT ENTRY
        LDX  #MSGWHAT  POINT TO MSG "WHAT?"
        LDX  #MSGWHAT  POINT TO MSG "WHAT?"
        LBRA PDATA1    PRINT MSG AND RETURN
        LBRA PDATA1    PRINT MSG AND RETURN
JMPEXT  JMP  [,X]      JUMP TO COMMAND ROUTINE
JMPEXT  JMP  [,X]      JUMP TO COMMAND ROUTINE
*
*
* EXTENDED COMMAND JUMP TABLE
* EXTENDED COMMAND JUMP TABLE
*
*
EXTTAB EQU *
EXTTAB EQU *
       FCC 'B'   BOOT FLEX
       FCC 'B'   BOOT FLEX
       FDB UBSUB
       FDB UBSUB
       FCC 'F'   FORMAT IDE DISK
       FCC 'F'   FORMAT IDE DISK
       FDB UFSUB
       FDB UFSUB
       FCC 'X'   XMODEM ROM DISK UPLOAD
       FCC 'X'   XMODEM ROM DISK UPLOAD
       FDB UXSUB
       FDB UXSUB
*
*
EXTEND EQU *
EXTEND EQU *
*
*
MSGWHAT FCC "WHAT ?"
MSGWHAT FCC "WHAT ?"
        FCB $0A,$0D,$04
        FCB $0A,$0D,$04
*
*
* GO TO FLEX RESIDENT IN MEMORY
* GO TO FLEX RESIDENT IN MEMORY
*
*
UBSUB   LDX #$CD00
UBSUB   LDX #$CD00
        STX 10,U
        STX 10,U
        TFR  U,S
        TFR  U,S
        RTI
        RTI
*
*
* 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
*
*
** 'UF' Format IDE Drive to FLEX standard.
** 'UF' Format IDE Drive to FLEX standard.
*
*
DISFOS  FCB $0A,$0D
DISFOS  FCB $0A,$0D
        FCC 'Formating IDE disk... '
        FCC 'Formating IDE disk... '
        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 'IDE drive not allocated! '
        FCC 'IDE drive not allocated! '
        FCB 4
        FCB 4
UFMSG1  FCB $0A,$0D
UFMSG1  FCB $0A,$0D
        FCC 'Format Complete'
        FCC 'Format Complete'
        FCB 4
        FCB 4
VOLMSG  FCC 'IDEDISK '
VOLMSG  FCC 'IDEDISK '
        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
*
*
        PSHS Y
        PSHS Y
        LDY  #VOLMSG
        LDY  #VOLMSG
        LDB  #16
        LDB  #16
DFL4    LDA  ,Y+
DFL4    LDA  ,Y+
        STA  B,X
        STA  B,X
        INCB
        INCB
        CMPB #24
        CMPB #24
        BNE  DFL4
        BNE  DFL4
        PULS Y
        PULS Y
*
*
        CLRA
        CLRA
        LDB  DRVNUM volume number
        LDB  DRVNUM 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
*
*
* Not sure what this is about
* Not sure what this is about
* put bootstrap on track 0 sector 1
* put bootstrap on track 0 sector 1
*
*
*        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  #BOOT
        LDX  #BOOT
        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
*
*
* ACIA INPUT TEST
* ACIA INPUT TEST
*
*
INTEST  LDA ACIAC1
INTEST  LDA ACIAC1
        BITA #$01
        BITA #$01
        RTS
        RTS
*
*
* RESET ACIA
* RESET ACIA
*
*
ACIRST  LDA #$03 master reset
ACIRST  LDA #$03 master reset
        STA  ACIAC1
        STA  ACIAC1
        LDA #$11
        LDA #$11
        STA ACIAC1
        STA ACIAC1
        RTS
        RTS
*
*
* ACIA INPUT
* ACIA INPUT
*
*
INTER   LDA  #16
INTER   LDA  #16
        STA  DELCNT+0
        STA  DELCNT+0
        CLR  DELCNT+1
        CLR  DELCNT+1
        CLR  DELCNT+2
        CLR  DELCNT+2
INTER0  LDA  ACIAC1
INTER0  LDA  ACIAC1
        BITA #$01
        BITA #$01
        BNE  INTER1
        BNE  INTER1
        BITA #$78
        BITA #$78
        BEQ  INTER2
        BEQ  INTER2
        BSR  ACIRST
        BSR  ACIRST
        BRA  INTER
        BRA  INTER
*
*
INTER1  LDA  ACIAD1
INTER1  LDA  ACIAD1
        ANDCC #$FF-VFLAG
        ANDCC #$FF-VFLAG
        RTS
        RTS
*
*
INTER2  DEC  DELCNT+2
INTER2  DEC  DELCNT+2
        BNE  INTER0
        BNE  INTER0
        DEC  DELCNT+1
        DEC  DELCNT+1
        BNE  INTER0
        BNE  INTER0
        DEC  DELCNT+0
        DEC  DELCNT+0
        BNE  INTER0
        BNE  INTER0
        CLRA
        CLRA
        ORCC #VFLAG
        ORCC #VFLAG
        RTS
        RTS
*
*
* ACIA OUTPUT
* ACIA OUTPUT
*
*
OUTTER  PSHS A
OUTTER  PSHS A
*
*
OUTTE1  LDA ACIAC1
OUTTE1  LDA ACIAC1
        BITA #$02
        BITA #$02
        BNE  OUTTE2
        BNE  OUTTE2
        BITA #$78
        BITA #$78
        BEQ  OUTTE1
        BEQ  OUTTE1
        BSR  ACIRST
        BSR  ACIRST
        BRA  OUTTE1
        BRA  OUTTE1
*
*
OUTTE2  PULS A
OUTTE2  PULS A
        STA ACIAD1
        STA ACIAD1
        RTS
        RTS
*
*
* Print Data
* Print Data
*
*
PDATA0  BSR  OUTTER
PDATA0  BSR  OUTTER
PDATA1  LDA  ,X+
PDATA1  LDA  ,X+
        CMPA #$04
        CMPA #$04
        BNE  PDATA0
        BNE  PDATA0
        RTS
        RTS
*
*
*
*
** 'UX' Xmodem IDE Disk upload
** 'UX' Xmodem IDE Disk upload
*
*
UXMES0  FCB $0D,$0A
UXMES0  FCB $0D,$0A
        FCC 'Xmodem IDE Disk Upload'
        FCC 'Xmodem IDE Disk Upload'
        FCB 4
        FCB 4
UXMES1  FCB $0D,$0A
UXMES1  FCB $0D,$0A
        FCC 'Upload Complete'
        FCC 'Upload Complete'
        FCB 4
        FCB 4
UXMES2  FCB $0D,$0A
UXMES2  FCB $0D,$0A
        FCC 'Upload Error'
        FCC 'Upload Error'
        FCB 4
        FCB 4
UXMSG3  FCB $0D,$0A
UXMSG3  FCB $0D,$0A
        FCC 'Drive Number :'
        FCC 'Drive Number :'
        FCB 4
        FCB 4
UXMSG4  FCB $0D,$0A
UXMSG4  FCB $0D,$0A
        FCC 'Are You Sure ? (Y/N)'
        FCC 'Are You Sure ? (Y/N)'
        FCB 4
        FCB 4
*
*
* Print Banner
* Print Banner
*
*
UXSUB   LDX #UXMES0
UXSUB   LDX #UXMES0
        LBSR PDATA1
        LBSR PDATA1
*
*
* Prompt for Disk drive number (0 to 3)
* Prompt for Disk drive number (0 to 3)
*
*
        LDX #UXMSG3
        LDX #UXMSG3
        LBSR PDATA1
        LBSR PDATA1
UXSUB1  LBSR INTER
UXSUB1  LBSR INTER
        BVS  UXSUB1
        BVS  UXSUB1
        LBSR OUTTER
        LBSR OUTTER
        CMPA #'0
        CMPA #'0
        LBLO UXEXIT
        LBLO UXEXIT
        CMPA #'3
        CMPA #'3
        LBHI UXEXIT
        LBHI UXEXIT
        SUBA #'0
        SUBA #'0
        STA  DRVNUM
        STA  DRVNUM
*
*
* Report selected drive
* Report selected drive
*
*
        LDX #UXMSG3
        LDX #UXMSG3
        LBSR PDATA1
        LBSR PDATA1
        LDA  DRVNUM
        LDA  DRVNUM
        ADDA #'0
        ADDA #'0
        LBSR OUTTER
        LBSR OUTTER
*
*
* Ask for confirmation (Y/N)
* Ask for confirmation (Y/N)
*
*
        LDX #UXMSG4
        LDX #UXMSG4
        LBSR PDATA1
        LBSR PDATA1
UXSUB2  LBSR INTER
UXSUB2  LBSR INTER
        BVS  UXSUB2
        BVS  UXSUB2
        LBSR OUTTER
        LBSR OUTTER
        ANDA #$5F
        ANDA #$5F
        CMPA #'N
        CMPA #'N
        LBEQ UXEXIT
        LBEQ UXEXIT
        CMPA #'Y
        CMPA #'Y
        BNE  UXSUB
        BNE  UXSUB
*
*
* We have confirmation ... now load the disk image
* We have confirmation ... now load the disk image
*
*
        LBSR INITDR
        LBSR INITDR
        LDU  #XSTST
        LDU  #XSTST
        STU  XSTATE
        STU  XSTATE
        LDA  #1
        LDA  #1
        STA  BLKNUM
        STA  BLKNUM
*
*
* Sector1
* Sector1
*
*
        LDX  #BUFFER
        LDX  #BUFFER
*
*
        CLRA         TRACK 0
        CLRA         TRACK 0
        LDB  #$01    SECTOR 1
        LDB  #$01    SECTOR 1
        STA  TRACK
        STA  TRACK
        STB  SECTOR
        STB  SECTOR
*
*
        LBSR XREAD
        LBSR XREAD
        LBCS UXERR
        LBCS UXERR
        LBSR XACK
        LBSR XACK
        LBSR XREAD
        LBSR XREAD
        LBCS UXERR
        LBCS UXERR
*
*
        LDX  #BUFFER
        LDX  #BUFFER
        LDA  TRACK
        LDA  TRACK
        LDB  SECTOR
        LDB  SECTOR
        LBSR WRITSC
        LBSR WRITSC
        LBSR XACK
        LBSR XACK
*
*
* Sector 2
* Sector 2
*
*
        LDX  #BUFFER
        LDX  #BUFFER
*
*
        LDA  TRACK
        LDA  TRACK
        LDB  SECTOR
        LDB  SECTOR
        INCB
        INCB
        STA  TRACK
        STA  TRACK
        STB  SECTOR
        STB  SECTOR
*
*
        LBSR XREAD
        LBSR XREAD
        LBCS UXERR
        LBCS UXERR
        LBSR XACK
        LBSR XACK
        LBSR XREAD
        LBSR XREAD
        LBCS UXERR
        LBCS UXERR
*
*
        LDX  #BUFFER
        LDX  #BUFFER
        LDA  TRACK
        LDA  TRACK
        LDB  SECTOR
        LDB  SECTOR
        LBSR WRITSC
        LBSR WRITSC
*
*
        LBSR XACK
        LBSR XACK
*
*
* Sector 3 - SIR
* Sector 3 - SIR
*
*
        LDX  #BUFFER
        LDX  #BUFFER
*
*
        LDA  TRACK
        LDA  TRACK
        LDB  SECTOR
        LDB  SECTOR
        INCB
        INCB
        STA  TRACK
        STA  TRACK
        STB  SECTOR
        STB  SECTOR
*
*
        LBSR XREAD
        LBSR XREAD
        LBCS UXERR
        LBCS UXERR
        LBSR XACK
        LBSR XACK
        LBSR XREAD
        LBSR XREAD
        LBCS UXERR
        LBCS UXERR
*
*
        LDX  #BUFFER
        LDX  #BUFFER
        LDA  38,X
        LDA  38,X
        INCA
        INCA
        STA  MAXTRK
        STA  MAXTRK
        LDB  39,X
        LDB  39,X
        INCB
        INCB
        STB  MAXSEC
        STB  MAXSEC
        LDA  TRACK
        LDA  TRACK
        LDB  SECTOR
        LDB  SECTOR
        LBSR WRITSC
        LBSR WRITSC
*
*
        LBSR XACK
        LBSR XACK
*
*
* Sector 4 to Last Track & Sector
* Sector 4 to Last Track & Sector
*
*
*
*
        LDA  TRACK
        LDA  TRACK
        LDB  SECTOR
        LDB  SECTOR
        INCB
        INCB
*
*
UXLOOP  LDX  #BUFFER
UXLOOP  LDX  #BUFFER
        STA  TRACK
        STA  TRACK
        STB  SECTOR
        STB  SECTOR
*
*
        LBSR XREAD
        LBSR XREAD
        LBCS UXERR
        LBCS UXERR
        LBSR XACK
        LBSR XACK
        LBSR XREAD
        LBSR XREAD
        LBCS UXERR
        LBCS UXERR
*
*
        LDX  #BUFFER
        LDX  #BUFFER
        LDA  TRACK
        LDA  TRACK
        LDB  SECTOR
        LDB  SECTOR
        LBSR WRITSC
        LBSR WRITSC
        LBSR XACK
        LBSR XACK
*
*
        LDA  TRACK
        LDA  TRACK
        LDB  SECTOR
        LDB  SECTOR
        INCB
        INCB
        CMPB MAXSEC
        CMPB MAXSEC
        BNE  UXLOOP
        BNE  UXLOOP
        LDB  #1
        LDB  #1
        INCA
        INCA
        CMPA MAXTRK
        CMPA MAXTRK
        BNE  UXLOOP
        BNE  UXLOOP
*
*
*
*
*  Write Boot sector
*  Write Boot sector
*
*
        LDX  #BOOT
        LDX  #BOOT
        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
*
*
UXEXIT  LDX  #UXMES1
UXEXIT  LDX  #UXMES1
        JMP  PDATA1
        JMP  PDATA1
*
*
UXERR   LDX  #UXMES2
UXERR   LDX  #UXMES2
        LBRA PDATA1
        LBRA PDATA1
*
*
* Get a Byte using XModem protocol
* Get a Byte using XModem protocol
* Carry clear => no errors
* Carry clear => no errors
* Carry set   => errors
* Carry set   => errors
*
*
XREAD   PSHS U
XREAD   PSHS U
        LDU  XSTATE
        LDU  XSTATE
*
*
XBYTE0  LBSR INTER
XBYTE0  LBSR INTER
        BVC  XBYTE1
        BVC  XBYTE1
        LDA  #NAK
        LDA  #NAK
        LBSR OUTTER
        LBSR OUTTER
        LDU  #XSTST
        LDU  #XSTST
        BRA  XBYTE0
        BRA  XBYTE0
*
*
XBYTE1  JSR  ,U
XBYTE1  JSR  ,U
        BNE  XBYTE0
        BNE  XBYTE0
        STU  XSTATE
        STU  XSTATE
        PULS U,PC
        PULS U,PC
*
*
* START - LOOK FOR SOH (START OF HEADER) = $01
* START - LOOK FOR SOH (START OF HEADER) = $01
*
*
XSTST   CMPA #SOH
XSTST   CMPA #SOH
        BNE  XSTST1
        BNE  XSTST1
        LDU  #XSTBL
        LDU  #XSTBL
        ANDCC #$FF-CFLAG-ZFLAG No abort, no valid data (no exit)
        ANDCC #$FF-CFLAG-ZFLAG No abort, no valid data (no exit)
        RTS
        RTS
*
*
XSTST1  CMPA #EOT
XSTST1  CMPA #EOT
        BNE  XSTST2
        BNE  XSTST2
        LDA  #ACK
        LDA  #ACK
        LBSR OUTTER
        LBSR OUTTER
        ORCC  #CFLAG+ZFLAG  Set (c)=1 abort & exit
        ORCC  #CFLAG+ZFLAG  Set (c)=1 abort & exit
        RTS
        RTS
*
*
XSTST2  CMPA #CAN
XSTST2  CMPA #CAN
        BNE  XSTST3
        BNE  XSTST3
        ORCC  #CFLAG+ZFLAG  Set (c)=1 abort & exit
        ORCC  #CFLAG+ZFLAG  Set (c)=1 abort & exit
        RTS
        RTS
*
*
XSTST3  ANDCC #$FF-CFLAG-ZFLAG
XSTST3  ANDCC #$FF-CFLAG-ZFLAG
        RTS
        RTS
*
*
* Got SOH
* Got SOH
* Now get block number
* Now get block number
*
*
XSTBL   CMPA BLKNUM
XSTBL   CMPA BLKNUM
        BNE  XSTBLE
        BNE  XSTBLE
        LDU  #XSTCOM
        LDU  #XSTCOM
        ANDCC #$FF-CFLAG-ZFLAG No abort, No valid data (no exit)
        ANDCC #$FF-CFLAG-ZFLAG No abort, No valid data (no exit)
        RTS
        RTS
*
*
* Error in block number
* Error in block number
*
*
XSTBLE  LDA  #NAK
XSTBLE  LDA  #NAK
        LBSR OUTTER
        LBSR OUTTER
        LDU  #XSTST
        LDU  #XSTST
        ANDCC #$FF-CFLAG-ZFLAG No abort, No valid data (no exit)
        ANDCC #$FF-CFLAG-ZFLAG No abort, No valid data (no exit)
        RTS
        RTS
*
*
* Get complement of block number
* Get complement of block number
*
*
XSTCOM  COMA
XSTCOM  COMA
        CMPA BLKNUM
        CMPA BLKNUM
        BNE  XSTBLE
        BNE  XSTBLE
        CLR  CHKSUM
        CLR  CHKSUM
        LDA  #128
        LDA  #128
        STA  BYTCNT
        STA  BYTCNT
        LDU  #XSTDA
        LDU  #XSTDA
        ANDCC #$FF-CFLAG-ZFLAG No abort, No valid data (no exit)
        ANDCC #$FF-CFLAG-ZFLAG No abort, No valid data (no exit)
        RTS
        RTS
*
*
* Get data bytes
* Get data bytes
*
*
XSTDA   PSHS A
XSTDA   PSHS A
        ADDA CHKSUM
        ADDA CHKSUM
        STA  CHKSUM
        STA  CHKSUM
        PULS A
        PULS A
        DEC  BYTCNT
        DEC  BYTCNT
        BNE  XSTDA1
        BNE  XSTDA1
        LDU  #XSTCK
        LDU  #XSTCK
XSTDA1  STA  ,X+
XSTDA1  STA  ,X+
        ANDCC #$FF-CFLAG-ZFLAG No abort, no valid data (no exit)
        ANDCC #$FF-CFLAG-ZFLAG No abort, no valid data (no exit)
        RTS
        RTS
*
*
* Byte count reached zero
* Byte count reached zero
* Check checksum byte
* Check checksum byte
*
*
XSTCK   CMPA CHKSUM
XSTCK   CMPA CHKSUM
        BNE  XSTCK1 retry if wrong checksum
        BNE  XSTCK1 retry if wrong checksum
*
*
* Checksum OK ...
* Checksum OK ...
* increment block number
* increment block number
* Don't send ACK until data written to CF
* Don't send ACK until data written to CF
*
*
        INC  BLKNUM
        INC  BLKNUM
        LDU  #XSTST
        LDU  #XSTST
        ANDCC #$FF-CFLAG No abort
        ANDCC #$FF-CFLAG No abort
        ORCC #ZFLAG      Valid data (exit)
        ORCC #ZFLAG      Valid data (exit)
        RTS
        RTS
*
*
* Checksum Error detected ...
* Checksum Error detected ...
* Reset Sector counter in ACCB to last 128 byte boundary
* Reset Sector counter in ACCB to last 128 byte boundary
* and send NAK
* and send NAK
*
*
XSTCK1  PSHS B
XSTCK1  PSHS B
        TFR  X,D
        TFR  X,D
        DECB
        DECB
        ANDB #128
        ANDB #128
        TFR  D,X
        TFR  D,X
        PULS B
        PULS B
        LDA  #NAK
        LDA  #NAK
XSTCK2  LBSR OUTTER
XSTCK2  LBSR OUTTER
        LDU  #XSTST
        LDU  #XSTST
        ANDCC #$FF-CFLAG-ZFLAG No abort, no valid data (no exit)
        ANDCC #$FF-CFLAG-ZFLAG No abort, no valid data (no exit)
        RTS
        RTS
*
*
* Acknowledge Data Received
* Acknowledge Data Received
*
*
XACK    PSHS A
XACK    PSHS A
        LDA  #ACK
        LDA  #ACK
        LBSR OUTTER
        LBSR OUTTER
        PULS A,PC
        PULS A,PC
*
*
*
*
** FLEX 9 IDE DISK DRIVERS
** FLEX 9 IDE DISK DRIVERS
*
*
* FOR SYS09BUG 1.2 ON THE XSA-3S1000
* FOR SYS09BUG 1.2 ON THE XSA-3S1000
* WITH I/O MAPPED AT $XE000
* WITH I/O MAPPED AT $XE000
* AND ROM MAPPED AT $XF000
* AND ROM MAPPED AT $XF000
*
*
*
*
* INITIALIZE CF CARD FOR 8 BIT LBA MODE
* INITIALIZE CF CARD FOR 8 BIT LBA MODE
*
*
INITDR LDD #AUXRESET
INITDR LDD #AUXRESET
       STD CF_AUX
       STD CF_AUX
       LDD #AUXRSTREL
       LDD #AUXRSTREL
       STD CF_AUX
       STD CF_AUX
       LDD  #HEADLBA
       LDD  #HEADLBA
       STD  CF_HEAD
       STD  CF_HEAD
       LBRA WTRDY
       LBRA WTRDY
*
*
* 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 PSHS A
SEEKTS PSHS A
       CLRA
       CLRA
       DECB
       DECB
       STD  CF_SECNUM
       STD  CF_SECNUM
       LDB ,S
       LDB ,S
       STD  CF_CYLLO
       STD  CF_CYLLO
       LDB  DRVNUM
       LDB  DRVNUM
       STD  CF_CYLHI
       STD  CF_CYLHI
       LDB  #$01
       LDB  #$01
       STD  CF_SECCNT
       STD  CF_SECCNT
       CLRB
       CLRB
       PULS A,PC
       PULS A,PC
*
*
* READ SECTORS FROM CF
* READ SECTORS FROM CF
*
*
*
*
READSC BSR  SEEKTS
READSC BSR  SEEKTS
       LDD  #CMDREAD ; IDE READ MULTIPLE
       LDD  #CMDREAD ; IDE READ MULTIPLE
       STD  CF_COMAND
       STD  CF_COMAND
       LBSR  WTRDY
       LBSR  WTRDY
*
*
* READ LOOP
* READ LOOP
*
*
       PSHS Y
       PSHS Y
       LDY #256
       LDY #256
RDLP1  LBSR  WTDRQ
RDLP1  LBSR  WTDRQ
       LDD  CF_DATA
       LDD  CF_DATA
       STB  ,X+
       STB  ,X+
       LEAY -1,Y
       LEAY -1,Y
       BNE  RDLP1
       BNE  RDLP1
       PULS Y
       PULS Y
*
*
       LBSR  WTRDY
       LBSR  WTRDY
       CLRB
       CLRB
       RTS
       RTS
*
*
* WRITE SECTOR TO CF
* WRITE SECTOR TO CF
*
*
WRITSC BSR  SEEKTS   ; SEEK TRACK & SECTOR
WRITSC BSR  SEEKTS   ; SEEK TRACK & SECTOR
       LDD  #CMDWRITE ; IDE WRITE MULTIPLE
       LDD  #CMDWRITE ; IDE WRITE MULTIPLE
       STD  CF_COMAND
       STD  CF_COMAND
       LBSR  WTRDY
       LBSR  WTRDY
*
*
* WRITE LOOP
* WRITE LOOP
*
*
       PSHS Y
       PSHS Y
       LDY #256
       LDY #256
       CLRA
       CLRA
WRTLP1 LBSR  WTDRQ
WRTLP1 LBSR  WTDRQ
       LDB  ,X+
       LDB  ,X+
       STD  CF_DATA
       STD  CF_DATA
       LEAY -1,Y
       LEAY -1,Y
       BNE  WRTLP1
       BNE  WRTLP1
       PULS Y
       PULS Y
*
*
       LBSR  WTRDY
       LBSR  WTRDY
       CLRB
       CLRB
       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
*******************************************************
*******************************************************
*
*
* 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
* Bootstrap Loader is position independent code
* Bootstrap Loader is position independent code
*
*
******************************************************
******************************************************
*
*
* Equates
* Equates
*
*
BSSTACK EQU $C0FF
BSSTACK EQU $C0FF
SCTBUF  EQU $C300
SCTBUF  EQU $C300
*
*
* Start of Utility
* Start of Utility
*
*
        ORG MONEXT+$0700
        ORG MONEXT+$0700
BOOT    BRA BLOAD0
BOOT    BRA BLOAD0
        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
*
*
BLOAD0  LDS  #BSSTACK   Set up Bootstrap stack
BLOAD0  LDS  #BSSTACK   Set up Bootstrap stack
        LDD  TRK,PCR    Set up start track and sector
        LDD  TRK,PCR    Set up start track and sector
        STD  SCTBUF
        STD  SCTBUF
        LDY  #SCTBUF+256
        LDY  #SCTBUF+256
*
*
* Perform actual file load
* Perform actual file load
*
*
BLOAD1  BSR GETCH    Get acharcater
BLOAD1  BSR GETCH    Get acharcater
        CMPA #$02    Data record hearder ?
        CMPA #$02    Data record hearder ?
        BEQ  BLOAD2   Skip, is so
        BEQ  BLOAD2   Skip, is so
        CMPA #$16    Xfr address hearder ?
        CMPA #$16    Xfr address hearder ?
        BNE BLOAD1    Loop if neither
        BNE BLOAD1    Loop if neither
*
*
* Get transfer address
* Get transfer address
*
*
        BSR  GETCH
        BSR  GETCH
        STA  TADR,PCR
        STA  TADR,PCR
        BSR  GETCH
        BSR  GETCH
        STA  TADR+1,PCR
        STA  TADR+1,PCR
        BRA  BLOAD1
        BRA  BLOAD1
*
*
* Load data record
* Load data record
*
*
BLOAD2 BSR  GETCH  Get load address
BLOAD2 BSR  GETCH  Get load address
       STA  LADR,PCR
       STA  LADR,PCR
       BSR  GETCH
       BSR  GETCH
       STA  LADR+1,PCR
       STA  LADR+1,PCR
       BSR  GETCH  Get Bytes count
       BSR  GETCH  Get Bytes count
       TFR  A,B
       TFR  A,B
       TSTB
       TSTB
       BEQ  BLOAD1 Loop if count = 0
       BEQ  BLOAD1 Loop if count = 0
       LDX  LADR,PCR  Get load address
       LDX  LADR,PCR  Get load address
BLOAD3 PSHS B,X
BLOAD3 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  BLOAD3  Loop until count = 0
       BNE  BLOAD3  Loop until count = 0
       BRA  BLOAD1
       BRA  BLOAD1
*
*
* 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  GOFLEX      if zero, file is loaded
       BEQ  GOFLEX      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
*
*
GOFLEX JMP  [TADR,PCR]      Jump to transfer address
GOFLEX JMP  [TADR,PCR]      Jump to transfer address
*
*
** FLEX 9 IDE DISK DRIVERS
** FLEX 9 IDE DISK DRIVERS
*
*
* 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   PSHS A
SEEK   PSHS A
       CLRA
       CLRA
       DECB
       DECB
       STD  CF_SECNUM
       STD  CF_SECNUM
       LDB  ,S
       LDB  ,S
       STD  CF_CYLLO
       STD  CF_CYLLO
       LDB  DRNUM,PCR
       LDB  DRNUM,PCR
       STD  CF_CYLHI
       STD  CF_CYLHI
       LDB  #$01
       LDB  #$01
       STD  CF_SECCNT
       STD  CF_SECCNT
       CLRB
       CLRB
       PULS A,PC
       PULS A,PC
*
*
* READ SECTORS FROM CF
* READ SECTORS FROM CF
*
*
*
*
READ   BSR  SEEK
READ   BSR  SEEK
       LDD  #CMDREAD ; IDE READ MULTIPLE
       LDD  #CMDREAD ; IDE READ MULTIPLE
       STD  CF_COMAND
       STD  CF_COMAND
       BSR  WTRDY
       BSR  WTRDY
*
*
* READ LOOP
* READ LOOP
*
*
       PSHS Y
       PSHS Y
       LDY #256
       LDY #256
READ1  BSR  WTDRQ
READ1  BSR  WTDRQ
       LDD  CF_DATA
       LDD  CF_DATA
       STB  ,X+
       STB  ,X+
       LEAY -1,Y
       LEAY -1,Y
       BNE  READ1
       BNE  READ1
       PULS Y
       PULS Y
*
*
       BSR  WTRDY
       BSR  WTRDY
       CLRB
       CLRB
       RTS
       RTS
*
*
* WAIT UNTIL READY
* WAIT UNTIL READY
*
*
WTRDY   LDD  CF_STATUS
WTRDY   LDD  CF_STATUS
        BITB #BUSY
        BITB #BUSY
        BNE  WTRDY
        BNE  WTRDY
        LDD  CF_STATUS
        LDD  CF_STATUS
        BITB #DRDY
        BITB #DRDY
        BEQ  WTRDY
        BEQ  WTRDY
        RTS
        RTS
*
*
* WAIT FOR DATA REQUEST
* WAIT FOR DATA REQUEST
*
*
WTDRQ   LDD  CF_STATUS
WTDRQ   LDD  CF_STATUS
        BITB #DRQ
        BITB #DRQ
        BEQ  WTDRQ
        BEQ  WTDRQ
        RTS
        RTS
*
*
       END
       END
 
 

powered by: WebSVN 2.1.0

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