URL
https://opencores.org/ocsvn/System09/System09/trunk
Subversion Repositories System09
Compare Revisions
- This comparison shows the changes necessary to convert path
/System09/tags/pre_mkfiles_rev1_merge/src/fmt
- from Rev 27 to Rev 66
- ↔ Reverse comparison
Rev 27 → Rev 66
/fmt_cf8.sh
0,0 → 1,?rev2len?
../../Tools/as09/as09.exe cf8fmt.txt -l > cf8fmt.lst |
/fmt_ide.sh
0,0 → 1,?rev2len?
../../Tools/as09/as09.exe cf8fmt.txt -l > cf8fmt.lst |
/fmt_cf8.s19
0,0 → 1,27
S117010017029E6E9FF800000000000000000000000000002B |
S123030034308E03E8108E04E2B6E00047250A313F26F6301F26EE35B0B6E00135B03430B8 |
S123032034028E03E8108E04E2B6E0004747250C313F26F5301F26ED350235B03502B7E05A |
S12303400135B08DD9A680810426F8390A0D466F726D6174696E672052414D6469736B2EB4 |
S12303602E2E200A0D4472697665204E756D626572203F040A0D0452616D6469736B206E8C |
S12303806F7420616C6C6F63617465642120040A0D466F726D617420436F6D706C6574658F |
S12303A004BD04B18E034CBD034517FF5324FB17FF6C8130102500F38133102200ED80307B |
S12303C01F89F701078E0104BD05228E02004F5FA7805A26FB7F01088601B701098E0200BB |
S12303E0B60108A784B601094C810026046C848601A701B60108F60109BD04FE7C0109B67F |
S12304000109810026D78601B701097C0108B60108814026C88E0200863FC6FFBD04DD8ECF |
S123042002006F846F01863FC6FFBD04FE8E02004FC6FFBD04DD8E02006F846F014FC6FFC1 |
S1230440BD04FE8E02004FC603BD04DD8E02006F846F01CC5241ED8810CC4D44ED8812CC0C |
S12304604953ED8814CC4B20ED8816CC0001ED881BCC0101ED881D863FC6FFED881FED8841 |
S123048026CC3EC1ED88218601A788238607A788248607A788254FC603BD04FE8EC0004FC3 |
S12304A0C601B70108F701091700538E038F7E03458D7F86E0B7E0468601B7E04186EFB786 |
S12304C0E047206E8D5C4FC6015AF7E043B7E044F60107F7E045C601F7E0425F398DEA8686 |
S12304E020B7E0478D4C5F8D58B6E040A7805A26F65F8D4DB6E0405A26F88D365F398DC932 |
S12305008630B7E0478D2B5F8D37A680B7E0405A26F65F8D2C4FB7E0405A26F78D145F3907 |
S12305205F39A603810323014FB701075F39A6035F39B6E047858026F9B6E047854027F22B |
S10C054039B6E047850827F939B2 |
S123C000200B000000000000C00000000010CEC0FFFCC005FDC300108EC4008D3581022745 |
S123C02010811626F68D2BB7C0088D26B7C00920EA8D1FB7C00A8D1AB7C00B8D151F895DC8 |
S123C04027D9BEC00A34148D093514A7805A26F520C9108CC400260F8EC300EC84270B8D93 |
S123C06021269D108EC304A6A0396E9FC0085AF7E043B7E044F6C00CF7E045C601F7E04212 |
S123C0805F398DEA8620B7E0478D185F8D24B6E040A7805A26F65F8D19B6E0405A26F88D01 |
S11DC0A0025F39B6E047858026F9B6E047854027F239B6E047850827F93930 |
S9030000FC |
/fmt_ide.s19
0,0 → 1,31
S11701001702986E9FF8000000000000000000000000000031 |
S123030034308E03E8108E04E2B6E00047250A313F26F6301F26EE35B0B6E00135B03430B8 |
S123032034028E03E8108E04E2B6E0004747250C313F26F5301F26ED350235B03502B7E05A |
S12303400135B00A0D466F726D6174696E6720494445206469736B2E2E2E200A0D44726958 |
S12303607665204E756D626572203F040A0D04494445206472697665206E6F7420616C6CC1 |
S12303806F63617465642120040A0D466F726D617420436F6D706C65746504BD05398E033B |
S12303A043BD053217FF5924FB17FF728130102500F38133102200ED80301F89F701078E5B |
S12303C00104BD05B18E02004F5FA7805A26FB7F01088601B701098E0200B60108A784B6C1 |
S12303E001094C810026046C848601A701B60108F60109BD058D7C0109B60109810026D707 |
S12304008601B701097C0108B60108814026C88E0200863FC6FFBD056C8E02006F846F0162 |
S1230420863FC6FFBD058D8E02004FC6FFBD056C8E02006F846F014FC6FFBD058D8E020027 |
S12304404FC603BD056C8E02006F846F01CC5241ED8810CC4D44ED8812CC4953ED8814CCDA |
S12304604B20ED8816CC0001ED881BCC0101ED881D863FC6FFED881FED8826CC3EC1ED88CC |
S1230480218601A788238607A788248607A788254FC603BD058D8EC0004FC601B70108F71B |
S12304A001091700E88E03897E053234048D0E484848481F898D063404ABE03584BD04E60F |
S12304C029FB80302BF781092F0A81112BEF81162EEB800739B6E0008501398603B7E000CE |
S12304E08611B7E000398610B7010F7F01107F0111B6E000850126088578270A8DDD20E62B |
S1230500B6E0011C02397A011126E67A011026E17A010F26DC4F1A02393402B6E00085023C |
S12305202608857827F58DB320F13502B7E001398DE7A680810426F839CC0006FDE11ECC07 |
S12305400002FDE11ECC00E0FDE10C20748D624FC60134024F5AFDE106E6E4FDE108F60100 |
S123056007FDE10AC601FDE1045F35828DE4CC0020FDE10E8D4B3420108E01008D52FCE1F9 |
S123058000E780313F26F535208D365F398DC3CC0030FDE10E8D2A3420108E01004F8D30C7 |
S12305A0E680FDE100313F26F535208D145F395F39A603810323014FB701075F39A6035F43 |
S11B05C039FCE10EC58026F9FCE10EC54027F239FCE10EC50827F93944 |
S123C000200B000000000000C00000000010CEC0FFFCC005FDC300108EC4008D3581022745 |
S123C02010811626F68D2BB7C0088D26B7C00920EA8D1FB7C00A8D1AB7C00B8D151F895DC8 |
S123C04027D9BEC00A34148D093514A7805A26F520C9108CC400260F8EC300EC84270B8D93 |
S123C06027269D108EC304A6A0396E9FC00834024F5AFDE106E6E4FDE108F6C00CFDE10AFC |
S123C080C601FDE1045F35828DE4CC0020FDE10E8D173420108E01008D1EFCE100E78031DD |
S123C0A03F26F535208D025F39FCE10EC58026F9FCE10EC54027F239FCE10EC50827F93904 |
S9030000FC |
/fmt_cf8.txt
0,0 → 1,626
* |
** FLEX 9 COMPACT FLASH FORMAT PROGRAM |
* |
* FOR B5-X300 and CF with 8 Bit Transfer interface |
* |
* |
CFLAG EQU $01 CARRY FLAG |
VFLAG EQU $02 OVERFLOW FLAG |
ZFLAG EQU $04 ZERO FLAG |
NFLAG EQU $08 NEGATIVE FLAG |
IFLAG EQU $10 IRQ MASK CC |
HFLAG EQU $20 HALF CARRY |
FFLAG EQU $40 FIRQ MASK CC |
EFLAG EQU $80 ENTIRE FLAG |
* |
MAPPAG EQU $00 PAGE $0000 DAT ADDRESS |
* |
* Serial Port |
* |
ACIAS EQU $E000 |
ACIAC1 EQU ACIAS |
ACIAD1 EQU ACIAS+1 |
DELCON EQU 1250 Delay (Processor clock in MHz * 50) |
* |
* XMODEM Control characters |
* |
SOH EQU $01 |
EOT EQU $04 |
ACK EQU $06 |
NAK EQU $15 |
CAN EQU $18 |
* |
* Some dummy Constants |
* |
RMAXTRK EQU 64 |
RMAXSEC EQU 255 |
RTOTSEC EQU RMAXTRK*RMAXSEC-RMAXSEC |
* |
* Start |
* |
ORG $0100 |
START LBSR UFSUB |
JMP [$F800] Jump to monitor on Completion. |
* |
* |
* RAM SPACE |
* |
DRVNUM FCB 0 |
TRACK FCB 0 |
SECTOR FCB 0 |
CHKSUM FCB 0 |
BLKNUM FCB 0 Xmodem block number |
BYTCNT FCB 0 Xmodem byte count |
XSTATE FDB 0 Xmodem State Vector |
DELCNT FCB $00,$00,$00 Xmodem Poll timer |
MAXTRK FCB 0 |
MAXSEC FCB 0 |
ORG $0200 |
* |
* SECTOR BUFFER |
* |
BUFFER RMB 256 |
* |
* |
* recieve char from remote drive. |
* timeout if no response for approx 1s. |
* Entry: no parameters |
* Exit: (A) = recieved char, (C)=1 if valid char, (C)=0 if timeout. |
* |
RCHAR PSHS X,Y |
* |
LDX #1000 1000x inner loop |
RCHAR1 LDY #DELCON delay constant for inner loop (approx 1ms). |
RCHAR2 LDA ACIAC1 test for recieved char |
ASRA |
BCS RCHAR3 get character |
LEAY -1,Y else, continue to count delay |
BNE RCHAR2 |
LEAX -1,X |
BNE RCHAR1 |
PULS X,Y,PC return with error if timed out |
* |
RCHAR3 LDA ACIAD1 return data (carry bit still set) |
PULS X,Y,PC |
* |
* |
* transmit char to remote drive. |
* timeout if no response for approx 1s. (allows for use of hardware flow control) |
* Entry: (A) = char to transmit |
* Exit: (A) = recieved char, (C)=1 if valid char, (C)=0 if timeout. |
* |
SCHAR PSHS X,Y |
PSHS A |
* |
LDX #1000 1000x inner loop |
SCHAR1 LDY #DELCON delay constant for inner loop (approx 1ms). |
SCHAR2 LDA ACIAC1 test for space in transmit FIFO |
ASRA |
ASRA |
BCS SCHAR3 send character |
LEAY -1,Y else, continue to count delay |
BNE SCHAR2 |
LEAX -1,X |
BNE SCHAR1 |
PULS A |
PULS X,Y,PC return with error if timed out |
* |
SCHAR3 PULS A |
STA ACIAD1 send data (carry bit still set) |
PULS X,Y,PC |
* |
* Print Data |
* |
PDATA0 BSR SCHAR |
PDATA1 LDA ,X+ |
CMPA #$04 |
BNE PDATA0 |
RTS |
* |
** 'UF' Format RAMdisc to FLEX standard. |
* |
DISFOS FCB $0A,$0D |
FCC 'Formating RAMdisk... ' |
FCB $0A,$0D |
FCC 'Drive Number ?' |
FCB 4 |
MESS6 FCB $0A,$0D,4 |
FCC 'Ramdisk not allocated! ' |
FCB 4 |
UFMSG1 FCB $0A,$0D |
FCC 'Format Complete' |
FCB 4 |
* |
UFSUB JSR INITDR |
LDX #DISFOS |
JSR PDATA1 |
UFSUB1 LBSR RCHAR |
BCC UFSUB1 |
LBSR SCHAR |
CMPA #'0' |
LBLO UFEXIT |
CMPA #'3' |
LBHI UFEXIT |
SUBA #'0' |
TFR A,B |
STB DRVNUM |
LDX #DRVNUM-3 |
JSR DRVSEL |
* |
* set up free chain |
* |
LDX #BUFFER clear out buffer |
CLRA |
CLRB |
DFL1 STA 0,X+ |
DECB |
BNE DFL1 |
* |
CLR TRACK |
LDA #1 |
STA SECTOR |
DFL2 LDX #BUFFER |
LDA TRACK |
STA 0,X |
LDA SECTOR |
INCA |
CMPA #RMAXSEC+1 last sector on track? |
BNE DFL3 |
INC 0,X |
LDA #1 |
DFL3 STA 1,X |
LDA TRACK |
LDB SECTOR |
JSR WRITSC |
INC SECTOR |
LDA SECTOR |
CMPA #RMAXSEC+1 |
BNE DFL2 |
LDA #1 |
STA SECTOR |
INC TRACK |
LDA TRACK |
CMPA #RMAXTRK |
BNE DFL2 |
* break free chain at last track/sector |
LDX #BUFFER |
LDA #RMAXTRK-1 |
LDB #RMAXSEC |
JSR READSC |
LDX #BUFFER |
CLR 0,X |
CLR 1,X |
LDA #RMAXTRK-1 |
LDB #RMAXSEC |
JSR WRITSC |
* set up sector structure, SIR, directory etc |
LDX #BUFFER |
CLRA |
LDB #RMAXSEC |
JSR READSC |
LDX #BUFFER |
CLR 0,X break end of directory chain |
CLR 1,X |
CLRA |
LDB #RMAXSEC |
JSR WRITSC |
* |
LDX #BUFFER |
CLRA |
LDB #3 set up SIR |
JSR READSC |
LDX #BUFFER |
CLR 0,X break forward link |
CLR 1,X |
LDD #$5241 set volume name (RAMDISK ) |
STD 16,X |
LDD #$4D44 |
STD 18,X |
LDD #$4953 |
STD 20,X |
LDD #$4B20 |
STD 22,X |
LDD #1 volume number |
STD 27,X |
LDD #$0101 first trk/sec 01-01 |
STD 29,X |
LDA #RMAXTRK-1 |
LDB #RMAXSEC |
STD 31,X |
STD 38,X |
LDD #RTOTSEC total DATA sectors (2912-14) |
STD 33,X |
* |
LDA #01 month set default creation date (SYS09's birthday!) |
STA 35,X |
LDA #07 day |
STA 36,X |
LDA #07 year |
STA 37,X |
* |
RF3 CLRA |
LDB #3 |
JSR WRITSC |
* |
* LDX #BUFFER |
* CLRA |
* LDB #1 |
* JSR READSC |
* LDX #BUFFER |
* LDA #$AA set the init flag |
* STA 0,X |
* LDA #$55 |
* STA 1,X |
* CLRA |
* LDB #1 |
* JSR WRITSC |
* |
* Write Boot sector |
* |
LDX #$C000 |
CLRA TRACK 0 |
LDB #$01 SECTOR 1 |
STA TRACK |
STB SECTOR |
LBSR WRITSC |
* |
UFEXIT LDX #UFMSG1 |
JMP PDATA1 |
* |
* |
** FLEX 9 COMPACT FLASH DISK DRIVERS |
* |
* FOR SYS09BUG 1.2 ON THE BURCHED B5-X300 |
* WITH I/O MAPPED AT $XE000 |
* AND ROM MAPPED AT $XF000 |
* THE BURCHED B5-X300 HAS 256KBYTES OF SRAM |
* THE FIRST 64K IS USED BY FLEX, |
* THE SECOND 192K MAY BE USED AS A RAM DISK |
* |
* |
IMASK EQU $10 IRQ MASK CC |
FMASK EQU $40 FIRQ MASK CC |
DATREG EQU $FFF0 DAT REGISTERS |
* |
CF_BASE EQU $E040 |
CF_DATA EQU CF_BASE+0 |
CF_ERROR EQU CF_BASE+1 ; read error |
CF_FEATURE EQU CF_BASE+1 ; write feature |
CF_SCNT EQU CF_BASE+2 |
CF_SNUM EQU CF_BASE+3 |
CF_CLO EQU CF_BASE+4 |
CF_CHI EQU CF_BASE+5 |
CF_HEAD EQU CF_BASE+6 |
CF_STATUS EQU CF_BASE+7 ; read status |
CF_COMAND EQU CF_BASE+7 ; write command |
* |
* Command Equates |
* |
CMDREAD EQU $20 ; Read Single sector |
CMDWRITE EQU $30 ; Write Single sector |
CMDFEATURE EQU $EF |
FEAT8BIT EQU $01 ; enable 8 bit transfers |
HEADLBA EQU $E0 |
* |
* Status bit equates |
* |
BSY EQU $80 |
DRDY EQU $40 |
DRQ EQU $08 |
ERR EQU $01 |
* |
* |
* INITIALIZE CF CARD FOR 8 BIT LBA MODE |
* |
INITDR BSR WAITRDY |
LDA #HEADLBA |
STA CF_HEAD |
LDA #FEAT8BIT |
STA CF_FEATURE |
LDA #CMDFEATURE |
STA CF_COMAND |
BRA WAITRDY |
* |
* RESTORE DISK DRIVER (SEEK TRACK 00) |
* |
RESTR1 BSR DRVSEL |
CLRA ; Track 0 |
LDB #$01 ; Sector 1 |
* |
* Seek track and sector |
* A holds track number (0 - ??) |
* B holds sector number (1 - ??) |
* Sector numbers starts from 1 |
* subtract 1 to start from sector 0 on CF |
* |
SEEKTS DECB |
STB CF_SNUM |
STA CF_CLO |
LDB DRVNUM |
STB CF_CHI |
LDB #$01 |
STB CF_SCNT |
CLRB |
RTS |
* |
* READ SECTORS FROM CF |
* |
* |
READSC BSR SEEKTS |
LDA #CMDREAD ; IDE READ MULTIPLE |
STA CF_COMAND |
BSR WAITRDY |
* |
* READ LOOP |
* |
CLRB |
RDLP1 BSR WAITDRQ |
LDA CF_DATA |
STA ,X+ |
DECB |
BNE RDLP1 |
* |
CLRB |
RDLP2 BSR WAITDRQ |
LDA CF_DATA |
DECB |
BNE RDLP2 |
* |
BSR WAITRDY |
CLRB |
RTS |
* |
* WRITE SECTOR TO CF |
* |
WRITSC BSR SEEKTS ; SEEK TRACK & SECTOR |
LDA #CMDWRITE ; IDE WRITE MULTIPLE |
STA CF_COMAND |
BSR WAITRDY |
* |
* WRITE LOOP |
* |
CLRB |
WRTLP1 BSR WAITDRQ |
LDA ,X+ |
STA CF_DATA |
DECB |
BNE WRTLP1 |
* |
CLRB |
WRTLP2 BSR WAITDRQ |
CLRA |
STA CF_DATA |
DECB |
BNE WRTLP2 |
* |
BSR WAITRDY |
CLRB |
RTS |
* |
* CHECK FOR BUSY |
* Doubles as VERIFY |
* |
BUSY CLRB Never busy |
RTS |
* |
* DRIVE SELECT DISK DRIVER |
* |
DRVSEL LDA 3,X GET DRIVE # FROM FCB |
CMPA #3 |
BLS DRVS2 IF > 3, SET IT TO 0 |
CLRA |
DRVS2 STA DRVNUM |
CLRB ; SET Z, CLEAR C |
RTS |
* |
* CHECK DRIVE READY DISK DRIVER |
* |
CHKDRV LDA 3,X |
CLRB ; CLEAR C, SET Z |
RTS |
* |
* WAIT UNTIL READY |
* |
WAITRDY LDA CF_STATUS |
BITA #BSY |
BNE WAITRDY |
LDA CF_STATUS |
BITA #DRDY |
BEQ WAITRDY |
RTS |
* |
* WAIT FOR DATA REQUEST |
* |
WAITDRQ LDA CF_STATUS |
BITA #DRQ |
BEQ WAITDRQ |
RTS |
* |
******************************************************* |
* |
* Bootstrap FLEX Loader |
* |
* SBUG1.8 loads the bootstap loader at $C000 |
* however the Flex adaption manual has the |
* bootstrap loader residing at $C100 |
* |
****************************************************** |
* |
* Equates |
* |
STACK EQU $C0FF |
SCTBUF EQU $C300 |
* |
* Start of Utility |
* |
ORG $C000 |
BOOT BRA LOAD0 |
FCB 0,0,0 |
TRK FCB 0 File start track |
SCT FCB 0 File start sector |
DNS FCB 0 Density Flag (not used) |
TADR FDB $C000 Transfer address |
LADR FDB 0 Load Address |
DRNUM FCB 0 Drive number 0 |
* |
LOAD0 LDS #STACK Set up stack |
LDD TRK Set up start track and sector |
STD SCTBUF |
LDY #SCTBUF+256 |
* |
* Perform actual file load |
* |
LOAD1 BSR GETCH Get acharcater |
CMPA #$02 Data record hearder ? |
BEQ LOAD2 Skip, is so |
CMPA #$16 Xfr address hearder ? |
BNE LOAD1 Loop if neither |
* |
* Get transfer address |
* |
BSR GETCH |
STA TADR |
BSR GETCH |
STA TADR+1 |
BRA LOAD1 |
* |
* Load data record |
* |
LOAD2 BSR GETCH Get load address |
STA LADR |
BSR GETCH |
STA LADR+1 |
BSR GETCH Get Bytes count |
TFR A,B |
TSTB |
BEQ LOAD1 Loop if count = 0 |
LDX LADR Get load address |
LOAD3 PSHS B,X |
BSR GETCH Get data character |
PULS B,X |
STA ,X+ Store at load address |
DECB |
BNE LOAD3 Loop until count = 0 |
BRA LOAD1 |
* |
* Get Character routine |
* Reads a sector if needed |
* |
GETCH CMPY #SCTBUF+256 out of data ? |
BNE GETCH4 Go read Character if not |
GETCH2 LDX #SCTBUF Point to buffer |
LDD 0,X Get forward Link |
BEQ GO if zero, file is loaded |
BSR READ Read next sector |
BNE BOOT start over if error |
LDY #SCTBUF+4 Point past link |
GETCH4 LDA ,Y+ Else, get a character |
RTS |
* |
* File is loaded, Jump to it |
* |
GO JMP [TADR] Jump to transfer address |
|
* |
** FLEX 9 COMPACT FLASH DISK DRIVERS |
* |
* FOR SYS09BUG 1.2 ON THE BURCHED B5-X300 |
* WITH I/O MAPPED AT $XE000 |
* AND ROM MAPPED AT $XF000 |
* THE BURCHED B5-X300 HAS 256KBYTES OF SRAM |
* THE FIRST 64K IS USED BY FLEX, |
* THE SECOND 192K MAY BE USED AS A RAM DISK |
* |
* |
*IMASK EQU $10 IRQ MASK CC |
*FMASK EQU $40 FIRQ MASK CC |
*DATREG EQU $FFF0 DAT REGISTERS |
* |
*CF_BASE EQU $E040 |
*CF_DATA EQU CF_BASE+0 |
*CF_ERROR EQU CF_BASE+1 ; read error |
*CF_FEATURE EQU CF_BASE+1 ; write feature |
*CF_SCNT EQU CF_BASE+2 |
*CF_SNUM EQU CF_BASE+3 |
*CF_CLO EQU CF_BASE+4 |
*CF_CHI EQU CF_BASE+5 |
*CF_HEAD EQU CF_BASE+6 |
*CF_STATUS EQU CF_BASE+7 ; read status |
*CF_COMAND EQU CF_BASE+7 ; write command |
* |
* Command Equates |
* |
*CMDREAD EQU $20 ; Read Single sector |
*CMDWRITE EQU $30 ; Write Single sector |
*CMDFEATURE EQU $EF |
*FEAT8BIT EQU $01 ; enable 8 bit transfers |
*HEADLBA EQU $E0 |
* |
* Status bit equates |
* |
*BSY EQU $80 |
*DRDY EQU $40 |
*DRQ EQU $08 |
*ERR EQU $01 |
* |
* Seek track and sector |
* A holds track number (0 - ??) |
* B holds sector number (1 - ??) |
* Sector numbers starts from 1 |
* subtract 1 to start from sector 0 on CF |
* |
SEEK DECB |
STB CF_SNUM |
STA CF_CLO |
LDB DRNUM |
STB CF_CHI |
LDB #$01 |
STB CF_SCNT |
CLRB |
RTS |
* |
* READ SECTORS FROM CF |
* |
* |
READ BSR SEEK |
LDA #CMDREAD ; IDE READ MULTIPLE |
STA CF_COMAND |
BSR WTRDY |
* |
* READ LOOP |
* |
CLRB |
READ1 BSR WTDRQ |
LDA CF_DATA |
STA ,X+ |
DECB |
BNE READ1 |
* |
CLRB |
READ2 BSR WTDRQ |
LDA CF_DATA |
DECB |
BNE READ2 |
* |
BSR WTRDY |
CLRB |
RTS |
* |
* WAIT UNTIL READY |
* |
WTRDY LDA CF_STATUS |
BITA #BSY |
BNE WTRDY |
LDA CF_STATUS |
BITA #DRDY |
BEQ WTRDY |
RTS |
* |
* WAIT FOR DATA REQUEST |
* |
WTDRQ LDA CF_STATUS |
BITA #DRQ |
BEQ WTDRQ |
RTS |
* |
END START |
/fmt_ide.txt
0,0 → 1,705
* |
** FLEX 9 DISK DRIVERS |
* |
* FOR SYS09BUG ON THE DIGILENT SPARTAN 3 STARTER BOARD |
* WITH I/O MAPPED AT $XE000 |
* AND ROM MAPPED AT $XF000 |
* THE DIGILENT SPARTAN 3 STARTER BOARD HAS 1MBYTE OF SRAM |
* THE FIRST 64K IS USED BY FLEX, |
* THE SECOND 128K IS USED AS A ROM DISK |
* THE REMAINING RAM IS USED FOR A RAM DISK |
* |
* |
CFLAG EQU $01 CARRY FLAG |
VFLAG EQU $02 OVERFLOW FLAG |
ZFLAG EQU $04 ZERO FLAG |
NFLAG EQU $08 NEGATIVE FLAG |
IFLAG EQU $10 IRQ MASK CC |
HFLAG EQU $20 HALF CARRY |
FFLAG EQU $40 FIRQ MASK CC |
EFLAG EQU $80 ENTIRE FLAG |
* |
MAPPAG EQU $00 PAGE $0000 DAT ADDRESS |
* |
* Serial Port |
* |
ACIAS EQU $E000 |
ACIAC1 EQU ACIAS |
ACIAD1 EQU ACIAS+1 |
DELCON EQU 1250 Delay (Processor clock in MHz * 50) |
* |
* XMODEM Control characters |
* |
SOH EQU $01 |
EOT EQU $04 |
ACK EQU $06 |
NAK EQU $15 |
CAN EQU $18 |
* |
* Some dummy Constants |
* |
RMAXTRK EQU 64 |
RMAXSEC EQU 255 |
RTOTSEC EQU RMAXTRK*RMAXSEC-RMAXSEC |
* |
* Start |
* |
ORG $0100 |
START LBSR UFSUB |
JMP [$F800] Jump to monitor on Completion. |
* |
* |
* RAM SPACE |
* |
DRVNUM FCB 0 |
TRACK FCB 0 |
SECTOR FCB 0 |
CHKSUM FCB 0 |
BLKNUM FCB 0 Xmodem block number |
BYTCNT FCB 0 Xmodem byte count |
XSTATE FDB 0 Xmodem State Vector |
DELCNT FCB $00,$00,$00 Xmodem Poll timer |
MAXTRK FCB 0 |
MAXSEC FCB 0 |
ORG $0200 |
* |
* SECTOR BUFFER |
* |
BUFFER RMB 256 |
* |
* |
* recieve char from remote drive. |
* timeout if no response for approx 1s. |
* Entry: no parameters |
* Exit: (A) = recieved char, (C)=1 if valid char, (C)=0 if timeout. |
* |
RCHAR PSHS X,Y |
* |
LDX #1000 1000x inner loop |
RCHAR1 LDY #DELCON delay constant for inner loop (approx 1ms). |
RCHAR2 LDA ACIAC1 test for recieved char |
ASRA |
BCS RCHAR3 get character |
LEAY -1,Y else, continue to count delay |
BNE RCHAR2 |
LEAX -1,X |
BNE RCHAR1 |
PULS X,Y,PC return with error if timed out |
* |
RCHAR3 LDA ACIAD1 return data (carry bit still set) |
PULS X,Y,PC |
* |
* |
* transmit char to remote drive. |
* timeout if no response for approx 1s. (allows for use of hardware flow control) |
* Entry: (A) = char to transmit |
* Exit: (A) = recieved char, (C)=1 if valid char, (C)=0 if timeout. |
* |
SCHAR PSHS X,Y |
PSHS A |
* |
LDX #1000 1000x inner loop |
SCHAR1 LDY #DELCON delay constant for inner loop (approx 1ms). |
SCHAR2 LDA ACIAC1 test for space in transmit FIFO |
ASRA |
ASRA |
BCS SCHAR3 send character |
LEAY -1,Y else, continue to count delay |
BNE SCHAR2 |
LEAX -1,X |
BNE SCHAR1 |
PULS A |
PULS X,Y,PC return with error if timed out |
* |
SCHAR3 PULS A |
STA ACIAD1 send data (carry bit still set) |
PULS X,Y,PC |
* |
** 'UF' Format IDE Drive to FLEX standard. |
* |
DISFOS FCB $0A,$0D |
FCC 'Formating IDE disk... ' |
FCB $0A,$0D |
FCC 'Drive Number ?' |
FCB 4 |
MESS6 FCB $0A,$0D,4 |
FCC 'IDE drive not allocated! ' |
FCB 4 |
UFMSG1 FCB $0A,$0D |
FCC 'Format Complete' |
FCB 4 |
* |
UFSUB JSR INITDR |
LDX #DISFOS |
JSR PDATA1 |
UFSUB1 LBSR RCHAR |
BCC UFSUB1 |
LBSR SCHAR |
CMPA #'0' |
LBLO UFEXIT |
CMPA #'3' |
LBHI UFEXIT |
SUBA #'0' |
TFR A,B |
STB DRVNUM |
LDX #DRVNUM-3 |
JSR DRVSEL |
* |
* set up free chain |
* |
LDX #BUFFER clear out buffer |
CLRA |
CLRB |
DFL1 STA 0,X+ |
DECB |
BNE DFL1 |
* |
CLR TRACK |
LDA #1 |
STA SECTOR |
DFL2 LDX #BUFFER |
LDA TRACK |
STA 0,X |
LDA SECTOR |
INCA |
CMPA #RMAXSEC+1 last sector on track? |
BNE DFL3 |
INC 0,X |
LDA #1 |
DFL3 STA 1,X |
LDA TRACK |
LDB SECTOR |
JSR WRITSC |
INC SECTOR |
LDA SECTOR |
CMPA #RMAXSEC+1 |
BNE DFL2 |
LDA #1 |
STA SECTOR |
INC TRACK |
LDA TRACK |
CMPA #RMAXTRK |
BNE DFL2 |
* break free chain at last track/sector |
LDX #BUFFER |
LDA #RMAXTRK-1 |
LDB #RMAXSEC |
JSR READSC |
LDX #BUFFER |
CLR 0,X |
CLR 1,X |
LDA #RMAXTRK-1 |
LDB #RMAXSEC |
JSR WRITSC |
* set up sector structure, SIR, directory etc |
LDX #BUFFER |
CLRA |
LDB #RMAXSEC |
JSR READSC |
LDX #BUFFER |
CLR 0,X break end of directory chain |
CLR 1,X |
CLRA |
LDB #RMAXSEC |
JSR WRITSC |
* |
LDX #BUFFER |
CLRA |
LDB #3 set up SIR |
JSR READSC |
LDX #BUFFER |
CLR 0,X break forward link |
CLR 1,X |
LDD #$5241 set volume name (RAMDISK ) |
STD 16,X |
LDD #$4D44 |
STD 18,X |
LDD #$4953 |
STD 20,X |
LDD #$4B20 |
STD 22,X |
LDD #1 volume number |
STD 27,X |
LDD #$0101 first trk/sec 01-01 |
STD 29,X |
LDA #RMAXTRK-1 |
LDB #RMAXSEC |
STD 31,X |
STD 38,X |
LDD #RTOTSEC total DATA sectors (2912-14) |
STD 33,X |
* |
LDA #01 month set default creation date (SYS09's birthday!) |
STA 35,X |
LDA #07 day |
STA 36,X |
LDA #07 year |
STA 37,X |
* |
RF3 CLRA |
LDB #3 |
JSR WRITSC |
* |
* Not sure what this is about |
* put bootstrap on track 0 sector 1 |
* |
* LDX #BUFFER |
* CLRA |
* LDB #1 |
* JSR READSC |
* LDX #BUFFER |
* LDA #$AA set the init flag |
* STA 0,X |
* LDA #$55 |
* STA 1,X |
* CLRA |
* LDB #1 |
* JSR WRITSC |
* |
* Write Boot sector |
* |
LDX #$C000 |
CLRA TRACK 0 |
LDB #$01 SECTOR 1 |
STA TRACK |
STB SECTOR |
LBSR WRITSC |
* |
UFEXIT LDX #UFMSG1 |
JMP PDATA1 |
* |
* Read a byte from the serial port |
* |
LRBYTE PSHS B |
BSR LRHEX Get hex digit. |
ASLA |
ASLA Shift to msb. |
ASLA |
ASLA |
TFR A,B Save in B. |
BSR LRHEX Get next digit. |
PSHS B |
ADDA 0,S+ Add together bytes. |
PULS B,PC |
* |
LRHEX JSR INTER |
BVS LRHEX |
SUBA #$30 Remove ascii bias. |
BMI LRHEX |
CMPA #$09 Number? |
BLE LRHEX1 Yes. |
CMPA #$11 Keep testing. |
BMI LRHEX |
CMPA #$16 |
BGT LRHEX |
SUBA #$07 |
LRHEX1 RTS |
* |
* ACIA INPUT TEST |
* |
INTEST LDA ACIAC1 |
BITA #$01 |
RTS |
* |
* RESET ACIA |
* |
ACIRST LDA #$03 master reset |
STA ACIAC1 |
LDA #$11 |
STA ACIAC1 |
RTS |
* |
* ACIA INPUT |
* |
INTER LDA #16 |
STA DELCNT+0 |
CLR DELCNT+1 |
CLR DELCNT+2 |
INTER0 LDA ACIAC1 |
BITA #$01 |
BNE INTER1 |
BITA #$78 |
BEQ INTER2 |
BSR ACIRST |
BRA INTER |
* |
INTER1 LDA ACIAD1 |
ANDCC #VFLAG |
RTS |
* |
INTER2 DEC DELCNT+2 |
BNE INTER0 |
DEC DELCNT+1 |
BNE INTER0 |
DEC DELCNT+0 |
BNE INTER0 |
CLRA |
ORCC #VFLAG |
RTS |
* |
* ACIA OUTPUT |
* |
OUTTER PSHS A |
* |
OUTTE1 LDA ACIAC1 |
BITA #$02 |
BNE OUTTE2 |
BITA #$78 |
BEQ OUTTE1 |
BSR ACIRST |
BRA OUTTE1 |
* |
OUTTE2 PULS A |
STA ACIAD1 |
RTS |
* |
* Print Data |
* |
PDATA0 BSR OUTTER |
PDATA1 LDA ,X+ |
CMPA #$04 |
BNE PDATA0 |
RTS |
* |
** FLEX 9 IDE DISK DRIVERS |
* |
* FOR SYS09BUG 1.2 ON THE XSA-3S1000 |
* WITH I/O MAPPED AT $XE000 |
* AND ROM MAPPED AT $XF000 |
* |
* |
IMASK EQU $10 IRQ MASK CC |
FMASK EQU $40 FIRQ MASK CC |
* |
CF_BASE EQU $E100 |
CF_DATA EQU CF_BASE+0 |
CF_ERROR EQU CF_BASE+2 ; read error |
CF_FEATURE EQU CF_BASE+2 ; write feature |
CF_SCNT EQU CF_BASE+4 |
CF_SNUM EQU CF_BASE+6 |
CF_CLO EQU CF_BASE+8 |
CF_CHI EQU CF_BASE+10 |
CF_HEAD EQU CF_BASE+12 |
CF_STATUS EQU CF_BASE+14 ; read status |
CF_COMAND EQU CF_BASE+14 ; write command |
CF_AUX EQU CF_BASE+30 |
* |
* Command Equates |
* |
CMDREAD EQU $20 ; Read Single sector |
CMDWRITE EQU $30 ; Write Single sector |
AUXRESET EQU $06 |
AUXRSTREL EQU $02 |
HEADLBA EQU $E0 |
* |
* Status bit equates |
* |
BSY EQU $80 |
DRDY EQU $40 |
DRQ EQU $08 |
ERR EQU $01 |
* |
* |
* INITIALIZE CF CARD FOR 8 BIT LBA MODE |
* |
INITDR LDD #AUXRESET |
STD CF_AUX |
LDD #AUXRSTREL |
STD CF_AUX |
LDD #HEADLBA |
STD CF_HEAD |
BRA WAITRDY |
* |
* RESTORE DISK DRIVER (SEEK TRACK 00) |
* |
RESTR1 BSR DRVSEL |
CLRA ; Track 0 |
LDB #$01 ; Sector 1 |
* |
* Seek track and sector |
* A holds track number (0 - ??) |
* B holds sector number (1 - ??) |
* Sector numbers starts from 1 |
* subtract 1 to start from sector 0 on CF |
* |
SEEKTS PSHS A |
CLRA |
DECB |
STD CF_SNUM |
LDB ,S |
STD CF_CLO |
LDB DRVNUM |
STD CF_CHI |
LDB #$01 |
STD CF_SCNT |
CLRB |
PULS A,PC |
* |
* READ SECTORS FROM CF |
* |
* |
READSC BSR SEEKTS |
LDD #CMDREAD ; IDE READ MULTIPLE |
STD CF_COMAND |
BSR WAITRDY |
* |
* READ LOOP |
* |
PSHS Y |
LDY #256 |
RDLP1 BSR WAITDRQ |
LDD CF_DATA |
STB ,X+ |
LEAY -1,Y |
BNE RDLP1 |
PULS Y |
* |
BSR WAITRDY |
CLRB |
RTS |
* |
* WRITE SECTOR TO CF |
* |
WRITSC BSR SEEKTS ; SEEK TRACK & SECTOR |
LDD #CMDWRITE ; IDE WRITE MULTIPLE |
STD CF_COMAND |
BSR WAITRDY |
* |
* WRITE LOOP |
* |
PSHS Y |
LDY #256 |
CLRA |
WRTLP1 BSR WAITDRQ |
LDB ,X+ |
STD CF_DATA |
LEAY -1,Y |
BNE WRTLP1 |
PULS Y |
* |
BSR WAITRDY |
CLRB |
RTS |
* |
* CHECK FOR BUSY |
* Doubles as VERIFY |
* |
BUSY CLRB Never busy |
RTS |
* |
* DRIVE SELECT DISK DRIVER |
* |
DRVSEL LDA 3,X GET DRIVE # FROM FCB |
CMPA #3 |
BLS DRVS2 IF > 3, SET IT TO 0 |
CLRA |
DRVS2 STA DRVNUM |
CLRB ; SET Z, CLEAR C |
RTS |
* |
* CHECK DRIVE READY DISK DRIVER |
* |
CHKDRV LDA 3,X |
CLRB ; CLEAR C, SET Z |
RTS |
* |
* WAIT UNTIL READY |
* |
WAITRDY LDD CF_STATUS |
BITB #BSY |
BNE WAITRDY |
LDD CF_STATUS |
BITB #DRDY |
BEQ WAITRDY |
RTS |
* |
* WAIT FOR DATA REQUEST |
* |
WAITDRQ LDD CF_STATUS |
BITB #DRQ |
BEQ WAITDRQ |
RTS |
* |
******************************************************* |
* |
* Bootstrap FLEX Loader |
* |
* SBUG1.8 loads the bootstap loader at $C000 |
* however the Flex adaption manual has the |
* bootstrap loader residing at $C100 |
* |
****************************************************** |
* |
* Equates |
* |
STACK EQU $C0FF |
SCTBUF EQU $C300 |
* |
* Start of Utility |
* |
ORG $C000 |
BOOT BRA LOAD0 |
FCB 0,0,0 |
TRK FCB 0 File start track |
SCT FCB 0 File start sector |
DNS FCB 0 Density Flag (not used) |
TADR FDB $C000 Transfer address |
LADR FDB 0 Load Address |
DRNUM FCB 0 Drive number 0 |
* |
LOAD0 LDS #STACK Set up stack |
LDD TRK Set up start track and sector |
STD SCTBUF |
LDY #SCTBUF+256 |
* |
* Perform actual file load |
* |
LOAD1 BSR GETCH Get acharcater |
CMPA #$02 Data record hearder ? |
BEQ LOAD2 Skip, is so |
CMPA #$16 Xfr address hearder ? |
BNE LOAD1 Loop if neither |
* |
* Get transfer address |
* |
BSR GETCH |
STA TADR |
BSR GETCH |
STA TADR+1 |
BRA LOAD1 |
* |
* Load data record |
* |
LOAD2 BSR GETCH Get load address |
STA LADR |
BSR GETCH |
STA LADR+1 |
BSR GETCH Get Bytes count |
TFR A,B |
TSTB |
BEQ LOAD1 Loop if count = 0 |
LDX LADR Get load address |
LOAD3 PSHS B,X |
BSR GETCH Get data character |
PULS B,X |
STA ,X+ Store at load address |
DECB |
BNE LOAD3 Loop until count = 0 |
BRA LOAD1 |
* |
* Get Character routine |
* Reads a sector if needed |
* |
GETCH CMPY #SCTBUF+256 out of data ? |
BNE GETCH4 Go read Character if not |
GETCH2 LDX #SCTBUF Point to buffer |
LDD 0,X Get forward Link |
BEQ GO if zero, file is loaded |
BSR READ Read next sector |
BNE BOOT start over if error |
LDY #SCTBUF+4 Point past link |
GETCH4 LDA ,Y+ Else, get a character |
RTS |
* |
* File is loaded, Jump to it |
* |
GO JMP [TADR] Jump to transfer address |
|
* |
** FLEX 9 IDE DISK DRIVERS |
* |
* FOR SYS09BUG 1.2 ON THE XSA-3S1000 |
* WITH I/O MAPPED AT $XE000 |
* AND ROM MAPPED AT $XF000 |
* |
*IMASK EQU $10 IRQ MASK CC |
*FMASK EQU $40 FIRQ MASK CC |
* |
*CF_BASE EQU $E100 |
*CF_DATA EQU CF_BASE+0 |
*CF_ERROR EQU CF_BASE+2 ; read error |
*CF_FEATURE EQU CF_BASE+2 ; write feature |
*CF_SCNT EQU CF_BASE+4 |
*CF_SNUM EQU CF_BASE+6 |
*CF_CLO EQU CF_BASE+8 |
*CF_CHI EQU CF_BASE+10 |
*CF_HEAD EQU CF_BASE+12 |
*CF_STATUS EQU CF_BASE+14 ; read status |
*CF_COMAND EQU CF_BASE+14 ; write command |
*CF_AUX EQU CF_BASE+30 |
* |
* Command Equates |
* |
*CMDREAD EQU $20 ; Read Single sector |
*CMDWRITE EQU $30 ; Write Single sector |
*HEADLBA EQU $E0 |
*AUXRESET EQU $06 |
*AUXRSTREL EQU $02 |
* |
* Status bit equates |
* |
*BSY EQU $80 |
*DRDY EQU $40 |
*DRQ EQU $08 |
*ERR EQU $01 |
* |
* Seek track and sector |
* A holds track number (0 - ??) |
* B holds sector number (1 - ??) |
* Sector numbers starts from 1 |
* subtract 1 to start from sector 0 on CF |
* |
SEEK PSHS A |
CLRA |
DECB |
STD CF_SNUM |
LDB ,S |
STD CF_CLO |
LDB DRNUM |
STD CF_CHI |
LDB #$01 |
STD CF_SCNT |
CLRB |
PULS A,PC |
* |
* READ SECTORS FROM CF |
* |
* |
READ BSR SEEK |
LDD #CMDREAD ; IDE READ MULTIPLE |
STD CF_COMAND |
BSR WTRDY |
* |
* READ LOOP |
* |
PSHS Y |
LDY #256 |
READ1 BSR WTDRQ |
LDD CF_DATA |
STB ,X+ |
LEAY -1,Y |
BNE READ1 |
PULS Y |
* |
BSR WTRDY |
CLRB |
RTS |
* |
* WAIT UNTIL READY |
* |
WTRDY LDD CF_STATUS |
BITB #BSY |
BNE WTRDY |
LDD CF_STATUS |
BITB #DRDY |
BEQ WTRDY |
RTS |
* |
* WAIT FOR DATA REQUEST |
* |
WTDRQ LDD CF_STATUS |
BITB #DRQ |
BEQ WTDRQ |
RTS |
* |
END START |
/fmt_cf8.lst
0,0 → 1,640
Assembler release DWC_2.0 version 2.11 |
May 6, 2004 (c) Motorola (free ware) |
0001 * |
0002 ** FLEX 9 COMPACT FLASH FORMAT PROGRAM |
0003 * |
0004 * FOR B5-X300 and CF with 8 Bit Transfer interface |
0005 * |
0006 * |
0007 0001 CFLAG EQU $01 CARRY FLAG |
0008 0002 VFLAG EQU $02 OVERFLOW FLAG |
0009 0004 ZFLAG EQU $04 ZERO FLAG |
0010 0008 NFLAG EQU $08 NEGATIVE FLAG |
0011 0010 IFLAG EQU $10 IRQ MASK CC |
0012 0020 HFLAG EQU $20 HALF CARRY |
0013 0040 FFLAG EQU $40 FIRQ MASK CC |
0014 0080 EFLAG EQU $80 ENTIRE FLAG |
0015 * |
0016 0000 MAPPAG EQU $00 PAGE $0000 DAT ADDRESS |
0017 * |
0018 * Serial Port |
0019 * |
0020 E000 ACIAS EQU $E000 |
0021 E000 ACIAC1 EQU ACIAS |
0022 E001 ACIAD1 EQU ACIAS+1 |
0023 04E2 DELCON EQU 1250 Delay (Processor clock in MHz * 50) |
0024 * |
0025 * XMODEM Control characters |
0026 * |
0027 0001 SOH EQU $01 |
0028 0004 EOT EQU $04 |
0029 0006 ACK EQU $06 |
0030 0015 NAK EQU $15 |
0031 0018 CAN EQU $18 |
0032 * |
0033 * Some dummy Constants |
0034 * |
0035 0040 RMAXTRK EQU 64 |
0036 00FF RMAXSEC EQU 255 |
0037 3EC1 RTOTSEC EQU RMAXTRK*RMAXSEC-RMAXSEC |
0038 * |
0039 * Start |
0040 * |
0041 0100 ORG $0100 |
0042 0100 17 02 9E START LBSR UFSUB |
0043 0103 6E 9F F8 00 JMP [$F800] Jump to monitor on Completion. |
0044 * |
0045 * |
0046 * RAM SPACE |
0047 * |
0048 0107 00 DRVNUM FCB 0 |
0049 0108 00 TRACK FCB 0 |
0050 0109 00 SECTOR FCB 0 |
0051 010A 00 CHKSUM FCB 0 |
0052 010B 00 BLKNUM FCB 0 Xmodem block number |
0053 010C 00 BYTCNT FCB 0 Xmodem byte count |
0054 010D 00 00 XSTATE FDB 0 Xmodem State Vector |
0055 010F 00 00 00 DELCNT FCB $00,$00,$00 Xmodem Poll timer |
0056 0112 00 MAXTRK FCB 0 |
0057 0113 00 MAXSEC FCB 0 |
0058 0200 ORG $0200 |
0059 * |
0060 * SECTOR BUFFER |
0061 * |
0062 0200 BUFFER RMB 256 |
0063 * |
0064 * |
0065 * recieve char from remote drive. |
0066 * timeout if no response for approx 1s. |
0067 * Entry: no parameters |
0068 * Exit: (A) = recieved char, (C)=1 if valid char, (C)=0 if timeout. |
0069 * |
0070 0300 34 30 RCHAR PSHS X,Y |
0071 * |
0072 0302 8E 03 E8 LDX #1000 1000x inner loop |
0073 0305 10 8E 04 E2 RCHAR1 LDY #DELCON delay constant for inner loop (approx 1ms). |
0074 0309 B6 E0 00 RCHAR2 LDA ACIAC1 test for recieved char |
0075 030C 47 ASRA |
0076 030D 25 0A BCS RCHAR3 get character |
0077 030F 31 3F LEAY -1,Y else, continue to count delay |
0078 0311 26 F6 BNE RCHAR2 |
0079 0313 30 1F LEAX -1,X |
0080 0315 26 EE BNE RCHAR1 |
0081 0317 35 B0 PULS X,Y,PC return with error if timed out |
0082 * |
0083 0319 B6 E0 01 RCHAR3 LDA ACIAD1 return data (carry bit still set) |
0084 031C 35 B0 PULS X,Y,PC |
0085 * |
0086 * |
0087 * transmit char to remote drive. |
0088 * timeout if no response for approx 1s. (allows for use of hardware flow control) |
0089 * Entry: (A) = char to transmit |
0090 * Exit: (A) = recieved char, (C)=1 if valid char, (C)=0 if timeout. |
0091 * |
0092 031E 34 30 SCHAR PSHS X,Y |
0093 0320 34 02 PSHS A |
0094 * |
0095 0322 8E 03 E8 LDX #1000 1000x inner loop |
0096 0325 10 8E 04 E2 SCHAR1 LDY #DELCON delay constant for inner loop (approx 1ms). |
0097 0329 B6 E0 00 SCHAR2 LDA ACIAC1 test for space in transmit FIFO |
0098 032C 47 ASRA |
0099 032D 47 ASRA |
0100 032E 25 0C BCS SCHAR3 send character |
0101 0330 31 3F LEAY -1,Y else, continue to count delay |
0102 0332 26 F5 BNE SCHAR2 |
0103 0334 30 1F LEAX -1,X |
0104 0336 26 ED BNE SCHAR1 |
0105 0338 35 02 PULS A |
0106 033A 35 B0 PULS X,Y,PC return with error if timed out |
0107 * |
0108 033C 35 02 SCHAR3 PULS A |
0109 033E B7 E0 01 STA ACIAD1 send data (carry bit still set) |
0110 0341 35 B0 PULS X,Y,PC |
0111 * |
0112 * Print Data |
0113 * |
0114 0343 8D D9 PDATA0 BSR SCHAR |
0115 0345 A6 80 PDATA1 LDA ,X+ |
0116 0347 81 04 CMPA #$04 |
0117 0349 26 F8 BNE PDATA0 |
0118 034B 39 RTS |
0119 * |
0120 ** 'UF' Format RAMdisc to FLEX standard. |
0121 * |
0122 034C 0A 0D DISFOS FCB $0A,$0D |
0123 034E 46 6F 72 6D 61 74 FCC 'Formating RAMdisk... ' |
69 6E 67 20 52 41 |
4D 64 69 73 6B 2E |
2E 2E 20 |
0124 0363 0A 0D FCB $0A,$0D |
0125 0365 44 72 69 76 65 20 FCC 'Drive Number ?' |
4E 75 6D 62 65 72 |
20 3F |
0126 0373 04 FCB 4 |
0127 0374 0A 0D 04 MESS6 FCB $0A,$0D,4 |
0128 0377 52 61 6D 64 69 73 FCC 'Ramdisk not allocated! ' |
6B 20 6E 6F 74 20 |
61 6C 6C 6F 63 61 |
74 65 64 21 20 |
0129 038E 04 FCB 4 |
0130 038F 0A 0D UFMSG1 FCB $0A,$0D |
0131 0391 46 6F 72 6D 61 74 FCC 'Format Complete' |
20 43 6F 6D 70 6C |
65 74 65 |
0132 03A0 04 FCB 4 |
0133 * |
0134 03A1 BD 04 B1 UFSUB JSR INITDR |
0135 03A4 8E 03 4C LDX #DISFOS |
0136 03A7 BD 03 45 JSR PDATA1 |
0137 03AA 17 FF 53 UFSUB1 LBSR RCHAR |
0138 03AD 24 FB BCC UFSUB1 |
0139 03AF 17 FF 6C LBSR SCHAR |
0140 03B2 81 30 CMPA #'0' |
0141 03B4 10 25 00 F3 LBLO UFEXIT |
0142 03B8 81 33 CMPA #'3' |
0143 03BA 10 22 00 ED LBHI UFEXIT |
0144 03BE 80 30 SUBA #'0' |
0145 03C0 1F 89 TFR A,B |
0146 03C2 F7 01 07 STB DRVNUM |
0147 03C5 8E 01 04 LDX #DRVNUM-3 |
0148 03C8 BD 05 22 JSR DRVSEL |
0149 * |
0150 * set up free chain |
0151 * |
0152 03CB 8E 02 00 LDX #BUFFER clear out buffer |
0153 03CE 4F CLRA |
0154 03CF 5F CLRB |
0155 03D0 A7 80 DFL1 STA 0,X+ |
0156 03D2 5A DECB |
0157 03D3 26 FB BNE DFL1 |
0158 * |
0159 03D5 7F 01 08 CLR TRACK |
0160 03D8 86 01 LDA #1 |
0161 03DA B7 01 09 STA SECTOR |
0162 03DD 8E 02 00 DFL2 LDX #BUFFER |
0163 03E0 B6 01 08 LDA TRACK |
0164 03E3 A7 84 STA 0,X |
0165 03E5 B6 01 09 LDA SECTOR |
0166 03E8 4C INCA |
0167 03E9 81 00 CMPA #RMAXSEC+1 last sector on track? |
0168 03EB 26 04 BNE DFL3 |
0169 03ED 6C 84 INC 0,X |
0170 03EF 86 01 LDA #1 |
0171 03F1 A7 01 DFL3 STA 1,X |
0172 03F3 B6 01 08 LDA TRACK |
0173 03F6 F6 01 09 LDB SECTOR |
0174 03F9 BD 04 FE JSR WRITSC |
0175 03FC 7C 01 09 INC SECTOR |
0176 03FF B6 01 09 LDA SECTOR |
0177 0402 81 00 CMPA #RMAXSEC+1 |
0178 0404 26 D7 BNE DFL2 |
0179 0406 86 01 LDA #1 |
0180 0408 B7 01 09 STA SECTOR |
0181 040B 7C 01 08 INC TRACK |
0182 040E B6 01 08 LDA TRACK |
0183 0411 81 40 CMPA #RMAXTRK |
0184 0413 26 C8 BNE DFL2 |
0185 * break free chain at last track/sector |
0186 0415 8E 02 00 LDX #BUFFER |
0187 0418 86 3F LDA #RMAXTRK-1 |
0188 041A C6 FF LDB #RMAXSEC |
0189 041C BD 04 DD JSR READSC |
0190 041F 8E 02 00 LDX #BUFFER |
0191 0422 6F 84 CLR 0,X |
0192 0424 6F 01 CLR 1,X |
0193 0426 86 3F LDA #RMAXTRK-1 |
0194 0428 C6 FF LDB #RMAXSEC |
0195 042A BD 04 FE JSR WRITSC |
0196 * set up sector structure, SIR, directory etc |
0197 042D 8E 02 00 LDX #BUFFER |
0198 0430 4F CLRA |
0199 0431 C6 FF LDB #RMAXSEC |
0200 0433 BD 04 DD JSR READSC |
0201 0436 8E 02 00 LDX #BUFFER |
0202 0439 6F 84 CLR 0,X break end of directory chain |
0203 043B 6F 01 CLR 1,X |
0204 043D 4F CLRA |
0205 043E C6 FF LDB #RMAXSEC |
0206 0440 BD 04 FE JSR WRITSC |
0207 * |
0208 0443 8E 02 00 LDX #BUFFER |
0209 0446 4F CLRA |
0210 0447 C6 03 LDB #3 set up SIR |
0211 0449 BD 04 DD JSR READSC |
0212 044C 8E 02 00 LDX #BUFFER |
0213 044F 6F 84 CLR 0,X break forward link |
0214 0451 6F 01 CLR 1,X |
0215 0453 CC 52 41 LDD #$5241 set volume name (RAMDISK ) |
0216 0456 ED 88 10 STD 16,X |
0217 0459 CC 4D 44 LDD #$4D44 |
0218 045C ED 88 12 STD 18,X |
0219 045F CC 49 53 LDD #$4953 |
0220 0462 ED 88 14 STD 20,X |
0221 0465 CC 4B 20 LDD #$4B20 |
0222 0468 ED 88 16 STD 22,X |
0223 046B CC 00 01 LDD #1 volume number |
0224 046E ED 88 1B STD 27,X |
0225 0471 CC 01 01 LDD #$0101 first trk/sec 01-01 |
0226 0474 ED 88 1D STD 29,X |
0227 0477 86 3F LDA #RMAXTRK-1 |
0228 0479 C6 FF LDB #RMAXSEC |
0229 047B ED 88 1F STD 31,X |
0230 047E ED 88 26 STD 38,X |
0231 0481 CC 3E C1 LDD #RTOTSEC total DATA sectors (2912-14) |
0232 0484 ED 88 21 STD 33,X |
0233 * |
0234 0487 86 01 LDA #01 month set default creation date (SYS09's birthday!) |
0235 0489 A7 88 23 STA 35,X |
0236 048C 86 07 LDA #07 day |
0237 048E A7 88 24 STA 36,X |
0238 0491 86 07 LDA #07 year |
0239 0493 A7 88 25 STA 37,X |
0240 * |
0241 0496 4F RF3 CLRA |
0242 0497 C6 03 LDB #3 |
0243 0499 BD 04 FE JSR WRITSC |
0244 * |
0245 * LDX #BUFFER |
0246 * CLRA |
0247 * LDB #1 |
0248 * JSR READSC |
0249 * LDX #BUFFER |
0250 * LDA #$AA set the init flag |
0251 * STA 0,X |
0252 * LDA #$55 |
0253 * STA 1,X |
0254 * CLRA |
0255 * LDB #1 |
0256 * JSR WRITSC |
0257 * |
0258 * Write Boot sector |
0259 * |
0260 049C 8E C0 00 LDX #$C000 |
0261 049F 4F CLRA TRACK 0 |
0262 04A0 C6 01 LDB #$01 SECTOR 1 |
0263 04A2 B7 01 08 STA TRACK |
0264 04A5 F7 01 09 STB SECTOR |
0265 04A8 17 00 53 LBSR WRITSC |
0266 * |
0267 04AB 8E 03 8F UFEXIT LDX #UFMSG1 |
0268 04AE 7E 03 45 JMP PDATA1 |
0269 * |
0270 * |
0271 ** FLEX 9 COMPACT FLASH DISK DRIVERS |
0272 * |
0273 * FOR SYS09BUG 1.2 ON THE BURCHED B5-X300 |
0274 * WITH I/O MAPPED AT $XE000 |
0275 * AND ROM MAPPED AT $XF000 |
0276 * THE BURCHED B5-X300 HAS 256KBYTES OF SRAM |
0277 * THE FIRST 64K IS USED BY FLEX, |
0278 * THE SECOND 192K MAY BE USED AS A RAM DISK |
0279 * |
0280 * |
0281 0010 IMASK EQU $10 IRQ MASK CC |
0282 0040 FMASK EQU $40 FIRQ MASK CC |
0283 FFF0 DATREG EQU $FFF0 DAT REGISTERS |
0284 * |
0285 E040 CF_BASE EQU $E040 |
0286 E040 CF_DATA EQU CF_BASE+0 |
0287 E041 CF_ERROR EQU CF_BASE+1 ; read error |
0288 E041 CF_FEATURE EQU CF_BASE+1 ; write feature |
0289 E042 CF_SCNT EQU CF_BASE+2 |
0290 E043 CF_SNUM EQU CF_BASE+3 |
0291 E044 CF_CLO EQU CF_BASE+4 |
0292 E045 CF_CHI EQU CF_BASE+5 |
0293 E046 CF_HEAD EQU CF_BASE+6 |
0294 E047 CF_STATUS EQU CF_BASE+7 ; read status |
0295 E047 CF_COMAND EQU CF_BASE+7 ; write command |
0296 * |
0297 * Command Equates |
0298 * |
0299 0020 CMDREAD EQU $20 ; Read Single sector |
0300 0030 CMDWRITE EQU $30 ; Write Single sector |
0301 00EF CMDFEATURE EQU $EF |
0302 0001 FEAT8BIT EQU $01 ; enable 8 bit transfers |
0303 00E0 HEADLBA EQU $E0 |
0304 * |
0305 * Status bit equates |
0306 * |
0307 0080 BSY EQU $80 |
0308 0040 DRDY EQU $40 |
0309 0008 DRQ EQU $08 |
0310 0001 ERR EQU $01 |
0311 * |
0312 * |
0313 * INITIALIZE CF CARD FOR 8 BIT LBA MODE |
0314 * |
0315 04B1 8D 7F INITDR BSR WAITRDY |
0316 04B3 86 E0 LDA #HEADLBA |
0317 04B5 B7 E0 46 STA CF_HEAD |
0318 04B8 86 01 LDA #FEAT8BIT |
0319 04BA B7 E0 41 STA CF_FEATURE |
0320 04BD 86 EF LDA #CMDFEATURE |
0321 04BF B7 E0 47 STA CF_COMAND |
0322 04C2 20 6E BRA WAITRDY |
0323 * |
0324 * RESTORE DISK DRIVER (SEEK TRACK 00) |
0325 * |
0326 04C4 8D 5C RESTR1 BSR DRVSEL |
0327 04C6 4F CLRA ; Track 0 |
0328 04C7 C6 01 LDB #$01 ; Sector 1 |
0329 * |
0330 * Seek track and sector |
0331 * A holds track number (0 - ??) |
0332 * B holds sector number (1 - ??) |
0333 * Sector numbers starts from 1 |
0334 * subtract 1 to start from sector 0 on CF |
0335 * |
0336 04C9 5A SEEKTS DECB |
0337 04CA F7 E0 43 STB CF_SNUM |
0338 04CD B7 E0 44 STA CF_CLO |
0339 04D0 F6 01 07 LDB DRVNUM |
0340 04D3 F7 E0 45 STB CF_CHI |
0341 04D6 C6 01 LDB #$01 |
0342 04D8 F7 E0 42 STB CF_SCNT |
0343 04DB 5F CLRB |
0344 04DC 39 RTS |
0345 * |
0346 * READ SECTORS FROM CF |
0347 * |
0348 * |
0349 04DD 8D EA READSC BSR SEEKTS |
0350 04DF 86 20 LDA #CMDREAD ; IDE READ MULTIPLE |
0351 04E1 B7 E0 47 STA CF_COMAND |
0352 04E4 8D 4C BSR WAITRDY |
0353 * |
0354 * READ LOOP |
0355 * |
0356 04E6 5F CLRB |
0357 04E7 8D 58 RDLP1 BSR WAITDRQ |
0358 04E9 B6 E0 40 LDA CF_DATA |
0359 04EC A7 80 STA ,X+ |
0360 04EE 5A DECB |
0361 04EF 26 F6 BNE RDLP1 |
0362 * |
0363 04F1 5F CLRB |
0364 04F2 8D 4D RDLP2 BSR WAITDRQ |
0365 04F4 B6 E0 40 LDA CF_DATA |
0366 04F7 5A DECB |
0367 04F8 26 F8 BNE RDLP2 |
0368 * |
0369 04FA 8D 36 BSR WAITRDY |
0370 04FC 5F CLRB |
0371 04FD 39 RTS |
0372 * |
0373 * WRITE SECTOR TO CF |
0374 * |
0375 04FE 8D C9 WRITSC BSR SEEKTS ; SEEK TRACK & SECTOR |
0376 0500 86 30 LDA #CMDWRITE ; IDE WRITE MULTIPLE |
0377 0502 B7 E0 47 STA CF_COMAND |
0378 0505 8D 2B BSR WAITRDY |
0379 * |
0380 * WRITE LOOP |
0381 * |
0382 0507 5F CLRB |
0383 0508 8D 37 WRTLP1 BSR WAITDRQ |
0384 050A A6 80 LDA ,X+ |
0385 050C B7 E0 40 STA CF_DATA |
0386 050F 5A DECB |
0387 0510 26 F6 BNE WRTLP1 |
0388 * |
0389 0512 5F CLRB |
0390 0513 8D 2C WRTLP2 BSR WAITDRQ |
0391 0515 4F CLRA |
0392 0516 B7 E0 40 STA CF_DATA |
0393 0519 5A DECB |
0394 051A 26 F7 BNE WRTLP2 |
0395 * |
0396 051C 8D 14 BSR WAITRDY |
0397 051E 5F CLRB |
0398 051F 39 RTS |
0399 * |
0400 * CHECK FOR BUSY |
0401 * Doubles as VERIFY |
0402 * |
0403 0520 5F BUSY CLRB Never busy |
0404 0521 39 RTS |
0405 * |
0406 * DRIVE SELECT DISK DRIVER |
0407 * |
0408 0522 A6 03 DRVSEL LDA 3,X GET DRIVE # FROM FCB |
0409 0524 81 03 CMPA #3 |
0410 0526 23 01 BLS DRVS2 IF > 3, SET IT TO 0 |
0411 0528 4F CLRA |
0412 0529 B7 01 07 DRVS2 STA DRVNUM |
0413 052C 5F CLRB ; SET Z, CLEAR C |
0414 052D 39 RTS |
0415 * |
0416 * CHECK DRIVE READY DISK DRIVER |
0417 * |
0418 052E A6 03 CHKDRV LDA 3,X |
0419 0530 5F CLRB ; CLEAR C, SET Z |
0420 0531 39 RTS |
0421 * |
0422 * WAIT UNTIL READY |
0423 * |
0424 0532 B6 E0 47 WAITRDY LDA CF_STATUS |
0425 0535 85 80 BITA #BSY |
0426 0537 26 F9 BNE WAITRDY |
0427 0539 B6 E0 47 LDA CF_STATUS |
0428 053C 85 40 BITA #DRDY |
0429 053E 27 F2 BEQ WAITRDY |
0430 0540 39 RTS |
0431 * |
0432 * WAIT FOR DATA REQUEST |
0433 * |
0434 0541 B6 E0 47 WAITDRQ LDA CF_STATUS |
0435 0544 85 08 BITA #DRQ |
0436 0546 27 F9 BEQ WAITDRQ |
0437 0548 39 RTS |
0438 * |
0439 ******************************************************* |
0440 * |
0441 * Bootstrap FLEX Loader |
0442 * |
0443 * SBUG1.8 loads the bootstap loader at $C000 |
0444 * however the Flex adaption manual has the |
0445 * bootstrap loader residing at $C100 |
0446 * |
0447 ****************************************************** |
0448 * |
0449 * Equates |
0450 * |
0451 C0FF STACK EQU $C0FF |
0452 C300 SCTBUF EQU $C300 |
0453 * |
0454 * Start of Utility |
0455 * |
0456 C000 ORG $C000 |
0457 C000 20 0B BOOT BRA LOAD0 |
0458 C002 00 00 00 FCB 0,0,0 |
0459 C005 00 TRK FCB 0 File start track |
0460 C006 00 SCT FCB 0 File start sector |
0461 C007 00 DNS FCB 0 Density Flag (not used) |
0462 C008 C0 00 TADR FDB $C000 Transfer address |
0463 C00A 00 00 LADR FDB 0 Load Address |
0464 C00C 00 DRNUM FCB 0 Drive number 0 |
0465 * |
0466 C00D 10 CE C0 FF LOAD0 LDS #STACK Set up stack |
0467 C011 FC C0 05 LDD TRK Set up start track and sector |
0468 C014 FD C3 00 STD SCTBUF |
0469 C017 10 8E C4 00 LDY #SCTBUF+256 |
0470 * |
0471 * Perform actual file load |
0472 * |
0473 C01B 8D 35 LOAD1 BSR GETCH Get acharcater |
0474 C01D 81 02 CMPA #$02 Data record hearder ? |
0475 C01F 27 10 BEQ LOAD2 Skip, is so |
0476 C021 81 16 CMPA #$16 Xfr address hearder ? |
0477 C023 26 F6 BNE LOAD1 Loop if neither |
0478 * |
0479 * Get transfer address |
0480 * |
0481 C025 8D 2B BSR GETCH |
0482 C027 B7 C0 08 STA TADR |
0483 C02A 8D 26 BSR GETCH |
0484 C02C B7 C0 09 STA TADR+1 |
0485 C02F 20 EA BRA LOAD1 |
0486 * |
0487 * Load data record |
0488 * |
0489 C031 8D 1F LOAD2 BSR GETCH Get load address |
0490 C033 B7 C0 0A STA LADR |
0491 C036 8D 1A BSR GETCH |
0492 C038 B7 C0 0B STA LADR+1 |
0493 C03B 8D 15 BSR GETCH Get Bytes count |
0494 C03D 1F 89 TFR A,B |
0495 C03F 5D TSTB |
0496 C040 27 D9 BEQ LOAD1 Loop if count = 0 |
0497 C042 BE C0 0A LDX LADR Get load address |
0498 C045 34 14 LOAD3 PSHS B,X |
0499 C047 8D 09 BSR GETCH Get data character |
0500 C049 35 14 PULS B,X |
0501 C04B A7 80 STA ,X+ Store at load address |
0502 C04D 5A DECB |
0503 C04E 26 F5 BNE LOAD3 Loop until count = 0 |
0504 C050 20 C9 BRA LOAD1 |
0505 * |
0506 * Get Character routine |
0507 * Reads a sector if needed |
0508 * |
0509 C052 10 8C C4 00 GETCH CMPY #SCTBUF+256 out of data ? |
0510 C056 26 0F BNE GETCH4 Go read Character if not |
0511 C058 8E C3 00 GETCH2 LDX #SCTBUF Point to buffer |
0512 C05B EC 84 LDD 0,X Get forward Link |
0513 C05D 27 0B BEQ GO if zero, file is loaded |
0514 C05F 8D 21 BSR READ Read next sector |
0515 C061 26 9D BNE BOOT start over if error |
0516 C063 10 8E C3 04 LDY #SCTBUF+4 Point past link |
0517 C067 A6 A0 GETCH4 LDA ,Y+ Else, get a character |
0518 C069 39 RTS |
0519 * |
0520 * File is loaded, Jump to it |
0521 * |
0522 C06A 6E 9F C0 08 GO JMP [TADR] Jump to transfer address |
0523 |
0524 * |
0525 ** FLEX 9 COMPACT FLASH DISK DRIVERS |
0526 * |
0527 * FOR SYS09BUG 1.2 ON THE BURCHED B5-X300 |
0528 * WITH I/O MAPPED AT $XE000 |
0529 * AND ROM MAPPED AT $XF000 |
0530 * THE BURCHED B5-X300 HAS 256KBYTES OF SRAM |
0531 * THE FIRST 64K IS USED BY FLEX, |
0532 * THE SECOND 192K MAY BE USED AS A RAM DISK |
0533 * |
0534 * |
0535 *IMASK EQU $10 IRQ MASK CC |
0536 *FMASK EQU $40 FIRQ MASK CC |
0537 *DATREG EQU $FFF0 DAT REGISTERS |
0538 * |
0539 *CF_BASE EQU $E040 |
0540 *CF_DATA EQU CF_BASE+0 |
0541 *CF_ERROR EQU CF_BASE+1 ; read error |
0542 *CF_FEATURE EQU CF_BASE+1 ; write feature |
0543 *CF_SCNT EQU CF_BASE+2 |
0544 *CF_SNUM EQU CF_BASE+3 |
0545 *CF_CLO EQU CF_BASE+4 |
0546 *CF_CHI EQU CF_BASE+5 |
0547 *CF_HEAD EQU CF_BASE+6 |
0548 *CF_STATUS EQU CF_BASE+7 ; read status |
0549 *CF_COMAND EQU CF_BASE+7 ; write command |
0550 * |
0551 * Command Equates |
0552 * |
0553 *CMDREAD EQU $20 ; Read Single sector |
0554 *CMDWRITE EQU $30 ; Write Single sector |
0555 *CMDFEATURE EQU $EF |
0556 *FEAT8BIT EQU $01 ; enable 8 bit transfers |
0557 *HEADLBA EQU $E0 |
0558 * |
0559 * Status bit equates |
0560 * |
0561 *BSY EQU $80 |
0562 *DRDY EQU $40 |
0563 *DRQ EQU $08 |
0564 *ERR EQU $01 |
0565 * |
0566 * Seek track and sector |
0567 * A holds track number (0 - ??) |
0568 * B holds sector number (1 - ??) |
0569 * Sector numbers starts from 1 |
0570 * subtract 1 to start from sector 0 on CF |
0571 * |
0572 C06E 5A SEEK DECB |
0573 C06F F7 E0 43 STB CF_SNUM |
0574 C072 B7 E0 44 STA CF_CLO |
0575 C075 F6 C0 0C LDB DRNUM |
0576 C078 F7 E0 45 STB CF_CHI |
0577 C07B C6 01 LDB #$01 |
0578 C07D F7 E0 42 STB CF_SCNT |
0579 C080 5F CLRB |
0580 C081 39 RTS |
0581 * |
0582 * READ SECTORS FROM CF |
0583 * |
0584 * |
0585 C082 8D EA READ BSR SEEK |
0586 C084 86 20 LDA #CMDREAD ; IDE READ MULTIPLE |
0587 C086 B7 E0 47 STA CF_COMAND |
0588 C089 8D 18 BSR WTRDY |
0589 * |
0590 * READ LOOP |
0591 * |
0592 C08B 5F CLRB |
0593 C08C 8D 24 READ1 BSR WTDRQ |
0594 C08E B6 E0 40 LDA CF_DATA |
0595 C091 A7 80 STA ,X+ |
0596 C093 5A DECB |
0597 C094 26 F6 BNE READ1 |
0598 * |
0599 C096 5F CLRB |
0600 C097 8D 19 READ2 BSR WTDRQ |
0601 C099 B6 E0 40 LDA CF_DATA |
0602 C09C 5A DECB |
0603 C09D 26 F8 BNE READ2 |
0604 * |
0605 C09F 8D 02 BSR WTRDY |
0606 C0A1 5F CLRB |
0607 C0A2 39 RTS |
0608 * |
0609 * WAIT UNTIL READY |
0610 * |
0611 C0A3 B6 E0 47 WTRDY LDA CF_STATUS |
0612 C0A6 85 80 BITA #BSY |
0613 C0A8 26 F9 BNE WTRDY |
0614 C0AA B6 E0 47 LDA CF_STATUS |
0615 C0AD 85 40 BITA #DRDY |
0616 C0AF 27 F2 BEQ WTRDY |
0617 C0B1 39 RTS |
0618 * |
0619 * WAIT FOR DATA REQUEST |
0620 * |
0621 C0B2 B6 E0 47 WTDRQ LDA CF_STATUS |
0622 C0B5 85 08 BITA #DRQ |
0623 C0B7 27 F9 BEQ WTDRQ |
0624 C0B9 39 RTS |
0625 * |
0626 END START |
Program + Init Data = 791 bytes |
Error count = 0 |
/fmt_ide.lst
0,0 → 1,720
Assembler release DWC_2.0 version 2.11 |
May 6, 2004 (c) Motorola (free ware) |
0001 * |
0002 ** FLEX 9 DISK DRIVERS |
0003 * |
0004 * FOR SYS09BUG ON THE DIGILENT SPARTAN 3 STARTER BOARD |
0005 * WITH I/O MAPPED AT $XE000 |
0006 * AND ROM MAPPED AT $XF000 |
0007 * THE DIGILENT SPARTAN 3 STARTER BOARD HAS 1MBYTE OF SRAM |
0008 * THE FIRST 64K IS USED BY FLEX, |
0009 * THE SECOND 128K IS USED AS A ROM DISK |
0010 * THE REMAINING RAM IS USED FOR A RAM DISK |
0011 * |
0012 * |
0013 0001 CFLAG EQU $01 CARRY FLAG |
0014 0002 VFLAG EQU $02 OVERFLOW FLAG |
0015 0004 ZFLAG EQU $04 ZERO FLAG |
0016 0008 NFLAG EQU $08 NEGATIVE FLAG |
0017 0010 IFLAG EQU $10 IRQ MASK CC |
0018 0020 HFLAG EQU $20 HALF CARRY |
0019 0040 FFLAG EQU $40 FIRQ MASK CC |
0020 0080 EFLAG EQU $80 ENTIRE FLAG |
0021 * |
0022 0000 MAPPAG EQU $00 PAGE $0000 DAT ADDRESS |
0023 * |
0024 * Serial Port |
0025 * |
0026 E000 ACIAS EQU $E000 |
0027 E000 ACIAC1 EQU ACIAS |
0028 E001 ACIAD1 EQU ACIAS+1 |
0029 04E2 DELCON EQU 1250 Delay (Processor clock in MHz * 50) |
0030 * |
0031 * XMODEM Control characters |
0032 * |
0033 0001 SOH EQU $01 |
0034 0004 EOT EQU $04 |
0035 0006 ACK EQU $06 |
0036 0015 NAK EQU $15 |
0037 0018 CAN EQU $18 |
0038 * |
0039 * Some dummy Constants |
0040 * |
0041 0040 RMAXTRK EQU 64 |
0042 00FF RMAXSEC EQU 255 |
0043 3EC1 RTOTSEC EQU RMAXTRK*RMAXSEC-RMAXSEC |
0044 * |
0045 * Start |
0046 * |
0047 0100 ORG $0100 |
0048 0100 17 02 98 START LBSR UFSUB |
0049 0103 6E 9F F8 00 JMP [$F800] Jump to monitor on Completion. |
0050 * |
0051 * |
0052 * RAM SPACE |
0053 * |
0054 0107 00 DRVNUM FCB 0 |
0055 0108 00 TRACK FCB 0 |
0056 0109 00 SECTOR FCB 0 |
0057 010A 00 CHKSUM FCB 0 |
0058 010B 00 BLKNUM FCB 0 Xmodem block number |
0059 010C 00 BYTCNT FCB 0 Xmodem byte count |
0060 010D 00 00 XSTATE FDB 0 Xmodem State Vector |
0061 010F 00 00 00 DELCNT FCB $00,$00,$00 Xmodem Poll timer |
0062 0112 00 MAXTRK FCB 0 |
0063 0113 00 MAXSEC FCB 0 |
0064 0200 ORG $0200 |
0065 * |
0066 * SECTOR BUFFER |
0067 * |
0068 0200 BUFFER RMB 256 |
0069 * |
0070 * |
0071 * recieve char from remote drive. |
0072 * timeout if no response for approx 1s. |
0073 * Entry: no parameters |
0074 * Exit: (A) = recieved char, (C)=1 if valid char, (C)=0 if timeout. |
0075 * |
0076 0300 34 30 RCHAR PSHS X,Y |
0077 * |
0078 0302 8E 03 E8 LDX #1000 1000x inner loop |
0079 0305 10 8E 04 E2 RCHAR1 LDY #DELCON delay constant for inner loop (approx 1ms). |
0080 0309 B6 E0 00 RCHAR2 LDA ACIAC1 test for recieved char |
0081 030C 47 ASRA |
0082 030D 25 0A BCS RCHAR3 get character |
0083 030F 31 3F LEAY -1,Y else, continue to count delay |
0084 0311 26 F6 BNE RCHAR2 |
0085 0313 30 1F LEAX -1,X |
0086 0315 26 EE BNE RCHAR1 |
0087 0317 35 B0 PULS X,Y,PC return with error if timed out |
0088 * |
0089 0319 B6 E0 01 RCHAR3 LDA ACIAD1 return data (carry bit still set) |
0090 031C 35 B0 PULS X,Y,PC |
0091 * |
0092 * |
0093 * transmit char to remote drive. |
0094 * timeout if no response for approx 1s. (allows for use of hardware flow control) |
0095 * Entry: (A) = char to transmit |
0096 * Exit: (A) = recieved char, (C)=1 if valid char, (C)=0 if timeout. |
0097 * |
0098 031E 34 30 SCHAR PSHS X,Y |
0099 0320 34 02 PSHS A |
0100 * |
0101 0322 8E 03 E8 LDX #1000 1000x inner loop |
0102 0325 10 8E 04 E2 SCHAR1 LDY #DELCON delay constant for inner loop (approx 1ms). |
0103 0329 B6 E0 00 SCHAR2 LDA ACIAC1 test for space in transmit FIFO |
0104 032C 47 ASRA |
0105 032D 47 ASRA |
0106 032E 25 0C BCS SCHAR3 send character |
0107 0330 31 3F LEAY -1,Y else, continue to count delay |
0108 0332 26 F5 BNE SCHAR2 |
0109 0334 30 1F LEAX -1,X |
0110 0336 26 ED BNE SCHAR1 |
0111 0338 35 02 PULS A |
0112 033A 35 B0 PULS X,Y,PC return with error if timed out |
0113 * |
0114 033C 35 02 SCHAR3 PULS A |
0115 033E B7 E0 01 STA ACIAD1 send data (carry bit still set) |
0116 0341 35 B0 PULS X,Y,PC |
0117 * |
0118 ** 'UF' Format IDE Drive to FLEX standard. |
0119 * |
0120 0343 0A 0D DISFOS FCB $0A,$0D |
0121 0345 46 6F 72 6D 61 74 FCC 'Formating IDE disk... ' |
69 6E 67 20 49 44 |
45 20 64 69 73 6B |
2E 2E 2E 20 |
0122 035B 0A 0D FCB $0A,$0D |
0123 035D 44 72 69 76 65 20 FCC 'Drive Number ?' |
4E 75 6D 62 65 72 |
20 3F |
0124 036B 04 FCB 4 |
0125 036C 0A 0D 04 MESS6 FCB $0A,$0D,4 |
0126 036F 49 44 45 20 64 72 FCC 'IDE drive not allocated! ' |
69 76 65 20 6E 6F |
74 20 61 6C 6C 6F |
63 61 74 65 64 21 |
20 |
0127 0388 04 FCB 4 |
0128 0389 0A 0D UFMSG1 FCB $0A,$0D |
0129 038B 46 6F 72 6D 61 74 FCC 'Format Complete' |
20 43 6F 6D 70 6C |
65 74 65 |
0130 039A 04 FCB 4 |
0131 * |
0132 039B BD 05 39 UFSUB JSR INITDR |
0133 039E 8E 03 43 LDX #DISFOS |
0134 03A1 BD 05 32 JSR PDATA1 |
0135 03A4 17 FF 59 UFSUB1 LBSR RCHAR |
0136 03A7 24 FB BCC UFSUB1 |
0137 03A9 17 FF 72 LBSR SCHAR |
0138 03AC 81 30 CMPA #'0' |
0139 03AE 10 25 00 F3 LBLO UFEXIT |
0140 03B2 81 33 CMPA #'3' |
0141 03B4 10 22 00 ED LBHI UFEXIT |
0142 03B8 80 30 SUBA #'0' |
0143 03BA 1F 89 TFR A,B |
0144 03BC F7 01 07 STB DRVNUM |
0145 03BF 8E 01 04 LDX #DRVNUM-3 |
0146 03C2 BD 05 B1 JSR DRVSEL |
0147 * |
0148 * set up free chain |
0149 * |
0150 03C5 8E 02 00 LDX #BUFFER clear out buffer |
0151 03C8 4F CLRA |
0152 03C9 5F CLRB |
0153 03CA A7 80 DFL1 STA 0,X+ |
0154 03CC 5A DECB |
0155 03CD 26 FB BNE DFL1 |
0156 * |
0157 03CF 7F 01 08 CLR TRACK |
0158 03D2 86 01 LDA #1 |
0159 03D4 B7 01 09 STA SECTOR |
0160 03D7 8E 02 00 DFL2 LDX #BUFFER |
0161 03DA B6 01 08 LDA TRACK |
0162 03DD A7 84 STA 0,X |
0163 03DF B6 01 09 LDA SECTOR |
0164 03E2 4C INCA |
0165 03E3 81 00 CMPA #RMAXSEC+1 last sector on track? |
0166 03E5 26 04 BNE DFL3 |
0167 03E7 6C 84 INC 0,X |
0168 03E9 86 01 LDA #1 |
0169 03EB A7 01 DFL3 STA 1,X |
0170 03ED B6 01 08 LDA TRACK |
0171 03F0 F6 01 09 LDB SECTOR |
0172 03F3 BD 05 8D JSR WRITSC |
0173 03F6 7C 01 09 INC SECTOR |
0174 03F9 B6 01 09 LDA SECTOR |
0175 03FC 81 00 CMPA #RMAXSEC+1 |
0176 03FE 26 D7 BNE DFL2 |
0177 0400 86 01 LDA #1 |
0178 0402 B7 01 09 STA SECTOR |
0179 0405 7C 01 08 INC TRACK |
0180 0408 B6 01 08 LDA TRACK |
0181 040B 81 40 CMPA #RMAXTRK |
0182 040D 26 C8 BNE DFL2 |
0183 * break free chain at last track/sector |
0184 040F 8E 02 00 LDX #BUFFER |
0185 0412 86 3F LDA #RMAXTRK-1 |
0186 0414 C6 FF LDB #RMAXSEC |
0187 0416 BD 05 6C JSR READSC |
0188 0419 8E 02 00 LDX #BUFFER |
0189 041C 6F 84 CLR 0,X |
0190 041E 6F 01 CLR 1,X |
0191 0420 86 3F LDA #RMAXTRK-1 |
0192 0422 C6 FF LDB #RMAXSEC |
0193 0424 BD 05 8D JSR WRITSC |
0194 * set up sector structure, SIR, directory etc |
0195 0427 8E 02 00 LDX #BUFFER |
0196 042A 4F CLRA |
0197 042B C6 FF LDB #RMAXSEC |
0198 042D BD 05 6C JSR READSC |
0199 0430 8E 02 00 LDX #BUFFER |
0200 0433 6F 84 CLR 0,X break end of directory chain |
0201 0435 6F 01 CLR 1,X |
0202 0437 4F CLRA |
0203 0438 C6 FF LDB #RMAXSEC |
0204 043A BD 05 8D JSR WRITSC |
0205 * |
0206 043D 8E 02 00 LDX #BUFFER |
0207 0440 4F CLRA |
0208 0441 C6 03 LDB #3 set up SIR |
0209 0443 BD 05 6C JSR READSC |
0210 0446 8E 02 00 LDX #BUFFER |
0211 0449 6F 84 CLR 0,X break forward link |
0212 044B 6F 01 CLR 1,X |
0213 044D CC 52 41 LDD #$5241 set volume name (RAMDISK ) |
0214 0450 ED 88 10 STD 16,X |
0215 0453 CC 4D 44 LDD #$4D44 |
0216 0456 ED 88 12 STD 18,X |
0217 0459 CC 49 53 LDD #$4953 |
0218 045C ED 88 14 STD 20,X |
0219 045F CC 4B 20 LDD #$4B20 |
0220 0462 ED 88 16 STD 22,X |
0221 0465 CC 00 01 LDD #1 volume number |
0222 0468 ED 88 1B STD 27,X |
0223 046B CC 01 01 LDD #$0101 first trk/sec 01-01 |
0224 046E ED 88 1D STD 29,X |
0225 0471 86 3F LDA #RMAXTRK-1 |
0226 0473 C6 FF LDB #RMAXSEC |
0227 0475 ED 88 1F STD 31,X |
0228 0478 ED 88 26 STD 38,X |
0229 047B CC 3E C1 LDD #RTOTSEC total DATA sectors (2912-14) |
0230 047E ED 88 21 STD 33,X |
0231 * |
0232 0481 86 01 LDA #01 month set default creation date (SYS09's birthday!) |
0233 0483 A7 88 23 STA 35,X |
0234 0486 86 07 LDA #07 day |
0235 0488 A7 88 24 STA 36,X |
0236 048B 86 07 LDA #07 year |
0237 048D A7 88 25 STA 37,X |
0238 * |
0239 0490 4F RF3 CLRA |
0240 0491 C6 03 LDB #3 |
0241 0493 BD 05 8D JSR WRITSC |
0242 * |
0243 * Not sure what this is about |
0244 * put bootstrap on track 0 sector 1 |
0245 * |
0246 * LDX #BUFFER |
0247 * CLRA |
0248 * LDB #1 |
0249 * JSR READSC |
0250 * LDX #BUFFER |
0251 * LDA #$AA set the init flag |
0252 * STA 0,X |
0253 * LDA #$55 |
0254 * STA 1,X |
0255 * CLRA |
0256 * LDB #1 |
0257 * JSR WRITSC |
0258 * |
0259 * Write Boot sector |
0260 * |
0261 0496 8E C0 00 LDX #$C000 |
0262 0499 4F CLRA TRACK 0 |
0263 049A C6 01 LDB #$01 SECTOR 1 |
0264 049C B7 01 08 STA TRACK |
0265 049F F7 01 09 STB SECTOR |
0266 04A2 17 00 E8 LBSR WRITSC |
0267 * |
0268 04A5 8E 03 89 UFEXIT LDX #UFMSG1 |
0269 04A8 7E 05 32 JMP PDATA1 |
0270 * |
0271 * Read a byte from the serial port |
0272 * |
0273 04AB 34 04 LRBYTE PSHS B |
0274 04AD 8D 0E BSR LRHEX Get hex digit. |
0275 04AF 48 ASLA |
0276 04B0 48 ASLA Shift to msb. |
0277 04B1 48 ASLA |
0278 04B2 48 ASLA |
0279 04B3 1F 89 TFR A,B Save in B. |
0280 04B5 8D 06 BSR LRHEX Get next digit. |
0281 04B7 34 04 PSHS B |
0282 04B9 AB E0 ADDA 0,S+ Add together bytes. |
0283 04BB 35 84 PULS B,PC |
0284 * |
0285 04BD BD 04 E6 LRHEX JSR INTER |
0286 04C0 29 FB BVS LRHEX |
0287 04C2 80 30 SUBA #$30 Remove ascii bias. |
0288 04C4 2B F7 BMI LRHEX |
0289 04C6 81 09 CMPA #$09 Number? |
0290 04C8 2F 0A BLE LRHEX1 Yes. |
0291 04CA 81 11 CMPA #$11 Keep testing. |
0292 04CC 2B EF BMI LRHEX |
0293 04CE 81 16 CMPA #$16 |
0294 04D0 2E EB BGT LRHEX |
0295 04D2 80 07 SUBA #$07 |
0296 04D4 39 LRHEX1 RTS |
0297 * |
0298 * ACIA INPUT TEST |
0299 * |
0300 04D5 B6 E0 00 INTEST LDA ACIAC1 |
0301 04D8 85 01 BITA #$01 |
0302 04DA 39 RTS |
0303 * |
0304 * RESET ACIA |
0305 * |
0306 04DB 86 03 ACIRST LDA #$03 master reset |
0307 04DD B7 E0 00 STA ACIAC1 |
0308 04E0 86 11 LDA #$11 |
0309 04E2 B7 E0 00 STA ACIAC1 |
0310 04E5 39 RTS |
0311 * |
0312 * ACIA INPUT |
0313 * |
0314 04E6 86 10 INTER LDA #16 |
0315 04E8 B7 01 0F STA DELCNT+0 |
0316 04EB 7F 01 10 CLR DELCNT+1 |
0317 04EE 7F 01 11 CLR DELCNT+2 |
0318 04F1 B6 E0 00 INTER0 LDA ACIAC1 |
0319 04F4 85 01 BITA #$01 |
0320 04F6 26 08 BNE INTER1 |
0321 04F8 85 78 BITA #$78 |
0322 04FA 27 0A BEQ INTER2 |
0323 04FC 8D DD BSR ACIRST |
0324 04FE 20 E6 BRA INTER |
0325 * |
0326 0500 B6 E0 01 INTER1 LDA ACIAD1 |
0327 0503 1C 02 ANDCC #VFLAG |
0328 0505 39 RTS |
0329 * |
0330 0506 7A 01 11 INTER2 DEC DELCNT+2 |
0331 0509 26 E6 BNE INTER0 |
0332 050B 7A 01 10 DEC DELCNT+1 |
0333 050E 26 E1 BNE INTER0 |
0334 0510 7A 01 0F DEC DELCNT+0 |
0335 0513 26 DC BNE INTER0 |
0336 0515 4F CLRA |
0337 0516 1A 02 ORCC #VFLAG |
0338 0518 39 RTS |
0339 * |
0340 * ACIA OUTPUT |
0341 * |
0342 0519 34 02 OUTTER PSHS A |
0343 * |
0344 051B B6 E0 00 OUTTE1 LDA ACIAC1 |
0345 051E 85 02 BITA #$02 |
0346 0520 26 08 BNE OUTTE2 |
0347 0522 85 78 BITA #$78 |
0348 0524 27 F5 BEQ OUTTE1 |
0349 0526 8D B3 BSR ACIRST |
0350 0528 20 F1 BRA OUTTE1 |
0351 * |
0352 052A 35 02 OUTTE2 PULS A |
0353 052C B7 E0 01 STA ACIAD1 |
0354 052F 39 RTS |
0355 * |
0356 * Print Data |
0357 * |
0358 0530 8D E7 PDATA0 BSR OUTTER |
0359 0532 A6 80 PDATA1 LDA ,X+ |
0360 0534 81 04 CMPA #$04 |
0361 0536 26 F8 BNE PDATA0 |
0362 0538 39 RTS |
0363 * |
0364 ** FLEX 9 IDE DISK DRIVERS |
0365 * |
0366 * FOR SYS09BUG 1.2 ON THE XSA-3S1000 |
0367 * WITH I/O MAPPED AT $XE000 |
0368 * AND ROM MAPPED AT $XF000 |
0369 * |
0370 * |
0371 0010 IMASK EQU $10 IRQ MASK CC |
0372 0040 FMASK EQU $40 FIRQ MASK CC |
0373 * |
0374 E100 CF_BASE EQU $E100 |
0375 E100 CF_DATA EQU CF_BASE+0 |
0376 E102 CF_ERROR EQU CF_BASE+2 ; read error |
0377 E102 CF_FEATURE EQU CF_BASE+2 ; write feature |
0378 E104 CF_SCNT EQU CF_BASE+4 |
0379 E106 CF_SNUM EQU CF_BASE+6 |
0380 E108 CF_CLO EQU CF_BASE+8 |
0381 E10A CF_CHI EQU CF_BASE+10 |
0382 E10C CF_HEAD EQU CF_BASE+12 |
0383 E10E CF_STATUS EQU CF_BASE+14 ; read status |
0384 E10E CF_COMAND EQU CF_BASE+14 ; write command |
0385 E11E CF_AUX EQU CF_BASE+30 |
0386 * |
0387 * Command Equates |
0388 * |
0389 0020 CMDREAD EQU $20 ; Read Single sector |
0390 0030 CMDWRITE EQU $30 ; Write Single sector |
0391 0006 AUXRESET EQU $06 |
0392 0002 AUXRSTREL EQU $02 |
0393 00E0 HEADLBA EQU $E0 |
0394 * |
0395 * Status bit equates |
0396 * |
0397 0080 BSY EQU $80 |
0398 0040 DRDY EQU $40 |
0399 0008 DRQ EQU $08 |
0400 0001 ERR EQU $01 |
0401 * |
0402 * |
0403 * INITIALIZE CF CARD FOR 8 BIT LBA MODE |
0404 * |
0405 0539 CC 00 06 INITDR LDD #AUXRESET |
0406 053C FD E1 1E STD CF_AUX |
0407 053F CC 00 02 LDD #AUXRSTREL |
0408 0542 FD E1 1E STD CF_AUX |
0409 0545 CC 00 E0 LDD #HEADLBA |
0410 0548 FD E1 0C STD CF_HEAD |
0411 054B 20 74 BRA WAITRDY |
0412 * |
0413 * RESTORE DISK DRIVER (SEEK TRACK 00) |
0414 * |
0415 054D 8D 62 RESTR1 BSR DRVSEL |
0416 054F 4F CLRA ; Track 0 |
0417 0550 C6 01 LDB #$01 ; Sector 1 |
0418 * |
0419 * Seek track and sector |
0420 * A holds track number (0 - ??) |
0421 * B holds sector number (1 - ??) |
0422 * Sector numbers starts from 1 |
0423 * subtract 1 to start from sector 0 on CF |
0424 * |
0425 0552 34 02 SEEKTS PSHS A |
0426 0554 4F CLRA |
0427 0555 5A DECB |
0428 0556 FD E1 06 STD CF_SNUM |
0429 0559 E6 E4 LDB ,S |
0430 055B FD E1 08 STD CF_CLO |
0431 055E F6 01 07 LDB DRVNUM |
0432 0561 FD E1 0A STD CF_CHI |
0433 0564 C6 01 LDB #$01 |
0434 0566 FD E1 04 STD CF_SCNT |
0435 0569 5F CLRB |
0436 056A 35 82 PULS A,PC |
0437 * |
0438 * READ SECTORS FROM CF |
0439 * |
0440 * |
0441 056C 8D E4 READSC BSR SEEKTS |
0442 056E CC 00 20 LDD #CMDREAD ; IDE READ MULTIPLE |
0443 0571 FD E1 0E STD CF_COMAND |
0444 0574 8D 4B BSR WAITRDY |
0445 * |
0446 * READ LOOP |
0447 * |
0448 0576 34 20 PSHS Y |
0449 0578 10 8E 01 00 LDY #256 |
0450 057C 8D 52 RDLP1 BSR WAITDRQ |
0451 057E FC E1 00 LDD CF_DATA |
0452 0581 E7 80 STB ,X+ |
0453 0583 31 3F LEAY -1,Y |
0454 0585 26 F5 BNE RDLP1 |
0455 0587 35 20 PULS Y |
0456 * |
0457 0589 8D 36 BSR WAITRDY |
0458 058B 5F CLRB |
0459 058C 39 RTS |
0460 * |
0461 * WRITE SECTOR TO CF |
0462 * |
0463 058D 8D C3 WRITSC BSR SEEKTS ; SEEK TRACK & SECTOR |
0464 058F CC 00 30 LDD #CMDWRITE ; IDE WRITE MULTIPLE |
0465 0592 FD E1 0E STD CF_COMAND |
0466 0595 8D 2A BSR WAITRDY |
0467 * |
0468 * WRITE LOOP |
0469 * |
0470 0597 34 20 PSHS Y |
0471 0599 10 8E 01 00 LDY #256 |
0472 059D 4F CLRA |
0473 059E 8D 30 WRTLP1 BSR WAITDRQ |
0474 05A0 E6 80 LDB ,X+ |
0475 05A2 FD E1 00 STD CF_DATA |
0476 05A5 31 3F LEAY -1,Y |
0477 05A7 26 F5 BNE WRTLP1 |
0478 05A9 35 20 PULS Y |
0479 * |
0480 05AB 8D 14 BSR WAITRDY |
0481 05AD 5F CLRB |
0482 05AE 39 RTS |
0483 * |
0484 * CHECK FOR BUSY |
0485 * Doubles as VERIFY |
0486 * |
0487 05AF 5F BUSY CLRB Never busy |
0488 05B0 39 RTS |
0489 * |
0490 * DRIVE SELECT DISK DRIVER |
0491 * |
0492 05B1 A6 03 DRVSEL LDA 3,X GET DRIVE # FROM FCB |
0493 05B3 81 03 CMPA #3 |
0494 05B5 23 01 BLS DRVS2 IF > 3, SET IT TO 0 |
0495 05B7 4F CLRA |
0496 05B8 B7 01 07 DRVS2 STA DRVNUM |
0497 05BB 5F CLRB ; SET Z, CLEAR C |
0498 05BC 39 RTS |
0499 * |
0500 * CHECK DRIVE READY DISK DRIVER |
0501 * |
0502 05BD A6 03 CHKDRV LDA 3,X |
0503 05BF 5F CLRB ; CLEAR C, SET Z |
0504 05C0 39 RTS |
0505 * |
0506 * WAIT UNTIL READY |
0507 * |
0508 05C1 FC E1 0E WAITRDY LDD CF_STATUS |
0509 05C4 C5 80 BITB #BSY |
0510 05C6 26 F9 BNE WAITRDY |
0511 05C8 FC E1 0E LDD CF_STATUS |
0512 05CB C5 40 BITB #DRDY |
0513 05CD 27 F2 BEQ WAITRDY |
0514 05CF 39 RTS |
0515 * |
0516 * WAIT FOR DATA REQUEST |
0517 * |
0518 05D0 FC E1 0E WAITDRQ LDD CF_STATUS |
0519 05D3 C5 08 BITB #DRQ |
0520 05D5 27 F9 BEQ WAITDRQ |
0521 05D7 39 RTS |
0522 * |
0523 ******************************************************* |
0524 * |
0525 * Bootstrap FLEX Loader |
0526 * |
0527 * SBUG1.8 loads the bootstap loader at $C000 |
0528 * however the Flex adaption manual has the |
0529 * bootstrap loader residing at $C100 |
0530 * |
0531 ****************************************************** |
0532 * |
0533 * Equates |
0534 * |
0535 C0FF STACK EQU $C0FF |
0536 C300 SCTBUF EQU $C300 |
0537 * |
0538 * Start of Utility |
0539 * |
0540 C000 ORG $C000 |
0541 C000 20 0B BOOT BRA LOAD0 |
0542 C002 00 00 00 FCB 0,0,0 |
0543 C005 00 TRK FCB 0 File start track |
0544 C006 00 SCT FCB 0 File start sector |
0545 C007 00 DNS FCB 0 Density Flag (not used) |
0546 C008 C0 00 TADR FDB $C000 Transfer address |
0547 C00A 00 00 LADR FDB 0 Load Address |
0548 C00C 00 DRNUM FCB 0 Drive number 0 |
0549 * |
0550 C00D 10 CE C0 FF LOAD0 LDS #STACK Set up stack |
0551 C011 FC C0 05 LDD TRK Set up start track and sector |
0552 C014 FD C3 00 STD SCTBUF |
0553 C017 10 8E C4 00 LDY #SCTBUF+256 |
0554 * |
0555 * Perform actual file load |
0556 * |
0557 C01B 8D 35 LOAD1 BSR GETCH Get acharcater |
0558 C01D 81 02 CMPA #$02 Data record hearder ? |
0559 C01F 27 10 BEQ LOAD2 Skip, is so |
0560 C021 81 16 CMPA #$16 Xfr address hearder ? |
0561 C023 26 F6 BNE LOAD1 Loop if neither |
0562 * |
0563 * Get transfer address |
0564 * |
0565 C025 8D 2B BSR GETCH |
0566 C027 B7 C0 08 STA TADR |
0567 C02A 8D 26 BSR GETCH |
0568 C02C B7 C0 09 STA TADR+1 |
0569 C02F 20 EA BRA LOAD1 |
0570 * |
0571 * Load data record |
0572 * |
0573 C031 8D 1F LOAD2 BSR GETCH Get load address |
0574 C033 B7 C0 0A STA LADR |
0575 C036 8D 1A BSR GETCH |
0576 C038 B7 C0 0B STA LADR+1 |
0577 C03B 8D 15 BSR GETCH Get Bytes count |
0578 C03D 1F 89 TFR A,B |
0579 C03F 5D TSTB |
0580 C040 27 D9 BEQ LOAD1 Loop if count = 0 |
0581 C042 BE C0 0A LDX LADR Get load address |
0582 C045 34 14 LOAD3 PSHS B,X |
0583 C047 8D 09 BSR GETCH Get data character |
0584 C049 35 14 PULS B,X |
0585 C04B A7 80 STA ,X+ Store at load address |
0586 C04D 5A DECB |
0587 C04E 26 F5 BNE LOAD3 Loop until count = 0 |
0588 C050 20 C9 BRA LOAD1 |
0589 * |
0590 * Get Character routine |
0591 * Reads a sector if needed |
0592 * |
0593 C052 10 8C C4 00 GETCH CMPY #SCTBUF+256 out of data ? |
0594 C056 26 0F BNE GETCH4 Go read Character if not |
0595 C058 8E C3 00 GETCH2 LDX #SCTBUF Point to buffer |
0596 C05B EC 84 LDD 0,X Get forward Link |
0597 C05D 27 0B BEQ GO if zero, file is loaded |
0598 C05F 8D 27 BSR READ Read next sector |
0599 C061 26 9D BNE BOOT start over if error |
0600 C063 10 8E C3 04 LDY #SCTBUF+4 Point past link |
0601 C067 A6 A0 GETCH4 LDA ,Y+ Else, get a character |
0602 C069 39 RTS |
0603 * |
0604 * File is loaded, Jump to it |
0605 * |
0606 C06A 6E 9F C0 08 GO JMP [TADR] Jump to transfer address |
0607 |
0608 * |
0609 ** FLEX 9 IDE DISK DRIVERS |
0610 * |
0611 * FOR SYS09BUG 1.2 ON THE XSA-3S1000 |
0612 * WITH I/O MAPPED AT $XE000 |
0613 * AND ROM MAPPED AT $XF000 |
0614 * |
0615 *IMASK EQU $10 IRQ MASK CC |
0616 *FMASK EQU $40 FIRQ MASK CC |
0617 * |
0618 *CF_BASE EQU $E100 |
0619 *CF_DATA EQU CF_BASE+0 |
0620 *CF_ERROR EQU CF_BASE+2 ; read error |
0621 *CF_FEATURE EQU CF_BASE+2 ; write feature |
0622 *CF_SCNT EQU CF_BASE+4 |
0623 *CF_SNUM EQU CF_BASE+6 |
0624 *CF_CLO EQU CF_BASE+8 |
0625 *CF_CHI EQU CF_BASE+10 |
0626 *CF_HEAD EQU CF_BASE+12 |
0627 *CF_STATUS EQU CF_BASE+14 ; read status |
0628 *CF_COMAND EQU CF_BASE+14 ; write command |
0629 *CF_AUX EQU CF_BASE+30 |
0630 * |
0631 * Command Equates |
0632 * |
0633 *CMDREAD EQU $20 ; Read Single sector |
0634 *CMDWRITE EQU $30 ; Write Single sector |
0635 *HEADLBA EQU $E0 |
0636 *AUXRESET EQU $06 |
0637 *AUXRSTREL EQU $02 |
0638 * |
0639 * Status bit equates |
0640 * |
0641 *BSY EQU $80 |
0642 *DRDY EQU $40 |
0643 *DRQ EQU $08 |
0644 *ERR EQU $01 |
0645 * |
0646 * Seek track and sector |
0647 * A holds track number (0 - ??) |
0648 * B holds sector number (1 - ??) |
0649 * Sector numbers starts from 1 |
0650 * subtract 1 to start from sector 0 on CF |
0651 * |
0652 C06E 34 02 SEEK PSHS A |
0653 C070 4F CLRA |
0654 C071 5A DECB |
0655 C072 FD E1 06 STD CF_SNUM |
0656 C075 E6 E4 LDB ,S |
0657 C077 FD E1 08 STD CF_CLO |
0658 C07A F6 C0 0C LDB DRNUM |
0659 C07D FD E1 0A STD CF_CHI |
0660 C080 C6 01 LDB #$01 |
0661 C082 FD E1 04 STD CF_SCNT |
0662 C085 5F CLRB |
0663 C086 35 82 PULS A,PC |
0664 * |
0665 * READ SECTORS FROM CF |
0666 * |
0667 * |
0668 C088 8D E4 READ BSR SEEK |
0669 C08A CC 00 20 LDD #CMDREAD ; IDE READ MULTIPLE |
0670 C08D FD E1 0E STD CF_COMAND |
0671 C090 8D 17 BSR WTRDY |
0672 * |
0673 * READ LOOP |
0674 * |
0675 C092 34 20 PSHS Y |
0676 C094 10 8E 01 00 LDY #256 |
0677 C098 8D 1E READ1 BSR WTDRQ |
0678 C09A FC E1 00 LDD CF_DATA |
0679 C09D E7 80 STB ,X+ |
0680 C09F 31 3F LEAY -1,Y |
0681 C0A1 26 F5 BNE READ1 |
0682 C0A3 35 20 PULS Y |
0683 * |
0684 C0A5 8D 02 BSR WTRDY |
0685 C0A7 5F CLRB |
0686 C0A8 39 RTS |
0687 * |
0688 * WAIT UNTIL READY |
0689 * |
0690 C0A9 FC E1 0E WTRDY LDD CF_STATUS |
0691 C0AC C5 80 BITB #BSY |
0692 C0AE 26 F9 BNE WTRDY |
0693 C0B0 FC E1 0E LDD CF_STATUS |
0694 C0B3 C5 40 BITB #DRDY |
0695 C0B5 27 F2 BEQ WTRDY |
0696 C0B7 39 RTS |
0697 * |
0698 * WAIT FOR DATA REQUEST |
0699 * |
0700 C0B8 FC E1 0E WTDRQ LDD CF_STATUS |
0701 C0BB C5 08 BITB #DRQ |
0702 C0BD 27 F9 BEQ WTDRQ |
0703 C0BF 39 RTS |
0704 * |
0705 END START |
Program + Init Data = 940 bytes |
Error count = 0 |