;------------------------------------------------------------ ; ; bcd addition routines ; ; adds A bcd+ B => A ; a consists of al,am,ah,ahh and ahhh ; b consists of bl,bm,ah,bhh ; ; This takes 64 cycles for an 8 digit bcd add. ; ; bcdABA A bcd+ B => A ; ; bcdBBB B bcd+ B => B ; ; bcdBinDec convert binary in C bcd in A ; ; #define buildbcdBinDec24 ; bcdABA48 A bcd+ B => A ; ; bcdBBB48 B bcd+ B => B ; ; bcdBinDec28 convert binary in C bcd in A ; ; #define buildbcdBinDec16 ; bcdABA24 A bcd+ B => A ; ; bcdBBB24 B bcd+ B => B ; ; bcdBinDec16 convert binary in C bcd in A ; ; #define buildbcdBinDec8 ; bcdABA16 A bcd+ B => A ; ; bcdBBB16 B bcd+ B => B ; ; bcdBinDec8 convert binary in C bcd in A ; ; ; ahhh,ahh,ah,am,al - 8 digit + carry ; bhhh,bhh,bh,bm,bl - 8 digit plus carry ; ch,cm,cl - 24 bit binary ; ; D H Rice, Copyright Aug 1999 ; ;------------------------------------------------------------ ; currently all files are required cblock ahh ah am al bhh bh bm bl savedStatus ; used for storing binary ; cl ; cm ; ch cnt endc bcdAddByte macro a1, b1 ; routine to A bcd+ B => A ; bcd add al + bl and carry ; 0 6 9 ; 0 6 9 ; == == == ; 0 0C 12 ; no dc no dc dc ; ; +6 +6 +6 ; == == == ; 6 12 18 ; no dc dc no dc ; ; if no dc every took place subtract 6 movfw b1 addwf a1,f ; ; now add carry from last addition ; btfsc savedStatus,C incf a1,f movfw STATUS movwf savedStatus movlw 0x66 addwf a1,f movfw STATUS iorwf savedStatus,f movlw 0 btfss savedStatus,DC iorlw 0x06 ; defer this carry until next expansion of the macro ; btfsc savedStatus,C ; incf a2,f btfss savedStatus,C iorlw 0x60 subwf a1,f ; savedStatus is carried into next endm ;----------------------------------------------------------------------- ifdef buildbcdBinDec24 bcdABA48 clrf savedStatus bcdAddByte al,bl bcdAddByte am,bm bcdAddByte ah,bh bcdAddByte ahh,bhh return bcdBBB48 clrf savedStatus bcdAddByte bl,bl bcdAddByte bm,bm bcdAddByte bh,bh bcdAddByte bhh,bhh return bcdBinDec24 ; ; convert binary in C to BCD in A ; converting FF FF FF takes 3495 cycles ; converting 00 00 00 takes 1863 cycles ; movlw 0x00 movwf al movwf am movwf ah movwf ahh movwf bl movwf bm movwf bh movwf bhh incf bl,f movlw .24 movwf cnt bcdBinDec24_0 ; this could test rrf ch,f rrf cm,f rrf cl,f ; LSB is now in C skpnc call bcdABA48 ; bcd double call bcdBBB48 decfsz cnt goto bcdBinDec24_0 return endif ;----------------------------------------------------------------------- ifdef buildbcdBinDec16 bcdABA24 clrf savedStatus bcdAddByte al,bl bcdAddByte am,bm bcdAddByte ah,bh return bcdBBB24 clrf savedStatus bcdAddByte bl,bl bcdAddByte bm,bm bcdAddByte bh,bh return bcdBinDec16 ; ; convert binary in C to BCD in A ; converting FF FF takes 1805 cycles ; converting 00 00 takes 1337 cycles ; movlw 0x00 movwf al movwf am movwf ah movwf bl movwf bm movwf bh incf bl,f movlw .16 movwf cnt bcdBinDec16_0 ; this could test ; rrf ch,f rrf cm,f rrf cl,f ; LSB is now in C skpnc call bcdABA24 ; bcd double call bcdBBB24 decfsz cnt goto bcdBinDec16_0 return endif ;----------------------------------------------------------------------- ifdef buildbcdBinDec8 bcdABA16 clrf savedStatus bcdAddByte al,bl bcdAddByte am,bm return bcdBBB16 clrf savedStatus bcdAddByte bl,bl bcdAddByte bm,bm return bcdBinDec8 ; ; convert binary in C to BCD in A ; converting FF takes 645 cycles ; converting 00 takes 357 cycles ; movlw 0x00 movwf al movwf am movwf ah movwf bl movwf bm movwf bh incf bl,f movlw .8 movwf cnt bcdBinDec8_0 ; this could test rrf cl,f ; LSB is now in C skpnc call bcdABA16 ; bcd double call bcdBBB16 decfsz cnt goto bcdBinDec8_0 return endif