please dont rip this site

8051 Divide 32bits by 16bits

by Andrew David, Software Manager, Ultronics Ltd http://www.Ultronics.com
; Divide 16 bit number in R7,R6 by 8 bit number in B. Put result in A.

div16:  CJNE  R6,#0,calcdiv
        CJNE  R7,#0,calcdiv
        MOV   R2,#0             ; If R7:R6 is 0, then result is 0
        LJMP  dend

calcdiv:CLR   C
        MOV   A,B
        RRC   A
        MOV   R5,A

        MOV   A,#0
        RRC   A
        MOV   R4,A              ; R5,R4 is the initial divisor

        MOV   R2,#0             ; Result
        MOV   R3,#80h           ; Bit value for result

dloop:  MOV   A,R6
        CLR   C
        SUBB  A,R4              ; LS Byte subtract
        MOV   R1,A

        MOV   A,R7
        SUBB  A,R5              ; MS Byte subtract
        JC    set0              ; If carry set, subtract was not possible

        MOV   R7,A
        MOV   A,R1
        MOV   R6,A              ; R7,R6 is the new value to subtract from

        MOV   A,R2
        ADD   A,R3
        MOV   R2,A              ; Set bit in result

set0:   CLR   C
        MOV   A,R3
        RRC   A
        MOV   R3,A              ; New bit value for result
        JZ    dend              ; all bits have been done

        CLR   C
        MOV   A,R5
        RRC   A
        MOV   R5,A
        MOV   A,R4
        RRC   A
        MOV   R4,A              ; R5,R4 is new divisor

        LJMP  dloop             ; do next bit

dend:   MOV   A,R2              ; Result in A
        RET






; Divide 20 bit number in R7:R6:R5 by 10 bit number in R3:R2.
; Put result in A:B.

div20:  MOV   A,R5
        ORL   A,R6
        ORL   A,R7
        JNZ   caldiv

        SETB  RS0               ; Reg bank 1
        MOV   R7,#0
        MOV   R6,#0             ; If R7:R6:R5 is 0, then result is 0
        CLR   RS0               ; Reg bank 0
        LJMP  d20end

caldiv: MOV   R4,#0
        MOV   R1,#3             ; Divisor is already 6 left. Shift another
3.

shftsub:CLR   C
        MOV   A,R2
        RLC   A
        MOV   R2,A
        MOV   A,R3
        RLC   A
        MOV   R3,A
        MOV   A,R4
        RLC   A
        MOV   R4,A
        DJNZ  R1,shftsub        ; R4:R3:R2 is the initial sutractor

        SETB  RS0               ; Reg bank 1
        MOV   R7,#0
        MOV   R6,#0             ; Result in R7:R6 bank 1
        MOV   R5,#80h
        MOV   R4,#0             ; Bit value for result in R5:R4 bank 1
        CLR   RS0               ; Reg bank 0

d20loop:CLR   C
        MOV   A,R5
        SUBB  A,R2              ; LS Byte subtract
        MOV   R0,A

        MOV   A,R6
        SUBB  A,R3              ; Mid Byte subtract
        MOV   R1,A

        MOV   A,R7
        SUBB  A,R4              ; MS Byte subtract
        JC    res0              ; If carry set, subtract was not possible

        MOV   R7,A
        MOV   A,R1
        MOV   R6,A
        MOV   A,R0
        MOV   R5,A              ; Update subtractee

        SETB  RS0               ; Reg bank 1
        MOV   A,R6
        ORL   A,R4
        MOV   R6,A              ; Set bit in result LS Byte
        MOV   A,R7
        ORL   A,R5
        MOV   R7,A              ; Set bit in result MS Byte

res0:   SETB  RS0               ; Reg bank 1
        CLR   C
        MOV   A,R5
        RRC   A
        MOV   R5,A
        MOV   A,R4
        RRC   A
        MOV   R4,A              ; New bit value for result
        ANL   A,#20h
        CLR   RS0               ; Reg bank 0
        JNZ   d20end            ; all bits have been done

        CLR   C
        MOV   A,R4
        RRC   A
        MOV   R4,A
        MOV   A,R3
        RRC   A
        MOV   R3,A
        MOV   A,R2
        RRC   A
        MOV   R2,A              ; R4:R3:R2 is the new subtractor

        LJMP  d20loop           ; do next bit

d20end: SETB  RS0               ; Reg bank 1
        MOV   A,R7
        MOV   B,R6              ; Result in A:B
        CLR   RS0               ; Reg bank 0

        RET

See:


file: /Techref/8051/div32by16-ad.htm, 4KB, , updated: 2007/9/25 14:24, local time: 2024/10/31 21:45, owner: JMN-EFP-786,
TOP NEW HELP FIND: 
3.147.55.35:LOG IN
©2024 PLEASE DON'T RIP! THIS SITE CLOSES OCT 28, 2024 SO LONG AND THANKS FOR ALL THE FISH!

 ©2024 These pages are served without commercial sponsorship. (No popup ads, etc...).Bandwidth abuse increases hosting cost forcing sponsorship or shutdown. This server aggressively defends against automated copying for any reason including offline viewing, duplication, etc... Please respect this requirement and DO NOT RIP THIS SITE. Questions?
Please DO link to this page! Digg it! / MAKE!

<A HREF="http://linistepper.com/techref/8051/div32by16-ad.htm"> Divide 32bits by 16bits</A>

After you find an appropriate page, you are invited to your to this massmind site! (posts will be visible only to you before review) Just type a nice message (short messages are blocked as spam) in the box and press the Post button. (HTML welcomed, but not the <A tag: Instead, use the link box to link to another page. A tutorial is available Members can login to post directly, become page editors, and be credited for their posts.


Link? Put it here: 
if you want a response, please enter your email address: 
Attn spammers: All posts are reviewed before being made visible to anyone other than the poster.
Did you find what you needed?