Difference between revisions of "Programming:Integer Division"
From CPCWiki - THE Amstrad CPC encyclopedia!
| 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