; ;********************************************************************** ; 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 11:04, local time: 2024/8/14 13:01,
3.133.109.145:LOG IN
|
©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://piclist.com/techref/piclist/andrewspicos/oututil.htm"> piclist andrewspicos oututil</A> |
Did you find what you needed? |
PICList 2024 contributors:
o List host: MIT, Site host massmind.org, Top posters @none found - Page Editors: James Newton, David Cary, and YOU! * Roman Black of Black Robotics donates from sales of Linistep stepper controller kits. * Ashley Roll of Digital Nemesis donates from sales of RCL-1 RS232 to TTL converters. * Monthly Subscribers: Gregg Rew. on-going support is MOST appreciated! * Contributors: Richard Seriani, Sr. |
Welcome to piclist.com! |
.