URL
https://opencores.org/ocsvn/System09/System09/trunk
Subversion Repositories System09
Compare Revisions
- This comparison shows the changes necessary to convert path
/
- from Rev 47 to Rev 46
- ↔ Reverse comparison
Rev 47 → Rev 46
/branches/mkfiles_rev1/src/upld/upld_ide.asm
File deleted
/branches/mkfiles_rev1/src/upld/upld_cf8.asm
File deleted
/branches/mkfiles_rev1/src/upld/upld_ide.sh
File deleted
/branches/mkfiles_rev1/src/upld/Makefile
File deleted
/branches/mkfiles_rev1/src/upld/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 |
/branches/mkfiles_rev1/src/upld/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 |
/branches/mkfiles_rev1/src/upld/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 |
/branches/mkfiles_rev1/src/upld/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 |
/branches/mkfiles_rev1/src/upld/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 |
/branches/mkfiles_rev1/src/upld/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 |
/branches/mkfiles_rev1/src/upld/upld_cf8.sh
1,0 → 1,880
../../Tools/as09/as09.exe upld_cf8.asm -l > upld_cf8.lst |
../../Tools/as09/as09.exe cf8load.txt -l > cf8load.lst |
/branches/mkfiles_rev1/src/dump/dump_ide.asm
File deleted
/branches/mkfiles_rev1/src/dump/dump_cf8.asm
File deleted
/branches/mkfiles_rev1/src/dump/Makefile
File deleted
/branches/mkfiles_rev1/src/dump/dump_ide.sh
1,2 → 1,2
../../Tools/as09/as09.exe dump_ide.asm -l > dump_ide.lst |
../../Tools/as09/as09.exe dump_ide.txt -l > dump_ide.lst |
|
/branches/mkfiles_rev1/src/dump/dump_cf8.s19
0,0 → 1,34
S10C0100160246000000E000FFB5 |
S123034910CE03498E0109108E02006F80313F26FABD046486E0B7E046BD04648601B7E004 |
S12303694186EFB7E047BD04648E064EBD05FB8E0678BD05FBBD06028152274A814E27232D |
S12303898150272E815710270088814D2710815127088E0731BD05EC20D56E9FF800BD045E |
S12303A9F320CCBE01043001BF0104262A7C01032025BE010426087D0103271B7A01033022 |
S12303C91FBF010420118E06DFBD05ECBD0559293EF70103BF01048601B7E042B60105B7C7 |
S12303E9E043B60104B7E044B60103B7E0458620B7E047BD04648E0109108E0200BD04738C |
S1230409B6E040A780313F26F4BD0464BD047B7E03788E06DFBD05ECBD0559293BF7010353 |
S1230429BF01048601B7E042B60105B7E043B60104B7E044B60103B7E0458630B7E047BD78 |
S123044904648E0109108E0200BD0473A680B7E040313F26F4BD04647E0378B6E047858034 |
S123046926F9B6E047854027F239B6E047850827F9398E06F8BD05ECB60103BD05C1BE0163 |
S123048904BD05B9BD05F0108E000030A901FF1F10C30010C4F034061F20C4F01F01ACE414 |
S12304A9270517016E270332623934108E0725170131AEE41700F9170163C610A689010913 |
S12304C930011700F31701575A26F117014FAEE1C610A6890109300181202504817E2302D0 |
S12304E9862E17013C5A26EA20B48E070ABD05EC17007429348C0200242F1F128E07251791 |
S123050900E11F211700A9170115A6A901091700A717010B1700602811810827DF81182787 |
S1230529DB815E2721810D261339A7A90109A1A9010927081700E8863F1700E5108C01FF73 |
S123054927BA312120B6108C000027B0313F20AC327D8D232957A7E48D1D2951A7618D179C |
S1230569294BA7624F35948D2129421F018D08293C3410A76135908D112932484848481F5D |
S1230589898D0729283404ABE0398D6D8130251D81392203803039814125128146220380CA |
S12305A9373981612507816622038057391A0239341035028D0235023402444444448D0427 |
S12305C93502840F8B3081392F028B0720533402C608A68068E42502862D8D458D415A2629 |
S12305E9F135828D02200B34108E072A8D0435908D2FA680810426F8397D010827068D0431 |
S1230609847F201D3410BE0106A684850127F7A60135903402A69F0106850135828D008678 |
S1230629203412BE0106A684850227FA3502A7013590BE01068603A7848611A7846D0186DD |
S1230649FFB70108390A0D434F4D5041435420464C41534820534543544F522052454144BD |
S12306692F5752495445205554494C495459040A0D285229205245414420534543544F5275 |
S12306890A0D28572920575249544520534543544F520A0D284E29204E45585420534543E3 |
S12306A9544F520A0D285029205052455620534543544F520A0D284D29204D4F4449465996 |
S12306C920534543544F520A0D28512920515549540A0D3A2004534543544F52204E554DAC |
S12306E94245522028362048455829203A2004534543544F52204E554D424552202D2024A0 |
S1230709040D0A4D454D4F5259204144445245535320283320484558293A2004202D20043A |
S114072900000A0D0000000457686174203F0D0A0492 |
S9030000FC |
/branches/mkfiles_rev1/src/dump/dump_ide.s19
0,0 → 1,35
S10C0100160246000000E000FFB5 |
S123034910CE03498E0109108E0000C60010AF815A26FACC0006FDE11ECC0002FDE11EBD5B |
S12303690487CC00E0FDE10CBD04878E0648BD062B8E0672BD062BBD062F81522764814E2A |
S1230389273D815027488157102700A5814D272A815127228172274A816E27238170272EDB |
S12303A981771027008B816D2710817127088E073BBD062320BB6E9FF800BD052A20B2BE1E |
S12303C901043001BF0104262A7C01032025BE010426087D0103271B7A0103301FBF0104BC |
S12303E920118E06E9BD0623BD05902941F70103BF01044FC601FDE104F60105FDE106F613 |
S12304090104FDE108F60103FDE10AC620FDE10EBD04878E0109108E0100BD0496FCE1007D |
S1230429E780A780313F26F2BD0487BD049E7E037A8E06E9BD0623BD0590293FF70103BF20 |
S123044901044FC601FDE104F60105FDE106F60104FDE108F60103FDE10ACC0030FDE10E07 |
S1230469BD04878E0109108E0100BD0496E680A680FDE100313F26F2BD04877E037AFCE187 |
S12304890EC58026F9FCE10EC54027F239FCE10EC50827F9398E0702BD0623B60103BD0591 |
S12304A9F8BE0104BD05F0BD0627108E000030A900FFBD04CF8E0744BD0623BD0638108E7A |
S12304C9010030A900FF1F10C30010C4F034061F20C4F01F01ACE42705170157270332624A |
S12304E93934108E072F170131AEE41700F9170146C610A689010930011700F317013A5A6F |
S123050926F1170132AEE1C610A6890109300181202504817E2302862E17011F5A26EA203B |
S1230529B48E0714BD062317007429348C0200242F1F128E072F1700E11F211700A917009E |
S1230549F8A6A901091700A71700EE1700602811810827DF811827DB815E2721810D2613B2 |
S123056939A7A90109A1A9010927081700CB863F1700C8108C01FF27BA312120B6108C0091 |
S12305890027B0313F20AC327D8D232957A7E48D1D2951A7618D17294BA7624F35948D21BE |
S12305A929421F018D08293C3410A76135908D112932484848481F898D0729283404ABE02F |
S12305C9398D638130251D813922038030398141251281462203803739816125078166223E |
S12305E9038057391A0239341035028D0235023402444444448D043502840F8B3081392F00 |
S1230609028B0720363402C608A68068E42502862D8D288D245A26F135826E9FF8106E9FE3 |
S1230629F80E6E9FF80C7D010827046E9FF8066E9FF8046E9FF8088D0086206E9FF80A0A78 |
S12306490D434F4D5041435420464C41534820534543544F5220524541442F575249544505 |
S1230669205554494C495459040D0A285229205245414420534543544F5220202028572927 |
S123068920575249544520534543544F5220200D0A284E29204E45585420534543544F526D |
S12306A9202020285029205052455620534543544F522020200D0A284D29204D4F4449463B |
S12306C95920534543544F52202851292051554954202020202020202020200D0A3A2004EA |
S12306E9534543544F52204E554D4245522028362048455829203A2004534543544F52201A |
S12307094E554D424552202D2024040D0A4D454D4F52592041444452455353202833204875 |
S12307294558293A2004202D200400000A0D0000000457686174203F0D0A040D0A486974B2 |
S118074920616E79206B657920746F20636F6E74696E7565043A |
S9030000FC |
/branches/mkfiles_rev1/src/dump/dump_cf8.txt
0,0 → 1,605
* |
* Sector Dump Utility |
* For Compact Flash Driver |
* for the 6809 |
* Configured in 8 bit mode |
* |
* John Kent |
* 21 May 2007 |
* |
* Register Equates |
* |
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_SECCNT EQU CF_BASE+2 |
CF_SECNUM EQU CF_BASE+3 |
CF_CYLLO EQU CF_BASE+4 |
CF_CYLHI 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 |
* |
BUSY EQU $80 |
DRDY EQU $40 |
DRQ EQU $08 |
ERR EQU $01 |
* |
* Start of Program |
* |
ORG $0100 |
START LBRA START1 |
* |
* DATA STORAGE |
* |
SECNUM FCB $00,$00,$00 |
CPORT FDB $E000 |
ECHO FCB $FF |
* |
* SECTOR BUFFER |
* |
SECBUF RMB 512 |
* |
* PROGRAM STACK |
* |
RMB 64 |
STACK EQU * |
* |
* Initialization |
* |
START1 LDS #STACK |
* |
* Clear sector buffer |
* |
LDX #SECBUF |
LDY #512 |
ZEROLP CLR ,X+ |
LEAY -1,Y |
BNE ZEROLP |
* |
* INITIALIZE CF CARD FOR 8 BIT LBA MODE |
* |
JSR WAITRDY |
LDA #HEADLBA |
STA CF_HEAD |
JSR WAITRDY |
LDA #FEAT8BIT |
STA CF_FEATURE |
LDA #CMDFEATURE |
STA CF_COMAND |
JSR WAITRDY |
* |
* DISPLAY TITTLE BANNER |
* |
LDX #TTLMSG |
JSR PDATA |
* |
* COMMAND LOOP |
* R - READ |
* W - WRITE |
* N - NEXT |
* P - PREV |
* M - MODIFY |
* Q - QUIT |
* |
CMDLP LDX #CMDMSG |
JSR PDATA |
JSR ECHON |
CMPA #'R' |
BEQ READ |
CMPA #'N' |
BEQ NEXT |
CMPA #'P' |
BEQ PREV |
CMPA #'W' |
LBEQ WRITE |
CMPA #'M' |
BEQ MODIFY |
CMPA #'Q' |
BEQ QUIT |
LDX #WOTMSG |
JSR PSTRNG |
BRA CMDLP |
* |
* QUIT |
* |
QUIT JMP [$F800] |
* |
* MODIFY SECTOR |
* |
MODIFY JSR MEMCHG |
BRA CMDLP |
* |
* NEXT SECTOR (READ) |
* INCREMENT SECTOR NUMBER |
* WRAPS AROUND TO ZERO ON $FFFFFF |
* |
NEXT LDX SECNUM+1 |
LEAX 1,X |
STX SECNUM+1 |
BNE READS |
INC SECNUM |
BRA READS |
* |
* PREVIOUS SECTOR (READ) |
* DECREMENT SECTOR NUMBER |
* DON'T DECREMENT PAST $000000 |
* |
PREV LDX SECNUM+1 |
BNE PREV1 |
TST SECNUM |
BEQ READS |
DEC SECNUM |
PREV1 LEAX -1,X |
STX SECNUM+1 |
BRA READS |
* |
* READ SECTORS FROM CF |
* |
READ LDX #SECPMT |
JSR PSTRNG |
JSR IN6HEX |
BVS RDEXIT |
STB SECNUM |
STX SECNUM+1 |
* |
READS LDA #$01 |
STA CF_SECCNT |
LDA SECNUM+2 |
STA CF_SECNUM |
LDA SECNUM+1 |
STA CF_CYLLO |
LDA SECNUM+0 |
STA CF_CYLHI |
* |
LDA #CMDREAD ; IDE READ MULTIPLE |
STA CF_COMAND |
JSR WAITRDY |
* |
LDX #SECBUF |
LDY #512 |
* |
* READ LOOP |
* |
RDLOOP JSR WAITDRQ |
LDA CF_DATA |
STA ,X+ |
LEAY -1,Y |
BNE RDLOOP |
* |
JSR WAITRDY |
JSR MEMDUMP |
RDEXIT JMP CMDLP |
* |
* WRITE SECTOR TO CF |
* |
WRITE LDX #SECPMT |
JSR PSTRNG |
JSR IN6HEX |
BVS WREXIT |
STB SECNUM |
STX SECNUM+1 |
* |
LDA #$01 |
STA CF_SECCNT |
LDA SECNUM+2 |
STA CF_SECNUM |
LDA SECNUM+1 |
STA CF_CYLLO |
LDA SECNUM+0 |
STA CF_CYLHI |
* |
LDA #CMDWRITE; IDE WRITE MULTIPLE |
STA CF_COMAND |
JSR WAITRDY |
* |
LDX #SECBUF |
LDY #512 |
* |
* WRITE LOOP |
* |
WRLOOP JSR WAITDRQ |
LDA ,X+ |
STA CF_DATA |
LEAY -1,Y |
BNE WRLOOP |
* |
JSR WAITRDY |
WREXIT JMP CMDLP |
* |
* WAIT UNTIL READY |
* |
WAITRDY LDA CF_STATUS |
BITA #BUSY |
BNE WAITRDY |
LDA CF_STATUS |
BITA #DRDY |
BEQ WAITRDY |
RTS |
* |
* WAIT FOR DATA REQUEST |
* |
WAITDRQ LDA CF_STATUS |
BITA #DRQ |
BEQ WAITDRQ |
RTS |
* |
* DUMP SECTOR IN MEMORY |
* |
MEMDUMP LDX #SECMSG |
JSR PSTRNG |
LDA SECNUM |
JSR OUT2H |
LDX SECNUM+1 |
JSR OUT4H |
JSR PCRLF |
LDY #$0000 |
LEAX #$1FF,Y |
* |
* ADJUST LOWER AND UPPER ADDRESS LIMITS |
* TO EVEN 16 BYTE BOUNDRIES. |
* |
* IF LOWER ADDR = $4532 |
* LOWER BOUNDS WILL BE ADJUSTED TO = $4530. |
* |
* IF UPPER ADDR = $4567 |
* UPPER BOUNDS WILL BE ADJUSTED TO = $4570. |
* |
* ENTER WITH LOWER ADDRESS IN X-REG. |
* -UPPER ADDRESS ON TOP OF STACK. |
* |
AJDUMP TFR X,D GET UPPER ADDR IN D-REG |
ADDD #$10 ADD 16 TO UPPER ADDRESS |
ANDB #$F0 MASK TO EVEN 16 BYTE BOUNDRY |
PSHS A,B SAVE ON STACK AS UPPER DUMP LIMIT |
TFR Y,D $F9A5 GET LOWER ADDRESS IN D-REG |
ANDB #$F0 MASK TO EVEN 16 BYTE BOUNDRY |
TFR D,X PUT IN X-REG AS LOWER DUMP LIMIT |
NXTLIN CMPX ,S COMPARE LOWER TO UPPER LIMIT |
BEQ SKPDMP IF EQUAL SKIP HEX-ASCII DUMP |
LBSR INCHEK CHECK FOR INPUT FROM KEYBOARD |
BEQ EDUMP |
SKPDMP LEAS 2,S READJUST STACK IF NOT DUMPING |
RTS ; |
* |
* PRINT 16 HEX BYTES FOLLOWED BY 16 ASCII CHARACTERS |
* FOR EACH LINE THROUGHOUT ADDRESS LIMITS. |
* |
EDUMP PSHS X PUSH LOWER ADDR LIMIT ON STACK |
LDX #MSG5 POINT TO MSG " - " |
LBSR PSTRNG PRINT MSG |
LDX ,S LOAD LOWER ADDR FROM TOP OF STACK |
LBSR OUT4H PRINT THE ADDRESS |
LBSR OUT2S 2 SPACES |
LDB #$10 LOAD COUNT OF 16 BYTES TO DUMP |
ELOOP LDA SECBUF,X GET FROM MEMORY HEX BYTE TO PRINT |
LEAX 1,X |
LBSR OUT2H OUTPUT HEX BYTE AS ASCII |
LBSR OUT1S OUTPUT SPACE |
DECB $F9D1 DECREMENT BYTE COUNT |
BNE ELOOP CONTINUE TIL 16 HEX BYTES PRINTED |
* |
* PRINT 16 ASCII CHARACTERS |
* IF NOT PRINTABLE OR NOT VALID |
* ASCII PRINT A PERIOD (.) |
LBSR OUT2S 2 SPACES |
LDX ,S++ GET LOW LIMIT FRM STACK - ADJ STACK |
LDB #$10 SET ASCII CHAR TO PRINT = 16 |
EDPASC LDA SECBUF,X GET CHARACTER FROM MEMORY |
LEAX 1,X |
CMPA #$20 IF LESS THAN $20, NON-PRINTABLE? |
BCS PERIOD IF SO, PRINT PERIOD INSTEAD |
CMPA #$7E IS IT VALID ASCII? |
BLS PRASC IF SO PRINT IT |
PERIOD LDA #'. LOAD A PERIOD (.) |
PRASC LBSR OUTCH PRINT ASCII CHARACTER |
DECB DECREMENT COUNT |
BNE EDPASC |
BRA NXTLIN |
* |
* |
***** "M" MEMORY EXAMINE AND CHANGE ***** |
* |
* RESTRICT ADDRESSING RANGE TO 512 BYTES ($000 - $1FF) |
* |
MEMCHG LDX #MEMMSG |
JSR PSTRNG |
LBSR IN3HEX INPUT ADDRESS |
BVS CHRTN IF NOT HEX, RETURN |
CMPX #$0200 |
BHS CHRTN |
TFR X,Y SAVE ADDR IN "Y" |
MEMC2 LDX #MSG5 POINT TO MSG " - " |
LBSR PSTRNG PRINT MSG |
TFR Y,X FETCH ADDRESS |
LBSR OUT4H PRINT ADDR IN HEX |
LBSR OUT1S OUTPUT SPACE |
LDA SECBUF,Y GET CONTENTS OF CURRENT ADDR. |
LBSR OUT2H OUTPUT CONTENTS IN ASCII |
LBSR OUT1S OUTPUT SPACE |
LBSR BYTE LOOP WAITING FOR OPERATOR INPUT |
BVC CHANGE IF VALID HEX GO CHANGE MEM. LOC. |
CMPA #8 IS IT A BACKSPACE (CNTRL H)? |
BEQ MEMC2 PROMPT OPERATOR AGAIN |
CMPA #$18 IS IT A CANCEL (CNTRL X)? |
BEQ MEMC2 PROMPT OPERATOR AGAIN |
CMPA #'^ IS IT AN UP ARROW? |
BEQ BACK DISPLAY PREVIOUS BYTE |
CMPA #$D IS IT A CR? |
BNE FORWRD DISPLAY NEXT BYTE |
CHRTN RTS EXIT ROUTINE |
* |
* |
CHANGE STA SECBUF,Y CHANGE BYTE IN MEMORY |
CMPA SECBUF,Y DID MEMORY BYTE CHANGE? |
BEQ FORWRD $F972 |
LBSR OUT1S OUTPUT SPACE |
LDA #'? LOAD QUESTION MARK |
LBSR OUTCH PRINT IT |
FORWRD CMPY #$01FF |
BEQ MEMC2 |
LEAY 1,Y POINT TO NEXT HIGHER MEM LOCATION |
BRA MEMC2 PRINT LOCATION & CONTENTS |
BACK CMPY #$0000 |
BEQ MEMC2 |
LEAY -1,Y POINT TO LAST MEM LOCATION |
BRA MEMC2 PRINT LOCATION & CONTENTS |
* |
* THE FOLLOWING ROUTINE LOOPS WAITING FOR THE |
* OPERATOR TO INPUT ONE VALID HEX ADDRESS. THE |
* ADDRESS IS RETURNED IN THE "X" REGISTER. |
* |
* IN6HEX - MS BYTE IN ACCB |
* LS WORD IN X REG |
* |
IN6HEX LEAS -3,S |
BSR BYTE |
BVS NOTHEX |
STA 0,S |
BSR BYTE |
BVS NOTHEX |
STA 1,S |
BSR BYTE |
BVS NOTHEX |
STA 2,S |
CLRA |
PULS B,X,PC |
* |
* INPUT 3 HEX DIGITS |
* RESULT RETURNED IN X |
* |
IN3HEX BSR INHEX INPUT HEX (1 HEX CHAR) |
BVS NOTHEX EXIT IF NOT VALID HEX |
TFR D,X |
BSR BYTE INPUT BYTE (2 HEX CHAR) |
BVS NOTHEX |
PSHS X |
STA 1,S |
PULS X,PC |
* |
***** INPUT BYTE (2 HEX CHAR.) ***** |
* |
BYTE BSR INHEX GET HEX LEFT |
BVS NOTHEX EXIT IF NOT VALID HEX |
ASLA ; |
ASLA ; |
ASLA ; SHIFT INTO LEFT NIBBLE |
ASLA ; |
TFR A,B PUT HEXL IN "B" |
BSR INHEX GET HEX RIGHT |
BVS NOTHEX EXIT IF NOT VALID HEX |
PSHS B PUSH HEXL ON STACK |
ADDA ,S+ ADD HEXL TO HEXR AND ADJ. STK |
RTS RETURN WITH HEX L&R IN "A" |
* |
* |
INHEX BSR ECHON INPUT ASCII CHAR. |
CMPA #'0 IS IT > OR = "0" ? |
BCS NOTHEX IF LESS IT AIN'T HEX |
CMPA #'9 IS IT < OR = "9" ? |
BHI INHEXA IF > MAYBE IT'S ALPHA |
SUBA #$30 ASCII ADJ. NUMERIC |
RTS ; |
* |
* |
INHEXA CMPA #'A IS IT > OR = "A" |
BCS NOTHEX IF LESS IT AIN'T HEX |
CMPA #'F IS IT < OR = "F" ? |
BHI INHEXL IF > IT AIN'T HEX |
SUBA #$37 ASCII ADJ. ALPHA |
RTS ; |
* |
INHEXL CMPA #'a IS IT > OR = "a" |
BCS NOTHEX IF LESS IT AIN'T HEX |
CMPA #'f IS IT < "f" |
BHI NOTHEX IF > IT AIN'T HEX |
SUBA #$57 ADJUST TO LOWER CASE |
RTS ; |
* |
* |
NOTHEX ORCC #2 SET (V) FLAG IN C-CODES REGISTER |
RTS ; |
* |
* |
OUT4H PSHS X PUSH X-REG. ON THE STACK |
PULS A POP MS BYTE OF X-REG INTO A-ACC. |
BSR OUTHL OUTPUT HEX LEFT |
PULS A POP LS BYTE OF X-REG INTO A-ACC. |
OUTHL EQU * |
OUT2H PSHS A SAVE IT BACK ON STACK |
LSRA CONVERT UPPER HEX NIBBLE TO ASCII |
LSRA ; |
LSRA ; |
LSRA ; |
BSR XASCII PRINT HEX NIBBLE AS ASCII |
OUTHR PULS A CONVERT LOWER HEX NIBBLE TO ASCII |
ANDA #$0F STRIP LEFT NIBBLE |
XASCII ADDA #$30 ASCII ADJ |
CMPA #$39 IS IT < OR = "9" ? |
BLE OUTC IF LESS, OUTPUT IT |
ADDA #7 IF > MAKE ASCII LETTER |
OUTC BRA OUTCH OUTPUT CHAR |
* |
* BINARY / ASCII --- THIS ROUTINE |
* OUTPUTS A BYTE IN ENHANCED |
* BINARY FORMAT. THE ENHANCEMENT |
* IS DONE BY SUBSTITUTING ASCII |
* LETTERS FOR THE ONES IN THE BYTE. |
* THE ASCII ENHANCEMENT LETTERS |
* ARE OBTAINED FROM THE STRING |
* POINTED TO BY THE INDEX REG. "X". |
* |
BIASCI PSHS A SAVE "A" ON STACK |
LDB #8 PRESET LOOP# TO BITS PER BYTE |
OUTBA LDA ,X+ GET LETTER FROM STRING |
ASL ,S TEST BYTE FOR "1" IN B7 |
BCS PRTBA IF ONE PRINT LETTER |
LDA #'- IF ZERO PRINT "-" |
PRTBA BSR OUTCH PRINT IT |
BSR OUT1S PRINT SPACE |
DECB SUB 1 FROM #BITS YET TO PRINT |
BNE OUTBA |
PULS A,PC |
* |
* PRINT STRING PRECEEDED BY A CR & LF. |
* |
PSTRNG BSR PCRLF PRINT CR/LF |
BRA PDATA PRINT STRING POINTED TO BY IX |
* |
* PCRLF |
* |
PCRLF PSHS X SAVE IX |
LDX #MSG2+1 POINT TO MSG CR/LF + 3 NULS |
BSR PDATA PRINT MSG |
PULS X,PC RESTORE IX |
PRINT BSR OUTCH |
* |
* PDATA |
* |
PDATA LDA ,X+ GET 1st CHAR. TO PRINT |
CMPA #4 IS IT EOT? |
BNE PRINT IF NOT EOT PRINT IT |
RTS ; |
* |
* |
ECHON TST ECHO IS ECHO REQUIRED ? |
BEQ INCH ECHO NOT REQ. IF CLEAR |
* |
* INCHE |
* |
* ---GETS CHARACTER FROM TERMINAL AND |
* ECHOS SAME. THE CHARACTER IS RETURNED |
* IN THE "A" ACCUMULATOR WITH THE PARITY |
* BIT MASKED OFF. ALL OTHER REGISTERS |
* ARE PRESERVED. |
* |
INCHE BSR INCH GET CHAR FROM TERMINAL |
ANDA #$7F STRIP PARITY FROM CHAR. |
BRA OUTCH ECHO CHAR TO TERMINAL |
* |
* INCH |
* |
* GET CHARACTER FROM TERMINAL. RETURN |
* CHARACTER IN "A" ACCUMULATOR AND PRESERVE |
* ALL OTHER REGISTERS. THE INPUT CHARACTER |
* IS 8 BITS AND IS NOT ECHOED. |
* |
* |
INCH PSHS X SAVE IX |
GETSTA LDX CPORT POINT TO TERMINAL PORT |
LDA ,X FETCH PORT STATUS |
BITA #1 TEST READY BIT, RDRF ? |
BEQ GETSTA IF NOT RDY, THEN TRY AGAIN |
GETST1 LDA 1,X FETCH CHAR |
PULS X,PC RESTORE IX |
* |
* INCHEK |
* |
* CHECK FOR A CHARACTER AVAILABLE FROM |
* THE TERMINAL. THE SERIAL PORT IS CHECKED |
* FOR READ READY. ALL REGISTERS ARE |
* PRESERVED, AND THE "Z" BIT WILL BE |
* CLEAR IF A CHARACTER CAN BE READ. |
* |
* |
INCHEK PSHS A SAVE A ACCUM. |
LDA [CPORT] FETCH PORT STATUS |
BITA #1 TEST READY BIT, RDRF ? |
INCHEK1 PULS A,PC RESTORE A ACCUM. |
* |
OUT2S BSR OUT1S OUTPUT 2 SPACES |
OUT1S LDA #$20 OUTPUT 1 SPACE |
* |
* |
* OUTCH |
* |
* OUTPUT CHARACTER TO TERMINAL. |
* THE CHAR. TO BE OUTPUT IS |
* PASSED IN THE A REGISTER. |
* ALL REGISTERS ARE PRESERVED. |
* |
OUTCH PSHS A,X SAVE A ACCUM AND IX |
LDX CPORT GET ADDR. OF TERMINAL |
FETSTA LDA ,X FETCH PORT STATUS |
BITA #2 TEST TDRE, OK TO XMIT ? |
BEQ FETSTA IF NOT LOOP UNTIL RDY |
PULS A GET CHAR. FOR XMIT |
STA 1,X XMIT CHAR. |
PULS X,PC RESTORE IX |
* |
* |
ACINIZ LDX CPORT POINT TO CONTROL PORT ADDRESS |
LDA #3 RESET ACIA PORT CODE |
STA ,X STORE IN CONTROL REGISTER |
LDA #$11 SET 8 DATA, 2 STOP AN 0 PARITY |
STA ,X STORE IN CONTROL REGISTER |
TST 1,X ANYTHING IN DATA REGISTER? |
LDA #$FF TURN ON ECHO FLAG |
STA ECHO |
RTS |
* |
* MESSAGE STRINGS |
* |
TTLMSG FCB $0A,$0D |
FCC "COMPACT FLASH SECTOR READ/WRITE UTILITY" |
FCB $04 |
CMDMSG FCB $0A,$0D |
FCC "(R) READ SECTOR" |
FCB $0A,$0D |
FCC "(W) WRITE SECTOR" |
FCB $0A,$0D |
FCC "(N) NEXT SECTOR" |
FCB $0A,$0D |
FCC "(P) PREV SECTOR" |
FCB $0A,$0D |
FCC "(M) MODIFY SECTOR" |
FCB $0A,$0D |
FCC "(Q) QUIT" |
FCB $0A,$0D |
FCC ": " |
FCB $04 |
SECPMT FCC "SECTOR NUMBER (6 HEX) : " |
FCB $04 |
SECMSG FCC "SECTOR NUMBER - $" |
FCB $04 |
MEMMSG FCB $0D,$0A |
FCC "MEMORY ADDRESS (3 HEX): " |
FCB $04 |
MSG5 FCC " - " |
FCB $04 |
MSG2 FCB $00,$00,$0A,$0D,$00,$00,$00,$04 |
WOTMSG FCC "What ?" |
FCB $0D,$0A,$04 |
* |
END START |
/branches/mkfiles_rev1/src/dump/dump_ide.txt
0,0 → 1,619
* |
* Sector Dump Utility |
* for IDE Drives or Compact Flash |
* for the 6809 |
* revised for 16 bit peripheral bus |
* on XESS XSA-3S1000 / XST-3.0 |
* |
* John Kent |
* 1 Feb 2008 |
* |
* SYS09BUG |
* |
MON_BASE EQU $F800 |
MONV EQU MON_BASE+0 |
NEXTCV EQU MON_BASE+2 |
INCHV EQU MON_BASE+4 |
INCHEV EQU MON_BASE+6 |
INCHEKV EQU MON_BASE+8 |
OUTCHV EQU MON_BASE+10 |
PDATAV EQU MON_BASE+12 |
PCRLFV EQU MON_BASE+14 |
PSTRGV EQU MON_BASE+16 |
* |
* Register Equates |
* |
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_SECCNT EQU CF_BASE+4 |
CF_SECNUM EQU CF_BASE+6 |
CF_CYLLO EQU CF_BASE+8 |
CF_CYLHI 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 |
* |
AUXRESET EQU $06 ; CF_AUX Reset command |
AUXRELEA EQU $02 |
CMDREAD EQU $20 ; Read Single sector |
CMDWRITE EQU $30 ; Write Single sector |
HEADLBA EQU $E0 |
* |
* Status bit equates |
* |
BUSY EQU $80 |
DRDY EQU $40 |
DRQ EQU $08 |
ERR EQU $01 |
* |
* Start of Program |
* |
ORG $0100 |
START LBRA START1 |
* |
* DATA STORAGE |
* |
SECNUM FCB $00,$00,$00 |
CPORT FDB $E000 |
ECHO FCB $FF |
* |
* SECTOR BUFFER |
* |
SECBUF RMB 512 |
* |
* PROGRAM STACK |
* |
RMB 64 |
STACK EQU * |
* |
* Initialization |
* |
START1 LDS #STACK |
* |
* Clear sector buffer |
* |
LDX #SECBUF |
LDY #0 |
LDB #0 |
ZEROLP STY ,X++ |
DECB |
BNE ZEROLP |
* |
* INITIALIZE CF CARD FOR 8 BIT LBA MODE |
* |
LDD #AUXRESET |
STD CF_AUX |
LDD #AUXRELEA |
STD CF_AUX |
JSR WAITRDY |
LDD #HEADLBA |
STD CF_HEAD |
JSR WAITRDY |
* |
* DISPLAY TITTLE BANNER |
* |
LDX #TTLMSG |
JSR PDATA |
* |
* COMMAND LOOP |
* R - READ |
* W - WRITE |
* N - NEXT |
* P - PREV |
* M - MODIFY |
* Q - QUIT |
* |
CMDLP LDX #CMDMSG |
JSR PDATA |
JSR ECHON |
CMPA #'R' |
BEQ READ |
CMPA #'N' |
BEQ NEXT |
CMPA #'P' |
BEQ PREV |
CMPA #'W' |
LBEQ WRITE |
CMPA #'M' |
BEQ MODIFY |
CMPA #'Q' |
BEQ QUIT |
CMPA #'r' |
BEQ READ |
CMPA #'n' |
BEQ NEXT |
CMPA #'p' |
BEQ PREV |
CMPA #'w' |
LBEQ WRITE |
CMPA #'m' |
BEQ MODIFY |
CMPA #'q' |
BEQ QUIT |
LDX #WOTMSG |
JSR PSTRNG |
BRA CMDLP |
* |
* QUIT |
* |
QUIT JMP [MONV] |
* |
* MODIFY SECTOR |
* |
MODIFY JSR MEMCHG |
BRA CMDLP |
* |
* NEXT SECTOR (READ) |
* INCREMENT SECTOR NUMBER |
* WRAPS AROUND TO ZERO ON $FFFFFF |
* |
NEXT LDX SECNUM+1 |
LEAX 1,X |
STX SECNUM+1 |
BNE READS |
INC SECNUM |
BRA READS |
* |
* PREVIOUS SECTOR (READ) |
* DECREMENT SECTOR NUMBER |
* DON'T DECREMENT PAST $000000 |
* |
PREV LDX SECNUM+1 |
BNE PREV1 |
TST SECNUM |
BEQ READS |
DEC SECNUM |
PREV1 LEAX -1,X |
STX SECNUM+1 |
BRA READS |
* |
* READ SECTORS FROM CF |
* |
READ LDX #SECPMT |
JSR PSTRNG |
JSR IN6HEX |
BVS RDEXIT |
STB SECNUM |
STX SECNUM+1 |
* |
READS CLRA |
LDB #$01 |
STD CF_SECCNT |
* |
LDB SECNUM+2 |
STD CF_SECNUM |
* |
LDB SECNUM+1 |
STD CF_CYLLO |
* |
LDB SECNUM+0 |
STD CF_CYLHI |
* |
LDB #CMDREAD ; IDE READ MULTIPLE |
STD CF_COMAND |
JSR WAITRDY |
* |
LDX #SECBUF |
LDY #256 |
* |
* READ LOOP |
* |
RDLOOP JSR WAITDRQ |
LDD CF_DATA ; reverse order of bytes |
STB ,X+ |
STA ,X+ |
LEAY -1,Y |
BNE RDLOOP |
* |
JSR WAITRDY |
JSR MEMDUMP |
RDEXIT JMP CMDLP |
* |
* WRITE SECTOR TO CF |
* |
WRITE LDX #SECPMT |
JSR PSTRNG |
JSR IN6HEX |
BVS WREXIT |
STB SECNUM |
STX SECNUM+1 |
* |
CLRA |
LDB #$01 |
STD CF_SECCNT |
* |
LDB SECNUM+2 |
STD CF_SECNUM |
* |
LDB SECNUM+1 |
STD CF_CYLLO |
* |
LDB SECNUM+0 |
STD CF_CYLHI |
* |
LDD #CMDWRITE; IDE WRITE MULTIPLE |
STD CF_COMAND |
JSR WAITRDY |
* |
LDX #SECBUF |
LDY #256 |
* |
* WRITE LOOP |
* |
WRLOOP JSR WAITDRQ |
LDB ,X+ ; reverse order of bytes |
LDA ,X+ |
STD CF_DATA |
LEAY -1,Y |
BNE WRLOOP |
* |
JSR WAITRDY |
WREXIT JMP CMDLP |
* |
* WAIT UNTIL READY |
* |
WAITRDY LDD CF_STATUS |
BITB #BUSY |
BNE WAITRDY |
LDD CF_STATUS |
BITB #DRDY |
BEQ WAITRDY |
RTS |
* |
* WAIT FOR DATA REQUEST |
* |
WAITDRQ LDD CF_STATUS |
BITB #DRQ |
BEQ WAITDRQ |
RTS |
* |
* DUMP SECTOR IN MEMORY |
* |
MEMDUMP LDX #SECMSG |
JSR PSTRNG |
LDA SECNUM |
JSR OUT2H |
LDX SECNUM+1 |
JSR OUT4H |
JSR PCRLF |
* |
* Dump first 256 bytes |
* |
LDY #$0000 |
LEAX #$0FF,Y |
JSR AJDUMP |
* |
* Prompt to continue |
* |
LDX #PAGMSG |
JSR PSTRNG |
JSR INCH |
* |
* Dump second 256 bytes |
* |
LDY #$0100 |
LEAX #$0FF,Y |
* |
* ADJUST LOWER AND UPPER ADDRESS LIMITS |
* TO EVEN 16 BYTE BOUNDRIES. |
* |
* IF LOWER ADDR = $4532 |
* LOWER BOUNDS WILL BE ADJUSTED TO = $4530. |
* |
* IF UPPER ADDR = $4567 |
* UPPER BOUNDS WILL BE ADJUSTED TO = $4570. |
* |
* ENTER WITH LOWER ADDRESS IN X-REG. |
* -UPPER ADDRESS ON TOP OF STACK. |
* |
AJDUMP TFR X,D GET UPPER ADDR IN D-REG |
ADDD #$10 ADD 16 TO UPPER ADDRESS |
ANDB #$F0 MASK TO EVEN 16 BYTE BOUNDRY |
PSHS A,B SAVE ON STACK AS UPPER DUMP LIMIT |
TFR Y,D $F9A5 GET LOWER ADDRESS IN D-REG |
ANDB #$F0 MASK TO EVEN 16 BYTE BOUNDRY |
TFR D,X PUT IN X-REG AS LOWER DUMP LIMIT |
NXTLIN CMPX ,S COMPARE LOWER TO UPPER LIMIT |
BEQ SKPDMP IF EQUAL SKIP HEX-ASCII DUMP |
LBSR INCHEK CHECK FOR INPUT FROM KEYBOARD |
BEQ EDUMP |
SKPDMP LEAS 2,S READJUST STACK IF NOT DUMPING |
RTS ; |
* |
* PRINT 16 HEX BYTES FOLLOWED BY 16 ASCII CHARACTERS |
* FOR EACH LINE THROUGHOUT ADDRESS LIMITS. |
* |
EDUMP PSHS X PUSH LOWER ADDR LIMIT ON STACK |
LDX #MSG5 POINT TO MSG " - " |
LBSR PSTRNG PRINT MSG |
LDX ,S LOAD LOWER ADDR FROM TOP OF STACK |
LBSR OUT4H PRINT THE ADDRESS |
LBSR OUT2S 2 SPACES |
LDB #$10 LOAD COUNT OF 16 BYTES TO DUMP |
ELOOP LDA SECBUF,X GET FROM MEMORY HEX BYTE TO PRINT |
LEAX 1,X |
LBSR OUT2H OUTPUT HEX BYTE AS ASCII |
LBSR OUT1S OUTPUT SPACE |
DECB $F9D1 DECREMENT BYTE COUNT |
BNE ELOOP CONTINUE TIL 16 HEX BYTES PRINTED |
* |
* PRINT 16 ASCII CHARACTERS |
* IF NOT PRINTABLE OR NOT VALID |
* ASCII PRINT A PERIOD (.) |
LBSR OUT2S 2 SPACES |
LDX ,S++ GET LOW LIMIT FRM STACK - ADJ STACK |
LDB #$10 SET ASCII CHAR TO PRINT = 16 |
EDPASC LDA SECBUF,X GET CHARACTER FROM MEMORY |
LEAX 1,X |
CMPA #$20 IF LESS THAN $20, NON-PRINTABLE? |
BCS PERIOD IF SO, PRINT PERIOD INSTEAD |
CMPA #$7E IS IT VALID ASCII? |
BLS PRASC IF SO PRINT IT |
PERIOD LDA #'. LOAD A PERIOD (.) |
PRASC LBSR OUTCH PRINT ASCII CHARACTER |
DECB DECREMENT COUNT |
BNE EDPASC |
BRA NXTLIN |
* |
* |
***** "M" MEMORY EXAMINE AND CHANGE ***** |
* |
* RESTRICT ADDRESSING RANGE TO 512 BYTES ($000 - $1FF) |
* |
MEMCHG LDX #MEMMSG |
JSR PSTRNG |
LBSR IN3HEX INPUT ADDRESS |
BVS CHRTN IF NOT HEX, RETURN |
CMPX #$0200 |
BHS CHRTN |
TFR X,Y SAVE ADDR IN "Y" |
MEMC2 LDX #MSG5 POINT TO MSG " - " |
LBSR PSTRNG PRINT MSG |
TFR Y,X FETCH ADDRESS |
LBSR OUT4H PRINT ADDR IN HEX |
LBSR OUT1S OUTPUT SPACE |
LDA SECBUF,Y GET CONTENTS OF CURRENT ADDR. |
LBSR OUT2H OUTPUT CONTENTS IN ASCII |
LBSR OUT1S OUTPUT SPACE |
LBSR BYTE LOOP WAITING FOR OPERATOR INPUT |
BVC CHANGE IF VALID HEX GO CHANGE MEM. LOC. |
CMPA #8 IS IT A BACKSPACE (CNTRL H)? |
BEQ MEMC2 PROMPT OPERATOR AGAIN |
CMPA #$18 IS IT A CANCEL (CNTRL X)? |
BEQ MEMC2 PROMPT OPERATOR AGAIN |
CMPA #'^ IS IT AN UP ARROW? |
BEQ BACK DISPLAY PREVIOUS BYTE |
CMPA #$D IS IT A CR? |
BNE FORWRD DISPLAY NEXT BYTE |
CHRTN RTS EXIT ROUTINE |
* |
* |
CHANGE STA SECBUF,Y CHANGE BYTE IN MEMORY |
CMPA SECBUF,Y DID MEMORY BYTE CHANGE? |
BEQ FORWRD $F972 |
LBSR OUT1S OUTPUT SPACE |
LDA #'? LOAD QUESTION MARK |
LBSR OUTCH PRINT IT |
FORWRD CMPY #$01FF |
BEQ MEMC2 |
LEAY 1,Y POINT TO NEXT HIGHER MEM LOCATION |
BRA MEMC2 PRINT LOCATION & CONTENTS |
BACK CMPY #$0000 |
BEQ MEMC2 |
LEAY -1,Y POINT TO LAST MEM LOCATION |
BRA MEMC2 PRINT LOCATION & CONTENTS |
* |
* THE FOLLOWING ROUTINE LOOPS WAITING FOR THE |
* OPERATOR TO INPUT ONE VALID HEX ADDRESS. THE |
* ADDRESS IS RETURNED IN THE "X" REGISTER. |
* |
* IN6HEX - MS BYTE IN ACCB |
* LS WORD IN X REG |
* |
IN6HEX LEAS -3,S |
BSR BYTE |
BVS NOTHEX |
STA 0,S |
BSR BYTE |
BVS NOTHEX |
STA 1,S |
BSR BYTE |
BVS NOTHEX |
STA 2,S |
CLRA |
PULS B,X,PC |
* |
* INPUT 3 HEX DIGITS |
* RESULT RETURNED IN X |
* |
IN3HEX BSR INHEX INPUT HEX (1 HEX CHAR) |
BVS NOTHEX EXIT IF NOT VALID HEX |
TFR D,X |
BSR BYTE INPUT BYTE (2 HEX CHAR) |
BVS NOTHEX |
PSHS X |
STA 1,S |
PULS X,PC |
* |
***** INPUT BYTE (2 HEX CHAR.) ***** |
* |
BYTE BSR INHEX GET HEX LEFT |
BVS NOTHEX EXIT IF NOT VALID HEX |
ASLA ; |
ASLA ; |
ASLA ; SHIFT INTO LEFT NIBBLE |
ASLA ; |
TFR A,B PUT HEXL IN "B" |
BSR INHEX GET HEX RIGHT |
BVS NOTHEX EXIT IF NOT VALID HEX |
PSHS B PUSH HEXL ON STACK |
ADDA ,S+ ADD HEXL TO HEXR AND ADJ. STK |
RTS RETURN WITH HEX L&R IN "A" |
* |
* |
INHEX BSR ECHON INPUT ASCII CHAR. |
CMPA #'0 IS IT > OR = "0" ? |
BCS NOTHEX IF LESS IT AIN'T HEX |
CMPA #'9 IS IT < OR = "9" ? |
BHI INHEXA IF > MAYBE IT'S ALPHA |
SUBA #$30 ASCII ADJ. NUMERIC |
RTS ; |
* |
* |
INHEXA CMPA #'A IS IT > OR = "A" |
BCS NOTHEX IF LESS IT AIN'T HEX |
CMPA #'F IS IT < OR = "F" ? |
BHI INHEXL IF > IT AIN'T HEX |
SUBA #$37 ASCII ADJ. ALPHA |
RTS ; |
* |
INHEXL CMPA #'a IS IT > OR = "a" |
BCS NOTHEX IF LESS IT AIN'T HEX |
CMPA #'f IS IT < "f" |
BHI NOTHEX IF > IT AIN'T HEX |
SUBA #$57 ADJUST TO LOWER CASE |
RTS ; |
* |
* |
NOTHEX ORCC #2 SET (V) FLAG IN C-CODES REGISTER |
RTS ; |
* |
* |
OUT4H PSHS X PUSH X-REG. ON THE STACK |
PULS A POP MS BYTE OF X-REG INTO A-ACC. |
BSR OUTHL OUTPUT HEX LEFT |
PULS A POP LS BYTE OF X-REG INTO A-ACC. |
OUTHL EQU * |
OUT2H PSHS A SAVE IT BACK ON STACK |
LSRA CONVERT UPPER HEX NIBBLE TO ASCII |
LSRA ; |
LSRA ; |
LSRA ; |
BSR XASCII PRINT HEX NIBBLE AS ASCII |
OUTHR PULS A CONVERT LOWER HEX NIBBLE TO ASCII |
ANDA #$0F STRIP LEFT NIBBLE |
XASCII ADDA #$30 ASCII ADJ |
CMPA #$39 IS IT < OR = "9" ? |
BLE OUTC IF LESS, OUTPUT IT |
ADDA #7 IF > MAKE ASCII LETTER |
OUTC BRA OUTCH OUTPUT CHAR |
* |
* BINARY / ASCII --- THIS ROUTINE |
* OUTPUTS A BYTE IN ENHANCED |
* BINARY FORMAT. THE ENHANCEMENT |
* IS DONE BY SUBSTITUTING ASCII |
* LETTERS FOR THE ONES IN THE BYTE. |
* THE ASCII ENHANCEMENT LETTERS |
* ARE OBTAINED FROM THE STRING |
* POINTED TO BY THE INDEX REG. "X". |
* |
BIASCI PSHS A SAVE "A" ON STACK |
LDB #8 PRESET LOOP# TO BITS PER BYTE |
OUTBA LDA ,X+ GET LETTER FROM STRING |
ASL ,S TEST BYTE FOR "1" IN B7 |
BCS PRTBA IF ONE PRINT LETTER |
LDA #'- IF ZERO PRINT "-" |
PRTBA BSR OUTCH PRINT IT |
BSR OUT1S PRINT SPACE |
DECB SUB 1 FROM #BITS YET TO PRINT |
BNE OUTBA |
PULS A,PC |
* |
* PRINT STRING PRECEEDED BY A CR & LF. |
* |
PSTRNG JMP [PSTRGV] PRINT CR/LF |
* |
* PCRLF |
* |
PCRLF JMP [PCRLFV] |
* |
* PDATA |
* |
PDATA JMP [PDATAV] |
* |
ECHON TST ECHO IS ECHO REQUIRED ? |
BEQ INCH ECHO NOT REQ. IF CLEAR |
* |
* INCHE |
* |
* ---GETS CHARACTER FROM TERMINAL AND |
* ECHOS SAME. THE CHARACTER IS RETURNED |
* IN THE "A" ACCUMULATOR WITH THE PARITY |
* BIT MASKED OFF. ALL OTHER REGISTERS |
* ARE PRESERVED. |
* |
INCHE JMP [INCHEV] |
* |
* INCH |
* |
* GET CHARACTER FROM TERMINAL. RETURN |
* CHARACTER IN "A" ACCUMULATOR AND PRESERVE |
* ALL OTHER REGISTERS. THE INPUT CHARACTER |
* IS 8 BITS AND IS NOT ECHOED. |
* |
* |
INCH JMP [INCHV] |
* |
* INCHEK |
* |
* CHECK FOR A CHARACTER AVAILABLE FROM |
* THE TERMINAL. THE SERIAL PORT IS CHECKED |
* FOR READ READY. ALL REGISTERS ARE |
* PRESERVED, AND THE "Z" BIT WILL BE |
* CLEAR IF A CHARACTER CAN BE READ. |
* |
* |
INCHEK JMP [INCHEKV] |
* |
OUT2S BSR OUT1S OUTPUT 2 SPACES |
OUT1S LDA #$20 OUTPUT 1 SPACE |
* |
* |
* OUTCH |
* |
* OUTPUT CHARACTER TO TERMINAL. |
* THE CHAR. TO BE OUTPUT IS |
* PASSED IN THE A REGISTER. |
* ALL REGISTERS ARE PRESERVED. |
* |
OUTCH JMP [OUTCHV] |
* |
* MESSAGE STRINGS |
* |
TTLMSG FCB $0A,$0D |
FCC "COMPACT FLASH SECTOR READ/WRITE UTILITY" |
FCB $04 |
CMDMSG FCB $0D,$0A |
FCC "(R) READ SECTOR " |
FCC "(W) WRITE SECTOR " |
FCB $0D,$0A |
FCC "(N) NEXT SECTOR " |
FCC "(P) PREV SECTOR " |
FCB $0D,$0A |
FCC "(M) MODIFY SECTOR " |
FCC "(Q) QUIT " |
FCB $0D,$0A |
FCC ": " |
FCB $04 |
SECPMT FCC "SECTOR NUMBER (6 HEX) : " |
FCB $04 |
SECMSG FCC "SECTOR NUMBER - $" |
FCB $04 |
MEMMSG FCB $0D,$0A |
FCC "MEMORY ADDRESS (3 HEX): " |
FCB $04 |
MSG5 FCC " - " |
FCB $04 |
MSG2 FCB $00,$00,$0A,$0D,$00,$00,$00,$04 |
WOTMSG FCC "What ?" |
FCB $0D,$0A,$04 |
PAGMSG FCB $0D,$0A |
FCC "Hit any key to continue" |
FCB $04 |
* |
END START |
/branches/mkfiles_rev1/src/dump/dump_cf8.lst
0,0 → 1,635
Assembler release DWC_2.0 version 2.11 |
May 6, 2004 (c) Motorola (free ware) |
0001 * |
0002 * Sector Dump Utility |
0003 * For Compact Flash Driver |
0004 * for the 6809 |
0005 * Configured in 8 bit mode |
0006 * |
0007 * John Kent |
0008 * 21 May 2007 |
0009 * |
0010 * Register Equates |
0011 * |
0012 E040 CF_BASE EQU $E040 |
0013 E040 CF_DATA EQU CF_BASE+0 |
0014 E041 CF_ERROR EQU CF_BASE+1 ; read error |
0015 E041 CF_FEATURE EQU CF_BASE+1 ; write feature |
0016 E042 CF_SECCNT EQU CF_BASE+2 |
0017 E043 CF_SECNUM EQU CF_BASE+3 |
0018 E044 CF_CYLLO EQU CF_BASE+4 |
0019 E045 CF_CYLHI EQU CF_BASE+5 |
0020 E046 CF_HEAD EQU CF_BASE+6 |
0021 E047 CF_STATUS EQU CF_BASE+7 ; read status |
0022 E047 CF_COMAND EQU CF_BASE+7 ; write command |
0023 * |
0024 * Command Equates |
0025 * |
0026 0020 CMDREAD EQU $20 ; Read Single sector |
0027 0030 CMDWRITE EQU $30 ; Write Single sector |
0028 00EF CMDFEATURE EQU $EF |
0029 0001 FEAT8BIT EQU $01 ; enable 8 bit transfers |
0030 00E0 HEADLBA EQU $E0 |
0031 * |
0032 * Status bit equates |
0033 * |
0034 0080 BUSY EQU $80 |
0035 0040 DRDY EQU $40 |
0036 0008 DRQ EQU $08 |
0037 0001 ERR EQU $01 |
0038 * |
0039 * Start of Program |
0040 * |
0041 0100 ORG $0100 |
0042 0100 16 02 46 START LBRA START1 |
0043 * |
0044 * DATA STORAGE |
0045 * |
0046 0103 00 00 00 SECNUM FCB $00,$00,$00 |
0047 0106 E0 00 CPORT FDB $E000 |
0048 0108 FF ECHO FCB $FF |
0049 * |
0050 * SECTOR BUFFER |
0051 * |
0052 0109 SECBUF RMB 512 |
0053 * |
0054 * PROGRAM STACK |
0055 * |
0056 0309 RMB 64 |
0057 0349 STACK EQU * |
0058 * |
0059 * Initialization |
0060 * |
0061 0349 10 CE 03 49 START1 LDS #STACK |
0062 * |
0063 * Clear sector buffer |
0064 * |
0065 034D 8E 01 09 LDX #SECBUF |
0066 0350 10 8E 02 00 LDY #512 |
0067 0354 6F 80 ZEROLP CLR ,X+ |
0068 0356 31 3F LEAY -1,Y |
0069 0358 26 FA BNE ZEROLP |
0070 * |
0071 * INITIALIZE CF CARD FOR 8 BIT LBA MODE |
0072 * |
0073 035A BD 04 64 JSR WAITRDY |
0074 035D 86 E0 LDA #HEADLBA |
0075 035F B7 E0 46 STA CF_HEAD |
0076 0362 BD 04 64 JSR WAITRDY |
0077 0365 86 01 LDA #FEAT8BIT |
0078 0367 B7 E0 41 STA CF_FEATURE |
0079 036A 86 EF LDA #CMDFEATURE |
0080 036C B7 E0 47 STA CF_COMAND |
0081 036F BD 04 64 JSR WAITRDY |
0082 * |
0083 * DISPLAY TITTLE BANNER |
0084 * |
0085 0372 8E 06 4E LDX #TTLMSG |
0086 0375 BD 05 FB JSR PDATA |
0087 * |
0088 * COMMAND LOOP |
0089 * R - READ |
0090 * W - WRITE |
0091 * N - NEXT |
0092 * P - PREV |
0093 * M - MODIFY |
0094 * Q - QUIT |
0095 * |
0096 0378 8E 06 78 CMDLP LDX #CMDMSG |
0097 037B BD 05 FB JSR PDATA |
0098 037E BD 06 02 JSR ECHON |
0099 0381 81 52 CMPA #'R' |
0100 0383 27 4A BEQ READ |
0101 0385 81 4E CMPA #'N' |
0102 0387 27 23 BEQ NEXT |
0103 0389 81 50 CMPA #'P' |
0104 038B 27 2E BEQ PREV |
0105 038D 81 57 CMPA #'W' |
0106 038F 10 27 00 88 LBEQ WRITE |
0107 0393 81 4D CMPA #'M' |
0108 0395 27 10 BEQ MODIFY |
0109 0397 81 51 CMPA #'Q' |
0110 0399 27 08 BEQ QUIT |
0111 039B 8E 07 31 LDX #WOTMSG |
0112 039E BD 05 EC JSR PSTRNG |
0113 03A1 20 D5 BRA CMDLP |
0114 * |
0115 * QUIT |
0116 * |
0117 03A3 6E 9F F8 00 QUIT JMP [$F800] |
0118 * |
0119 * MODIFY SECTOR |
0120 * |
0121 03A7 BD 04 F3 MODIFY JSR MEMCHG |
0122 03AA 20 CC BRA CMDLP |
0123 * |
0124 * NEXT SECTOR (READ) |
0125 * INCREMENT SECTOR NUMBER |
0126 * WRAPS AROUND TO ZERO ON $FFFFFF |
0127 * |
0128 03AC BE 01 04 NEXT LDX SECNUM+1 |
0129 03AF 30 01 LEAX 1,X |
0130 03B1 BF 01 04 STX SECNUM+1 |
0131 03B4 26 2A BNE READS |
0132 03B6 7C 01 03 INC SECNUM |
0133 03B9 20 25 BRA READS |
0134 * |
0135 * PREVIOUS SECTOR (READ) |
0136 * DECREMENT SECTOR NUMBER |
0137 * DON'T DECREMENT PAST $000000 |
0138 * |
0139 03BB BE 01 04 PREV LDX SECNUM+1 |
0140 03BE 26 08 BNE PREV1 |
0141 03C0 7D 01 03 TST SECNUM |
0142 03C3 27 1B BEQ READS |
0143 03C5 7A 01 03 DEC SECNUM |
0144 03C8 30 1F PREV1 LEAX -1,X |
0145 03CA BF 01 04 STX SECNUM+1 |
0146 03CD 20 11 BRA READS |
0147 * |
0148 * READ SECTORS FROM CF |
0149 * |
0150 03CF 8E 06 DF READ LDX #SECPMT |
0151 03D2 BD 05 EC JSR PSTRNG |
0152 03D5 BD 05 59 JSR IN6HEX |
0153 03D8 29 3E BVS RDEXIT |
0154 03DA F7 01 03 STB SECNUM |
0155 03DD BF 01 04 STX SECNUM+1 |
0156 * |
0157 03E0 86 01 READS LDA #$01 |
0158 03E2 B7 E0 42 STA CF_SECCNT |
0159 03E5 B6 01 05 LDA SECNUM+2 |
0160 03E8 B7 E0 43 STA CF_SECNUM |
0161 03EB B6 01 04 LDA SECNUM+1 |
0162 03EE B7 E0 44 STA CF_CYLLO |
0163 03F1 B6 01 03 LDA SECNUM+0 |
0164 03F4 B7 E0 45 STA CF_CYLHI |
0165 * |
0166 03F7 86 20 LDA #CMDREAD ; IDE READ MULTIPLE |
0167 03F9 B7 E0 47 STA CF_COMAND |
0168 03FC BD 04 64 JSR WAITRDY |
0169 * |
0170 03FF 8E 01 09 LDX #SECBUF |
0171 0402 10 8E 02 00 LDY #512 |
0172 * |
0173 * READ LOOP |
0174 * |
0175 0406 BD 04 73 RDLOOP JSR WAITDRQ |
0176 0409 B6 E0 40 LDA CF_DATA |
0177 040C A7 80 STA ,X+ |
0178 040E 31 3F LEAY -1,Y |
0179 0410 26 F4 BNE RDLOOP |
0180 * |
0181 0412 BD 04 64 JSR WAITRDY |
0182 0415 BD 04 7B JSR MEMDUMP |
0183 0418 7E 03 78 RDEXIT JMP CMDLP |
0184 * |
0185 * WRITE SECTOR TO CF |
0186 * |
0187 041B 8E 06 DF WRITE LDX #SECPMT |
0188 041E BD 05 EC JSR PSTRNG |
0189 0421 BD 05 59 JSR IN6HEX |
0190 0424 29 3B BVS WREXIT |
0191 0426 F7 01 03 STB SECNUM |
0192 0429 BF 01 04 STX SECNUM+1 |
0193 * |
0194 042C 86 01 LDA #$01 |
0195 042E B7 E0 42 STA CF_SECCNT |
0196 0431 B6 01 05 LDA SECNUM+2 |
0197 0434 B7 E0 43 STA CF_SECNUM |
0198 0437 B6 01 04 LDA SECNUM+1 |
0199 043A B7 E0 44 STA CF_CYLLO |
0200 043D B6 01 03 LDA SECNUM+0 |
0201 0440 B7 E0 45 STA CF_CYLHI |
0202 * |
0203 0443 86 30 LDA #CMDWRITE; IDE WRITE MULTIPLE |
0204 0445 B7 E0 47 STA CF_COMAND |
0205 0448 BD 04 64 JSR WAITRDY |
0206 * |
0207 044B 8E 01 09 LDX #SECBUF |
0208 044E 10 8E 02 00 LDY #512 |
0209 * |
0210 * WRITE LOOP |
0211 * |
0212 0452 BD 04 73 WRLOOP JSR WAITDRQ |
0213 0455 A6 80 LDA ,X+ |
0214 0457 B7 E0 40 STA CF_DATA |
0215 045A 31 3F LEAY -1,Y |
0216 045C 26 F4 BNE WRLOOP |
0217 * |
0218 045E BD 04 64 JSR WAITRDY |
0219 0461 7E 03 78 WREXIT JMP CMDLP |
0220 * |
0221 * WAIT UNTIL READY |
0222 * |
0223 0464 B6 E0 47 WAITRDY LDA CF_STATUS |
0224 0467 85 80 BITA #BUSY |
0225 0469 26 F9 BNE WAITRDY |
0226 046B B6 E0 47 LDA CF_STATUS |
0227 046E 85 40 BITA #DRDY |
0228 0470 27 F2 BEQ WAITRDY |
0229 0472 39 RTS |
0230 * |
0231 * WAIT FOR DATA REQUEST |
0232 * |
0233 0473 B6 E0 47 WAITDRQ LDA CF_STATUS |
0234 0476 85 08 BITA #DRQ |
0235 0478 27 F9 BEQ WAITDRQ |
0236 047A 39 RTS |
0237 * |
0238 * DUMP SECTOR IN MEMORY |
0239 * |
0240 047B 8E 06 F8 MEMDUMP LDX #SECMSG |
0241 047E BD 05 EC JSR PSTRNG |
0242 0481 B6 01 03 LDA SECNUM |
0243 0484 BD 05 C1 JSR OUT2H |
0244 0487 BE 01 04 LDX SECNUM+1 |
0245 048A BD 05 B9 JSR OUT4H |
0246 048D BD 05 F0 JSR PCRLF |
0247 0490 10 8E 00 00 LDY #$0000 |
0248 0494 30 A9 01 FF LEAX #$1FF,Y |
0249 * |
0250 * ADJUST LOWER AND UPPER ADDRESS LIMITS |
0251 * TO EVEN 16 BYTE BOUNDRIES. |
0252 * |
0253 * IF LOWER ADDR = $4532 |
0254 * LOWER BOUNDS WILL BE ADJUSTED TO = $4530. |
0255 * |
0256 * IF UPPER ADDR = $4567 |
0257 * UPPER BOUNDS WILL BE ADJUSTED TO = $4570. |
0258 * |
0259 * ENTER WITH LOWER ADDRESS IN X-REG. |
0260 * -UPPER ADDRESS ON TOP OF STACK. |
0261 * |
0262 0498 1F 10 AJDUMP TFR X,D GET UPPER ADDR IN D-REG |
0263 049A C3 00 10 ADDD #$10 ADD 16 TO UPPER ADDRESS |
0264 049D C4 F0 ANDB #$F0 MASK TO EVEN 16 BYTE BOUNDRY |
0265 049F 34 06 PSHS A,B SAVE ON STACK AS UPPER DUMP LIMIT |
0266 04A1 1F 20 TFR Y,D $F9A5 GET LOWER ADDRESS IN D-REG |
0267 04A3 C4 F0 ANDB #$F0 MASK TO EVEN 16 BYTE BOUNDRY |
0268 04A5 1F 01 TFR D,X PUT IN X-REG AS LOWER DUMP LIMIT |
0269 04A7 AC E4 NXTLIN CMPX ,S COMPARE LOWER TO UPPER LIMIT |
0270 04A9 27 05 BEQ SKPDMP IF EQUAL SKIP HEX-ASCII DUMP |
0271 04AB 17 01 6E LBSR INCHEK CHECK FOR INPUT FROM KEYBOARD |
0272 04AE 27 03 BEQ EDUMP |
0273 04B0 32 62 SKPDMP LEAS 2,S READJUST STACK IF NOT DUMPING |
0274 04B2 39 RTS ; |
0275 * |
0276 * PRINT 16 HEX BYTES FOLLOWED BY 16 ASCII CHARACTERS |
0277 * FOR EACH LINE THROUGHOUT ADDRESS LIMITS. |
0278 * |
0279 04B3 34 10 EDUMP PSHS X PUSH LOWER ADDR LIMIT ON STACK |
0280 04B5 8E 07 25 LDX #MSG5 POINT TO MSG " - " |
0281 04B8 17 01 31 LBSR PSTRNG PRINT MSG |
0282 04BB AE E4 LDX ,S LOAD LOWER ADDR FROM TOP OF STACK |
0283 04BD 17 00 F9 LBSR OUT4H PRINT THE ADDRESS |
0284 04C0 17 01 63 LBSR OUT2S 2 SPACES |
0285 04C3 C6 10 LDB #$10 LOAD COUNT OF 16 BYTES TO DUMP |
0286 04C5 A6 89 01 09 ELOOP LDA SECBUF,X GET FROM MEMORY HEX BYTE TO PRINT |
0287 04C9 30 01 LEAX 1,X |
0288 04CB 17 00 F3 LBSR OUT2H OUTPUT HEX BYTE AS ASCII |
0289 04CE 17 01 57 LBSR OUT1S OUTPUT SPACE |
0290 04D1 5A DECB $F9D1 DECREMENT BYTE COUNT |
0291 04D2 26 F1 BNE ELOOP CONTINUE TIL 16 HEX BYTES PRINTED |
0292 * |
0293 * PRINT 16 ASCII CHARACTERS |
0294 * IF NOT PRINTABLE OR NOT VALID |
0295 * ASCII PRINT A PERIOD (.) |
0296 04D4 17 01 4F LBSR OUT2S 2 SPACES |
0297 04D7 AE E1 LDX ,S++ GET LOW LIMIT FRM STACK - ADJ STACK |
0298 04D9 C6 10 LDB #$10 SET ASCII CHAR TO PRINT = 16 |
0299 04DB A6 89 01 09 EDPASC LDA SECBUF,X GET CHARACTER FROM MEMORY |
0300 04DF 30 01 LEAX 1,X |
0301 04E1 81 20 CMPA #$20 IF LESS THAN $20, NON-PRINTABLE? |
0302 04E3 25 04 BCS PERIOD IF SO, PRINT PERIOD INSTEAD |
0303 04E5 81 7E CMPA #$7E IS IT VALID ASCII? |
0304 04E7 23 02 BLS PRASC IF SO PRINT IT |
0305 04E9 86 2E PERIOD LDA #'. LOAD A PERIOD (.) |
0306 04EB 17 01 3C PRASC LBSR OUTCH PRINT ASCII CHARACTER |
0307 04EE 5A DECB DECREMENT COUNT |
0308 04EF 26 EA BNE EDPASC |
0309 04F1 20 B4 BRA NXTLIN |
0310 * |
0311 * |
0312 ***** "M" MEMORY EXAMINE AND CHANGE ***** |
0313 * |
0314 * RESTRICT ADDRESSING RANGE TO 512 BYTES ($000 - $1FF) |
0315 * |
0316 04F3 8E 07 0A MEMCHG LDX #MEMMSG |
0317 04F6 BD 05 EC JSR PSTRNG |
0318 04F9 17 00 74 LBSR IN3HEX INPUT ADDRESS |
0319 04FC 29 34 BVS CHRTN IF NOT HEX, RETURN |
0320 04FE 8C 02 00 CMPX #$0200 |
0321 0501 24 2F BHS CHRTN |
0322 0503 1F 12 TFR X,Y SAVE ADDR IN "Y" |
0323 0505 8E 07 25 MEMC2 LDX #MSG5 POINT TO MSG " - " |
0324 0508 17 00 E1 LBSR PSTRNG PRINT MSG |
0325 050B 1F 21 TFR Y,X FETCH ADDRESS |
0326 050D 17 00 A9 LBSR OUT4H PRINT ADDR IN HEX |
0327 0510 17 01 15 LBSR OUT1S OUTPUT SPACE |
0328 0513 A6 A9 01 09 LDA SECBUF,Y GET CONTENTS OF CURRENT ADDR. |
0329 0517 17 00 A7 LBSR OUT2H OUTPUT CONTENTS IN ASCII |
0330 051A 17 01 0B LBSR OUT1S OUTPUT SPACE |
0331 051D 17 00 60 LBSR BYTE LOOP WAITING FOR OPERATOR INPUT |
0332 0520 28 11 BVC CHANGE IF VALID HEX GO CHANGE MEM. LOC. |
0333 0522 81 08 CMPA #8 IS IT A BACKSPACE (CNTRL H)? |
0334 0524 27 DF BEQ MEMC2 PROMPT OPERATOR AGAIN |
0335 0526 81 18 CMPA #$18 IS IT A CANCEL (CNTRL X)? |
0336 0528 27 DB BEQ MEMC2 PROMPT OPERATOR AGAIN |
0337 052A 81 5E CMPA #'^ IS IT AN UP ARROW? |
0338 052C 27 21 BEQ BACK DISPLAY PREVIOUS BYTE |
0339 052E 81 0D CMPA #$D IS IT A CR? |
0340 0530 26 13 BNE FORWRD DISPLAY NEXT BYTE |
0341 0532 39 CHRTN RTS EXIT ROUTINE |
0342 * |
0343 * |
0344 0533 A7 A9 01 09 CHANGE STA SECBUF,Y CHANGE BYTE IN MEMORY |
0345 0537 A1 A9 01 09 CMPA SECBUF,Y DID MEMORY BYTE CHANGE? |
0346 053B 27 08 BEQ FORWRD $F972 |
0347 053D 17 00 E8 LBSR OUT1S OUTPUT SPACE |
0348 0540 86 3F LDA #'? LOAD QUESTION MARK |
0349 0542 17 00 E5 LBSR OUTCH PRINT IT |
0350 0545 10 8C 01 FF FORWRD CMPY #$01FF |
0351 0549 27 BA BEQ MEMC2 |
0352 054B 31 21 LEAY 1,Y POINT TO NEXT HIGHER MEM LOCATION |
0353 054D 20 B6 BRA MEMC2 PRINT LOCATION & CONTENTS |
0354 054F 10 8C 00 00 BACK CMPY #$0000 |
0355 0553 27 B0 BEQ MEMC2 |
0356 0555 31 3F LEAY -1,Y POINT TO LAST MEM LOCATION |
0357 0557 20 AC BRA MEMC2 PRINT LOCATION & CONTENTS |
0358 * |
0359 * THE FOLLOWING ROUTINE LOOPS WAITING FOR THE |
0360 * OPERATOR TO INPUT ONE VALID HEX ADDRESS. THE |
0361 * ADDRESS IS RETURNED IN THE "X" REGISTER. |
0362 * |
0363 * IN6HEX - MS BYTE IN ACCB |
0364 * LS WORD IN X REG |
0365 * |
0366 0559 32 7D IN6HEX LEAS -3,S |
0367 055B 8D 23 BSR BYTE |
0368 055D 29 57 BVS NOTHEX |
0369 055F A7 E4 STA 0,S |
0370 0561 8D 1D BSR BYTE |
0371 0563 29 51 BVS NOTHEX |
0372 0565 A7 61 STA 1,S |
0373 0567 8D 17 BSR BYTE |
0374 0569 29 4B BVS NOTHEX |
0375 056B A7 62 STA 2,S |
0376 056D 4F CLRA |
0377 056E 35 94 PULS B,X,PC |
0378 * |
0379 * INPUT 3 HEX DIGITS |
0380 * RESULT RETURNED IN X |
0381 * |
0382 0570 8D 21 IN3HEX BSR INHEX INPUT HEX (1 HEX CHAR) |
0383 0572 29 42 BVS NOTHEX EXIT IF NOT VALID HEX |
0384 0574 1F 01 TFR D,X |
0385 0576 8D 08 BSR BYTE INPUT BYTE (2 HEX CHAR) |
0386 0578 29 3C BVS NOTHEX |
0387 057A 34 10 PSHS X |
0388 057C A7 61 STA 1,S |
0389 057E 35 90 PULS X,PC |
0390 * |
0391 ***** INPUT BYTE (2 HEX CHAR.) ***** |
0392 * |
0393 0580 8D 11 BYTE BSR INHEX GET HEX LEFT |
0394 0582 29 32 BVS NOTHEX EXIT IF NOT VALID HEX |
0395 0584 48 ASLA ; |
0396 0585 48 ASLA ; |
0397 0586 48 ASLA ; SHIFT INTO LEFT NIBBLE |
0398 0587 48 ASLA ; |
0399 0588 1F 89 TFR A,B PUT HEXL IN "B" |
0400 058A 8D 07 BSR INHEX GET HEX RIGHT |
0401 058C 29 28 BVS NOTHEX EXIT IF NOT VALID HEX |
0402 058E 34 04 PSHS B PUSH HEXL ON STACK |
0403 0590 AB E0 ADDA ,S+ ADD HEXL TO HEXR AND ADJ. STK |
0404 0592 39 RTS RETURN WITH HEX L&R IN "A" |
0405 * |
0406 * |
0407 0593 8D 6D INHEX BSR ECHON INPUT ASCII CHAR. |
0408 0595 81 30 CMPA #'0 IS IT > OR = "0" ? |
0409 0597 25 1D BCS NOTHEX IF LESS IT AIN'T HEX |
0410 0599 81 39 CMPA #'9 IS IT < OR = "9" ? |
0411 059B 22 03 BHI INHEXA IF > MAYBE IT'S ALPHA |
0412 059D 80 30 SUBA #$30 ASCII ADJ. NUMERIC |
0413 059F 39 RTS ; |
0414 * |
0415 * |
0416 05A0 81 41 INHEXA CMPA #'A IS IT > OR = "A" |
0417 05A2 25 12 BCS NOTHEX IF LESS IT AIN'T HEX |
0418 05A4 81 46 CMPA #'F IS IT < OR = "F" ? |
0419 05A6 22 03 BHI INHEXL IF > IT AIN'T HEX |
0420 05A8 80 37 SUBA #$37 ASCII ADJ. ALPHA |
0421 05AA 39 RTS ; |
0422 * |
0423 05AB 81 61 INHEXL CMPA #'a IS IT > OR = "a" |
0424 05AD 25 07 BCS NOTHEX IF LESS IT AIN'T HEX |
0425 05AF 81 66 CMPA #'f IS IT < "f" |
0426 05B1 22 03 BHI NOTHEX IF > IT AIN'T HEX |
0427 05B3 80 57 SUBA #$57 ADJUST TO LOWER CASE |
0428 05B5 39 RTS ; |
0429 * |
0430 * |
0431 05B6 1A 02 NOTHEX ORCC #2 SET (V) FLAG IN C-CODES REGISTER |
0432 05B8 39 RTS ; |
0433 * |
0434 * |
0435 05B9 34 10 OUT4H PSHS X PUSH X-REG. ON THE STACK |
0436 05BB 35 02 PULS A POP MS BYTE OF X-REG INTO A-ACC. |
0437 05BD 8D 02 BSR OUTHL OUTPUT HEX LEFT |
0438 05BF 35 02 PULS A POP LS BYTE OF X-REG INTO A-ACC. |
0439 05C1 OUTHL EQU * |
0440 05C1 34 02 OUT2H PSHS A SAVE IT BACK ON STACK |
0441 05C3 44 LSRA CONVERT UPPER HEX NIBBLE TO ASCII |
0442 05C4 44 LSRA ; |
0443 05C5 44 LSRA ; |
0444 05C6 44 LSRA ; |
0445 05C7 8D 04 BSR XASCII PRINT HEX NIBBLE AS ASCII |
0446 05C9 35 02 OUTHR PULS A CONVERT LOWER HEX NIBBLE TO ASCII |
0447 05CB 84 0F ANDA #$0F STRIP LEFT NIBBLE |
0448 05CD 8B 30 XASCII ADDA #$30 ASCII ADJ |
0449 05CF 81 39 CMPA #$39 IS IT < OR = "9" ? |
0450 05D1 2F 02 BLE OUTC IF LESS, OUTPUT IT |
0451 05D3 8B 07 ADDA #7 IF > MAKE ASCII LETTER |
0452 05D5 20 53 OUTC BRA OUTCH OUTPUT CHAR |
0453 * |
0454 * BINARY / ASCII --- THIS ROUTINE |
0455 * OUTPUTS A BYTE IN ENHANCED |
0456 * BINARY FORMAT. THE ENHANCEMENT |
0457 * IS DONE BY SUBSTITUTING ASCII |
0458 * LETTERS FOR THE ONES IN THE BYTE. |
0459 * THE ASCII ENHANCEMENT LETTERS |
0460 * ARE OBTAINED FROM THE STRING |
0461 * POINTED TO BY THE INDEX REG. "X". |
0462 * |
0463 05D7 34 02 BIASCI PSHS A SAVE "A" ON STACK |
0464 05D9 C6 08 LDB #8 PRESET LOOP# TO BITS PER BYTE |
0465 05DB A6 80 OUTBA LDA ,X+ GET LETTER FROM STRING |
0466 05DD 68 E4 ASL ,S TEST BYTE FOR "1" IN B7 |
0467 05DF 25 02 BCS PRTBA IF ONE PRINT LETTER |
0468 05E1 86 2D LDA #'- IF ZERO PRINT "-" |
0469 05E3 8D 45 PRTBA BSR OUTCH PRINT IT |
0470 05E5 8D 41 BSR OUT1S PRINT SPACE |
0471 05E7 5A DECB SUB 1 FROM #BITS YET TO PRINT |
0472 05E8 26 F1 BNE OUTBA |
0473 05EA 35 82 PULS A,PC |
0474 * |
0475 * PRINT STRING PRECEEDED BY A CR & LF. |
0476 * |
0477 05EC 8D 02 PSTRNG BSR PCRLF PRINT CR/LF |
0478 05EE 20 0B BRA PDATA PRINT STRING POINTED TO BY IX |
0479 * |
0480 * PCRLF |
0481 * |
0482 05F0 34 10 PCRLF PSHS X SAVE IX |
0483 05F2 8E 07 2A LDX #MSG2+1 POINT TO MSG CR/LF + 3 NULS |
0484 05F5 8D 04 BSR PDATA PRINT MSG |
0485 05F7 35 90 PULS X,PC RESTORE IX |
0486 05F9 8D 2F PRINT BSR OUTCH |
0487 * |
0488 * PDATA |
0489 * |
0490 05FB A6 80 PDATA LDA ,X+ GET 1st CHAR. TO PRINT |
0491 05FD 81 04 CMPA #4 IS IT EOT? |
0492 05FF 26 F8 BNE PRINT IF NOT EOT PRINT IT |
0493 0601 39 RTS ; |
0494 * |
0495 * |
0496 0602 7D 01 08 ECHON TST ECHO IS ECHO REQUIRED ? |
0497 0605 27 06 BEQ INCH ECHO NOT REQ. IF CLEAR |
0498 * |
0499 * INCHE |
0500 * |
0501 * ---GETS CHARACTER FROM TERMINAL AND |
0502 * ECHOS SAME. THE CHARACTER IS RETURNED |
0503 * IN THE "A" ACCUMULATOR WITH THE PARITY |
0504 * BIT MASKED OFF. ALL OTHER REGISTERS |
0505 * ARE PRESERVED. |
0506 * |
0507 0607 8D 04 INCHE BSR INCH GET CHAR FROM TERMINAL |
0508 0609 84 7F ANDA #$7F STRIP PARITY FROM CHAR. |
0509 060B 20 1D BRA OUTCH ECHO CHAR TO TERMINAL |
0510 * |
0511 * INCH |
0512 * |
0513 * GET CHARACTER FROM TERMINAL. RETURN |
0514 * CHARACTER IN "A" ACCUMULATOR AND PRESERVE |
0515 * ALL OTHER REGISTERS. THE INPUT CHARACTER |
0516 * IS 8 BITS AND IS NOT ECHOED. |
0517 * |
0518 * |
0519 060D 34 10 INCH PSHS X SAVE IX |
0520 060F BE 01 06 GETSTA LDX CPORT POINT TO TERMINAL PORT |
0521 0612 A6 84 LDA ,X FETCH PORT STATUS |
0522 0614 85 01 BITA #1 TEST READY BIT, RDRF ? |
0523 0616 27 F7 BEQ GETSTA IF NOT RDY, THEN TRY AGAIN |
0524 0618 A6 01 GETST1 LDA 1,X FETCH CHAR |
0525 061A 35 90 PULS X,PC RESTORE IX |
0526 * |
0527 * INCHEK |
0528 * |
0529 * CHECK FOR A CHARACTER AVAILABLE FROM |
0530 * THE TERMINAL. THE SERIAL PORT IS CHECKED |
0531 * FOR READ READY. ALL REGISTERS ARE |
0532 * PRESERVED, AND THE "Z" BIT WILL BE |
0533 * CLEAR IF A CHARACTER CAN BE READ. |
0534 * |
0535 * |
0536 061C 34 02 INCHEK PSHS A SAVE A ACCUM. |
0537 061E A6 9F 01 06 LDA [CPORT] FETCH PORT STATUS |
0538 0622 85 01 BITA #1 TEST READY BIT, RDRF ? |
0539 0624 35 82 INCHEK1 PULS A,PC RESTORE A ACCUM. |
0540 * |
0541 0626 8D 00 OUT2S BSR OUT1S OUTPUT 2 SPACES |
0542 0628 86 20 OUT1S LDA #$20 OUTPUT 1 SPACE |
0543 * |
0544 * |
0545 * OUTCH |
0546 * |
0547 * OUTPUT CHARACTER TO TERMINAL. |
0548 * THE CHAR. TO BE OUTPUT IS |
0549 * PASSED IN THE A REGISTER. |
0550 * ALL REGISTERS ARE PRESERVED. |
0551 * |
0552 062A 34 12 OUTCH PSHS A,X SAVE A ACCUM AND IX |
0553 062C BE 01 06 LDX CPORT GET ADDR. OF TERMINAL |
0554 062F A6 84 FETSTA LDA ,X FETCH PORT STATUS |
0555 0631 85 02 BITA #2 TEST TDRE, OK TO XMIT ? |
0556 0633 27 FA BEQ FETSTA IF NOT LOOP UNTIL RDY |
0557 0635 35 02 PULS A GET CHAR. FOR XMIT |
0558 0637 A7 01 STA 1,X XMIT CHAR. |
0559 0639 35 90 PULS X,PC RESTORE IX |
0560 * |
0561 * |
0562 063B BE 01 06 ACINIZ LDX CPORT POINT TO CONTROL PORT ADDRESS |
0563 063E 86 03 LDA #3 RESET ACIA PORT CODE |
0564 0640 A7 84 STA ,X STORE IN CONTROL REGISTER |
0565 0642 86 11 LDA #$11 SET 8 DATA, 2 STOP AN 0 PARITY |
0566 0644 A7 84 STA ,X STORE IN CONTROL REGISTER |
0567 0646 6D 01 TST 1,X ANYTHING IN DATA REGISTER? |
0568 0648 86 FF LDA #$FF TURN ON ECHO FLAG |
0569 064A B7 01 08 STA ECHO |
0570 064D 39 RTS |
0571 * |
0572 * MESSAGE STRINGS |
0573 * |
0574 064E 0A 0D TTLMSG FCB $0A,$0D |
0575 0650 43 4F 4D 50 41 43 FCC "COMPACT FLASH SECTOR READ/WRITE UTILITY" |
54 20 46 4C 41 53 |
48 20 53 45 43 54 |
4F 52 20 52 45 41 |
44 2F 57 52 49 54 |
45 20 55 54 49 4C |
49 54 59 |
0576 0677 04 FCB $04 |
0577 0678 0A 0D CMDMSG FCB $0A,$0D |
0578 067A 28 52 29 20 52 45 FCC "(R) READ SECTOR" |
41 44 20 53 45 43 |
54 4F 52 |
0579 0689 0A 0D FCB $0A,$0D |
0580 068B 28 57 29 20 57 52 FCC "(W) WRITE SECTOR" |
49 54 45 20 53 45 |
43 54 4F 52 |
0581 069B 0A 0D FCB $0A,$0D |
0582 069D 28 4E 29 20 4E 45 FCC "(N) NEXT SECTOR" |
58 54 20 53 45 43 |
54 4F 52 |
0583 06AC 0A 0D FCB $0A,$0D |
0584 06AE 28 50 29 20 50 52 FCC "(P) PREV SECTOR" |
45 56 20 53 45 43 |
54 4F 52 |
0585 06BD 0A 0D FCB $0A,$0D |
0586 06BF 28 4D 29 20 4D 4F FCC "(M) MODIFY SECTOR" |
44 49 46 59 20 53 |
45 43 54 4F 52 |
0587 06D0 0A 0D FCB $0A,$0D |
0588 06D2 28 51 29 20 51 55 FCC "(Q) QUIT" |
49 54 |
0589 06DA 0A 0D FCB $0A,$0D |
0590 06DC 3A 20 FCC ": " |
0591 06DE 04 FCB $04 |
0592 06DF 53 45 43 54 4F 52 SECPMT FCC "SECTOR NUMBER (6 HEX) : " |
20 4E 55 4D 42 45 |
52 20 28 36 20 48 |
45 58 29 20 3A 20 |
0593 06F7 04 FCB $04 |
0594 06F8 53 45 43 54 4F 52 SECMSG FCC "SECTOR NUMBER - $" |
20 4E 55 4D 42 45 |
52 20 2D 20 24 |
0595 0709 04 FCB $04 |
0596 070A 0D 0A MEMMSG FCB $0D,$0A |
0597 070C 4D 45 4D 4F 52 59 FCC "MEMORY ADDRESS (3 HEX): " |
20 41 44 44 52 45 |
53 53 20 28 33 20 |
48 45 58 29 3A 20 |
0598 0724 04 FCB $04 |
0599 0725 20 2D 20 MSG5 FCC " - " |
0600 0728 04 FCB $04 |
0601 0729 00 00 0A 0D 00 00 MSG2 FCB $00,$00,$0A,$0D,$00,$00,$00,$04 |
00 04 |
0602 0731 57 68 61 74 20 3F WOTMSG FCC "What ?" |
0603 0737 0D 0A 04 FCB $0D,$0A,$04 |
0604 * |
0605 END START |
Program + Init Data = 1018 bytes |
Error count = 0 |
/branches/mkfiles_rev1/src/dump/dump_ide.lst
0,0 → 1,653
Assembler release DWC_2.0 version 2.11 |
May 6, 2004 (c) Motorola (free ware) |
0001 * |
0002 * Sector Dump Utility |
0003 * for IDE Drives or Compact Flash |
0004 * for the 6809 |
0005 * revised for 16 bit peripheral bus |
0006 * on XESS XSA-3S1000 / XST-3.0 |
0007 * |
0008 * John Kent |
0009 * 1 Feb 2008 |
0010 * |
0011 * SYS09BUG |
0012 * |
0013 F800 MON_BASE EQU $F800 |
0014 F800 MONV EQU MON_BASE+0 |
0015 F802 NEXTCV EQU MON_BASE+2 |
0016 F804 INCHV EQU MON_BASE+4 |
0017 F806 INCHEV EQU MON_BASE+6 |
0018 F808 INCHEKV EQU MON_BASE+8 |
0019 F80A OUTCHV EQU MON_BASE+10 |
0020 F80C PDATAV EQU MON_BASE+12 |
0021 F80E PCRLFV EQU MON_BASE+14 |
0022 F810 PSTRGV EQU MON_BASE+16 |
0023 * |
0024 * Register Equates |
0025 * |
0026 E100 CF_BASE EQU $E100 |
0027 E100 CF_DATA EQU CF_BASE+0 |
0028 E102 CF_ERROR EQU CF_BASE+2 ; read error |
0029 E102 CF_FEATURE EQU CF_BASE+2 ; write feature |
0030 E104 CF_SECCNT EQU CF_BASE+4 |
0031 E106 CF_SECNUM EQU CF_BASE+6 |
0032 E108 CF_CYLLO EQU CF_BASE+8 |
0033 E10A CF_CYLHI EQU CF_BASE+10 |
0034 E10C CF_HEAD EQU CF_BASE+12 |
0035 E10E CF_STATUS EQU CF_BASE+14 ; read status |
0036 E10E CF_COMAND EQU CF_BASE+14 ; write command |
0037 E11E CF_AUX EQU CF_BASE+30 |
0038 * |
0039 * Command Equates |
0040 * |
0041 0006 AUXRESET EQU $06 ; CF_AUX Reset command |
0042 0002 AUXRELEA EQU $02 |
0043 0020 CMDREAD EQU $20 ; Read Single sector |
0044 0030 CMDWRITE EQU $30 ; Write Single sector |
0045 00E0 HEADLBA EQU $E0 |
0046 * |
0047 * Status bit equates |
0048 * |
0049 0080 BUSY EQU $80 |
0050 0040 DRDY EQU $40 |
0051 0008 DRQ EQU $08 |
0052 0001 ERR EQU $01 |
0053 * |
0054 * Start of Program |
0055 * |
0056 0100 ORG $0100 |
0057 0100 16 02 46 START LBRA START1 |
0058 * |
0059 * DATA STORAGE |
0060 * |
0061 0103 00 00 00 SECNUM FCB $00,$00,$00 |
0062 0106 E0 00 CPORT FDB $E000 |
0063 0108 FF ECHO FCB $FF |
0064 * |
0065 * SECTOR BUFFER |
0066 * |
0067 0109 SECBUF RMB 512 |
0068 * |
0069 * PROGRAM STACK |
0070 * |
0071 0309 RMB 64 |
0072 0349 STACK EQU * |
0073 * |
0074 * Initialization |
0075 * |
0076 0349 10 CE 03 49 START1 LDS #STACK |
0077 * |
0078 * Clear sector buffer |
0079 * |
0080 034D 8E 01 09 LDX #SECBUF |
0081 0350 10 8E 00 00 LDY #0 |
0082 0354 C6 00 LDB #0 |
0083 0356 10 AF 81 ZEROLP STY ,X++ |
0084 0359 5A DECB |
0085 035A 26 FA BNE ZEROLP |
0086 * |
0087 * INITIALIZE CF CARD FOR 8 BIT LBA MODE |
0088 * |
0089 035C CC 00 06 LDD #AUXRESET |
0090 035F FD E1 1E STD CF_AUX |
0091 0362 CC 00 02 LDD #AUXRELEA |
0092 0365 FD E1 1E STD CF_AUX |
0093 0368 BD 04 87 JSR WAITRDY |
0094 036B CC 00 E0 LDD #HEADLBA |
0095 036E FD E1 0C STD CF_HEAD |
0096 0371 BD 04 87 JSR WAITRDY |
0097 * |
0098 * DISPLAY TITTLE BANNER |
0099 * |
0100 0374 8E 06 48 LDX #TTLMSG |
0101 0377 BD 06 2B JSR PDATA |
0102 * |
0103 * COMMAND LOOP |
0104 * R - READ |
0105 * W - WRITE |
0106 * N - NEXT |
0107 * P - PREV |
0108 * M - MODIFY |
0109 * Q - QUIT |
0110 * |
0111 037A 8E 06 72 CMDLP LDX #CMDMSG |
0112 037D BD 06 2B JSR PDATA |
0113 0380 BD 06 2F JSR ECHON |
0114 0383 81 52 CMPA #'R' |
0115 0385 27 64 BEQ READ |
0116 0387 81 4E CMPA #'N' |
0117 0389 27 3D BEQ NEXT |
0118 038B 81 50 CMPA #'P' |
0119 038D 27 48 BEQ PREV |
0120 038F 81 57 CMPA #'W' |
0121 0391 10 27 00 A5 LBEQ WRITE |
0122 0395 81 4D CMPA #'M' |
0123 0397 27 2A BEQ MODIFY |
0124 0399 81 51 CMPA #'Q' |
0125 039B 27 22 BEQ QUIT |
0126 039D 81 72 CMPA #'r' |
0127 039F 27 4A BEQ READ |
0128 03A1 81 6E CMPA #'n' |
0129 03A3 27 23 BEQ NEXT |
0130 03A5 81 70 CMPA #'p' |
0131 03A7 27 2E BEQ PREV |
0132 03A9 81 77 CMPA #'w' |
0133 03AB 10 27 00 8B LBEQ WRITE |
0134 03AF 81 6D CMPA #'m' |
0135 03B1 27 10 BEQ MODIFY |
0136 03B3 81 71 CMPA #'q' |
0137 03B5 27 08 BEQ QUIT |
0138 03B7 8E 07 3B LDX #WOTMSG |
0139 03BA BD 06 23 JSR PSTRNG |
0140 03BD 20 BB BRA CMDLP |
0141 * |
0142 * QUIT |
0143 * |
0144 03BF 6E 9F F8 00 QUIT JMP [MONV] |
0145 * |
0146 * MODIFY SECTOR |
0147 * |
0148 03C3 BD 05 2A MODIFY JSR MEMCHG |
0149 03C6 20 B2 BRA CMDLP |
0150 * |
0151 * NEXT SECTOR (READ) |
0152 * INCREMENT SECTOR NUMBER |
0153 * WRAPS AROUND TO ZERO ON $FFFFFF |
0154 * |
0155 03C8 BE 01 04 NEXT LDX SECNUM+1 |
0156 03CB 30 01 LEAX 1,X |
0157 03CD BF 01 04 STX SECNUM+1 |
0158 03D0 26 2A BNE READS |
0159 03D2 7C 01 03 INC SECNUM |
0160 03D5 20 25 BRA READS |
0161 * |
0162 * PREVIOUS SECTOR (READ) |
0163 * DECREMENT SECTOR NUMBER |
0164 * DON'T DECREMENT PAST $000000 |
0165 * |
0166 03D7 BE 01 04 PREV LDX SECNUM+1 |
0167 03DA 26 08 BNE PREV1 |
0168 03DC 7D 01 03 TST SECNUM |
0169 03DF 27 1B BEQ READS |
0170 03E1 7A 01 03 DEC SECNUM |
0171 03E4 30 1F PREV1 LEAX -1,X |
0172 03E6 BF 01 04 STX SECNUM+1 |
0173 03E9 20 11 BRA READS |
0174 * |
0175 * READ SECTORS FROM CF |
0176 * |
0177 03EB 8E 06 E9 READ LDX #SECPMT |
0178 03EE BD 06 23 JSR PSTRNG |
0179 03F1 BD 05 90 JSR IN6HEX |
0180 03F4 29 41 BVS RDEXIT |
0181 03F6 F7 01 03 STB SECNUM |
0182 03F9 BF 01 04 STX SECNUM+1 |
0183 * |
0184 03FC 4F READS CLRA |
0185 03FD C6 01 LDB #$01 |
0186 03FF FD E1 04 STD CF_SECCNT |
0187 * |
0188 0402 F6 01 05 LDB SECNUM+2 |
0189 0405 FD E1 06 STD CF_SECNUM |
0190 * |
0191 0408 F6 01 04 LDB SECNUM+1 |
0192 040B FD E1 08 STD CF_CYLLO |
0193 * |
0194 040E F6 01 03 LDB SECNUM+0 |
0195 0411 FD E1 0A STD CF_CYLHI |
0196 * |
0197 0414 C6 20 LDB #CMDREAD ; IDE READ MULTIPLE |
0198 0416 FD E1 0E STD CF_COMAND |
0199 0419 BD 04 87 JSR WAITRDY |
0200 * |
0201 041C 8E 01 09 LDX #SECBUF |
0202 041F 10 8E 01 00 LDY #256 |
0203 * |
0204 * READ LOOP |
0205 * |
0206 0423 BD 04 96 RDLOOP JSR WAITDRQ |
0207 0426 FC E1 00 LDD CF_DATA ; reverse order of bytes |
0208 0429 E7 80 STB ,X+ |
0209 042B A7 80 STA ,X+ |
0210 042D 31 3F LEAY -1,Y |
0211 042F 26 F2 BNE RDLOOP |
0212 * |
0213 0431 BD 04 87 JSR WAITRDY |
0214 0434 BD 04 9E JSR MEMDUMP |
0215 0437 7E 03 7A RDEXIT JMP CMDLP |
0216 * |
0217 * WRITE SECTOR TO CF |
0218 * |
0219 043A 8E 06 E9 WRITE LDX #SECPMT |
0220 043D BD 06 23 JSR PSTRNG |
0221 0440 BD 05 90 JSR IN6HEX |
0222 0443 29 3F BVS WREXIT |
0223 0445 F7 01 03 STB SECNUM |
0224 0448 BF 01 04 STX SECNUM+1 |
0225 * |
0226 044B 4F CLRA |
0227 044C C6 01 LDB #$01 |
0228 044E FD E1 04 STD CF_SECCNT |
0229 * |
0230 0451 F6 01 05 LDB SECNUM+2 |
0231 0454 FD E1 06 STD CF_SECNUM |
0232 * |
0233 0457 F6 01 04 LDB SECNUM+1 |
0234 045A FD E1 08 STD CF_CYLLO |
0235 * |
0236 045D F6 01 03 LDB SECNUM+0 |
0237 0460 FD E1 0A STD CF_CYLHI |
0238 * |
0239 0463 CC 00 30 LDD #CMDWRITE; IDE WRITE MULTIPLE |
0240 0466 FD E1 0E STD CF_COMAND |
0241 0469 BD 04 87 JSR WAITRDY |
0242 * |
0243 046C 8E 01 09 LDX #SECBUF |
0244 046F 10 8E 01 00 LDY #256 |
0245 * |
0246 * WRITE LOOP |
0247 * |
0248 0473 BD 04 96 WRLOOP JSR WAITDRQ |
0249 0476 E6 80 LDB ,X+ ; reverse order of bytes |
0250 0478 A6 80 LDA ,X+ |
0251 047A FD E1 00 STD CF_DATA |
0252 047D 31 3F LEAY -1,Y |
0253 047F 26 F2 BNE WRLOOP |
0254 * |
0255 0481 BD 04 87 JSR WAITRDY |
0256 0484 7E 03 7A WREXIT JMP CMDLP |
0257 * |
0258 * WAIT UNTIL READY |
0259 * |
0260 0487 FC E1 0E WAITRDY LDD CF_STATUS |
0261 048A C5 80 BITB #BUSY |
0262 048C 26 F9 BNE WAITRDY |
0263 048E FC E1 0E LDD CF_STATUS |
0264 0491 C5 40 BITB #DRDY |
0265 0493 27 F2 BEQ WAITRDY |
0266 0495 39 RTS |
0267 * |
0268 * WAIT FOR DATA REQUEST |
0269 * |
0270 0496 FC E1 0E WAITDRQ LDD CF_STATUS |
0271 0499 C5 08 BITB #DRQ |
0272 049B 27 F9 BEQ WAITDRQ |
0273 049D 39 RTS |
0274 * |
0275 * DUMP SECTOR IN MEMORY |
0276 * |
0277 049E 8E 07 02 MEMDUMP LDX #SECMSG |
0278 04A1 BD 06 23 JSR PSTRNG |
0279 04A4 B6 01 03 LDA SECNUM |
0280 04A7 BD 05 F8 JSR OUT2H |
0281 04AA BE 01 04 LDX SECNUM+1 |
0282 04AD BD 05 F0 JSR OUT4H |
0283 04B0 BD 06 27 JSR PCRLF |
0284 * |
0285 * Dump first 256 bytes |
0286 * |
0287 04B3 10 8E 00 00 LDY #$0000 |
0288 04B7 30 A9 00 FF LEAX #$0FF,Y |
0289 04BB BD 04 CF JSR AJDUMP |
0290 * |
0291 * Prompt to continue |
0292 * |
0293 04BE 8E 07 44 LDX #PAGMSG |
0294 04C1 BD 06 23 JSR PSTRNG |
0295 04C4 BD 06 38 JSR INCH |
0296 * |
0297 * Dump second 256 bytes |
0298 * |
0299 04C7 10 8E 01 00 LDY #$0100 |
0300 04CB 30 A9 00 FF LEAX #$0FF,Y |
0301 * |
0302 * ADJUST LOWER AND UPPER ADDRESS LIMITS |
0303 * TO EVEN 16 BYTE BOUNDRIES. |
0304 * |
0305 * IF LOWER ADDR = $4532 |
0306 * LOWER BOUNDS WILL BE ADJUSTED TO = $4530. |
0307 * |
0308 * IF UPPER ADDR = $4567 |
0309 * UPPER BOUNDS WILL BE ADJUSTED TO = $4570. |
0310 * |
0311 * ENTER WITH LOWER ADDRESS IN X-REG. |
0312 * -UPPER ADDRESS ON TOP OF STACK. |
0313 * |
0314 04CF 1F 10 AJDUMP TFR X,D GET UPPER ADDR IN D-REG |
0315 04D1 C3 00 10 ADDD #$10 ADD 16 TO UPPER ADDRESS |
0316 04D4 C4 F0 ANDB #$F0 MASK TO EVEN 16 BYTE BOUNDRY |
0317 04D6 34 06 PSHS A,B SAVE ON STACK AS UPPER DUMP LIMIT |
0318 04D8 1F 20 TFR Y,D $F9A5 GET LOWER ADDRESS IN D-REG |
0319 04DA C4 F0 ANDB #$F0 MASK TO EVEN 16 BYTE BOUNDRY |
0320 04DC 1F 01 TFR D,X PUT IN X-REG AS LOWER DUMP LIMIT |
0321 04DE AC E4 NXTLIN CMPX ,S COMPARE LOWER TO UPPER LIMIT |
0322 04E0 27 05 BEQ SKPDMP IF EQUAL SKIP HEX-ASCII DUMP |
0323 04E2 17 01 57 LBSR INCHEK CHECK FOR INPUT FROM KEYBOARD |
0324 04E5 27 03 BEQ EDUMP |
0325 04E7 32 62 SKPDMP LEAS 2,S READJUST STACK IF NOT DUMPING |
0326 04E9 39 RTS ; |
0327 * |
0328 * PRINT 16 HEX BYTES FOLLOWED BY 16 ASCII CHARACTERS |
0329 * FOR EACH LINE THROUGHOUT ADDRESS LIMITS. |
0330 * |
0331 04EA 34 10 EDUMP PSHS X PUSH LOWER ADDR LIMIT ON STACK |
0332 04EC 8E 07 2F LDX #MSG5 POINT TO MSG " - " |
0333 04EF 17 01 31 LBSR PSTRNG PRINT MSG |
0334 04F2 AE E4 LDX ,S LOAD LOWER ADDR FROM TOP OF STACK |
0335 04F4 17 00 F9 LBSR OUT4H PRINT THE ADDRESS |
0336 04F7 17 01 46 LBSR OUT2S 2 SPACES |
0337 04FA C6 10 LDB #$10 LOAD COUNT OF 16 BYTES TO DUMP |
0338 04FC A6 89 01 09 ELOOP LDA SECBUF,X GET FROM MEMORY HEX BYTE TO PRINT |
0339 0500 30 01 LEAX 1,X |
0340 0502 17 00 F3 LBSR OUT2H OUTPUT HEX BYTE AS ASCII |
0341 0505 17 01 3A LBSR OUT1S OUTPUT SPACE |
0342 0508 5A DECB $F9D1 DECREMENT BYTE COUNT |
0343 0509 26 F1 BNE ELOOP CONTINUE TIL 16 HEX BYTES PRINTED |
0344 * |
0345 * PRINT 16 ASCII CHARACTERS |
0346 * IF NOT PRINTABLE OR NOT VALID |
0347 * ASCII PRINT A PERIOD (.) |
0348 050B 17 01 32 LBSR OUT2S 2 SPACES |
0349 050E AE E1 LDX ,S++ GET LOW LIMIT FRM STACK - ADJ STACK |
0350 0510 C6 10 LDB #$10 SET ASCII CHAR TO PRINT = 16 |
0351 0512 A6 89 01 09 EDPASC LDA SECBUF,X GET CHARACTER FROM MEMORY |
0352 0516 30 01 LEAX 1,X |
0353 0518 81 20 CMPA #$20 IF LESS THAN $20, NON-PRINTABLE? |
0354 051A 25 04 BCS PERIOD IF SO, PRINT PERIOD INSTEAD |
0355 051C 81 7E CMPA #$7E IS IT VALID ASCII? |
0356 051E 23 02 BLS PRASC IF SO PRINT IT |
0357 0520 86 2E PERIOD LDA #'. LOAD A PERIOD (.) |
0358 0522 17 01 1F PRASC LBSR OUTCH PRINT ASCII CHARACTER |
0359 0525 5A DECB DECREMENT COUNT |
0360 0526 26 EA BNE EDPASC |
0361 0528 20 B4 BRA NXTLIN |
0362 * |
0363 * |
0364 ***** "M" MEMORY EXAMINE AND CHANGE ***** |
0365 * |
0366 * RESTRICT ADDRESSING RANGE TO 512 BYTES ($000 - $1FF) |
0367 * |
0368 052A 8E 07 14 MEMCHG LDX #MEMMSG |
0369 052D BD 06 23 JSR PSTRNG |
0370 0530 17 00 74 LBSR IN3HEX INPUT ADDRESS |
0371 0533 29 34 BVS CHRTN IF NOT HEX, RETURN |
0372 0535 8C 02 00 CMPX #$0200 |
0373 0538 24 2F BHS CHRTN |
0374 053A 1F 12 TFR X,Y SAVE ADDR IN "Y" |
0375 053C 8E 07 2F MEMC2 LDX #MSG5 POINT TO MSG " - " |
0376 053F 17 00 E1 LBSR PSTRNG PRINT MSG |
0377 0542 1F 21 TFR Y,X FETCH ADDRESS |
0378 0544 17 00 A9 LBSR OUT4H PRINT ADDR IN HEX |
0379 0547 17 00 F8 LBSR OUT1S OUTPUT SPACE |
0380 054A A6 A9 01 09 LDA SECBUF,Y GET CONTENTS OF CURRENT ADDR. |
0381 054E 17 00 A7 LBSR OUT2H OUTPUT CONTENTS IN ASCII |
0382 0551 17 00 EE LBSR OUT1S OUTPUT SPACE |
0383 0554 17 00 60 LBSR BYTE LOOP WAITING FOR OPERATOR INPUT |
0384 0557 28 11 BVC CHANGE IF VALID HEX GO CHANGE MEM. LOC. |
0385 0559 81 08 CMPA #8 IS IT A BACKSPACE (CNTRL H)? |
0386 055B 27 DF BEQ MEMC2 PROMPT OPERATOR AGAIN |
0387 055D 81 18 CMPA #$18 IS IT A CANCEL (CNTRL X)? |
0388 055F 27 DB BEQ MEMC2 PROMPT OPERATOR AGAIN |
0389 0561 81 5E CMPA #'^ IS IT AN UP ARROW? |
0390 0563 27 21 BEQ BACK DISPLAY PREVIOUS BYTE |
0391 0565 81 0D CMPA #$D IS IT A CR? |
0392 0567 26 13 BNE FORWRD DISPLAY NEXT BYTE |
0393 0569 39 CHRTN RTS EXIT ROUTINE |
0394 * |
0395 * |
0396 056A A7 A9 01 09 CHANGE STA SECBUF,Y CHANGE BYTE IN MEMORY |
0397 056E A1 A9 01 09 CMPA SECBUF,Y DID MEMORY BYTE CHANGE? |
0398 0572 27 08 BEQ FORWRD $F972 |
0399 0574 17 00 CB LBSR OUT1S OUTPUT SPACE |
0400 0577 86 3F LDA #'? LOAD QUESTION MARK |
0401 0579 17 00 C8 LBSR OUTCH PRINT IT |
0402 057C 10 8C 01 FF FORWRD CMPY #$01FF |
0403 0580 27 BA BEQ MEMC2 |
0404 0582 31 21 LEAY 1,Y POINT TO NEXT HIGHER MEM LOCATION |
0405 0584 20 B6 BRA MEMC2 PRINT LOCATION & CONTENTS |
0406 0586 10 8C 00 00 BACK CMPY #$0000 |
0407 058A 27 B0 BEQ MEMC2 |
0408 058C 31 3F LEAY -1,Y POINT TO LAST MEM LOCATION |
0409 058E 20 AC BRA MEMC2 PRINT LOCATION & CONTENTS |
0410 * |
0411 * THE FOLLOWING ROUTINE LOOPS WAITING FOR THE |
0412 * OPERATOR TO INPUT ONE VALID HEX ADDRESS. THE |
0413 * ADDRESS IS RETURNED IN THE "X" REGISTER. |
0414 * |
0415 * IN6HEX - MS BYTE IN ACCB |
0416 * LS WORD IN X REG |
0417 * |
0418 0590 32 7D IN6HEX LEAS -3,S |
0419 0592 8D 23 BSR BYTE |
0420 0594 29 57 BVS NOTHEX |
0421 0596 A7 E4 STA 0,S |
0422 0598 8D 1D BSR BYTE |
0423 059A 29 51 BVS NOTHEX |
0424 059C A7 61 STA 1,S |
0425 059E 8D 17 BSR BYTE |
0426 05A0 29 4B BVS NOTHEX |
0427 05A2 A7 62 STA 2,S |
0428 05A4 4F CLRA |
0429 05A5 35 94 PULS B,X,PC |
0430 * |
0431 * INPUT 3 HEX DIGITS |
0432 * RESULT RETURNED IN X |
0433 * |
0434 05A7 8D 21 IN3HEX BSR INHEX INPUT HEX (1 HEX CHAR) |
0435 05A9 29 42 BVS NOTHEX EXIT IF NOT VALID HEX |
0436 05AB 1F 01 TFR D,X |
0437 05AD 8D 08 BSR BYTE INPUT BYTE (2 HEX CHAR) |
0438 05AF 29 3C BVS NOTHEX |
0439 05B1 34 10 PSHS X |
0440 05B3 A7 61 STA 1,S |
0441 05B5 35 90 PULS X,PC |
0442 * |
0443 ***** INPUT BYTE (2 HEX CHAR.) ***** |
0444 * |
0445 05B7 8D 11 BYTE BSR INHEX GET HEX LEFT |
0446 05B9 29 32 BVS NOTHEX EXIT IF NOT VALID HEX |
0447 05BB 48 ASLA ; |
0448 05BC 48 ASLA ; |
0449 05BD 48 ASLA ; SHIFT INTO LEFT NIBBLE |
0450 05BE 48 ASLA ; |
0451 05BF 1F 89 TFR A,B PUT HEXL IN "B" |
0452 05C1 8D 07 BSR INHEX GET HEX RIGHT |
0453 05C3 29 28 BVS NOTHEX EXIT IF NOT VALID HEX |
0454 05C5 34 04 PSHS B PUSH HEXL ON STACK |
0455 05C7 AB E0 ADDA ,S+ ADD HEXL TO HEXR AND ADJ. STK |
0456 05C9 39 RTS RETURN WITH HEX L&R IN "A" |
0457 * |
0458 * |
0459 05CA 8D 63 INHEX BSR ECHON INPUT ASCII CHAR. |
0460 05CC 81 30 CMPA #'0 IS IT > OR = "0" ? |
0461 05CE 25 1D BCS NOTHEX IF LESS IT AIN'T HEX |
0462 05D0 81 39 CMPA #'9 IS IT < OR = "9" ? |
0463 05D2 22 03 BHI INHEXA IF > MAYBE IT'S ALPHA |
0464 05D4 80 30 SUBA #$30 ASCII ADJ. NUMERIC |
0465 05D6 39 RTS ; |
0466 * |
0467 * |
0468 05D7 81 41 INHEXA CMPA #'A IS IT > OR = "A" |
0469 05D9 25 12 BCS NOTHEX IF LESS IT AIN'T HEX |
0470 05DB 81 46 CMPA #'F IS IT < OR = "F" ? |
0471 05DD 22 03 BHI INHEXL IF > IT AIN'T HEX |
0472 05DF 80 37 SUBA #$37 ASCII ADJ. ALPHA |
0473 05E1 39 RTS ; |
0474 * |
0475 05E2 81 61 INHEXL CMPA #'a IS IT > OR = "a" |
0476 05E4 25 07 BCS NOTHEX IF LESS IT AIN'T HEX |
0477 05E6 81 66 CMPA #'f IS IT < "f" |
0478 05E8 22 03 BHI NOTHEX IF > IT AIN'T HEX |
0479 05EA 80 57 SUBA #$57 ADJUST TO LOWER CASE |
0480 05EC 39 RTS ; |
0481 * |
0482 * |
0483 05ED 1A 02 NOTHEX ORCC #2 SET (V) FLAG IN C-CODES REGISTER |
0484 05EF 39 RTS ; |
0485 * |
0486 * |
0487 05F0 34 10 OUT4H PSHS X PUSH X-REG. ON THE STACK |
0488 05F2 35 02 PULS A POP MS BYTE OF X-REG INTO A-ACC. |
0489 05F4 8D 02 BSR OUTHL OUTPUT HEX LEFT |
0490 05F6 35 02 PULS A POP LS BYTE OF X-REG INTO A-ACC. |
0491 05F8 OUTHL EQU * |
0492 05F8 34 02 OUT2H PSHS A SAVE IT BACK ON STACK |
0493 05FA 44 LSRA CONVERT UPPER HEX NIBBLE TO ASCII |
0494 05FB 44 LSRA ; |
0495 05FC 44 LSRA ; |
0496 05FD 44 LSRA ; |
0497 05FE 8D 04 BSR XASCII PRINT HEX NIBBLE AS ASCII |
0498 0600 35 02 OUTHR PULS A CONVERT LOWER HEX NIBBLE TO ASCII |
0499 0602 84 0F ANDA #$0F STRIP LEFT NIBBLE |
0500 0604 8B 30 XASCII ADDA #$30 ASCII ADJ |
0501 0606 81 39 CMPA #$39 IS IT < OR = "9" ? |
0502 0608 2F 02 BLE OUTC IF LESS, OUTPUT IT |
0503 060A 8B 07 ADDA #7 IF > MAKE ASCII LETTER |
0504 060C 20 36 OUTC BRA OUTCH OUTPUT CHAR |
0505 * |
0506 * BINARY / ASCII --- THIS ROUTINE |
0507 * OUTPUTS A BYTE IN ENHANCED |
0508 * BINARY FORMAT. THE ENHANCEMENT |
0509 * IS DONE BY SUBSTITUTING ASCII |
0510 * LETTERS FOR THE ONES IN THE BYTE. |
0511 * THE ASCII ENHANCEMENT LETTERS |
0512 * ARE OBTAINED FROM THE STRING |
0513 * POINTED TO BY THE INDEX REG. "X". |
0514 * |
0515 060E 34 02 BIASCI PSHS A SAVE "A" ON STACK |
0516 0610 C6 08 LDB #8 PRESET LOOP# TO BITS PER BYTE |
0517 0612 A6 80 OUTBA LDA ,X+ GET LETTER FROM STRING |
0518 0614 68 E4 ASL ,S TEST BYTE FOR "1" IN B7 |
0519 0616 25 02 BCS PRTBA IF ONE PRINT LETTER |
0520 0618 86 2D LDA #'- IF ZERO PRINT "-" |
0521 061A 8D 28 PRTBA BSR OUTCH PRINT IT |
0522 061C 8D 24 BSR OUT1S PRINT SPACE |
0523 061E 5A DECB SUB 1 FROM #BITS YET TO PRINT |
0524 061F 26 F1 BNE OUTBA |
0525 0621 35 82 PULS A,PC |
0526 * |
0527 * PRINT STRING PRECEEDED BY A CR & LF. |
0528 * |
0529 0623 6E 9F F8 10 PSTRNG JMP [PSTRGV] PRINT CR/LF |
0530 * |
0531 * PCRLF |
0532 * |
0533 0627 6E 9F F8 0E PCRLF JMP [PCRLFV] |
0534 * |
0535 * PDATA |
0536 * |
0537 062B 6E 9F F8 0C PDATA JMP [PDATAV] |
0538 * |
0539 062F 7D 01 08 ECHON TST ECHO IS ECHO REQUIRED ? |
0540 0632 27 04 BEQ INCH ECHO NOT REQ. IF CLEAR |
0541 * |
0542 * INCHE |
0543 * |
0544 * ---GETS CHARACTER FROM TERMINAL AND |
0545 * ECHOS SAME. THE CHARACTER IS RETURNED |
0546 * IN THE "A" ACCUMULATOR WITH THE PARITY |
0547 * BIT MASKED OFF. ALL OTHER REGISTERS |
0548 * ARE PRESERVED. |
0549 * |
0550 0634 6E 9F F8 06 INCHE JMP [INCHEV] |
0551 * |
0552 * INCH |
0553 * |
0554 * GET CHARACTER FROM TERMINAL. RETURN |
0555 * CHARACTER IN "A" ACCUMULATOR AND PRESERVE |
0556 * ALL OTHER REGISTERS. THE INPUT CHARACTER |
0557 * IS 8 BITS AND IS NOT ECHOED. |
0558 * |
0559 * |
0560 0638 6E 9F F8 04 INCH JMP [INCHV] |
0561 * |
0562 * INCHEK |
0563 * |
0564 * CHECK FOR A CHARACTER AVAILABLE FROM |
0565 * THE TERMINAL. THE SERIAL PORT IS CHECKED |
0566 * FOR READ READY. ALL REGISTERS ARE |
0567 * PRESERVED, AND THE "Z" BIT WILL BE |
0568 * CLEAR IF A CHARACTER CAN BE READ. |
0569 * |
0570 * |
0571 063C 6E 9F F8 08 INCHEK JMP [INCHEKV] |
0572 * |
0573 0640 8D 00 OUT2S BSR OUT1S OUTPUT 2 SPACES |
0574 0642 86 20 OUT1S LDA #$20 OUTPUT 1 SPACE |
0575 * |
0576 * |
0577 * OUTCH |
0578 * |
0579 * OUTPUT CHARACTER TO TERMINAL. |
0580 * THE CHAR. TO BE OUTPUT IS |
0581 * PASSED IN THE A REGISTER. |
0582 * ALL REGISTERS ARE PRESERVED. |
0583 * |
0584 0644 6E 9F F8 0A OUTCH JMP [OUTCHV] |
0585 * |
0586 * MESSAGE STRINGS |
0587 * |
0588 0648 0A 0D TTLMSG FCB $0A,$0D |
0589 064A 43 4F 4D 50 41 43 FCC "COMPACT FLASH SECTOR READ/WRITE UTILITY" |
54 20 46 4C 41 53 |
48 20 53 45 43 54 |
4F 52 20 52 45 41 |
44 2F 57 52 49 54 |
45 20 55 54 49 4C |
49 54 59 |
0590 0671 04 FCB $04 |
0591 0672 0D 0A CMDMSG FCB $0D,$0A |
0592 0674 28 52 29 20 52 45 FCC "(R) READ SECTOR " |
41 44 20 53 45 43 |
54 4F 52 20 20 20 |
0593 0686 28 57 29 20 57 52 FCC "(W) WRITE SECTOR " |
49 54 45 20 53 45 |
43 54 4F 52 20 20 |
0594 0698 0D 0A FCB $0D,$0A |
0595 069A 28 4E 29 20 4E 45 FCC "(N) NEXT SECTOR " |
58 54 20 53 45 43 |
54 4F 52 20 20 20 |
0596 06AC 28 50 29 20 50 52 FCC "(P) PREV SECTOR " |
45 56 20 53 45 43 |
54 4F 52 20 20 20 |
0597 06BE 0D 0A FCB $0D,$0A |
0598 06C0 28 4D 29 20 4D 4F FCC "(M) MODIFY SECTOR " |
44 49 46 59 20 53 |
45 43 54 4F 52 20 |
0599 06D2 28 51 29 20 51 55 FCC "(Q) QUIT " |
49 54 20 20 20 20 |
20 20 20 20 20 20 |
0600 06E4 0D 0A FCB $0D,$0A |
0601 06E6 3A 20 FCC ": " |
0602 06E8 04 FCB $04 |
0603 06E9 53 45 43 54 4F 52 SECPMT FCC "SECTOR NUMBER (6 HEX) : " |
20 4E 55 4D 42 45 |
52 20 28 36 20 48 |
45 58 29 20 3A 20 |
0604 0701 04 FCB $04 |
0605 0702 53 45 43 54 4F 52 SECMSG FCC "SECTOR NUMBER - $" |
20 4E 55 4D 42 45 |
52 20 2D 20 24 |
0606 0713 04 FCB $04 |
0607 0714 0D 0A MEMMSG FCB $0D,$0A |
0608 0716 4D 45 4D 4F 52 59 FCC "MEMORY ADDRESS (3 HEX): " |
20 41 44 44 52 45 |
53 53 20 28 33 20 |
48 45 58 29 3A 20 |
0609 072E 04 FCB $04 |
0610 072F 20 2D 20 MSG5 FCC " - " |
0611 0732 04 FCB $04 |
0612 0733 00 00 0A 0D 00 00 MSG2 FCB $00,$00,$0A,$0D,$00,$00,$00,$04 |
00 04 |
0613 073B 57 68 61 74 20 3F WOTMSG FCC "What ?" |
0614 0741 0D 0A 04 FCB $0D,$0A,$04 |
0615 0744 0D 0A PAGMSG FCB $0D,$0A |
0616 0746 48 69 74 20 61 6E FCC "Hit any key to continue" |
79 20 6B 65 79 20 |
74 6F 20 63 6F 6E |
74 69 6E 75 65 |
0617 075D 04 FCB $04 |
0618 * |
0619 END START |
Program + Init Data = 1054 bytes |
Error count = 0 |
/branches/mkfiles_rev1/src/dump/dump_cf8.sh
1,2 → 1,2
../../Tools/as09/as09.exe dump_cf8.asm -l > dump_cf8.lst |
../../Tools/as09/as09.exe dump_cf8.txt -l > dump_cf8.lst |
|
/branches/mkfiles_rev1/src/fmt/fmt_cf8.asm
File deleted
/branches/mkfiles_rev1/src/fmt/fmt_ide.asm
File deleted
/branches/mkfiles_rev1/src/fmt/Makefile
File deleted
/branches/mkfiles_rev1/src/fmt/fmt_cf8.sh
1,2 → 0,2
../../Tools/as09/as09.exe cf8fmt.asm -l > cf8fmt.lst |
../../Tools/as09/as09.exe cf8fmt.txt -l > cf8fmt.lst |
/branches/mkfiles_rev1/src/fmt/fmt_ide.sh
1,2 → 0,2
../../Tools/as09/as09.exe cf8fmt.asm -l > cf8fmt.lst |
../../Tools/as09/as09.exe cf8fmt.txt -l > cf8fmt.lst |
/branches/mkfiles_rev1/src/fmt/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 |
/branches/mkfiles_rev1/src/fmt/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 |
/branches/mkfiles_rev1/src/fmt/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 |
/branches/mkfiles_rev1/src/fmt/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 |
/branches/mkfiles_rev1/src/fmt/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 |
/branches/mkfiles_rev1/src/fmt/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 |