URL
https://opencores.org/ocsvn/System09/System09/trunk
Subversion Repositories System09
[/] [System09/] [trunk/] [src/] [dump/] [dump_ide.asm] - Rev 66
Compare with Previous | Blame | View Log
** 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 $F800MONV EQU MON_BASE+0NEXTCV EQU MON_BASE+2INCHV EQU MON_BASE+4INCHEV EQU MON_BASE+6INCHEKV EQU MON_BASE+8OUTCHV EQU MON_BASE+10PDATAV EQU MON_BASE+12PCRLFV EQU MON_BASE+14PSTRGV EQU MON_BASE+16** Register Equates*CF_BASE EQU $E100CF_DATA EQU CF_BASE+0CF_ERROR EQU CF_BASE+2 ; read errorCF_FEATURE EQU CF_BASE+2 ; write featureCF_SECCNT EQU CF_BASE+4CF_SECNUM EQU CF_BASE+6CF_CYLLO EQU CF_BASE+8CF_CYLHI EQU CF_BASE+10CF_HEAD EQU CF_BASE+12CF_STATUS EQU CF_BASE+14 ; read statusCF_COMAND EQU CF_BASE+14 ; write commandCF_AUX EQU CF_BASE+30** Command Equates*AUXRESET EQU $06 ; CF_AUX Reset commandAUXRELEA EQU $02CMDREAD EQU $20 ; Read Single sectorCMDWRITE EQU $30 ; Write Single sectorHEADLBA EQU $E0** Status bit equates*BUSY EQU $80DRDY EQU $40DRQ EQU $08ERR EQU $01** Start of Program*ORG $0100START LBRA START1** DATA STORAGE*SECNUM FCB $00,$00,$00CPORT FDB $E000ECHO FCB $FF** SECTOR BUFFER*SECBUF RMB 512** PROGRAM STACK*RMB 64STACK EQU *** Initialization*START1 LDS #STACK** Clear sector buffer*LDX #SECBUFLDY #0LDB #0ZEROLP STY ,X++DECBBNE ZEROLP** INITIALIZE CF CARD FOR 8 BIT LBA MODE*LDD #AUXRESETSTD CF_AUXLDD #AUXRELEASTD CF_AUXJSR WAITRDYLDD #HEADLBASTD CF_HEADJSR WAITRDY** DISPLAY TITTLE BANNER*LDX #TTLMSGJSR PDATA** COMMAND LOOP* R - READ* W - WRITE* N - NEXT* P - PREV* M - MODIFY* Q - QUIT*CMDLP LDX #CMDMSGJSR PDATAJSR ECHONCMPA #'R'BEQ READCMPA #'N'BEQ NEXTCMPA #'P'BEQ PREVCMPA #'W'LBEQ WRITECMPA #'M'BEQ MODIFYCMPA #'Q'BEQ QUITCMPA #'r'BEQ READCMPA #'n'BEQ NEXTCMPA #'p'BEQ PREVCMPA #'w'LBEQ WRITECMPA #'m'BEQ MODIFYCMPA #'q'BEQ QUITLDX #WOTMSGJSR PSTRNGBRA CMDLP** QUIT*QUIT JMP [MONV]** MODIFY SECTOR*MODIFY JSR MEMCHGBRA CMDLP** NEXT SECTOR (READ)* INCREMENT SECTOR NUMBER* WRAPS AROUND TO ZERO ON $FFFFFF*NEXT LDX SECNUM+1LEAX 1,XSTX SECNUM+1BNE READSINC SECNUMBRA READS** PREVIOUS SECTOR (READ)* DECREMENT SECTOR NUMBER* DON'T DECREMENT PAST $000000*PREV LDX SECNUM+1BNE PREV1TST SECNUMBEQ READSDEC SECNUMPREV1 LEAX -1,XSTX SECNUM+1BRA READS** READ SECTORS FROM CF*READ LDX #SECPMTJSR PSTRNGJSR IN6HEXBVS RDEXITSTB SECNUMSTX SECNUM+1*READS CLRALDB #$01STD CF_SECCNT*LDB SECNUM+2STD CF_SECNUM*LDB SECNUM+1STD CF_CYLLO*LDB SECNUM+0STD CF_CYLHI*LDB #CMDREAD ; IDE READ MULTIPLESTD CF_COMANDJSR WAITRDY*LDX #SECBUFLDY #256** READ LOOP*RDLOOP JSR WAITDRQLDD CF_DATA ; reverse order of bytesSTB ,X+STA ,X+LEAY -1,YBNE RDLOOP*JSR WAITRDYJSR MEMDUMPRDEXIT JMP CMDLP** WRITE SECTOR TO CF*WRITE LDX #SECPMTJSR PSTRNGJSR IN6HEXBVS WREXITSTB SECNUMSTX SECNUM+1*CLRALDB #$01STD CF_SECCNT*LDB SECNUM+2STD CF_SECNUM*LDB SECNUM+1STD CF_CYLLO*LDB SECNUM+0STD CF_CYLHI*LDD #CMDWRITE; IDE WRITE MULTIPLESTD CF_COMANDJSR WAITRDY*LDX #SECBUFLDY #256** WRITE LOOP*WRLOOP JSR WAITDRQLDB ,X+ ; reverse order of bytesLDA ,X+STD CF_DATALEAY -1,YBNE WRLOOP*JSR WAITRDYWREXIT JMP CMDLP** WAIT UNTIL READY*WAITRDY LDD CF_STATUSBITB #BUSYBNE WAITRDYLDD CF_STATUSBITB #DRDYBEQ WAITRDYRTS** WAIT FOR DATA REQUEST*WAITDRQ LDD CF_STATUSBITB #DRQBEQ WAITDRQRTS** DUMP SECTOR IN MEMORY*MEMDUMP LDX #SECMSGJSR PSTRNGLDA SECNUMJSR OUT2HLDX SECNUM+1JSR OUT4HJSR PCRLF** Dump first 256 bytes*LDY #$0000LEAX #$0FF,YJSR AJDUMP** Prompt to continue*LDX #PAGMSGJSR PSTRNGJSR INCH** Dump second 256 bytes*LDY #$0100LEAX #$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-REGADDD #$10 ADD 16 TO UPPER ADDRESSANDB #$F0 MASK TO EVEN 16 BYTE BOUNDRYPSHS A,B SAVE ON STACK AS UPPER DUMP LIMITTFR Y,D $F9A5 GET LOWER ADDRESS IN D-REGANDB #$F0 MASK TO EVEN 16 BYTE BOUNDRYTFR D,X PUT IN X-REG AS LOWER DUMP LIMITNXTLIN CMPX ,S COMPARE LOWER TO UPPER LIMITBEQ SKPDMP IF EQUAL SKIP HEX-ASCII DUMPLBSR INCHEK CHECK FOR INPUT FROM KEYBOARDBEQ EDUMPSKPDMP LEAS 2,S READJUST STACK IF NOT DUMPINGRTS ;** PRINT 16 HEX BYTES FOLLOWED BY 16 ASCII CHARACTERS* FOR EACH LINE THROUGHOUT ADDRESS LIMITS.*EDUMP PSHS X PUSH LOWER ADDR LIMIT ON STACKLDX #MSG5 POINT TO MSG " - "LBSR PSTRNG PRINT MSGLDX ,S LOAD LOWER ADDR FROM TOP OF STACKLBSR OUT4H PRINT THE ADDRESSLBSR OUT2S 2 SPACESLDB #$10 LOAD COUNT OF 16 BYTES TO DUMPELOOP LDA SECBUF,X GET FROM MEMORY HEX BYTE TO PRINTLEAX 1,XLBSR OUT2H OUTPUT HEX BYTE AS ASCIILBSR OUT1S OUTPUT SPACEDECB $F9D1 DECREMENT BYTE COUNTBNE ELOOP CONTINUE TIL 16 HEX BYTES PRINTED** PRINT 16 ASCII CHARACTERS* IF NOT PRINTABLE OR NOT VALID* ASCII PRINT A PERIOD (.)LBSR OUT2S 2 SPACESLDX ,S++ GET LOW LIMIT FRM STACK - ADJ STACKLDB #$10 SET ASCII CHAR TO PRINT = 16EDPASC LDA SECBUF,X GET CHARACTER FROM MEMORYLEAX 1,XCMPA #$20 IF LESS THAN $20, NON-PRINTABLE?BCS PERIOD IF SO, PRINT PERIOD INSTEADCMPA #$7E IS IT VALID ASCII?BLS PRASC IF SO PRINT ITPERIOD LDA #'. LOAD A PERIOD (.)PRASC LBSR OUTCH PRINT ASCII CHARACTERDECB DECREMENT COUNTBNE EDPASCBRA NXTLIN******* "M" MEMORY EXAMINE AND CHANGE ******* RESTRICT ADDRESSING RANGE TO 512 BYTES ($000 - $1FF)*MEMCHG LDX #MEMMSGJSR PSTRNGLBSR IN3HEX INPUT ADDRESSBVS CHRTN IF NOT HEX, RETURNCMPX #$0200BHS CHRTNTFR X,Y SAVE ADDR IN "Y"MEMC2 LDX #MSG5 POINT TO MSG " - "LBSR PSTRNG PRINT MSGTFR Y,X FETCH ADDRESSLBSR OUT4H PRINT ADDR IN HEXLBSR OUT1S OUTPUT SPACELDA SECBUF,Y GET CONTENTS OF CURRENT ADDR.LBSR OUT2H OUTPUT CONTENTS IN ASCIILBSR OUT1S OUTPUT SPACELBSR BYTE LOOP WAITING FOR OPERATOR INPUTBVC CHANGE IF VALID HEX GO CHANGE MEM. LOC.CMPA #8 IS IT A BACKSPACE (CNTRL H)?BEQ MEMC2 PROMPT OPERATOR AGAINCMPA #$18 IS IT A CANCEL (CNTRL X)?BEQ MEMC2 PROMPT OPERATOR AGAINCMPA #'^ IS IT AN UP ARROW?BEQ BACK DISPLAY PREVIOUS BYTECMPA #$D IS IT A CR?BNE FORWRD DISPLAY NEXT BYTECHRTN RTS EXIT ROUTINE**CHANGE STA SECBUF,Y CHANGE BYTE IN MEMORYCMPA SECBUF,Y DID MEMORY BYTE CHANGE?BEQ FORWRD $F972LBSR OUT1S OUTPUT SPACELDA #'? LOAD QUESTION MARKLBSR OUTCH PRINT ITFORWRD CMPY #$01FFBEQ MEMC2LEAY 1,Y POINT TO NEXT HIGHER MEM LOCATIONBRA MEMC2 PRINT LOCATION & CONTENTSBACK CMPY #$0000BEQ MEMC2LEAY -1,Y POINT TO LAST MEM LOCATIONBRA 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,SBSR BYTEBVS NOTHEXSTA 0,SBSR BYTEBVS NOTHEXSTA 1,SBSR BYTEBVS NOTHEXSTA 2,SCLRAPULS 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 HEXTFR D,XBSR BYTE INPUT BYTE (2 HEX CHAR)BVS NOTHEXPSHS XSTA 1,SPULS X,PC****** INPUT BYTE (2 HEX CHAR.) ******BYTE BSR INHEX GET HEX LEFTBVS NOTHEX EXIT IF NOT VALID HEXASLA ;ASLA ;ASLA ; SHIFT INTO LEFT NIBBLEASLA ;TFR A,B PUT HEXL IN "B"BSR INHEX GET HEX RIGHTBVS NOTHEX EXIT IF NOT VALID HEXPSHS B PUSH HEXL ON STACKADDA ,S+ ADD HEXL TO HEXR AND ADJ. STKRTS 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 HEXCMPA #'9 IS IT < OR = "9" ?BHI INHEXA IF > MAYBE IT'S ALPHASUBA #$30 ASCII ADJ. NUMERICRTS ;**INHEXA CMPA #'A IS IT > OR = "A"BCS NOTHEX IF LESS IT AIN'T HEXCMPA #'F IS IT < OR = "F" ?BHI INHEXL IF > IT AIN'T HEXSUBA #$37 ASCII ADJ. ALPHARTS ;*INHEXL CMPA #'a IS IT > OR = "a"BCS NOTHEX IF LESS IT AIN'T HEXCMPA #'f IS IT < "f"BHI NOTHEX IF > IT AIN'T HEXSUBA #$57 ADJUST TO LOWER CASERTS ;**NOTHEX ORCC #2 SET (V) FLAG IN C-CODES REGISTERRTS ;**OUT4H PSHS X PUSH X-REG. ON THE STACKPULS A POP MS BYTE OF X-REG INTO A-ACC.BSR OUTHL OUTPUT HEX LEFTPULS A POP LS BYTE OF X-REG INTO A-ACC.OUTHL EQU *OUT2H PSHS A SAVE IT BACK ON STACKLSRA CONVERT UPPER HEX NIBBLE TO ASCIILSRA ;LSRA ;LSRA ;BSR XASCII PRINT HEX NIBBLE AS ASCIIOUTHR PULS A CONVERT LOWER HEX NIBBLE TO ASCIIANDA #$0F STRIP LEFT NIBBLEXASCII ADDA #$30 ASCII ADJCMPA #$39 IS IT < OR = "9" ?BLE OUTC IF LESS, OUTPUT ITADDA #7 IF > MAKE ASCII LETTEROUTC 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 STACKLDB #8 PRESET LOOP# TO BITS PER BYTEOUTBA LDA ,X+ GET LETTER FROM STRINGASL ,S TEST BYTE FOR "1" IN B7BCS PRTBA IF ONE PRINT LETTERLDA #'- IF ZERO PRINT "-"PRTBA BSR OUTCH PRINT ITBSR OUT1S PRINT SPACEDECB SUB 1 FROM #BITS YET TO PRINTBNE OUTBAPULS 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 SPACESOUT1S 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,$0DFCC "COMPACT FLASH SECTOR READ/WRITE UTILITY"FCB $04CMDMSG FCB $0D,$0AFCC "(R) READ SECTOR "FCC "(W) WRITE SECTOR "FCB $0D,$0AFCC "(N) NEXT SECTOR "FCC "(P) PREV SECTOR "FCB $0D,$0AFCC "(M) MODIFY SECTOR "FCC "(Q) QUIT "FCB $0D,$0AFCC ": "FCB $04SECPMT FCC "SECTOR NUMBER (6 HEX) : "FCB $04SECMSG FCC "SECTOR NUMBER - $"FCB $04MEMMSG FCB $0D,$0AFCC "MEMORY ADDRESS (3 HEX): "FCB $04MSG5 FCC " - "FCB $04MSG2 FCB $00,$00,$0A,$0D,$00,$00,$00,$04WOTMSG FCC "What ?"FCB $0D,$0A,$04PAGMSG FCB $0D,$0AFCC "Hit any key to continue"FCB $04*END START
