;***********************************************************************
; TEST_ASC_TO_BIN
; Routine to test ascii to 16 binary conversion
; 41 instructions and cycles.
TEST_ASC_TO_BIN
GLOBAL TEST_ASC_TO_BIN
; load test value
MOVLW D'1'
MOVWF TenK,B
MOVLW D'2'
MOVWF Thou,B
MOVLW D'0'
MOVWF Hun,B
MOVLW D'7'
MOVWF Ten,B
MOVLW D'5'
MOVWF Ones,B
NOP
; these are not needed only used during dev. test
CLRF Hi,B
CLRF Lo,B
; bcd to binary conversion 16 bits ( i.e. max input is 65535 )
; uses nibble math there lowest nibble i calculated first
; the 'overflow' added to the calculation for the second nibble
; etc. upto the third nibble. Then the last additions for the
; fourth nibble which only is affected by ( apart from overflow from lower nibbles )
; the input byte tenk.
; uses factorisation of the decimal weight contants as per this table:
; 0000000000000001= 1 = 1
; 0000000000001010= 10 = 8+2
; 0000000001100100= 100 = 64+32+4
; 0000001111101000= 1000 = 512+256+128+64+32+8
; 0010011100010000= 10000 = 8192+1024+512+256+32
;
; calculation perform according to the following pseudo code:
; Separate each nibble:
;
; 0000 0000 0000 0001= 1 = 1
; 0000 0000 0000 1010= 10 = 8+2
; 0000 0000 0110 0100= 100 = 64+32+4
; 0000 0011 1110 1000= 1000 = 512+256+128+64+32+8
; 0010 0111 0001 0000= 10000 = 8192+1024+512+256+32
;
; Use the variable lo to calculate the result of the lowest nibble:
; lo = Thou*8 + Hun*4 + Ten*(8+2) + Ones
; the result and overflow ( top nibble ) is saved and calculation is perfromed on the second nibble
; by using the variable hi:
; hi = Tenk + Thou*(8+4+2) + Hun*(4+2)
; The low nibble from the result is added to the high nibble from the
; previous calculation of lo:
; lo = hi<<4 + lo
; etc. etc..
;
MOVF Thou,W ; w = thou
ADDWF Ten,W ; w = thou + ten
MOVWF Lo ; lo = thou + ten
ADDWF Lo,W ; w = 2*(thou + ten)
ADDWF Hun,W ; w = 2*(thou + ten) + hun
MOVWF Lo ; lo = 2*(thou + ten) + hun
ADDWF Lo,W ; w = 2*(2*(thou + ten) + hun)
ADDWF Ten,W ; w = 2*(2*(thou + ten) + hun)+ten
MOVWF Lo ; lo = 2*(2*(thou + ten) + hun)+ten
ADDWF Lo,W ; w = 2*(2*(2*(thou + ten) + hun))
ADDWF Ones,W ; w = 2*(2*(2*(thou + ten) + hun)) + ones
MOVWF Lo ; lo = 2*(2*(2*(thou + ten) + hun)) + ones = 8*Thou + 10*ten + 4*hun + ones
; low byte lowest nibble now fully calculated in lo
; now we calculate high nibble lo byte by using hi as temp storage
MOVF Thou,W ; w =Thou
ADDWF Thou,W ; w = 2 * Thou
ADDWF Hun,W ; w = 2 * Thou + hun
ADDWF Thou,W ; w = 2 * Thou + hun + thou
MOVWF Hi ; hi = 2 * Thou + hun + thou
ADDWF Hi,W ; w = 2*(2 * Thou + hun + thou) = 6*thou + 2*hun
ADDWF Thou,W ; w = 6*thou + 2*hun + thou
ADDWF Hun,W ; w = 6*thou + 2*hun + thou + hun
MOVWF Hi ; hi = 6*thou + 2*hun + thou + hun
ADDWF Hi,W ; w = 2* ( 6*thou + 2*hun + thou + hun )) = 14*thou + 6*hun
ADDWF TenK,W ; w = 14*thou + 6*hun + tenk
MOVWF Hi ; hi = 14*thou + 6*hun + tenk
; low byte high nibble fully calculated in hi
; now we need to add the low nibble to previous content in lo ( from low nibble calc. )
SWAPF Hi,W ; swap nibbles ( lownibble->high )
ANDLW 0xF0 ; mask out high nibble
ADDWF Lo,F ; add result to lo byte ( note carry checked 4 rows down ! )
SWAPF Hi,W ; swap nibbles ( high nibble->low )
ANDLW 0x0F ; mask out low nibble
BTFSC STATUS,C ; now we check the carry from the addition of the lo byte
ADDLW 0x01 ; in case of ripple carry we add one to hi byte
MOVWF Hi ; Hi = overflow(lo)
; now we have overflow from lo byte caculation in Hi therefor we cannot use the hi byte temporarily
; the following calculation must be performed in w only ( I just whish an temp was available :)
; or one could trash the input....)
RLF TenK,W ; w = 2*tenk
ADDWF TenK,W ; w = 3*tenk
ADDWF TenK,W ; w = 4*tenk
ADDWF TenK,W ; w = 5*tenk
ADDWF TenK,W ; w = 6*tenk
ADDWF TenK,W ; w = 7*tenk
ADDWF Thou,W ; w = 7*tenk + thou
ADDWF Thou,W ; w = 7*tenk + 2*thou
ADDWF Thou,W ; w = 7*tenk + 3*thou
ADDWF Hi,F ; add it to the overflow from lo
SWAPF TenK,W ; w = 32 * tenk
ADDWF Hi,F ; hi = 7*tenk + 3*thou + 32*Tenk
ADDWF Hi,F ; hi = 7*tenk + 3*thou + 32*Tenk + 32*Tenk = 7*tenk + 3*thou + 64*Tenk
NOP
RETURN
Questions:
It is easy ,i think ,that converting not less than 5 bytes of unpacked BCD to binary. in my project, i want to convert 8 bytes unpacked BCD to binary ,who can tell me how to do? thanks!