OpenCores
URL https://opencores.org/ocsvn/System09/System09/trunk

Subversion Repositories System09

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /System09/tags/pre_mkfiles_rev1_merge/src/dump
    from Rev 27 to Rev 66
    Reverse comparison

Rev 27 → Rev 66

/dump_ide.sh
0,0 → 1,2
../../Tools/as09/as09.exe dump_ide.txt -l > dump_ide.lst
 
/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
/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
/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
/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
/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
/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
/dump_cf8.sh
0,0 → 1,2
../../Tools/as09/as09.exe dump_cf8.txt -l > dump_cf8.lst
 

powered by: WebSVN 2.1.0

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