;
;**********************************************************************
; oututil.asm - Output String Utilities
;**********************************************************************
;
; created 3/11/98 -jea
; modified 4/17/98 -jea
;
; Several utilites are provided to help generate output strings:
;
; CpyTbl2Out is a macro which takes the program memory table address
; as a parameter and copies the table into the buffer pointed to by
; cmdOutPtr, using FSR0, until reaching a terminating 0.
;
; Hex2Buf and Dec2Buf are functions which convert the value in W
; from hex or decimal to ascii, storing the resulting string in the
; output buffer pointed to by cmdOutPtr. The digit string is then 0
; terminated.
;
; ***** Variables for string utilities *****
;
cblock ; declare bank 0 variables
cnvrtVal ; value to be converted to ascii
cnvrtDigit ; digit currently being converted
endc
;
; ***** Executable code for string utilities *****
;
;*********************************************************************
CpyTbl2Out macro TblAddr
; macro to copy constant ascii strings from program memory to a gpr
; buffer. Uses table reads from program memory and indirect
; addressing, via FSR0, into data memory. Calls Tbl2Buf function
; after initalization of input parameter via macro text substitution
;*********************************************************************
movlw high(TblAddr) ; load upper byte of output string addr
movwf TBLPTRH ; place it in the table pointer hi
movlw low(TblAddr) ; load lower byte of output string addr
movwf TBLPTRL ; place it in the table pointer lo
movfp cmdOutPtr, FSR0 ; load FSR0 with output buffer addr
call Tbl2Buf ; copy string into output buffer
movpf FSR0, cmdOutPtr ; save current output buffer location
endm
;
;*********************************************************************
CpyTbl2Buf macro TblAddr, BufAddr
; macro to copy constant ascii strings from program memory to a gpr
; buffer. Uses table reads from program memory and indirect
; addressing, via FSR0, into data memory. Calls Tbl2Buf function
; after initalization of input parameter via macro text substitution
;*********************************************************************
movlw high(TblAddr) ; load upper byte of output string addr
movwf TBLPTRH ; place it in the table pointer hi
movlw low(TblAddr) ; load lower byte of output string addr
movwf TBLPTRL ; place it in the table pointer lo
movlw BufAddr ; load literal buffer addr into W
movfp WREG, FSR0 ; load FSR0 with buffer addr
call Tbl2Buf ; copy string into output buffer
movpf FSR0, WREG ; put terminating null location in W
endm
;
;**********************************************************************
Tbl2Buf ; Function to copy a program memory table to a ram string buffer
;**********************************************************************
;
; Copy 0 terminated string data from a program memory table to a
; ram buffer. Input consists of the TBLPTRH and L preloaded with
; the table addr and the ram buffer addr in FSR0. On return
; FSR0 contains a pointer to the terminating null. The DataByte
; flag in the cmdFlags register, declared in the Cmd function, is
; used to track whether the last table read was the hi or lo byte.
;
tablrd 0, 1, WREG ; perform dummy read to init TABLAT
bcf cmdFlags, DataByte ; init cmdFlags causing hi read first
TblBfLp ; loop here to copy entire string
btfss cmdFlags, DataByte ; if last table byte read was hi then skip
tlrd 1, INDF0 ; otherwise fetch upper byte
btfsc cmdFlags, DataByte ; if last table byte read was lo then skip
tablrd 0, 1, INDF0 ; otherwise fetch lower byte
btg cmdFlags, DataByte ; toggle bit indicating hi or lo byte read
tstfsz INDF0 ; skip if new value is 0
goto $+2 ; otherwise continue copy
return ; end of string, return from copy
incf FSR0 ; point to next buffer location
goto TblBfLp ; get next string char
;
;**********************************************************************
Dec2Buf ; Function to convert a decimal number into an ascii string buffer
;**********************************************************************
;
; Interprets the input number as decimal and converts it into a
; 0 terminated ascii string. Input is comprised of the number to be
; converted in W and the addr of the string buffer in cmdOutPtr. On
; return cmdOutPtr points to the concatinated 0 termination.
; [ed: see also:
; Binary to BCD half-packed 8 bit to 3 digit
; Binary to BCD packed and ASCII, 32 bit to 10 digits
; ]
movwf cnvrtVal ; store number in cnvrtVal
movfp cmdOutPtr, FSR0 ; load FSR0 with output buffer addr
clrf cnvrtDigit ; init current conversion digit
bcf cmdFlags, Hundreds ; clear hundreds flag
DecHuns ; generate hundreds digit
movlw 99 ; load 99 decimal
cpfsgt cnvrtVal ; skip if cnvrtVal is 3 decimal digits
goto NoDcHns ; otherwise goto no hundreds conversion
incf cnvrtDigit ; increment current digit
movlw 100 ; load 100 decimal
subwf cnvrtVal ; subtract it from cnvrtVal
goto DecHuns ; continue to convert hundreds
NoDcHns ; no more hundreds digits
tstfsz cnvrtDigit ; skip if current digit is 0
goto $+2 ; otherwise setup hundreds digit
goto DecTens ; no hundreds, convert tens
bsf cmdFlags, Hundreds ; set flag indicating hundreds not 0
movlw '0' ; load ascii 0 into W
addwf cnvrtDigit, W ; add cnvrtDigit to ascii 0
movwf INDF0 ; store current digit char into buffer
clrf cnvrtDigit ; clear current digit
incf FSR0 ; increment buffer pointer
DecTens ; generate tens digit
movlw 9 ; load 9 decimal
cpfsgt cnvrtVal ; skip if cnvrtVal is 2 decimal digits
goto NoDcTns ; otherwise goto no tens conversion
incf cnvrtDigit ; increment current digit
movlw 10 ; load 10 decimal
subwf cnvrtVal ; subtract it from cnvrtVal
goto DecTens ; continue to convert tens
NoDcTns ; no more tens digits
tstfsz cnvrtDigit ; skip if current digit is 0
goto $+3 ; otherwise setup tens digit
btfss cmdFlags, Hundreds ; if hundreds nonzero setup anyway
goto DecOnes ; otherwise no tens, convert ones
movlw '0' ; load ascii 0 into W
addwf cnvrtDigit, W ; add cnvrtDigit to ascii 0
movwf INDF0 ; store current digit into buffer
clrf cnvrtDigit ; clear current digit
incf FSR0 ; increment buffer pointer
DecOnes ; generate ones digit unconditionally
movlw '0' ; load ascii 0 into W
addwf cnvrtVal, W ; add remaining cnvrtVal to ascii 0
movwf INDF0 ; store current digit into buffer
incf FSR0 ; increment buffer pointer
clrf INDF0 ; terminate converted string with 0
movpf FSR0, cmdOutPtr ; save current output buffer location
return ; return from convert
;
;**********************************************************************
Hex2Buf ; Function to convert a hex number into an ascii string buffer
;**********************************************************************
;
; Interprets the input number as hexidecimal and converts it into a
; 0 terminated ascii string. Input is comprised of the number to be
; converted in W and the addr of the string buffer in cmdOutPtr. On
; return cmdOutPtr points to the concatinated 0 termination.
;
movwf cnvrtVal ; store number in cnvrtVal
movfp cmdOutPtr, FSR0 ; load FSR0 with output buffer addr
; load upper nibble into cnvrtDigit for conversion
movlw 0xF0 ; load upper nibble mask
andwf cnvrtVal, W ; mask upper nibble into W
movwf cnvrtDigit ; store nibble in current digit
swapf cnvrtDigit ; swap value into lower nibble
; convert current digit to ascii
movlw 9 ; load highest decimal digit
cpfsgt cnvrtDigit ; skip if current digit is greater
goto $+3 ; otherwise convert as decimal
movlw 'A' - 0x0A ; load ascii A - hex A conversion constant
goto $+2 ; goto store char in buffer
; decimal digit
movlw '9' - 0x09 ; load ascii 9 - hex 9 conversion constant
; store converted char in buffer and test for completion
addwf cnvrtDigit, W ; convert to ascci char in W
movwf INDF0 ; store char in buffer
incf FSR0 ; increment buffer pointer
; load lower nibble into cnvrtDigit for conversion
movlw 0x0F ; load lower nibble mask
andwf cnvrtVal, W ; mask lower nibble into W
movwf cnvrtDigit ; store nibble in current digit
; convert current digit to ascii
movlw 9 ; load highest decimal digit
cpfsgt cnvrtDigit ; skip if current digit is greater
goto $+3 ; otherwise convert as decimal
movlw 'A' - 0x0A ; load ascii A - hex A conversion constant
goto $+2 ; goto store char in buffer
; decimal digit
movlw '9' - 0x09 ; load ascii 9 - hex 9 conversion constant
; store converted char in buffer and test for completion
addwf cnvrtDigit, W ; convert to ascci char in W
movwf INDF0 ; store char in buffer
incf FSR0 ; increment buffer pointer
clrf INDF0 ; terminate converted string with 0
movpf FSR0, cmdOutPtr ; save current output buffer location
return ; return from convert
; end of file oututil.asm *****************************************************
file: /Techref/piclist/andrewspicos/oututil.htm, 9KB, , updated: 2000/2/17 10:04, local time: 2024/12/24 22:42,
|
| ©2024 These pages are served without commercial sponsorship. (No popup ads, etc...).Bandwidth abuse increases hosting cost forcing sponsorship or shutdown. This server aggressively defends against automated copying for any reason including offline viewing, duplication, etc... Please respect this requirement and DO NOT RIP THIS SITE. Questions? <A HREF="http://linistepper.com/techref/piclist/andrewspicos/oututil.htm"> piclist andrewspicos oututil</A> |
Did you find what you needed?
|