OpenCores
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_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.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.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

powered by: WebSVN 2.1.0

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