ON 20090424@10:20:35 AM at page: On a web page you were interested in at: http://www.piclist.com/techref/member/LPL-AEA-Z85/index.htm#39927.4309606481 Lewis Paul Lineberger[LPL-AEA-Z85] Code:
;**************************************************************************
;Div4824U
;Inputs:
; x - x:6 (x) (0 - least significant!)
; y - Test:3 (y) (0 - least significant!)
;Temporary:
; Counter - Count
; Shift - Shift:6 (mathint)
;Output:
; Quotient - x:6 (x) (0 - least significant!)
; Remainder- Rem:3 (0 - least significant!)
;
;Adaptation to PIC 12/16 Assembly and error fix of code by Frank Finster 3/15/2005
;by Lewis Lineberger 4/24/2009
;Fixes overrun in Rem+2 when upper bit of y+2 and Rem+2 are set, but Rem+2 is still
;less than y+2. Overrun is illustrated by 0x34631A9FC / 0xDD39E9.
;Adaptation of 24x24 division by Tony Nixon with corrections
;PIC18 assembly instructions in comments for easy adaptation.
;by Frank Finster 3/15/2005.
;Code adapted by Andy Lee
;01-Sep-2006 Original version
;**************************************************************************
Div4824U
;---------------------------------------------------
; SUBROUTINE - 48 by 24 BIT division
movlw d'48'
movwf Count
; movff x+0, Shift+0
movf x+0, W
movwf mathint+0
; movff x+1, Shift+1
movf x+1, W
movwf mathint+1
; movff x+2, Shift+2
movf x+2, W
movwf mathint+2
; movff x+3, Shift+3
movf x+3, W
movwf mathint+3
; movff x+4, Shift+4
movf x+4, W
movwf mathint+4
; movff x+5, Shift+5
movf x+5, W
movwf mathint+5
clrf x+0
clrf x+1
clrf x+2
clrf x+3
clrf x+4
clrf x+5
clrf Rem+2
clrf Rem+1
clrf Rem+0
dloop
bcf STATUS, C
rlf mathint+0, F
rlf mathint+1, F
rlf mathint+2, F
rlf mathint+3, F
rlf mathint+4, F
rlf mathint+5, F
rlf Rem+0, F
rlf Rem+1, F
rlf Rem+2, F
btfsc STATUS, C ; overrun
goto subtract
movf y+2, w
subwf Rem+2, w
btfss STATUS, Z
goto nochk
;bra nochk
movf y+1,w
subwf Rem+1,w
btfss STATUS, Z
goto nochk
;bra nochk
movf y+0,w
subwf Rem+0,w
nochk
btfss STATUS, C ; Rem >= y
goto nogo
;bra nogo
subtract movf y+0,w
subwf Rem+0, F
btfsc STATUS, C
goto nodec_remainM
;bra nodec_remainM
decf Rem+1, f
movf Rem+1, w
xorlw 0xff
btfsc STATUS, Z
decf Rem+2, f
nodec_remainM
movf y+1, w
subwf Rem+1, f
btfss STATUS, C
decf Rem+2, f
movf y+2, w
subwf Rem+2, f
bsf STATUS, C
nogo
rlf x+0, F
rlf x+1, F
rlf x+2, F
rlf x+3, F
rlf x+4, F
rlf x+5, F
decfsz Count, f
goto dloop
return