Changes

Jump to: navigation, search

Programming:Integer Division

1,499 bytes added, 01:40, 5 August 2006
== 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 ==