*
|
*
|
** 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
|
|
|