Difference between revisions of "Programming:Integer Division"

From CPCWiki - THE Amstrad CPC encyclopedia!
Jump to: navigation, search
Line 1: Line 1:
 +
== 16bit division ==
 +
 +
'''Input:''' BC=Value1, DE=Value2
 +
 +
'''Output:''' HL=Value1/Value2, DE=Value1 MOD Value2
 +
 +
'''Destroyed:''' AF,BC
 +
 +
<pre>
 +
clcd16  ld a,e
 +
        or d
 +
        ld hl,0
 +
        ret z
 +
        ld a,b
 +
        ld b,16
 +
clcd161 rl c
 +
        rla
 +
        rl l
 +
        rl h
 +
        sbc hl,de
 +
        jr nc,clcd162
 +
        add hl,de
 +
clcd162 ccf
 +
        djnz clcd161
 +
        ex de,hl
 +
        rl c
 +
        rla
 +
        ld h,a
 +
        ld l,c
 +
        ret
 +
</pre>
 +
 +
== 24bit division ==
 +
 +
'''Input:''' A,BC=Value1, DE=Value2
 +
 +
'''Output:''' HL=Value1/Value2, DE=Value1 MOD Value2
 +
 +
'''Destroyed:''' AF,BC,IX,IYL
 +
 +
<pre>
 +
clcdiv  db #dd:ld l,e
 +
        db #dd:ld h,d  ;IX=Value2
 +
        ld e,a          ;E,BC=Value1(Counter)
 +
        ld hl,0
 +
        db #dd:ld a,l
 +
        db #dd:or h
 +
        ret z
 +
        ld d,l          ;D,HL=CalcVar
 +
        db #fd:ld l,24  ;IYL=Counter
 +
clcdiv1 rl c
 +
        rl b
 +
        rl e
 +
        rl l
 +
        rl h
 +
        rl d
 +
        ld a,l
 +
        db #dd:sub l
 +
        ld l,a
 +
        ld a,h
 +
        db #dd:sbc h
 +
        ld h,a
 +
        ld a,d
 +
        sbc 0
 +
        ld d,a          ;D,HL=D,HL-IX
 +
        jr nc,clcdiv2
 +
        ld a,l
 +
        db #dd:add l
 +
        ld l,a
 +
        ld a,h
 +
        db #dd:adc h
 +
        ld h,a
 +
        ld a,d
 +
        adc 0
 +
        ld d,a
 +
        scf
 +
clcdiv2 ccf
 +
        db #fd:dec l
 +
        jr nz,clcdiv1
 +
        ex de,hl        ;DE=Value1 MOD Value2
 +
        rl c
 +
        rl b
 +
        ld l,c
 +
        ld h,b          ;HL=Value1 DIV Value2
 +
        ret
 +
</pre>
 +
 
== 32bit division ==
 
== 32bit division ==
  

Revision as of 20:40, 4 August 2006

16bit division

Input: BC=Value1, DE=Value2

Output: HL=Value1/Value2, DE=Value1 MOD Value2

Destroyed: AF,BC

clcd16  ld a,e
        or d
        ld hl,0
        ret z
        ld a,b
        ld b,16
clcd161 rl c
        rla
        rl l
        rl h
        sbc hl,de
        jr nc,clcd162
        add hl,de
clcd162 ccf
        djnz clcd161
        ex de,hl
        rl c
        rla
        ld h,a
        ld l,c
        ret

24bit division

Input: A,BC=Value1, DE=Value2

Output: HL=Value1/Value2, DE=Value1 MOD Value2

Destroyed: AF,BC,IX,IYL

clcdiv  db #dd:ld l,e
        db #dd:ld h,d   ;IX=Value2
        ld e,a          ;E,BC=Value1(Counter)
        ld hl,0
        db #dd:ld a,l
        db #dd:or h
        ret z
        ld d,l          ;D,HL=CalcVar
        db #fd:ld l,24  ;IYL=Counter
clcdiv1 rl c
        rl b
        rl e
        rl l
        rl h
        rl d
        ld a,l
        db #dd:sub l
        ld l,a
        ld a,h
        db #dd:sbc h
        ld h,a
        ld a,d
        sbc 0
        ld d,a          ;D,HL=D,HL-IX
        jr nc,clcdiv2
        ld a,l
        db #dd:add l
        ld l,a
        ld a,h
        db #dd:adc h
        ld h,a
        ld a,d
        adc 0
        ld d,a
        scf
clcdiv2 ccf
        db #fd:dec l
        jr nz,clcdiv1
        ex de,hl        ;DE=Value1 MOD Value2
        rl c
        rl b
        ld l,c
        ld h,b          ;HL=Value1 DIV Value2
        ret

32bit division

Input: IY,BC=Value1, IX=Value2

Output: IY,BC=Value1/Value2, HL=Value1 MOD Value2

Destroyed: AF,DE,IY

clcd32c db 0
clcd32  ld hl,0
        db #dd:ld a,l
        db #dd:or h
        ret z           ;IY,BC=Value1(Counter)
        ld de,0         ;DE,HL=CalcVar
        ld a,32         ;Set Counter to 32
clcd321 ld (clcd32c),a
        rl c
        rl b
        db #fd:ld a,l:rla:db #fd:ld l,a
        db #fd:ld a,h:rla:db #fd:ld h,a
        rl l
        rl h
        rl e
        rl d
        ld a,l
        db #dd:sub l
        ld l,a
        ld a,h
        db #dd:sbc h
        ld h,a
        ld a,e
        sbc 0
        ld e,a
        ld a,d
        sbc 0
        ld d,a
        jr nc,clcd322
        ld a,l
        db #dd:add l
        ld l,a
        ld a,h
        db #dd:adc h
        ld h,a
        ld a,e
        adc 0
        ld e,a
        ld a,d
        adc 0
        ld d,a
        scf
clcd322 ccf
        ld a,(clcd32c)
        dec a
        jr nz,clcd321   ;HL=Value1 MOD Value2
        rl c
        rl b
        db #fd:ld a,l:rla:db #fd:ld l,a
        db #fd:ld a,h:rla:db #fd:ld h,a
        ret             ;IY,BC=Value1 DIV Value2