list P=16F877 #include __CONFIG _CP_OFF & _WDT_OFF & _XT_OSC & _LVP_OFF cblock 0x20 ACb3 ; 32-bit Accumulator b, lsb+3, ms-byte ACb2 ; 32-bit Accumulator b, lsb+2 ACb1 ; 32-bit Accumulator b, lsb+1 ACb0 ; 32-bit Accumulator b, ls-byte BCD9 ; 10^9, billions BCD8 ; 10^8 BCD7 ; 10^7 BCD6 ; 10^6, millions BCD5 ; 10^5 BCD4 ; 10^4 BCD3 ; 10^3, thousands BCD2 ; 10^2 BCD1 ; 10^1 BCD0 ; 10^0 bitcnt ; bit count digcnt ; digit count c_hold ; Carry bit hold endc org 0 nop ; required for ICD clrf PCLATH ; ensure page bits are cleared movlw 0xFF movwf ACb3 movlw 0xFF ; loads ACb = FF FF FF FF movwf ACb2 movlw 0xFF movwf ACb1 movlw 0xFF movwf ACb0 call Q_b2bcd not nop goto not ; ;============================================================================ ; Quadruple Precision (32-bit) unsigned Binary to BCD conversion ; BCD9 to BCD0 comprise one ten digit unpacked Binary-Coded-Decimal number. ; The upper nibble of each digit is zero (00008421). BCD9 is the MS-Digit. ; ACb3 to ACb0 comprise a four-byte (32-bit) binary accumulator. ; ACb3 is the MS-Byte. ; The 32-bit binary number in ACb in converted to a ten digit BCD number. ; Q_b2bcd clrf BCD9 ;Clear all bcd digits clrf BCD8 clrf BCD7 clrf BCD6 clrf BCD5 clrf BCD4 clrf BCD3 clrf BCD2 clrf BCD1 clrf BCD0 movlw D'32' ;Outer loop movwf bitcnt ; bit counter b2bcd1 rlf ACb0,f ;Shift 32-bit accumulator rlf ACb1,f ; left to rlf ACb2,f ; put ms-bit rlf ACb3,f ; into Carry movlw BCD0 ;Point to address of least movwf FSR ; significant bcd digit movlw D'10' ;Inner loop movwf digcnt ; digit counter b2bcd2 rlf INDF,f ;Shift Carry into bcd digit movlw D'10' ;Subtract ten from digit then subwf INDF,w ; check and adjust for decimal overflow btfsc STATUS,C ;If Carry = 1 (result >= 0) movwf INDF ; adjust for decimal overflow decf FSR,f ;Point to next bcd digit decfsz digcnt,f ;Decrement digit counter goto b2bcd2 ; - go if digcnt > 0 decfsz bitcnt,f ;Decrement bit counter goto b2bcd1 ; - go if bitcnt > 0 return end