URL
https://opencores.org/ocsvn/System09/System09/trunk
Subversion Repositories System09
[/] [System09/] [trunk/] [src/] [dump/] [dump_cf8.asm] - Rev 223
Go to most recent revision | Compare with Previous | Blame | View Log
** 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 $E040CF_DATA EQU CF_BASE+0CF_ERROR EQU CF_BASE+1 ; read errorCF_FEATURE EQU CF_BASE+1 ; write featureCF_SECCNT EQU CF_BASE+2CF_SECNUM EQU CF_BASE+3CF_CYLLO EQU CF_BASE+4CF_CYLHI EQU CF_BASE+5CF_HEAD EQU CF_BASE+6CF_STATUS EQU CF_BASE+7 ; read statusCF_COMAND EQU CF_BASE+7 ; write command** Command Equates*CMDREAD EQU $20 ; Read Single sectorCMDWRITE EQU $30 ; Write Single sectorCMDFEATURE EQU $EFFEAT8BIT EQU $01 ; enable 8 bit transfersHEADLBA 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 #512ZEROLP CLR ,X+LEAY -1,YBNE ZEROLP** INITIALIZE CF CARD FOR 8 BIT LBA MODE*JSR WAITRDYLDA #HEADLBASTA CF_HEADJSR WAITRDYLDA #FEAT8BITSTA CF_FEATURELDA #CMDFEATURESTA CF_COMANDJSR 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 QUITLDX #WOTMSGJSR PSTRNGBRA CMDLP** QUIT*QUIT JMP [$F800]** 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 LDA #$01STA CF_SECCNTLDA SECNUM+2STA CF_SECNUMLDA SECNUM+1STA CF_CYLLOLDA SECNUM+0STA CF_CYLHI*LDA #CMDREAD ; IDE READ MULTIPLESTA CF_COMANDJSR WAITRDY*LDX #SECBUFLDY #512** READ LOOP*RDLOOP JSR WAITDRQLDA CF_DATASTA ,X+LEAY -1,YBNE RDLOOP*JSR WAITRDYJSR MEMDUMPRDEXIT JMP CMDLP** WRITE SECTOR TO CF*WRITE LDX #SECPMTJSR PSTRNGJSR IN6HEXBVS WREXITSTB SECNUMSTX SECNUM+1*LDA #$01STA CF_SECCNTLDA SECNUM+2STA CF_SECNUMLDA SECNUM+1STA CF_CYLLOLDA SECNUM+0STA CF_CYLHI*LDA #CMDWRITE; IDE WRITE MULTIPLESTA CF_COMANDJSR WAITRDY*LDX #SECBUFLDY #512** WRITE LOOP*WRLOOP JSR WAITDRQLDA ,X+STA CF_DATALEAY -1,YBNE WRLOOP*JSR WAITRDYWREXIT JMP CMDLP** WAIT UNTIL READY*WAITRDY LDA CF_STATUSBITA #BUSYBNE WAITRDYLDA CF_STATUSBITA #DRDYBEQ WAITRDYRTS** WAIT FOR DATA REQUEST*WAITDRQ LDA CF_STATUSBITA #DRQBEQ WAITDRQRTS** DUMP SECTOR IN MEMORY*MEMDUMP LDX #SECMSGJSR PSTRNGLDA SECNUMJSR OUT2HLDX SECNUM+1JSR OUT4HJSR PCRLFLDY #$0000LEAX #$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-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 BSR PCRLF PRINT CR/LFBRA PDATA PRINT STRING POINTED TO BY IX** PCRLF*PCRLF PSHS X SAVE IXLDX #MSG2+1 POINT TO MSG CR/LF + 3 NULSBSR PDATA PRINT MSGPULS X,PC RESTORE IXPRINT BSR OUTCH** PDATA*PDATA LDA ,X+ GET 1st CHAR. TO PRINTCMPA #4 IS IT EOT?BNE PRINT IF NOT EOT PRINT ITRTS ;**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 TERMINALANDA #$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 IXGETSTA LDX CPORT POINT TO TERMINAL PORTLDA ,X FETCH PORT STATUSBITA #1 TEST READY BIT, RDRF ?BEQ GETSTA IF NOT RDY, THEN TRY AGAINGETST1 LDA 1,X FETCH CHARPULS 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 STATUSBITA #1 TEST READY BIT, RDRF ?INCHEK1 PULS A,PC RESTORE A ACCUM.*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 PSHS A,X SAVE A ACCUM AND IXLDX CPORT GET ADDR. OF TERMINALFETSTA LDA ,X FETCH PORT STATUSBITA #2 TEST TDRE, OK TO XMIT ?BEQ FETSTA IF NOT LOOP UNTIL RDYPULS A GET CHAR. FOR XMITSTA 1,X XMIT CHAR.PULS X,PC RESTORE IX**ACINIZ LDX CPORT POINT TO CONTROL PORT ADDRESSLDA #3 RESET ACIA PORT CODESTA ,X STORE IN CONTROL REGISTERLDA #$11 SET 8 DATA, 2 STOP AN 0 PARITYSTA ,X STORE IN CONTROL REGISTERTST 1,X ANYTHING IN DATA REGISTER?LDA #$FF TURN ON ECHO FLAGSTA ECHORTS** MESSAGE STRINGS*TTLMSG FCB $0A,$0DFCC "COMPACT FLASH SECTOR READ/WRITE UTILITY"FCB $04CMDMSG FCB $0A,$0DFCC "(R) READ SECTOR"FCB $0A,$0DFCC "(W) WRITE SECTOR"FCB $0A,$0DFCC "(N) NEXT SECTOR"FCB $0A,$0DFCC "(P) PREV SECTOR"FCB $0A,$0DFCC "(M) MODIFY SECTOR"FCB $0A,$0DFCC "(Q) QUIT"FCB $0A,$0DFCC ": "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,$04*END START
Go to most recent revision | Compare with Previous | Blame | View Log
