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/upld
- from Rev 27 to Rev 66
- ↔ Reverse comparison
Rev 27 → Rev 66
/upld_cf8.s19
0,0 → 1,35
S11701001702C36E9FF8000000000000000000000000000006 |
S1230300B6E0008501398603B7E0008611B7E000398610B7010F7F01107F0111B6E0008564 |
S12303200126088578270A8DDD20E6B6E0011CFD397A011126E67A011026E17A010F26DC4D |
S12303404F1A02393402B6E00085022608857827F58DB320F13502B7E001398DE7A68081E7 |
S12303600426F8390D0A586D6F64656D20524F4D204469736B2055706C6F6164040D0A55EF |
S1230380706C6F616420436F6D706C657465040D0A55706C6F6164204572726F72040D0A2B |
S12303A04472697665204E756D626572203A040D0A41726520596F752053757265203F208E |
S12303C028592F4E29048E036417FF918E039E17FF8B17FF3C29FB17FF6A81301025012E77 |
S12303E08133102201288030B701078E039E17FF6CB601078B3017FF4B8E03AF17FF5E1725 |
S1230400FF0F29FB17FF3D845F814E102700FF815926B31701B1CE0537FF010D8601B70199 |
S12304200B8E02004FC601B70108F701091700EA102500E01701871700E0102500D68E02FF |
S123044000B60108F601091701C51701718E0200B60108F601095CB70108F701091700BA36 |
S1230460102500B01701571700B0102500A68E0200B60108F601091701951701418E02009D |
S1230480B60108F601095CB70108F7010917008A10250080170127170080102500768E0215 |
S12304A000A688264CB70112E688275CF70113B60108F60109170157170103B60108F601D3 |
S12304C0095C8E0200B70108F7010917004C102500421700E9170042102500388E0200B67C |
S12304E00108F601091701271700D3B60108F601095CF1011326CBC6014CB1011226C38E67 |
S1230500C0004FC601B70108F701091701018E037D7E035D8E038F16FE433440FE010D172D |
S1230520FDEF280A861517FE1BCE053720F1ADC426EDFF010D35C081012606CE05571CFA3F |
S12305403981042608860617FDFA1A0539811826031A05391CFA39B1010B2606CE056D1C0B |
S1230560FA39861517FDDDCE05371CFA3943B1010B26EF7F010A8680B7010CCE05811CFA8C |
S1230580393402BB010AB7010A35027A010C2603CE0598A7801CFA39B1010A260B7C010B23 |
S12305A0CE05371CFE1A043934041F105AC4801F013504861517FD8CCE05371CFA39340294 |
S12305C0860617FD7F35828D7A86E0B7E0468601B7E04186EFB7E04720695AF7E043B7E0B1 |
S12305E044F60107F7E045C601F7E0425F398DEA8620B7E0478D4C5F8D58B6E040A7805AB2 |
S123060026F65F8D4DB6E0405A26F88D365F398DC98630B7E0478D2B5F8D37A680B7E04016 |
S12306205A26F65F8D2C4FB7E0405A26F78D145F395F39A603810323014FB701075F39A61D |
S11D0640035F39B6E047858026F9B6E047854027F239B6E047850827F93949 |
S123C000200B000000000000C00000000010CEC0FFFCC005FDC300108EC4008D3581022745 |
S123C02010811626F68D2BB7C0088D26B7C00920EA8D1FB7C00A8D1AB7C00B8D151F895DC8 |
S123C04027D9BEC00A34148D093514A7805A26F520C9108CC400260F8EC300EC84270B8D93 |
S123C06021269D108EC304A6A0396E9FC0085AF7E043B7E044F6C00CF7E045C601F7E04212 |
S123C0805F398DEA8620B7E0478D185F8D24B6E040A7805A26F65F8D19B6E0405A26F88D01 |
S11DC0A0025F39B6E047858026F9B6E047854027F239B6E047850827F93930 |
S9030000FC |
/upld_ide.s19
0,0 → 1,39
S11701001703306E9FF8000000000000000000000000000098 |
S123030034308E03E8108E04E2B6E00047250A313F26F6301F26EE35B0B6E00135B03430B8 |
S123032034028E03E8108E04E2B6E0004747250C313F26F5301F26ED350235B03502B7E05A |
S12303400135B034048D0E484848481F898D063404ABE03584BD037E29FB80302BF781094B |
S12303602F0A81112BEF81162EEB800739B6E0008501398603B7E0008611B7E000398610B2 |
S1230380B7010F7F01107F0111B6E000850126088578270A8DDD20E6B6E0011CFD397A0125 |
S12303A01126E67A011026E17A010F26DC4F1A02393402B6E00085022608857827F58DB380 |
S12303C020F13502B7E001398DE7A680810426F8390D0A586D6F64656D20524F4D2044692E |
S12303E0736B2055706C6F6164040D0A55706C6F616420436F6D706C657465040D0A5570DD |
S12304006C6F6164204572726F72040D0A4472697665204E756D626572203A040D0A417248 |
S12304206520596F752053757265203F2028592F4E29048E03D117FF918E040B17FF8B172F |
S1230440FF3C29FB17FF6A81301025012E8133102201288030B701078E040B17FF6CB60150 |
S1230460078B3017FF4B8E041C17FF5E17FF0F29FB17FF3D845F814E102700FF815926B3FC |
S12304801701B1CE05A4FF010D8601B7010B8E02004FC601B70108F701091700EA10250024 |
S12304A0E01701871700E0102500D68E0200B60108F601091701D11701718E0200B60108A7 |
S12304C0F601095CB70108F701091700BA102500B01701571700B0102500A68E0200B601ED |
S12304E008F601091701A11701418E0200B60108F601095CB70108F7010917008A1025009C |
S123050080170127170080102500768E0200A688264CB70112E688275CF70113B60108F62B |
S12305200109170163170103B60108F601095C8E0200B70108F7010917004C1025004217BA |
S123054000E9170042102500388E0200B60108F601091701331700D3B60108F601095CF158 |
S1230560011326CBC6014CB1011226C38EC0004FC601B70108F7010917010D8E03EA7E036C |
S1230580CA8E03FC16FE433440FE010D17FDEF280A861517FE1BCE05A420F1ADC426EDFF1E |
S12305A0010D35C081012606CE05C41CFA3981042608860617FDFA1A0539811826031A051A |
S12305C0391CFA39B1010B2606CE05DA1CFA39861517FDDDCE05A41CFA3943B1010B26EF43 |
S12305E07F010A8680B7010CCE05EE1CFA393402BB010AB7010A35027A010C2603CE060515 |
S1230600A7801CFA39B1010A260B7C010BCE05A41CFE1A043934041F105AC4801F013504A5 |
S1230620861517FD8CCE05A41CFA393402860617FD7F3582CC0006FDE11ECC0002FDE11E11 |
S1230640CC00E0FDE10C20748D624FC60134024F5AFDE106E6E4FDE108F60107FDE10AC648 |
S123066001FDE1045F35828DE4CC0020FDE10E8D4B3420108E01008D52FCE100E780313FD6 |
S123068026F535208D365F398DC3CC0030FDE10E8D2A3420108E01004F8D30E680FDE10059 |
S12306A0313F26F535208D145F395F39A603810323014FB701075F39A6035F39FCE10EC59D |
S11606C08026F9FCE10EC54027F239FCE10EC50827F93931 |
S123C000200B000000000000C00000000010CEC0FFFCC005FDC300108EC4008D3581022745 |
S123C02010811626F68D2BB7C0088D26B7C00920EA8D1FB7C00A8D1AB7C00B8D151F895DC8 |
S123C04027D9BEC00A34148D093514A7805A26F520C9108CC400260F8EC300EC84270B8D93 |
S123C06027269D108EC304A6A0396E9FC00834024F5AFDE106E6E4FDE108F6C00CFDE10AFC |
S123C080C601FDE1045F35828DE4CC0020FDE10E8D173420108E01008D1EFCE100E78031DD |
S123C0A03F26F535208D025F39FCE10EC58026F9FCE10EC54027F239FCE10EC50827F93904 |
S9030000FC |
/upld_cf8.txt
0,0 → 1,797
* |
** 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 48 |
RMAXSEC EQU 14 |
RTOTSEC EQU RMAXTRK*RMAXSEC-RMAXSEC |
* |
* Start |
* |
ORG $0100 |
START LBSR UXSUB |
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 |
* |
* 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 #$FF-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 |
* |
** 'UX' Xmodem ROM Disk upload |
* |
UXMES0 FCB $0D,$0A |
FCC 'Xmodem ROM Disk Upload' |
FCB 4 |
UXMES1 FCB $0D,$0A |
FCC 'Upload Complete' |
FCB 4 |
UXMES2 FCB $0D,$0A |
FCC 'Upload Error' |
FCB 4 |
UXMSG3 FCB $0D,$0A |
FCC 'Drive Number :' |
FCB 4 |
UXMSG4 FCB $0D,$0A |
FCC 'Are You Sure ? (Y/N)' |
FCB 4 |
* |
* Print Banner |
* |
UXSUB LDX #UXMES0 |
LBSR PDATA1 |
* |
* Prompt for Disk drive number (0 to 3) |
* |
LDX #UXMSG3 |
LBSR PDATA1 |
UXSUB1 LBSR INTER |
BVS UXSUB1 |
LBSR OUTTER |
CMPA #'0 |
LBLO UXEXIT |
CMPA #'3 |
LBHI UXEXIT |
SUBA #'0 |
STA DRVNUM |
* |
* Report selected drive |
* |
LDX #UXMSG3 |
LBSR PDATA1 |
LDA DRVNUM |
ADDA #'0 |
LBSR OUTTER |
* |
* Ask for confirmation (Y/N) |
* |
LDX #UXMSG4 |
LBSR PDATA1 |
UXSUB2 LBSR INTER |
BVS UXSUB2 |
LBSR OUTTER |
ANDA #$5F |
CMPA #'N |
LBEQ UXEXIT |
CMPA #'Y |
BNE UXSUB |
* |
* We have confirmation ... now load the disk image |
* |
LBSR INITDR |
LDU #XSTST |
STU XSTATE |
LDA #1 |
STA BLKNUM |
* |
* Sector1 |
* |
LDX #BUFFER |
* |
CLRA TRACK 0 |
LDB #$01 SECTOR 1 |
STA TRACK |
STB SECTOR |
* |
LBSR XREAD |
LBCS UXERR |
LBSR XACK |
LBSR XREAD |
LBCS UXERR |
* |
LDX #BUFFER |
LDA TRACK |
LDB SECTOR |
LBSR WRITSC |
LBSR XACK |
* |
* Sector 2 |
* |
LDX #BUFFER |
* |
LDA TRACK |
LDB SECTOR |
INCB |
STA TRACK |
STB SECTOR |
* |
LBSR XREAD |
LBCS UXERR |
LBSR XACK |
LBSR XREAD |
LBCS UXERR |
* |
LDX #BUFFER |
LDA TRACK |
LDB SECTOR |
LBSR WRITSC |
* |
LBSR XACK |
* |
* Sector 3 - SIR |
* |
LDX #BUFFER |
* |
LDA TRACK |
LDB SECTOR |
INCB |
STA TRACK |
STB SECTOR |
* |
LBSR XREAD |
LBCS UXERR |
LBSR XACK |
LBSR XREAD |
LBCS UXERR |
* |
LDX #BUFFER |
LDA 38,X |
INCA |
STA MAXTRK |
LDB 39,X |
INCB |
STB MAXSEC |
LDA TRACK |
LDB SECTOR |
LBSR WRITSC |
* |
LBSR XACK |
* |
* Sector 4 to Last Track & Sector |
* |
* |
LDA TRACK |
LDB SECTOR |
INCB |
* |
UXLOOP LDX #BUFFER |
STA TRACK |
STB SECTOR |
* |
LBSR XREAD |
LBCS UXERR |
LBSR XACK |
LBSR XREAD |
LBCS UXERR |
* |
LDX #BUFFER |
LDA TRACK |
LDB SECTOR |
LBSR WRITSC |
LBSR XACK |
* |
LDA TRACK |
LDB SECTOR |
INCB |
CMPB MAXSEC |
BNE UXLOOP |
LDB #1 |
INCA |
CMPA MAXTRK |
BNE UXLOOP |
* |
* |
* Write Boot sector |
* |
LDX #$C000 |
CLRA TRACK 0 |
LDB #$01 SECTOR 1 |
STA TRACK |
STB SECTOR |
LBSR WRITSC |
* |
UXEXIT LDX #UXMES1 |
JMP PDATA1 |
* |
UXERR LDX #UXMES2 |
LBRA PDATA1 |
* |
* Get a Byte using XModem protocol |
* Carry clear => no errors |
* Carry set => errors |
* |
XREAD PSHS U |
LDU XSTATE |
* |
XBYTE0 LBSR INTER |
BVC XBYTE1 |
LDA #NAK |
LBSR OUTTER |
LDU #XSTST |
BRA XBYTE0 |
* |
XBYTE1 JSR ,U |
BNE XBYTE0 |
STU XSTATE |
PULS U,PC |
* |
* START - LOOK FOR SOH (START OF HEADER) = $01 |
* |
XSTST CMPA #SOH |
BNE XSTST1 |
LDU #XSTBL |
ANDCC #$FF-CFLAG-ZFLAG No abort, no valid data (no exit) |
RTS |
* |
XSTST1 CMPA #EOT |
BNE XSTST2 |
LDA #ACK |
LBSR OUTTER |
ORCC #CFLAG+ZFLAG Set (c)=1 abort & exit |
RTS |
* |
XSTST2 CMPA #CAN |
BNE XSTST3 |
ORCC #CFLAG+ZFLAG Set (c)=1 abort & exit |
RTS |
* |
XSTST3 ANDCC #$FF-CFLAG-ZFLAG |
RTS |
* |
* Got SOH |
* Now get block number |
* |
XSTBL CMPA BLKNUM |
BNE XSTBLE |
LDU #XSTCOM |
ANDCC #$FF-CFLAG-ZFLAG No abort, No valid data (no exit) |
RTS |
* |
* Error in block number |
* |
XSTBLE LDA #NAK |
LBSR OUTTER |
LDU #XSTST |
ANDCC #$FF-CFLAG-ZFLAG No abort, No valid data (no exit) |
RTS |
* |
* Get complement of block number |
* |
XSTCOM COMA |
CMPA BLKNUM |
BNE XSTBLE |
CLR CHKSUM |
LDA #128 |
STA BYTCNT |
LDU #XSTDA |
ANDCC #$FF-CFLAG-ZFLAG No abort, No valid data (no exit) |
RTS |
* |
* Get data bytes |
* |
XSTDA PSHS A |
ADDA CHKSUM |
STA CHKSUM |
PULS A |
DEC BYTCNT |
BNE XSTDA1 |
LDU #XSTCK |
XSTDA1 STA ,X+ |
ANDCC #$FF-CFLAG-ZFLAG No abort, no valid data (no exit) |
RTS |
* |
* Byte count reached zero |
* Check checksum byte |
* |
XSTCK CMPA CHKSUM |
BNE XSTCK1 retry if wrong checksum |
* |
* Checksum OK ... |
* increment block number |
* Don't send ACK until data written to CF |
* |
INC BLKNUM |
LDU #XSTST |
ANDCC #$FF-CFLAG No abort |
ORCC #ZFLAG Valid data (exit) |
RTS |
* |
* Checksum Error detected ... |
* Reset Sector counter in ACCB to last 128 byte boundary |
* and send NAK |
* |
XSTCK1 PSHS B |
TFR X,D |
DECB |
ANDB #128 |
TFR D,X |
PULS B |
LDA #NAK |
XSTCK2 LBSR OUTTER |
LDU #XSTST |
ANDCC #$FF-CFLAG-ZFLAG No abort, no valid data (no exit) |
RTS |
* |
* Acknowledge Data Received |
* |
XACK PSHS A |
LDA #ACK |
LBSR OUTTER |
PULS A,PC |
* |
* |
** 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 |
* |
* 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 |
/upld_ide.txt
0,0 → 1,865
* |
** 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 UXSUB |
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 |
* |
* 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 #$FF-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 |
* |
* |
** 'UX' Xmodem ROM Disk upload |
* |
UXMES0 FCB $0D,$0A |
FCC 'Xmodem ROM Disk Upload' |
FCB 4 |
UXMES1 FCB $0D,$0A |
FCC 'Upload Complete' |
FCB 4 |
UXMES2 FCB $0D,$0A |
FCC 'Upload Error' |
FCB 4 |
UXMSG3 FCB $0D,$0A |
FCC 'Drive Number :' |
FCB 4 |
UXMSG4 FCB $0D,$0A |
FCC 'Are You Sure ? (Y/N)' |
FCB 4 |
* |
* Print Banner |
* |
UXSUB LDX #UXMES0 |
LBSR PDATA1 |
* |
* Prompt for Disk drive number (0 to 3) |
* |
LDX #UXMSG3 |
LBSR PDATA1 |
UXSUB1 LBSR INTER |
BVS UXSUB1 |
LBSR OUTTER |
CMPA #'0 |
LBLO UXEXIT |
CMPA #'3 |
LBHI UXEXIT |
SUBA #'0 |
STA DRVNUM |
* |
* Report selected drive |
* |
LDX #UXMSG3 |
LBSR PDATA1 |
LDA DRVNUM |
ADDA #'0 |
LBSR OUTTER |
* |
* Ask for confirmation (Y/N) |
* |
LDX #UXMSG4 |
LBSR PDATA1 |
UXSUB2 LBSR INTER |
BVS UXSUB2 |
LBSR OUTTER |
ANDA #$5F |
CMPA #'N |
LBEQ UXEXIT |
CMPA #'Y |
BNE UXSUB |
* |
* We have confirmation ... now load the disk image |
* |
LBSR INITDR |
LDU #XSTST |
STU XSTATE |
LDA #1 |
STA BLKNUM |
* |
* Sector1 |
* |
LDX #BUFFER |
* |
CLRA TRACK 0 |
LDB #$01 SECTOR 1 |
STA TRACK |
STB SECTOR |
* |
LBSR XREAD |
LBCS UXERR |
LBSR XACK |
LBSR XREAD |
LBCS UXERR |
* |
LDX #BUFFER |
LDA TRACK |
LDB SECTOR |
LBSR WRITSC |
LBSR XACK |
* |
* Sector 2 |
* |
LDX #BUFFER |
* |
LDA TRACK |
LDB SECTOR |
INCB |
STA TRACK |
STB SECTOR |
* |
LBSR XREAD |
LBCS UXERR |
LBSR XACK |
LBSR XREAD |
LBCS UXERR |
* |
LDX #BUFFER |
LDA TRACK |
LDB SECTOR |
LBSR WRITSC |
* |
LBSR XACK |
* |
* Sector 3 - SIR |
* |
LDX #BUFFER |
* |
LDA TRACK |
LDB SECTOR |
INCB |
STA TRACK |
STB SECTOR |
* |
LBSR XREAD |
LBCS UXERR |
LBSR XACK |
LBSR XREAD |
LBCS UXERR |
* |
LDX #BUFFER |
LDA 38,X |
INCA |
STA MAXTRK |
LDB 39,X |
INCB |
STB MAXSEC |
LDA TRACK |
LDB SECTOR |
LBSR WRITSC |
* |
LBSR XACK |
* |
* Sector 4 to Last Track & Sector |
* |
* |
LDA TRACK |
LDB SECTOR |
INCB |
* |
UXLOOP LDX #BUFFER |
STA TRACK |
STB SECTOR |
* |
LBSR XREAD |
LBCS UXERR |
LBSR XACK |
LBSR XREAD |
LBCS UXERR |
* |
LDX #BUFFER |
LDA TRACK |
LDB SECTOR |
LBSR WRITSC |
LBSR XACK |
* |
LDA TRACK |
LDB SECTOR |
INCB |
CMPB MAXSEC |
BNE UXLOOP |
LDB #1 |
INCA |
CMPA MAXTRK |
BNE UXLOOP |
* |
* |
* Write Boot sector |
* |
LDX #$C000 |
CLRA TRACK 0 |
LDB #$01 SECTOR 1 |
STA TRACK |
STB SECTOR |
LBSR WRITSC |
* |
UXEXIT LDX #UXMES1 |
JMP PDATA1 |
* |
UXERR LDX #UXMES2 |
LBRA PDATA1 |
* |
* Get a Byte using XModem protocol |
* Carry clear => no errors |
* Carry set => errors |
* |
XREAD PSHS U |
LDU XSTATE |
* |
XBYTE0 LBSR INTER |
BVC XBYTE1 |
LDA #NAK |
LBSR OUTTER |
LDU #XSTST |
BRA XBYTE0 |
* |
XBYTE1 JSR ,U |
BNE XBYTE0 |
STU XSTATE |
PULS U,PC |
* |
* START - LOOK FOR SOH (START OF HEADER) = $01 |
* |
XSTST CMPA #SOH |
BNE XSTST1 |
LDU #XSTBL |
ANDCC #$FF-CFLAG-ZFLAG No abort, no valid data (no exit) |
RTS |
* |
XSTST1 CMPA #EOT |
BNE XSTST2 |
LDA #ACK |
LBSR OUTTER |
ORCC #CFLAG+ZFLAG Set (c)=1 abort & exit |
RTS |
* |
XSTST2 CMPA #CAN |
BNE XSTST3 |
ORCC #CFLAG+ZFLAG Set (c)=1 abort & exit |
RTS |
* |
XSTST3 ANDCC #$FF-CFLAG-ZFLAG |
RTS |
* |
* Got SOH |
* Now get block number |
* |
XSTBL CMPA BLKNUM |
BNE XSTBLE |
LDU #XSTCOM |
ANDCC #$FF-CFLAG-ZFLAG No abort, No valid data (no exit) |
RTS |
* |
* Error in block number |
* |
XSTBLE LDA #NAK |
LBSR OUTTER |
LDU #XSTST |
ANDCC #$FF-CFLAG-ZFLAG No abort, No valid data (no exit) |
RTS |
* |
* Get complement of block number |
* |
XSTCOM COMA |
CMPA BLKNUM |
BNE XSTBLE |
CLR CHKSUM |
LDA #128 |
STA BYTCNT |
LDU #XSTDA |
ANDCC #$FF-CFLAG-ZFLAG No abort, No valid data (no exit) |
RTS |
* |
* Get data bytes |
* |
XSTDA PSHS A |
ADDA CHKSUM |
STA CHKSUM |
PULS A |
DEC BYTCNT |
BNE XSTDA1 |
LDU #XSTCK |
XSTDA1 STA ,X+ |
ANDCC #$FF-CFLAG-ZFLAG No abort, no valid data (no exit) |
RTS |
* |
* Byte count reached zero |
* Check checksum byte |
* |
XSTCK CMPA CHKSUM |
BNE XSTCK1 retry if wrong checksum |
* |
* Checksum OK ... |
* increment block number |
* Don't send ACK until data written to CF |
* |
INC BLKNUM |
LDU #XSTST |
ANDCC #$FF-CFLAG No abort |
ORCC #ZFLAG Valid data (exit) |
RTS |
* |
* Checksum Error detected ... |
* Reset Sector counter in ACCB to last 128 byte boundary |
* and send NAK |
* |
XSTCK1 PSHS B |
TFR X,D |
DECB |
ANDB #128 |
TFR D,X |
PULS B |
LDA #NAK |
XSTCK2 LBSR OUTTER |
LDU #XSTST |
ANDCC #$FF-CFLAG-ZFLAG No abort, no valid data (no exit) |
RTS |
* |
* Acknowledge Data Received |
* |
XACK PSHS A |
LDA #ACK |
LBSR OUTTER |
PULS A,PC |
* |
* |
** 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 |
/upld_cf8.lst
0,0 → 1,812
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 0030 RMAXTRK EQU 48 |
0042 000E RMAXSEC EQU 14 |
0043 0292 RTOTSEC EQU RMAXTRK*RMAXSEC-RMAXSEC |
0044 * |
0045 * Start |
0046 * |
0047 0100 ORG $0100 |
0048 0100 17 02 C3 START LBSR UXSUB |
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 * ACIA INPUT TEST |
0071 * |
0072 0300 B6 E0 00 INTEST LDA ACIAC1 |
0073 0303 85 01 BITA #$01 |
0074 0305 39 RTS |
0075 * |
0076 * RESET ACIA |
0077 * |
0078 0306 86 03 ACIRST LDA #$03 master reset |
0079 0308 B7 E0 00 STA ACIAC1 |
0080 030B 86 11 LDA #$11 |
0081 030D B7 E0 00 STA ACIAC1 |
0082 0310 39 RTS |
0083 * |
0084 * ACIA INPUT |
0085 * |
0086 0311 86 10 INTER LDA #16 |
0087 0313 B7 01 0F STA DELCNT+0 |
0088 0316 7F 01 10 CLR DELCNT+1 |
0089 0319 7F 01 11 CLR DELCNT+2 |
0090 031C B6 E0 00 INTER0 LDA ACIAC1 |
0091 031F 85 01 BITA #$01 |
0092 0321 26 08 BNE INTER1 |
0093 0323 85 78 BITA #$78 |
0094 0325 27 0A BEQ INTER2 |
0095 0327 8D DD BSR ACIRST |
0096 0329 20 E6 BRA INTER |
0097 * |
0098 032B B6 E0 01 INTER1 LDA ACIAD1 |
0099 032E 1C FD ANDCC #$FF-VFLAG |
0100 0330 39 RTS |
0101 * |
0102 0331 7A 01 11 INTER2 DEC DELCNT+2 |
0103 0334 26 E6 BNE INTER0 |
0104 0336 7A 01 10 DEC DELCNT+1 |
0105 0339 26 E1 BNE INTER0 |
0106 033B 7A 01 0F DEC DELCNT+0 |
0107 033E 26 DC BNE INTER0 |
0108 0340 4F CLRA |
0109 0341 1A 02 ORCC #VFLAG |
0110 0343 39 RTS |
0111 * |
0112 * ACIA OUTPUT |
0113 * |
0114 0344 34 02 OUTTER PSHS A |
0115 * |
0116 0346 B6 E0 00 OUTTE1 LDA ACIAC1 |
0117 0349 85 02 BITA #$02 |
0118 034B 26 08 BNE OUTTE2 |
0119 034D 85 78 BITA #$78 |
0120 034F 27 F5 BEQ OUTTE1 |
0121 0351 8D B3 BSR ACIRST |
0122 0353 20 F1 BRA OUTTE1 |
0123 * |
0124 0355 35 02 OUTTE2 PULS A |
0125 0357 B7 E0 01 STA ACIAD1 |
0126 035A 39 RTS |
0127 * |
0128 * Print Data |
0129 * |
0130 035B 8D E7 PDATA0 BSR OUTTER |
0131 035D A6 80 PDATA1 LDA ,X+ |
0132 035F 81 04 CMPA #$04 |
0133 0361 26 F8 BNE PDATA0 |
0134 0363 39 RTS |
0135 * |
0136 ** 'UX' Xmodem ROM Disk upload |
0137 * |
0138 0364 0D 0A UXMES0 FCB $0D,$0A |
0139 0366 58 6D 6F 64 65 6D FCC 'Xmodem ROM Disk Upload' |
20 52 4F 4D 20 44 |
69 73 6B 20 55 70 |
6C 6F 61 64 |
0140 037C 04 FCB 4 |
0141 037D 0D 0A UXMES1 FCB $0D,$0A |
0142 037F 55 70 6C 6F 61 64 FCC 'Upload Complete' |
20 43 6F 6D 70 6C |
65 74 65 |
0143 038E 04 FCB 4 |
0144 038F 0D 0A UXMES2 FCB $0D,$0A |
0145 0391 55 70 6C 6F 61 64 FCC 'Upload Error' |
20 45 72 72 6F 72 |
0146 039D 04 FCB 4 |
0147 039E 0D 0A UXMSG3 FCB $0D,$0A |
0148 03A0 44 72 69 76 65 20 FCC 'Drive Number :' |
4E 75 6D 62 65 72 |
20 3A |
0149 03AE 04 FCB 4 |
0150 03AF 0D 0A UXMSG4 FCB $0D,$0A |
0151 03B1 41 72 65 20 59 6F FCC 'Are You Sure ? (Y/N)' |
75 20 53 75 72 65 |
20 3F 20 28 59 2F |
4E 29 |
0152 03C5 04 FCB 4 |
0153 * |
0154 * Print Banner |
0155 * |
0156 03C6 8E 03 64 UXSUB LDX #UXMES0 |
0157 03C9 17 FF 91 LBSR PDATA1 |
0158 * |
0159 * Prompt for Disk drive number (0 to 3) |
0160 * |
0161 03CC 8E 03 9E LDX #UXMSG3 |
0162 03CF 17 FF 8B LBSR PDATA1 |
0163 03D2 17 FF 3C UXSUB1 LBSR INTER |
0164 03D5 29 FB BVS UXSUB1 |
0165 03D7 17 FF 6A LBSR OUTTER |
0166 03DA 81 30 CMPA #'0 |
0167 03DC 10 25 01 2E LBLO UXEXIT |
0168 03E0 81 33 CMPA #'3 |
0169 03E2 10 22 01 28 LBHI UXEXIT |
0170 03E6 80 30 SUBA #'0 |
0171 03E8 B7 01 07 STA DRVNUM |
0172 * |
0173 * Report selected drive |
0174 * |
0175 03EB 8E 03 9E LDX #UXMSG3 |
0176 03EE 17 FF 6C LBSR PDATA1 |
0177 03F1 B6 01 07 LDA DRVNUM |
0178 03F4 8B 30 ADDA #'0 |
0179 03F6 17 FF 4B LBSR OUTTER |
0180 * |
0181 * Ask for confirmation (Y/N) |
0182 * |
0183 03F9 8E 03 AF LDX #UXMSG4 |
0184 03FC 17 FF 5E LBSR PDATA1 |
0185 03FF 17 FF 0F UXSUB2 LBSR INTER |
0186 0402 29 FB BVS UXSUB2 |
0187 0404 17 FF 3D LBSR OUTTER |
0188 0407 84 5F ANDA #$5F |
0189 0409 81 4E CMPA #'N |
0190 040B 10 27 00 FF LBEQ UXEXIT |
0191 040F 81 59 CMPA #'Y |
0192 0411 26 B3 BNE UXSUB |
0193 * |
0194 * We have confirmation ... now load the disk image |
0195 * |
0196 0413 17 01 B1 LBSR INITDR |
0197 0416 CE 05 37 LDU #XSTST |
0198 0419 FF 01 0D STU XSTATE |
0199 041C 86 01 LDA #1 |
0200 041E B7 01 0B STA BLKNUM |
0201 * |
0202 * Sector1 |
0203 * |
0204 0421 8E 02 00 LDX #BUFFER |
0205 * |
0206 0424 4F CLRA TRACK 0 |
0207 0425 C6 01 LDB #$01 SECTOR 1 |
0208 0427 B7 01 08 STA TRACK |
0209 042A F7 01 09 STB SECTOR |
0210 * |
0211 042D 17 00 EA LBSR XREAD |
0212 0430 10 25 00 E0 LBCS UXERR |
0213 0434 17 01 87 LBSR XACK |
0214 0437 17 00 E0 LBSR XREAD |
0215 043A 10 25 00 D6 LBCS UXERR |
0216 * |
0217 043E 8E 02 00 LDX #BUFFER |
0218 0441 B6 01 08 LDA TRACK |
0219 0444 F6 01 09 LDB SECTOR |
0220 0447 17 01 C5 LBSR WRITSC |
0221 044A 17 01 71 LBSR XACK |
0222 * |
0223 * Sector 2 |
0224 * |
0225 044D 8E 02 00 LDX #BUFFER |
0226 * |
0227 0450 B6 01 08 LDA TRACK |
0228 0453 F6 01 09 LDB SECTOR |
0229 0456 5C INCB |
0230 0457 B7 01 08 STA TRACK |
0231 045A F7 01 09 STB SECTOR |
0232 * |
0233 045D 17 00 BA LBSR XREAD |
0234 0460 10 25 00 B0 LBCS UXERR |
0235 0464 17 01 57 LBSR XACK |
0236 0467 17 00 B0 LBSR XREAD |
0237 046A 10 25 00 A6 LBCS UXERR |
0238 * |
0239 046E 8E 02 00 LDX #BUFFER |
0240 0471 B6 01 08 LDA TRACK |
0241 0474 F6 01 09 LDB SECTOR |
0242 0477 17 01 95 LBSR WRITSC |
0243 * |
0244 047A 17 01 41 LBSR XACK |
0245 * |
0246 * Sector 3 - SIR |
0247 * |
0248 047D 8E 02 00 LDX #BUFFER |
0249 * |
0250 0480 B6 01 08 LDA TRACK |
0251 0483 F6 01 09 LDB SECTOR |
0252 0486 5C INCB |
0253 0487 B7 01 08 STA TRACK |
0254 048A F7 01 09 STB SECTOR |
0255 * |
0256 048D 17 00 8A LBSR XREAD |
0257 0490 10 25 00 80 LBCS UXERR |
0258 0494 17 01 27 LBSR XACK |
0259 0497 17 00 80 LBSR XREAD |
0260 049A 10 25 00 76 LBCS UXERR |
0261 * |
0262 049E 8E 02 00 LDX #BUFFER |
0263 04A1 A6 88 26 LDA 38,X |
0264 04A4 4C INCA |
0265 04A5 B7 01 12 STA MAXTRK |
0266 04A8 E6 88 27 LDB 39,X |
0267 04AB 5C INCB |
0268 04AC F7 01 13 STB MAXSEC |
0269 04AF B6 01 08 LDA TRACK |
0270 04B2 F6 01 09 LDB SECTOR |
0271 04B5 17 01 57 LBSR WRITSC |
0272 * |
0273 04B8 17 01 03 LBSR XACK |
0274 * |
0275 * Sector 4 to Last Track & Sector |
0276 * |
0277 * |
0278 04BB B6 01 08 LDA TRACK |
0279 04BE F6 01 09 LDB SECTOR |
0280 04C1 5C INCB |
0281 * |
0282 04C2 8E 02 00 UXLOOP LDX #BUFFER |
0283 04C5 B7 01 08 STA TRACK |
0284 04C8 F7 01 09 STB SECTOR |
0285 * |
0286 04CB 17 00 4C LBSR XREAD |
0287 04CE 10 25 00 42 LBCS UXERR |
0288 04D2 17 00 E9 LBSR XACK |
0289 04D5 17 00 42 LBSR XREAD |
0290 04D8 10 25 00 38 LBCS UXERR |
0291 * |
0292 04DC 8E 02 00 LDX #BUFFER |
0293 04DF B6 01 08 LDA TRACK |
0294 04E2 F6 01 09 LDB SECTOR |
0295 04E5 17 01 27 LBSR WRITSC |
0296 04E8 17 00 D3 LBSR XACK |
0297 * |
0298 04EB B6 01 08 LDA TRACK |
0299 04EE F6 01 09 LDB SECTOR |
0300 04F1 5C INCB |
0301 04F2 F1 01 13 CMPB MAXSEC |
0302 04F5 26 CB BNE UXLOOP |
0303 04F7 C6 01 LDB #1 |
0304 04F9 4C INCA |
0305 04FA B1 01 12 CMPA MAXTRK |
0306 04FD 26 C3 BNE UXLOOP |
0307 * |
0308 * |
0309 * Write Boot sector |
0310 * |
0311 04FF 8E C0 00 LDX #$C000 |
0312 0502 4F CLRA TRACK 0 |
0313 0503 C6 01 LDB #$01 SECTOR 1 |
0314 0505 B7 01 08 STA TRACK |
0315 0508 F7 01 09 STB SECTOR |
0316 050B 17 01 01 LBSR WRITSC |
0317 * |
0318 050E 8E 03 7D UXEXIT LDX #UXMES1 |
0319 0511 7E 03 5D JMP PDATA1 |
0320 * |
0321 0514 8E 03 8F UXERR LDX #UXMES2 |
0322 0517 16 FE 43 LBRA PDATA1 |
0323 * |
0324 * Get a Byte using XModem protocol |
0325 * Carry clear => no errors |
0326 * Carry set => errors |
0327 * |
0328 051A 34 40 XREAD PSHS U |
0329 051C FE 01 0D LDU XSTATE |
0330 * |
0331 051F 17 FD EF XBYTE0 LBSR INTER |
0332 0522 28 0A BVC XBYTE1 |
0333 0524 86 15 LDA #NAK |
0334 0526 17 FE 1B LBSR OUTTER |
0335 0529 CE 05 37 LDU #XSTST |
0336 052C 20 F1 BRA XBYTE0 |
0337 * |
0338 052E AD C4 XBYTE1 JSR ,U |
0339 0530 26 ED BNE XBYTE0 |
0340 0532 FF 01 0D STU XSTATE |
0341 0535 35 C0 PULS U,PC |
0342 * |
0343 * START - LOOK FOR SOH (START OF HEADER) = $01 |
0344 * |
0345 0537 81 01 XSTST CMPA #SOH |
0346 0539 26 06 BNE XSTST1 |
0347 053B CE 05 57 LDU #XSTBL |
0348 053E 1C FA ANDCC #$FF-CFLAG-ZFLAG No abort, no valid data (no exit) |
0349 0540 39 RTS |
0350 * |
0351 0541 81 04 XSTST1 CMPA #EOT |
0352 0543 26 08 BNE XSTST2 |
0353 0545 86 06 LDA #ACK |
0354 0547 17 FD FA LBSR OUTTER |
0355 054A 1A 05 ORCC #CFLAG+ZFLAG Set (c)=1 abort & exit |
0356 054C 39 RTS |
0357 * |
0358 054D 81 18 XSTST2 CMPA #CAN |
0359 054F 26 03 BNE XSTST3 |
0360 0551 1A 05 ORCC #CFLAG+ZFLAG Set (c)=1 abort & exit |
0361 0553 39 RTS |
0362 * |
0363 0554 1C FA XSTST3 ANDCC #$FF-CFLAG-ZFLAG |
0364 0556 39 RTS |
0365 * |
0366 * Got SOH |
0367 * Now get block number |
0368 * |
0369 0557 B1 01 0B XSTBL CMPA BLKNUM |
0370 055A 26 06 BNE XSTBLE |
0371 055C CE 05 6D LDU #XSTCOM |
0372 055F 1C FA ANDCC #$FF-CFLAG-ZFLAG No abort, No valid data (no exit) |
0373 0561 39 RTS |
0374 * |
0375 * Error in block number |
0376 * |
0377 0562 86 15 XSTBLE LDA #NAK |
0378 0564 17 FD DD LBSR OUTTER |
0379 0567 CE 05 37 LDU #XSTST |
0380 056A 1C FA ANDCC #$FF-CFLAG-ZFLAG No abort, No valid data (no exit) |
0381 056C 39 RTS |
0382 * |
0383 * Get complement of block number |
0384 * |
0385 056D 43 XSTCOM COMA |
0386 056E B1 01 0B CMPA BLKNUM |
0387 0571 26 EF BNE XSTBLE |
0388 0573 7F 01 0A CLR CHKSUM |
0389 0576 86 80 LDA #128 |
0390 0578 B7 01 0C STA BYTCNT |
0391 057B CE 05 81 LDU #XSTDA |
0392 057E 1C FA ANDCC #$FF-CFLAG-ZFLAG No abort, No valid data (no exit) |
0393 0580 39 RTS |
0394 * |
0395 * Get data bytes |
0396 * |
0397 0581 34 02 XSTDA PSHS A |
0398 0583 BB 01 0A ADDA CHKSUM |
0399 0586 B7 01 0A STA CHKSUM |
0400 0589 35 02 PULS A |
0401 058B 7A 01 0C DEC BYTCNT |
0402 058E 26 03 BNE XSTDA1 |
0403 0590 CE 05 98 LDU #XSTCK |
0404 0593 A7 80 XSTDA1 STA ,X+ |
0405 0595 1C FA ANDCC #$FF-CFLAG-ZFLAG No abort, no valid data (no exit) |
0406 0597 39 RTS |
0407 * |
0408 * Byte count reached zero |
0409 * Check checksum byte |
0410 * |
0411 0598 B1 01 0A XSTCK CMPA CHKSUM |
0412 059B 26 0B BNE XSTCK1 retry if wrong checksum |
0413 * |
0414 * Checksum OK ... |
0415 * increment block number |
0416 * Don't send ACK until data written to CF |
0417 * |
0418 059D 7C 01 0B INC BLKNUM |
0419 05A0 CE 05 37 LDU #XSTST |
0420 05A3 1C FE ANDCC #$FF-CFLAG No abort |
0421 05A5 1A 04 ORCC #ZFLAG Valid data (exit) |
0422 05A7 39 RTS |
0423 * |
0424 * Checksum Error detected ... |
0425 * Reset Sector counter in ACCB to last 128 byte boundary |
0426 * and send NAK |
0427 * |
0428 05A8 34 04 XSTCK1 PSHS B |
0429 05AA 1F 10 TFR X,D |
0430 05AC 5A DECB |
0431 05AD C4 80 ANDB #128 |
0432 05AF 1F 01 TFR D,X |
0433 05B1 35 04 PULS B |
0434 05B3 86 15 LDA #NAK |
0435 05B5 17 FD 8C XSTCK2 LBSR OUTTER |
0436 05B8 CE 05 37 LDU #XSTST |
0437 05BB 1C FA ANDCC #$FF-CFLAG-ZFLAG No abort, no valid data (no exit) |
0438 05BD 39 RTS |
0439 * |
0440 * Acknowledge Data Received |
0441 * |
0442 05BE 34 02 XACK PSHS A |
0443 05C0 86 06 LDA #ACK |
0444 05C2 17 FD 7F LBSR OUTTER |
0445 05C5 35 82 PULS A,PC |
0446 * |
0447 * |
0448 ** FLEX 9 COMPACT FLASH DISK DRIVERS |
0449 * |
0450 * FOR SYS09BUG 1.2 ON THE BURCHED B5-X300 |
0451 * WITH I/O MAPPED AT $XE000 |
0452 * AND ROM MAPPED AT $XF000 |
0453 * THE BURCHED B5-X300 HAS 256KBYTES OF SRAM |
0454 * THE FIRST 64K IS USED BY FLEX, |
0455 * THE SECOND 192K MAY BE USED AS A RAM DISK |
0456 * |
0457 * |
0458 0010 IMASK EQU $10 IRQ MASK CC |
0459 0040 FMASK EQU $40 FIRQ MASK CC |
0460 FFF0 DATREG EQU $FFF0 DAT REGISTERS |
0461 * |
0462 E040 CF_BASE EQU $E040 |
0463 E040 CF_DATA EQU CF_BASE+0 |
0464 E041 CF_ERROR EQU CF_BASE+1 ; read error |
0465 E041 CF_FEATURE EQU CF_BASE+1 ; write feature |
0466 E042 CF_SCNT EQU CF_BASE+2 |
0467 E043 CF_SNUM EQU CF_BASE+3 |
0468 E044 CF_CLO EQU CF_BASE+4 |
0469 E045 CF_CHI EQU CF_BASE+5 |
0470 E046 CF_HEAD EQU CF_BASE+6 |
0471 E047 CF_STATUS EQU CF_BASE+7 ; read status |
0472 E047 CF_COMAND EQU CF_BASE+7 ; write command |
0473 * |
0474 * Command Equates |
0475 * |
0476 0020 CMDREAD EQU $20 ; Read Single sector |
0477 0030 CMDWRITE EQU $30 ; Write Single sector |
0478 00EF CMDFEATURE EQU $EF |
0479 0001 FEAT8BIT EQU $01 ; enable 8 bit transfers |
0480 00E0 HEADLBA EQU $E0 |
0481 * |
0482 * Status bit equates |
0483 * |
0484 0080 BSY EQU $80 |
0485 0040 DRDY EQU $40 |
0486 0008 DRQ EQU $08 |
0487 0001 ERR EQU $01 |
0488 * |
0489 * |
0490 * INITIALIZE CF CARD FOR 8 BIT LBA MODE |
0491 * |
0492 05C7 8D 7A INITDR BSR WAITRDY |
0493 05C9 86 E0 LDA #HEADLBA |
0494 05CB B7 E0 46 STA CF_HEAD |
0495 05CE 86 01 LDA #FEAT8BIT |
0496 05D0 B7 E0 41 STA CF_FEATURE |
0497 05D3 86 EF LDA #CMDFEATURE |
0498 05D5 B7 E0 47 STA CF_COMAND |
0499 05D8 20 69 BRA WAITRDY |
0500 * |
0501 * Seek track and sector |
0502 * A holds track number (0 - ??) |
0503 * B holds sector number (1 - ??) |
0504 * Sector numbers starts from 1 |
0505 * subtract 1 to start from sector 0 on CF |
0506 * |
0507 05DA 5A SEEKTS DECB |
0508 05DB F7 E0 43 STB CF_SNUM |
0509 05DE B7 E0 44 STA CF_CLO |
0510 05E1 F6 01 07 LDB DRVNUM |
0511 05E4 F7 E0 45 STB CF_CHI |
0512 05E7 C6 01 LDB #$01 |
0513 05E9 F7 E0 42 STB CF_SCNT |
0514 05EC 5F CLRB |
0515 05ED 39 RTS |
0516 * |
0517 * READ SECTORS FROM CF |
0518 * |
0519 * |
0520 05EE 8D EA READSC BSR SEEKTS |
0521 05F0 86 20 LDA #CMDREAD ; IDE READ MULTIPLE |
0522 05F2 B7 E0 47 STA CF_COMAND |
0523 05F5 8D 4C BSR WAITRDY |
0524 * |
0525 * READ LOOP |
0526 * |
0527 05F7 5F CLRB |
0528 05F8 8D 58 RDLP1 BSR WAITDRQ |
0529 05FA B6 E0 40 LDA CF_DATA |
0530 05FD A7 80 STA ,X+ |
0531 05FF 5A DECB |
0532 0600 26 F6 BNE RDLP1 |
0533 * |
0534 0602 5F CLRB |
0535 0603 8D 4D RDLP2 BSR WAITDRQ |
0536 0605 B6 E0 40 LDA CF_DATA |
0537 0608 5A DECB |
0538 0609 26 F8 BNE RDLP2 |
0539 * |
0540 060B 8D 36 BSR WAITRDY |
0541 060D 5F CLRB |
0542 060E 39 RTS |
0543 * |
0544 * WRITE SECTOR TO CF |
0545 * |
0546 060F 8D C9 WRITSC BSR SEEKTS ; SEEK TRACK & SECTOR |
0547 0611 86 30 LDA #CMDWRITE ; IDE WRITE MULTIPLE |
0548 0613 B7 E0 47 STA CF_COMAND |
0549 0616 8D 2B BSR WAITRDY |
0550 * |
0551 * WRITE LOOP |
0552 * |
0553 0618 5F CLRB |
0554 0619 8D 37 WRTLP1 BSR WAITDRQ |
0555 061B A6 80 LDA ,X+ |
0556 061D B7 E0 40 STA CF_DATA |
0557 0620 5A DECB |
0558 0621 26 F6 BNE WRTLP1 |
0559 * |
0560 0623 5F CLRB |
0561 0624 8D 2C WRTLP2 BSR WAITDRQ |
0562 0626 4F CLRA |
0563 0627 B7 E0 40 STA CF_DATA |
0564 062A 5A DECB |
0565 062B 26 F7 BNE WRTLP2 |
0566 * |
0567 062D 8D 14 BSR WAITRDY |
0568 062F 5F CLRB |
0569 0630 39 RTS |
0570 * |
0571 * CHECK FOR BUSY |
0572 * Doubles as VERIFY |
0573 * |
0574 0631 5F BUSY CLRB Never busy |
0575 0632 39 RTS |
0576 * |
0577 * DRIVE SELECT DISK DRIVER |
0578 * |
0579 0633 A6 03 DRVSEL LDA 3,X GET DRIVE # FROM FCB |
0580 0635 81 03 CMPA #3 |
0581 0637 23 01 BLS DRVS2 IF > 3, SET IT TO 0 |
0582 0639 4F CLRA |
0583 063A B7 01 07 DRVS2 STA DRVNUM |
0584 063D 5F CLRB ; SET Z, CLEAR C |
0585 063E 39 RTS |
0586 * |
0587 * CHECK DRIVE READY DISK DRIVER |
0588 * |
0589 063F A6 03 CHKDRV LDA 3,X |
0590 0641 5F CLRB ; CLEAR C, SET Z |
0591 0642 39 RTS |
0592 * |
0593 * WAIT UNTIL READY |
0594 * |
0595 0643 B6 E0 47 WAITRDY LDA CF_STATUS |
0596 0646 85 80 BITA #BSY |
0597 0648 26 F9 BNE WAITRDY |
0598 064A B6 E0 47 LDA CF_STATUS |
0599 064D 85 40 BITA #DRDY |
0600 064F 27 F2 BEQ WAITRDY |
0601 0651 39 RTS |
0602 * |
0603 * WAIT FOR DATA REQUEST |
0604 * |
0605 0652 B6 E0 47 WAITDRQ LDA CF_STATUS |
0606 0655 85 08 BITA #DRQ |
0607 0657 27 F9 BEQ WAITDRQ |
0608 0659 39 RTS |
0609 * |
0610 ******************************************************* |
0611 * |
0612 * Bootstrap FLEX Loader |
0613 * |
0614 * SBUG1.8 loads the bootstap loader at $C000 |
0615 * however the Flex adaption manual has the |
0616 * bootstrap loader residing at $C100 |
0617 * |
0618 ****************************************************** |
0619 * |
0620 * Equates |
0621 * |
0622 C0FF STACK EQU $C0FF |
0623 C300 SCTBUF EQU $C300 |
0624 * |
0625 * Start of Utility |
0626 * |
0627 C000 ORG $C000 |
0628 C000 20 0B BOOT BRA LOAD0 |
0629 C002 00 00 00 FCB 0,0,0 |
0630 C005 00 TRK FCB 0 File start track |
0631 C006 00 SCT FCB 0 File start sector |
0632 C007 00 DNS FCB 0 Density Flag (not used) |
0633 C008 C0 00 TADR FDB $C000 Transfer address |
0634 C00A 00 00 LADR FDB 0 Load Address |
0635 C00C 00 DRNUM FCB 0 Drive number 0 |
0636 * |
0637 C00D 10 CE C0 FF LOAD0 LDS #STACK Set up stack |
0638 C011 FC C0 05 LDD TRK Set up start track and sector |
0639 C014 FD C3 00 STD SCTBUF |
0640 C017 10 8E C4 00 LDY #SCTBUF+256 |
0641 * |
0642 * Perform actual file load |
0643 * |
0644 C01B 8D 35 LOAD1 BSR GETCH Get acharcater |
0645 C01D 81 02 CMPA #$02 Data record hearder ? |
0646 C01F 27 10 BEQ LOAD2 Skip, is so |
0647 C021 81 16 CMPA #$16 Xfr address hearder ? |
0648 C023 26 F6 BNE LOAD1 Loop if neither |
0649 * |
0650 * Get transfer address |
0651 * |
0652 C025 8D 2B BSR GETCH |
0653 C027 B7 C0 08 STA TADR |
0654 C02A 8D 26 BSR GETCH |
0655 C02C B7 C0 09 STA TADR+1 |
0656 C02F 20 EA BRA LOAD1 |
0657 * |
0658 * Load data record |
0659 * |
0660 C031 8D 1F LOAD2 BSR GETCH Get load address |
0661 C033 B7 C0 0A STA LADR |
0662 C036 8D 1A BSR GETCH |
0663 C038 B7 C0 0B STA LADR+1 |
0664 C03B 8D 15 BSR GETCH Get Bytes count |
0665 C03D 1F 89 TFR A,B |
0666 C03F 5D TSTB |
0667 C040 27 D9 BEQ LOAD1 Loop if count = 0 |
0668 C042 BE C0 0A LDX LADR Get load address |
0669 C045 34 14 LOAD3 PSHS B,X |
0670 C047 8D 09 BSR GETCH Get data character |
0671 C049 35 14 PULS B,X |
0672 C04B A7 80 STA ,X+ Store at load address |
0673 C04D 5A DECB |
0674 C04E 26 F5 BNE LOAD3 Loop until count = 0 |
0675 C050 20 C9 BRA LOAD1 |
0676 * |
0677 * Get Character routine |
0678 * Reads a sector if needed |
0679 * |
0680 C052 10 8C C4 00 GETCH CMPY #SCTBUF+256 out of data ? |
0681 C056 26 0F BNE GETCH4 Go read Character if not |
0682 C058 8E C3 00 GETCH2 LDX #SCTBUF Point to buffer |
0683 C05B EC 84 LDD 0,X Get forward Link |
0684 C05D 27 0B BEQ GO if zero, file is loaded |
0685 C05F 8D 21 BSR READ Read next sector |
0686 C061 26 9D BNE BOOT start over if error |
0687 C063 10 8E C3 04 LDY #SCTBUF+4 Point past link |
0688 C067 A6 A0 GETCH4 LDA ,Y+ Else, get a character |
0689 C069 39 RTS |
0690 * |
0691 * File is loaded, Jump to it |
0692 * |
0693 C06A 6E 9F C0 08 GO JMP [TADR] Jump to transfer address |
0694 |
0695 * |
0696 ** FLEX 9 COMPACT FLASH DISK DRIVERS |
0697 * |
0698 * FOR SYS09BUG 1.2 ON THE BURCHED B5-X300 |
0699 * WITH I/O MAPPED AT $XE000 |
0700 * AND ROM MAPPED AT $XF000 |
0701 * THE BURCHED B5-X300 HAS 256KBYTES OF SRAM |
0702 * THE FIRST 64K IS USED BY FLEX, |
0703 * THE SECOND 192K MAY BE USED AS A RAM DISK |
0704 * |
0705 * |
0706 *IMASK EQU $10 IRQ MASK CC |
0707 *FMASK EQU $40 FIRQ MASK CC |
0708 *DATREG EQU $FFF0 DAT REGISTERS |
0709 * |
0710 *CF_BASE EQU $E040 |
0711 *CF_DATA EQU CF_BASE+0 |
0712 *CF_ERROR EQU CF_BASE+1 ; read error |
0713 *CF_FEATURE EQU CF_BASE+1 ; write feature |
0714 *CF_SCNT EQU CF_BASE+2 |
0715 *CF_SNUM EQU CF_BASE+3 |
0716 *CF_CLO EQU CF_BASE+4 |
0717 *CF_CHI EQU CF_BASE+5 |
0718 *CF_HEAD EQU CF_BASE+6 |
0719 *CF_STATUS EQU CF_BASE+7 ; read status |
0720 *CF_COMAND EQU CF_BASE+7 ; write command |
0721 * |
0722 * Command Equates |
0723 * |
0724 *CMDREAD EQU $20 ; Read Single sector |
0725 *CMDWRITE EQU $30 ; Write Single sector |
0726 *CMDFEATURE EQU $EF |
0727 *FEAT8BIT EQU $01 ; enable 8 bit transfers |
0728 *HEADLBA EQU $E0 |
0729 * |
0730 * Status bit equates |
0731 * |
0732 *BSY EQU $80 |
0733 *DRDY EQU $40 |
0734 *DRQ EQU $08 |
0735 *ERR EQU $01 |
0736 * |
0737 * Seek track and sector |
0738 * A holds track number (0 - ??) |
0739 * B holds sector number (1 - ??) |
0740 * Sector numbers starts from 1 |
0741 * subtract 1 to start from sector 0 on CF |
0742 * |
0743 C06E 5A SEEK DECB |
0744 C06F F7 E0 43 STB CF_SNUM |
0745 C072 B7 E0 44 STA CF_CLO |
0746 C075 F6 C0 0C LDB DRNUM |
0747 C078 F7 E0 45 STB CF_CHI |
0748 C07B C6 01 LDB #$01 |
0749 C07D F7 E0 42 STB CF_SCNT |
0750 C080 5F CLRB |
0751 C081 39 RTS |
0752 * |
0753 * READ SECTORS FROM CF |
0754 * |
0755 * |
0756 C082 8D EA READ BSR SEEK |
0757 C084 86 20 LDA #CMDREAD ; IDE READ MULTIPLE |
0758 C086 B7 E0 47 STA CF_COMAND |
0759 C089 8D 18 BSR WTRDY |
0760 * |
0761 * READ LOOP |
0762 * |
0763 C08B 5F CLRB |
0764 C08C 8D 24 READ1 BSR WTDRQ |
0765 C08E B6 E0 40 LDA CF_DATA |
0766 C091 A7 80 STA ,X+ |
0767 C093 5A DECB |
0768 C094 26 F6 BNE READ1 |
0769 * |
0770 C096 5F CLRB |
0771 C097 8D 19 READ2 BSR WTDRQ |
0772 C099 B6 E0 40 LDA CF_DATA |
0773 C09C 5A DECB |
0774 C09D 26 F8 BNE READ2 |
0775 * |
0776 C09F 8D 02 BSR WTRDY |
0777 C0A1 5F CLRB |
0778 C0A2 39 RTS |
0779 * |
0780 * WAIT UNTIL READY |
0781 * |
0782 C0A3 B6 E0 47 WTRDY LDA CF_STATUS |
0783 C0A6 85 80 BITA #BSY |
0784 C0A8 26 F9 BNE WTRDY |
0785 C0AA B6 E0 47 LDA CF_STATUS |
0786 C0AD 85 40 BITA #DRDY |
0787 C0AF 27 F2 BEQ WTRDY |
0788 C0B1 39 RTS |
0789 * |
0790 * WAIT FOR DATA REQUEST |
0791 * |
0792 C0B2 B6 E0 47 WTDRQ LDA CF_STATUS |
0793 C0B5 85 08 BITA #DRQ |
0794 C0B7 27 F9 BEQ WTDRQ |
0795 C0B9 39 RTS |
0796 * |
0797 END START |
Program + Init Data = 1064 bytes |
Error count = 0 |
/upld_ide.lst
0,0 → 1,880
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 03 30 START LBSR UXSUB |
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 * Read a byte from the serial port |
0119 * |
0120 0343 34 04 LRBYTE PSHS B |
0121 0345 8D 0E BSR LRHEX Get hex digit. |
0122 0347 48 ASLA |
0123 0348 48 ASLA Shift to msb. |
0124 0349 48 ASLA |
0125 034A 48 ASLA |
0126 034B 1F 89 TFR A,B Save in B. |
0127 034D 8D 06 BSR LRHEX Get next digit. |
0128 034F 34 04 PSHS B |
0129 0351 AB E0 ADDA 0,S+ Add together bytes. |
0130 0353 35 84 PULS B,PC |
0131 * |
0132 0355 BD 03 7E LRHEX JSR INTER |
0133 0358 29 FB BVS LRHEX |
0134 035A 80 30 SUBA #$30 Remove ascii bias. |
0135 035C 2B F7 BMI LRHEX |
0136 035E 81 09 CMPA #$09 Number? |
0137 0360 2F 0A BLE LRHEX1 Yes. |
0138 0362 81 11 CMPA #$11 Keep testing. |
0139 0364 2B EF BMI LRHEX |
0140 0366 81 16 CMPA #$16 |
0141 0368 2E EB BGT LRHEX |
0142 036A 80 07 SUBA #$07 |
0143 036C 39 LRHEX1 RTS |
0144 * |
0145 * ACIA INPUT TEST |
0146 * |
0147 036D B6 E0 00 INTEST LDA ACIAC1 |
0148 0370 85 01 BITA #$01 |
0149 0372 39 RTS |
0150 * |
0151 * RESET ACIA |
0152 * |
0153 0373 86 03 ACIRST LDA #$03 master reset |
0154 0375 B7 E0 00 STA ACIAC1 |
0155 0378 86 11 LDA #$11 |
0156 037A B7 E0 00 STA ACIAC1 |
0157 037D 39 RTS |
0158 * |
0159 * ACIA INPUT |
0160 * |
0161 037E 86 10 INTER LDA #16 |
0162 0380 B7 01 0F STA DELCNT+0 |
0163 0383 7F 01 10 CLR DELCNT+1 |
0164 0386 7F 01 11 CLR DELCNT+2 |
0165 0389 B6 E0 00 INTER0 LDA ACIAC1 |
0166 038C 85 01 BITA #$01 |
0167 038E 26 08 BNE INTER1 |
0168 0390 85 78 BITA #$78 |
0169 0392 27 0A BEQ INTER2 |
0170 0394 8D DD BSR ACIRST |
0171 0396 20 E6 BRA INTER |
0172 * |
0173 0398 B6 E0 01 INTER1 LDA ACIAD1 |
0174 039B 1C FD ANDCC #$FF-VFLAG |
0175 039D 39 RTS |
0176 * |
0177 039E 7A 01 11 INTER2 DEC DELCNT+2 |
0178 03A1 26 E6 BNE INTER0 |
0179 03A3 7A 01 10 DEC DELCNT+1 |
0180 03A6 26 E1 BNE INTER0 |
0181 03A8 7A 01 0F DEC DELCNT+0 |
0182 03AB 26 DC BNE INTER0 |
0183 03AD 4F CLRA |
0184 03AE 1A 02 ORCC #VFLAG |
0185 03B0 39 RTS |
0186 * |
0187 * ACIA OUTPUT |
0188 * |
0189 03B1 34 02 OUTTER PSHS A |
0190 * |
0191 03B3 B6 E0 00 OUTTE1 LDA ACIAC1 |
0192 03B6 85 02 BITA #$02 |
0193 03B8 26 08 BNE OUTTE2 |
0194 03BA 85 78 BITA #$78 |
0195 03BC 27 F5 BEQ OUTTE1 |
0196 03BE 8D B3 BSR ACIRST |
0197 03C0 20 F1 BRA OUTTE1 |
0198 * |
0199 03C2 35 02 OUTTE2 PULS A |
0200 03C4 B7 E0 01 STA ACIAD1 |
0201 03C7 39 RTS |
0202 * |
0203 * Print Data |
0204 * |
0205 03C8 8D E7 PDATA0 BSR OUTTER |
0206 03CA A6 80 PDATA1 LDA ,X+ |
0207 03CC 81 04 CMPA #$04 |
0208 03CE 26 F8 BNE PDATA0 |
0209 03D0 39 RTS |
0210 * |
0211 * |
0212 ** 'UX' Xmodem ROM Disk upload |
0213 * |
0214 03D1 0D 0A UXMES0 FCB $0D,$0A |
0215 03D3 58 6D 6F 64 65 6D FCC 'Xmodem ROM Disk Upload' |
20 52 4F 4D 20 44 |
69 73 6B 20 55 70 |
6C 6F 61 64 |
0216 03E9 04 FCB 4 |
0217 03EA 0D 0A UXMES1 FCB $0D,$0A |
0218 03EC 55 70 6C 6F 61 64 FCC 'Upload Complete' |
20 43 6F 6D 70 6C |
65 74 65 |
0219 03FB 04 FCB 4 |
0220 03FC 0D 0A UXMES2 FCB $0D,$0A |
0221 03FE 55 70 6C 6F 61 64 FCC 'Upload Error' |
20 45 72 72 6F 72 |
0222 040A 04 FCB 4 |
0223 040B 0D 0A UXMSG3 FCB $0D,$0A |
0224 040D 44 72 69 76 65 20 FCC 'Drive Number :' |
4E 75 6D 62 65 72 |
20 3A |
0225 041B 04 FCB 4 |
0226 041C 0D 0A UXMSG4 FCB $0D,$0A |
0227 041E 41 72 65 20 59 6F FCC 'Are You Sure ? (Y/N)' |
75 20 53 75 72 65 |
20 3F 20 28 59 2F |
4E 29 |
0228 0432 04 FCB 4 |
0229 * |
0230 * Print Banner |
0231 * |
0232 0433 8E 03 D1 UXSUB LDX #UXMES0 |
0233 0436 17 FF 91 LBSR PDATA1 |
0234 * |
0235 * Prompt for Disk drive number (0 to 3) |
0236 * |
0237 0439 8E 04 0B LDX #UXMSG3 |
0238 043C 17 FF 8B LBSR PDATA1 |
0239 043F 17 FF 3C UXSUB1 LBSR INTER |
0240 0442 29 FB BVS UXSUB1 |
0241 0444 17 FF 6A LBSR OUTTER |
0242 0447 81 30 CMPA #'0 |
0243 0449 10 25 01 2E LBLO UXEXIT |
0244 044D 81 33 CMPA #'3 |
0245 044F 10 22 01 28 LBHI UXEXIT |
0246 0453 80 30 SUBA #'0 |
0247 0455 B7 01 07 STA DRVNUM |
0248 * |
0249 * Report selected drive |
0250 * |
0251 0458 8E 04 0B LDX #UXMSG3 |
0252 045B 17 FF 6C LBSR PDATA1 |
0253 045E B6 01 07 LDA DRVNUM |
0254 0461 8B 30 ADDA #'0 |
0255 0463 17 FF 4B LBSR OUTTER |
0256 * |
0257 * Ask for confirmation (Y/N) |
0258 * |
0259 0466 8E 04 1C LDX #UXMSG4 |
0260 0469 17 FF 5E LBSR PDATA1 |
0261 046C 17 FF 0F UXSUB2 LBSR INTER |
0262 046F 29 FB BVS UXSUB2 |
0263 0471 17 FF 3D LBSR OUTTER |
0264 0474 84 5F ANDA #$5F |
0265 0476 81 4E CMPA #'N |
0266 0478 10 27 00 FF LBEQ UXEXIT |
0267 047C 81 59 CMPA #'Y |
0268 047E 26 B3 BNE UXSUB |
0269 * |
0270 * We have confirmation ... now load the disk image |
0271 * |
0272 0480 17 01 B1 LBSR INITDR |
0273 0483 CE 05 A4 LDU #XSTST |
0274 0486 FF 01 0D STU XSTATE |
0275 0489 86 01 LDA #1 |
0276 048B B7 01 0B STA BLKNUM |
0277 * |
0278 * Sector1 |
0279 * |
0280 048E 8E 02 00 LDX #BUFFER |
0281 * |
0282 0491 4F CLRA TRACK 0 |
0283 0492 C6 01 LDB #$01 SECTOR 1 |
0284 0494 B7 01 08 STA TRACK |
0285 0497 F7 01 09 STB SECTOR |
0286 * |
0287 049A 17 00 EA LBSR XREAD |
0288 049D 10 25 00 E0 LBCS UXERR |
0289 04A1 17 01 87 LBSR XACK |
0290 04A4 17 00 E0 LBSR XREAD |
0291 04A7 10 25 00 D6 LBCS UXERR |
0292 * |
0293 04AB 8E 02 00 LDX #BUFFER |
0294 04AE B6 01 08 LDA TRACK |
0295 04B1 F6 01 09 LDB SECTOR |
0296 04B4 17 01 D1 LBSR WRITSC |
0297 04B7 17 01 71 LBSR XACK |
0298 * |
0299 * Sector 2 |
0300 * |
0301 04BA 8E 02 00 LDX #BUFFER |
0302 * |
0303 04BD B6 01 08 LDA TRACK |
0304 04C0 F6 01 09 LDB SECTOR |
0305 04C3 5C INCB |
0306 04C4 B7 01 08 STA TRACK |
0307 04C7 F7 01 09 STB SECTOR |
0308 * |
0309 04CA 17 00 BA LBSR XREAD |
0310 04CD 10 25 00 B0 LBCS UXERR |
0311 04D1 17 01 57 LBSR XACK |
0312 04D4 17 00 B0 LBSR XREAD |
0313 04D7 10 25 00 A6 LBCS UXERR |
0314 * |
0315 04DB 8E 02 00 LDX #BUFFER |
0316 04DE B6 01 08 LDA TRACK |
0317 04E1 F6 01 09 LDB SECTOR |
0318 04E4 17 01 A1 LBSR WRITSC |
0319 * |
0320 04E7 17 01 41 LBSR XACK |
0321 * |
0322 * Sector 3 - SIR |
0323 * |
0324 04EA 8E 02 00 LDX #BUFFER |
0325 * |
0326 04ED B6 01 08 LDA TRACK |
0327 04F0 F6 01 09 LDB SECTOR |
0328 04F3 5C INCB |
0329 04F4 B7 01 08 STA TRACK |
0330 04F7 F7 01 09 STB SECTOR |
0331 * |
0332 04FA 17 00 8A LBSR XREAD |
0333 04FD 10 25 00 80 LBCS UXERR |
0334 0501 17 01 27 LBSR XACK |
0335 0504 17 00 80 LBSR XREAD |
0336 0507 10 25 00 76 LBCS UXERR |
0337 * |
0338 050B 8E 02 00 LDX #BUFFER |
0339 050E A6 88 26 LDA 38,X |
0340 0511 4C INCA |
0341 0512 B7 01 12 STA MAXTRK |
0342 0515 E6 88 27 LDB 39,X |
0343 0518 5C INCB |
0344 0519 F7 01 13 STB MAXSEC |
0345 051C B6 01 08 LDA TRACK |
0346 051F F6 01 09 LDB SECTOR |
0347 0522 17 01 63 LBSR WRITSC |
0348 * |
0349 0525 17 01 03 LBSR XACK |
0350 * |
0351 * Sector 4 to Last Track & Sector |
0352 * |
0353 * |
0354 0528 B6 01 08 LDA TRACK |
0355 052B F6 01 09 LDB SECTOR |
0356 052E 5C INCB |
0357 * |
0358 052F 8E 02 00 UXLOOP LDX #BUFFER |
0359 0532 B7 01 08 STA TRACK |
0360 0535 F7 01 09 STB SECTOR |
0361 * |
0362 0538 17 00 4C LBSR XREAD |
0363 053B 10 25 00 42 LBCS UXERR |
0364 053F 17 00 E9 LBSR XACK |
0365 0542 17 00 42 LBSR XREAD |
0366 0545 10 25 00 38 LBCS UXERR |
0367 * |
0368 0549 8E 02 00 LDX #BUFFER |
0369 054C B6 01 08 LDA TRACK |
0370 054F F6 01 09 LDB SECTOR |
0371 0552 17 01 33 LBSR WRITSC |
0372 0555 17 00 D3 LBSR XACK |
0373 * |
0374 0558 B6 01 08 LDA TRACK |
0375 055B F6 01 09 LDB SECTOR |
0376 055E 5C INCB |
0377 055F F1 01 13 CMPB MAXSEC |
0378 0562 26 CB BNE UXLOOP |
0379 0564 C6 01 LDB #1 |
0380 0566 4C INCA |
0381 0567 B1 01 12 CMPA MAXTRK |
0382 056A 26 C3 BNE UXLOOP |
0383 * |
0384 * |
0385 * Write Boot sector |
0386 * |
0387 056C 8E C0 00 LDX #$C000 |
0388 056F 4F CLRA TRACK 0 |
0389 0570 C6 01 LDB #$01 SECTOR 1 |
0390 0572 B7 01 08 STA TRACK |
0391 0575 F7 01 09 STB SECTOR |
0392 0578 17 01 0D LBSR WRITSC |
0393 * |
0394 057B 8E 03 EA UXEXIT LDX #UXMES1 |
0395 057E 7E 03 CA JMP PDATA1 |
0396 * |
0397 0581 8E 03 FC UXERR LDX #UXMES2 |
0398 0584 16 FE 43 LBRA PDATA1 |
0399 * |
0400 * Get a Byte using XModem protocol |
0401 * Carry clear => no errors |
0402 * Carry set => errors |
0403 * |
0404 0587 34 40 XREAD PSHS U |
0405 0589 FE 01 0D LDU XSTATE |
0406 * |
0407 058C 17 FD EF XBYTE0 LBSR INTER |
0408 058F 28 0A BVC XBYTE1 |
0409 0591 86 15 LDA #NAK |
0410 0593 17 FE 1B LBSR OUTTER |
0411 0596 CE 05 A4 LDU #XSTST |
0412 0599 20 F1 BRA XBYTE0 |
0413 * |
0414 059B AD C4 XBYTE1 JSR ,U |
0415 059D 26 ED BNE XBYTE0 |
0416 059F FF 01 0D STU XSTATE |
0417 05A2 35 C0 PULS U,PC |
0418 * |
0419 * START - LOOK FOR SOH (START OF HEADER) = $01 |
0420 * |
0421 05A4 81 01 XSTST CMPA #SOH |
0422 05A6 26 06 BNE XSTST1 |
0423 05A8 CE 05 C4 LDU #XSTBL |
0424 05AB 1C FA ANDCC #$FF-CFLAG-ZFLAG No abort, no valid data (no exit) |
0425 05AD 39 RTS |
0426 * |
0427 05AE 81 04 XSTST1 CMPA #EOT |
0428 05B0 26 08 BNE XSTST2 |
0429 05B2 86 06 LDA #ACK |
0430 05B4 17 FD FA LBSR OUTTER |
0431 05B7 1A 05 ORCC #CFLAG+ZFLAG Set (c)=1 abort & exit |
0432 05B9 39 RTS |
0433 * |
0434 05BA 81 18 XSTST2 CMPA #CAN |
0435 05BC 26 03 BNE XSTST3 |
0436 05BE 1A 05 ORCC #CFLAG+ZFLAG Set (c)=1 abort & exit |
0437 05C0 39 RTS |
0438 * |
0439 05C1 1C FA XSTST3 ANDCC #$FF-CFLAG-ZFLAG |
0440 05C3 39 RTS |
0441 * |
0442 * Got SOH |
0443 * Now get block number |
0444 * |
0445 05C4 B1 01 0B XSTBL CMPA BLKNUM |
0446 05C7 26 06 BNE XSTBLE |
0447 05C9 CE 05 DA LDU #XSTCOM |
0448 05CC 1C FA ANDCC #$FF-CFLAG-ZFLAG No abort, No valid data (no exit) |
0449 05CE 39 RTS |
0450 * |
0451 * Error in block number |
0452 * |
0453 05CF 86 15 XSTBLE LDA #NAK |
0454 05D1 17 FD DD LBSR OUTTER |
0455 05D4 CE 05 A4 LDU #XSTST |
0456 05D7 1C FA ANDCC #$FF-CFLAG-ZFLAG No abort, No valid data (no exit) |
0457 05D9 39 RTS |
0458 * |
0459 * Get complement of block number |
0460 * |
0461 05DA 43 XSTCOM COMA |
0462 05DB B1 01 0B CMPA BLKNUM |
0463 05DE 26 EF BNE XSTBLE |
0464 05E0 7F 01 0A CLR CHKSUM |
0465 05E3 86 80 LDA #128 |
0466 05E5 B7 01 0C STA BYTCNT |
0467 05E8 CE 05 EE LDU #XSTDA |
0468 05EB 1C FA ANDCC #$FF-CFLAG-ZFLAG No abort, No valid data (no exit) |
0469 05ED 39 RTS |
0470 * |
0471 * Get data bytes |
0472 * |
0473 05EE 34 02 XSTDA PSHS A |
0474 05F0 BB 01 0A ADDA CHKSUM |
0475 05F3 B7 01 0A STA CHKSUM |
0476 05F6 35 02 PULS A |
0477 05F8 7A 01 0C DEC BYTCNT |
0478 05FB 26 03 BNE XSTDA1 |
0479 05FD CE 06 05 LDU #XSTCK |
0480 0600 A7 80 XSTDA1 STA ,X+ |
0481 0602 1C FA ANDCC #$FF-CFLAG-ZFLAG No abort, no valid data (no exit) |
0482 0604 39 RTS |
0483 * |
0484 * Byte count reached zero |
0485 * Check checksum byte |
0486 * |
0487 0605 B1 01 0A XSTCK CMPA CHKSUM |
0488 0608 26 0B BNE XSTCK1 retry if wrong checksum |
0489 * |
0490 * Checksum OK ... |
0491 * increment block number |
0492 * Don't send ACK until data written to CF |
0493 * |
0494 060A 7C 01 0B INC BLKNUM |
0495 060D CE 05 A4 LDU #XSTST |
0496 0610 1C FE ANDCC #$FF-CFLAG No abort |
0497 0612 1A 04 ORCC #ZFLAG Valid data (exit) |
0498 0614 39 RTS |
0499 * |
0500 * Checksum Error detected ... |
0501 * Reset Sector counter in ACCB to last 128 byte boundary |
0502 * and send NAK |
0503 * |
0504 0615 34 04 XSTCK1 PSHS B |
0505 0617 1F 10 TFR X,D |
0506 0619 5A DECB |
0507 061A C4 80 ANDB #128 |
0508 061C 1F 01 TFR D,X |
0509 061E 35 04 PULS B |
0510 0620 86 15 LDA #NAK |
0511 0622 17 FD 8C XSTCK2 LBSR OUTTER |
0512 0625 CE 05 A4 LDU #XSTST |
0513 0628 1C FA ANDCC #$FF-CFLAG-ZFLAG No abort, no valid data (no exit) |
0514 062A 39 RTS |
0515 * |
0516 * Acknowledge Data Received |
0517 * |
0518 062B 34 02 XACK PSHS A |
0519 062D 86 06 LDA #ACK |
0520 062F 17 FD 7F LBSR OUTTER |
0521 0632 35 82 PULS A,PC |
0522 * |
0523 * |
0524 ** FLEX 9 IDE DISK DRIVERS |
0525 * |
0526 * FOR SYS09BUG 1.2 ON THE XSA-3S1000 |
0527 * WITH I/O MAPPED AT $XE000 |
0528 * AND ROM MAPPED AT $XF000 |
0529 * |
0530 * |
0531 0010 IMASK EQU $10 IRQ MASK CC |
0532 0040 FMASK EQU $40 FIRQ MASK CC |
0533 * |
0534 E100 CF_BASE EQU $E100 |
0535 E100 CF_DATA EQU CF_BASE+0 |
0536 E102 CF_ERROR EQU CF_BASE+2 ; read error |
0537 E102 CF_FEATURE EQU CF_BASE+2 ; write feature |
0538 E104 CF_SCNT EQU CF_BASE+4 |
0539 E106 CF_SNUM EQU CF_BASE+6 |
0540 E108 CF_CLO EQU CF_BASE+8 |
0541 E10A CF_CHI EQU CF_BASE+10 |
0542 E10C CF_HEAD EQU CF_BASE+12 |
0543 E10E CF_STATUS EQU CF_BASE+14 ; read status |
0544 E10E CF_COMAND EQU CF_BASE+14 ; write command |
0545 E11E CF_AUX EQU CF_BASE+30 |
0546 * |
0547 * Command Equates |
0548 * |
0549 0020 CMDREAD EQU $20 ; Read Single sector |
0550 0030 CMDWRITE EQU $30 ; Write Single sector |
0551 0006 AUXRESET EQU $06 |
0552 0002 AUXRSTREL EQU $02 |
0553 00E0 HEADLBA EQU $E0 |
0554 * |
0555 * Status bit equates |
0556 * |
0557 0080 BSY EQU $80 |
0558 0040 DRDY EQU $40 |
0559 0008 DRQ EQU $08 |
0560 0001 ERR EQU $01 |
0561 * |
0562 * |
0563 * INITIALIZE CF CARD FOR 8 BIT LBA MODE |
0564 * |
0565 0634 CC 00 06 INITDR LDD #AUXRESET |
0566 0637 FD E1 1E STD CF_AUX |
0567 063A CC 00 02 LDD #AUXRSTREL |
0568 063D FD E1 1E STD CF_AUX |
0569 0640 CC 00 E0 LDD #HEADLBA |
0570 0643 FD E1 0C STD CF_HEAD |
0571 0646 20 74 BRA WAITRDY |
0572 * |
0573 * RESTORE DISK DRIVER (SEEK TRACK 00) |
0574 * |
0575 0648 8D 62 RESTR1 BSR DRVSEL |
0576 064A 4F CLRA ; Track 0 |
0577 064B C6 01 LDB #$01 ; Sector 1 |
0578 * |
0579 * Seek track and sector |
0580 * A holds track number (0 - ??) |
0581 * B holds sector number (1 - ??) |
0582 * Sector numbers starts from 1 |
0583 * subtract 1 to start from sector 0 on CF |
0584 * |
0585 064D 34 02 SEEKTS PSHS A |
0586 064F 4F CLRA |
0587 0650 5A DECB |
0588 0651 FD E1 06 STD CF_SNUM |
0589 0654 E6 E4 LDB ,S |
0590 0656 FD E1 08 STD CF_CLO |
0591 0659 F6 01 07 LDB DRVNUM |
0592 065C FD E1 0A STD CF_CHI |
0593 065F C6 01 LDB #$01 |
0594 0661 FD E1 04 STD CF_SCNT |
0595 0664 5F CLRB |
0596 0665 35 82 PULS A,PC |
0597 * |
0598 * READ SECTORS FROM CF |
0599 * |
0600 * |
0601 0667 8D E4 READSC BSR SEEKTS |
0602 0669 CC 00 20 LDD #CMDREAD ; IDE READ MULTIPLE |
0603 066C FD E1 0E STD CF_COMAND |
0604 066F 8D 4B BSR WAITRDY |
0605 * |
0606 * READ LOOP |
0607 * |
0608 0671 34 20 PSHS Y |
0609 0673 10 8E 01 00 LDY #256 |
0610 0677 8D 52 RDLP1 BSR WAITDRQ |
0611 0679 FC E1 00 LDD CF_DATA |
0612 067C E7 80 STB ,X+ |
0613 067E 31 3F LEAY -1,Y |
0614 0680 26 F5 BNE RDLP1 |
0615 0682 35 20 PULS Y |
0616 * |
0617 0684 8D 36 BSR WAITRDY |
0618 0686 5F CLRB |
0619 0687 39 RTS |
0620 * |
0621 * WRITE SECTOR TO CF |
0622 * |
0623 0688 8D C3 WRITSC BSR SEEKTS ; SEEK TRACK & SECTOR |
0624 068A CC 00 30 LDD #CMDWRITE ; IDE WRITE MULTIPLE |
0625 068D FD E1 0E STD CF_COMAND |
0626 0690 8D 2A BSR WAITRDY |
0627 * |
0628 * WRITE LOOP |
0629 * |
0630 0692 34 20 PSHS Y |
0631 0694 10 8E 01 00 LDY #256 |
0632 0698 4F CLRA |
0633 0699 8D 30 WRTLP1 BSR WAITDRQ |
0634 069B E6 80 LDB ,X+ |
0635 069D FD E1 00 STD CF_DATA |
0636 06A0 31 3F LEAY -1,Y |
0637 06A2 26 F5 BNE WRTLP1 |
0638 06A4 35 20 PULS Y |
0639 * |
0640 06A6 8D 14 BSR WAITRDY |
0641 06A8 5F CLRB |
0642 06A9 39 RTS |
0643 * |
0644 * CHECK FOR BUSY |
0645 * Doubles as VERIFY |
0646 * |
0647 06AA 5F BUSY CLRB Never busy |
0648 06AB 39 RTS |
0649 * |
0650 * DRIVE SELECT DISK DRIVER |
0651 * |
0652 06AC A6 03 DRVSEL LDA 3,X GET DRIVE # FROM FCB |
0653 06AE 81 03 CMPA #3 |
0654 06B0 23 01 BLS DRVS2 IF > 3, SET IT TO 0 |
0655 06B2 4F CLRA |
0656 06B3 B7 01 07 DRVS2 STA DRVNUM |
0657 06B6 5F CLRB ; SET Z, CLEAR C |
0658 06B7 39 RTS |
0659 * |
0660 * CHECK DRIVE READY DISK DRIVER |
0661 * |
0662 06B8 A6 03 CHKDRV LDA 3,X |
0663 06BA 5F CLRB ; CLEAR C, SET Z |
0664 06BB 39 RTS |
0665 * |
0666 * WAIT UNTIL READY |
0667 * |
0668 06BC FC E1 0E WAITRDY LDD CF_STATUS |
0669 06BF C5 80 BITB #BSY |
0670 06C1 26 F9 BNE WAITRDY |
0671 06C3 FC E1 0E LDD CF_STATUS |
0672 06C6 C5 40 BITB #DRDY |
0673 06C8 27 F2 BEQ WAITRDY |
0674 06CA 39 RTS |
0675 * |
0676 * WAIT FOR DATA REQUEST |
0677 * |
0678 06CB FC E1 0E WAITDRQ LDD CF_STATUS |
0679 06CE C5 08 BITB #DRQ |
0680 06D0 27 F9 BEQ WAITDRQ |
0681 06D2 39 RTS |
0682 * |
0683 ******************************************************* |
0684 * |
0685 * Bootstrap FLEX Loader |
0686 * |
0687 * SBUG1.8 loads the bootstap loader at $C000 |
0688 * however the Flex adaption manual has the |
0689 * bootstrap loader residing at $C100 |
0690 * |
0691 ****************************************************** |
0692 * |
0693 * Equates |
0694 * |
0695 C0FF STACK EQU $C0FF |
0696 C300 SCTBUF EQU $C300 |
0697 * |
0698 * Start of Utility |
0699 * |
0700 C000 ORG $C000 |
0701 C000 20 0B BOOT BRA LOAD0 |
0702 C002 00 00 00 FCB 0,0,0 |
0703 C005 00 TRK FCB 0 File start track |
0704 C006 00 SCT FCB 0 File start sector |
0705 C007 00 DNS FCB 0 Density Flag (not used) |
0706 C008 C0 00 TADR FDB $C000 Transfer address |
0707 C00A 00 00 LADR FDB 0 Load Address |
0708 C00C 00 DRNUM FCB 0 Drive number 0 |
0709 * |
0710 C00D 10 CE C0 FF LOAD0 LDS #STACK Set up stack |
0711 C011 FC C0 05 LDD TRK Set up start track and sector |
0712 C014 FD C3 00 STD SCTBUF |
0713 C017 10 8E C4 00 LDY #SCTBUF+256 |
0714 * |
0715 * Perform actual file load |
0716 * |
0717 C01B 8D 35 LOAD1 BSR GETCH Get acharcater |
0718 C01D 81 02 CMPA #$02 Data record hearder ? |
0719 C01F 27 10 BEQ LOAD2 Skip, is so |
0720 C021 81 16 CMPA #$16 Xfr address hearder ? |
0721 C023 26 F6 BNE LOAD1 Loop if neither |
0722 * |
0723 * Get transfer address |
0724 * |
0725 C025 8D 2B BSR GETCH |
0726 C027 B7 C0 08 STA TADR |
0727 C02A 8D 26 BSR GETCH |
0728 C02C B7 C0 09 STA TADR+1 |
0729 C02F 20 EA BRA LOAD1 |
0730 * |
0731 * Load data record |
0732 * |
0733 C031 8D 1F LOAD2 BSR GETCH Get load address |
0734 C033 B7 C0 0A STA LADR |
0735 C036 8D 1A BSR GETCH |
0736 C038 B7 C0 0B STA LADR+1 |
0737 C03B 8D 15 BSR GETCH Get Bytes count |
0738 C03D 1F 89 TFR A,B |
0739 C03F 5D TSTB |
0740 C040 27 D9 BEQ LOAD1 Loop if count = 0 |
0741 C042 BE C0 0A LDX LADR Get load address |
0742 C045 34 14 LOAD3 PSHS B,X |
0743 C047 8D 09 BSR GETCH Get data character |
0744 C049 35 14 PULS B,X |
0745 C04B A7 80 STA ,X+ Store at load address |
0746 C04D 5A DECB |
0747 C04E 26 F5 BNE LOAD3 Loop until count = 0 |
0748 C050 20 C9 BRA LOAD1 |
0749 * |
0750 * Get Character routine |
0751 * Reads a sector if needed |
0752 * |
0753 C052 10 8C C4 00 GETCH CMPY #SCTBUF+256 out of data ? |
0754 C056 26 0F BNE GETCH4 Go read Character if not |
0755 C058 8E C3 00 GETCH2 LDX #SCTBUF Point to buffer |
0756 C05B EC 84 LDD 0,X Get forward Link |
0757 C05D 27 0B BEQ GO if zero, file is loaded |
0758 C05F 8D 27 BSR READ Read next sector |
0759 C061 26 9D BNE BOOT start over if error |
0760 C063 10 8E C3 04 LDY #SCTBUF+4 Point past link |
0761 C067 A6 A0 GETCH4 LDA ,Y+ Else, get a character |
0762 C069 39 RTS |
0763 * |
0764 * File is loaded, Jump to it |
0765 * |
0766 C06A 6E 9F C0 08 GO JMP [TADR] Jump to transfer address |
0767 |
0768 * |
0769 ** FLEX 9 IDE DISK DRIVERS |
0770 * |
0771 * FOR SYS09BUG 1.2 ON THE XSA-3S1000 |
0772 * WITH I/O MAPPED AT $XE000 |
0773 * AND ROM MAPPED AT $XF000 |
0774 * |
0775 *IMASK EQU $10 IRQ MASK CC |
0776 *FMASK EQU $40 FIRQ MASK CC |
0777 * |
0778 *CF_BASE EQU $E100 |
0779 *CF_DATA EQU CF_BASE+0 |
0780 *CF_ERROR EQU CF_BASE+2 ; read error |
0781 *CF_FEATURE EQU CF_BASE+2 ; write feature |
0782 *CF_SCNT EQU CF_BASE+4 |
0783 *CF_SNUM EQU CF_BASE+6 |
0784 *CF_CLO EQU CF_BASE+8 |
0785 *CF_CHI EQU CF_BASE+10 |
0786 *CF_HEAD EQU CF_BASE+12 |
0787 *CF_STATUS EQU CF_BASE+14 ; read status |
0788 *CF_COMAND EQU CF_BASE+14 ; write command |
0789 *CF_AUX EQU CF_BASE+30 |
0790 * |
0791 * Command Equates |
0792 * |
0793 *CMDREAD EQU $20 ; Read Single sector |
0794 *CMDWRITE EQU $30 ; Write Single sector |
0795 *HEADLBA EQU $E0 |
0796 *AUXRESET EQU $06 |
0797 *AUXRSTREL EQU $02 |
0798 * |
0799 * Status bit equates |
0800 * |
0801 *BSY EQU $80 |
0802 *DRDY EQU $40 |
0803 *DRQ EQU $08 |
0804 *ERR EQU $01 |
0805 * |
0806 * Seek track and sector |
0807 * A holds track number (0 - ??) |
0808 * B holds sector number (1 - ??) |
0809 * Sector numbers starts from 1 |
0810 * subtract 1 to start from sector 0 on CF |
0811 * |
0812 C06E 34 02 SEEK PSHS A |
0813 C070 4F CLRA |
0814 C071 5A DECB |
0815 C072 FD E1 06 STD CF_SNUM |
0816 C075 E6 E4 LDB ,S |
0817 C077 FD E1 08 STD CF_CLO |
0818 C07A F6 C0 0C LDB DRNUM |
0819 C07D FD E1 0A STD CF_CHI |
0820 C080 C6 01 LDB #$01 |
0821 C082 FD E1 04 STD CF_SCNT |
0822 C085 5F CLRB |
0823 C086 35 82 PULS A,PC |
0824 * |
0825 * READ SECTORS FROM CF |
0826 * |
0827 * |
0828 C088 8D E4 READ BSR SEEK |
0829 C08A CC 00 20 LDD #CMDREAD ; IDE READ MULTIPLE |
0830 C08D FD E1 0E STD CF_COMAND |
0831 C090 8D 17 BSR WTRDY |
0832 * |
0833 * READ LOOP |
0834 * |
0835 C092 34 20 PSHS Y |
0836 C094 10 8E 01 00 LDY #256 |
0837 C098 8D 1E READ1 BSR WTDRQ |
0838 C09A FC E1 00 LDD CF_DATA |
0839 C09D E7 80 STB ,X+ |
0840 C09F 31 3F LEAY -1,Y |
0841 C0A1 26 F5 BNE READ1 |
0842 C0A3 35 20 PULS Y |
0843 * |
0844 C0A5 8D 02 BSR WTRDY |
0845 C0A7 5F CLRB |
0846 C0A8 39 RTS |
0847 * |
0848 * WAIT UNTIL READY |
0849 * |
0850 C0A9 FC E1 0E WTRDY LDD CF_STATUS |
0851 C0AC C5 80 BITB #BSY |
0852 C0AE 26 F9 BNE WTRDY |
0853 C0B0 FC E1 0E LDD CF_STATUS |
0854 C0B3 C5 40 BITB #DRDY |
0855 C0B5 27 F2 BEQ WTRDY |
0856 C0B7 39 RTS |
0857 * |
0858 * WAIT FOR DATA REQUEST |
0859 * |
0860 C0B8 FC E1 0E WTDRQ LDD CF_STATUS |
0861 C0BB C5 08 BITB #DRQ |
0862 C0BD 27 F9 BEQ WTDRQ |
0863 C0BF 39 RTS |
0864 * |
0865 END START |
Program + Init Data = 1191 bytes |
Error count = 0 |
/upld_cf8.sh
0,0 → 1,880
../../Tools/as09/as09.exe cf8load.txt -l > cf8load.lst |