ON 20050317@5:33:07 PM at page: http://www.piclist.com/microchip/math/div/24by24tn.htm#38426.8549305556 James Newton[JMN-EFP-786] published post 38426.8549305556 programsetc@netscape.net shares this code:
|Delete 'P-' before: '' but after: 'Correcting High byte remainder error and added comments to Tony Nixon Code and Fred Mahers update to the 24bit by 24bit divide routine. Thank you all for the USEFUL Code references and comments here. note Nikolai Golovchenko and Zet P. Fred Finster 3/15/2005 Error Corrected Numerator Denominator Remainder Answer Divisor Remainder FFFFFF FFFFFE FF0001 000001 FFFFFE 000001 8FFFFF 8FFFFE FF0001 000001 8FFFFE 000001 2FFFFF 2FFFFE FF0001 000001 2FFFFE 000001 2FFFFE 2FFFFE 000001 2FFFFE 000000 2FFFFD 2FFFFE 000000 2FFFFE 2FFFFD 0F4240 004240 00003A 004240 003FC0 ;----------------------------------------------------- ; Here is the changed code, that corrects the HIGH byte remainder error ; btfsc STATUS, C ; Carry Set? Then execute fixup code for when a borrow is generated ; goto nodec_remainM ; when no borrow bit is needed from the higher byte positions. ; ; ;-------------------------------------------------------------------- ; SUBROUTINE - 24 BIT DIVISION from TONY NIXON ; numerator: nratorH nratorM nratorL ; denominator: denomH denomM denomL ; ; result: nratorH nratorM nratorL ; remainder: remainH remainM remainL ; Divide_24x24: movlw .24 ; set decimal 24 loop count movwf BCount movf nratorH,w ; copy Numerator into Shift Holding ram registers movwf shiftH movf nratorM,w movwf shiftM movf nratorL,w movwf shiftL clrf nratorH ; clear final Answer Numerator Ram locations clrf nratorM clrf nratorL ; clrf remainH ; clear final Answer Remainder Ram locations clrf remainM clrf remainL dloop: bcf STATUS, C ; bit clear Carry Flag in STATUS register rlf shiftL, f ; Shift numerator(dividend) Left to move rlf shiftM, f ; next bit to remainder rlf shiftH, f ; and shift in next bit of result rlf remainL, f ; shift carry (next Dividend bit) into remainder rlf remainM, f rlf remainH, f movf denomH,w subwf remainH,w ; subtract divsor(denomH) from(newly shifted left) Remainder HIGH byte. btfss STATUS, Z goto nochk ; skip if result was ZERO from good subtraction result ; movf denomM,w subwf remainM,w ; subtract divsor(denomM) from(newly shifted left) Remainder MIDDLE byte. btfss STATUS, Z goto nochk ; skip if result was ZERO from good subtraction result ; movf denomL,w subwf remainL,w ; subtract divsor(denomL) from(newly shifted left) Remainder LOW byte. nochk: btfss STATUS, C ; Carry SET? then denom is larger than reemainder goto nogo ; movf denomL,w subwf remainL, f ; Subtract denominator from remainder value in Low Byte btfsc STATUS, C ; Carry Set? Then execute fixup code for when a borrow is generated goto nodec_remainM ; when no borrow bit is needed from the higher byte positions. decf remainM, f ; Decrement to Borrow from Middle Byte, because carry was SET. movf remainM,w xorlw 0xff ; Check if rollover from Borrow occurred. remainM value went from 0 to 0xFF btfsc STATUS, Z decf remainH, f ; ZERO bit set, yes rollover, so Decrement to Borrow from High Byte, too! nodec_remainM: movf denomM,w subwf remainM, f ; Subtract denominator from remainder value in Middle Byte btfss STATUS, C decf remainH ,f ; Decrement High Byte, to borrow 1 bit movf denomH,w subwf remainH, f ; Subtract denominator from remainder value in High Byte bsf STATUS, C ; set CARRY bit to rotate in Numerator Result next. nogo: rlf nratorL, f ; rotate Numerator result left 1 bit rlf nratorM, f rlf nratorH, f decfsz BCount, f ; decrement the Loop Bit Counter goto dloop ; return ; all done