Changes

Jump to: navigation, search

Programming:Integer Division

2,048 bytes added, 13:27, 26 December 2015
/* Fast 32bit division */ a bit faster
== 8bit division ==
 
'''Input:''' HL=Value1, C=Value2
 
'''Output:''' L=Value1/Value2, H=Value1 MOD Value2
 
'''Destroyed:''' AF,BC
 
<pre>
LD B,8
Div_Next:
ADD HL,HL
LD A,H
SUB C
JR C,Div_NXTB
LD H,A
INC L
Div_NXTB:
DJNZ Div_Next
RET
</pre>
 
== 16bit division ==
clcd161 rl c
rla
rl l rl hadc hl,hl
sbc hl,de
jr nc,clcd162
'''Destroyed:''' AF,DE,IY
 
'''CPC Cycles:''' approximately 7800, 1900 usec
 
'''Size:''' 91 bytes
<pre>
ret ;IY,BC=Value1 DIV Value2
</pre>
 
== Fast 32bit division ==
 
'''Input:''' HL,DE=Value1, BC=Value2
 
'''Output:''' BCDE=Value1/Value2, HL=Value1 MOD Value2
 
'''Destroyed:''' AF
 
'''Not used:''' IX, IY
 
'''CPC Cycles:''' 1016-2444 (1730 on average), 254-611 usec (432 on average)
 
'''Size:''' 277 bytes
 
<pre>
div_r macro
local t2
SLA E
RL D
ADC HL, HL
 
LD A, L
ADD A, C
LD A, H
ADC A, B
JR NC, t2
 
ADD HL, BC
INC DE
t2
endm
div_e macro
local t1,t2
SLA E
RL D
ADC HL, HL
JR C, t1
 
LD A, L
ADD A, C
LD A, H
ADC A, B
JR NC, t2
t1
ADD HL, BC
INC DE
t2
endm
div32x16 proc ; BCDE = HLDE/BC, HL = HLDE%BC
local DIV16, DIV32R, DIV32E
DEC BC
LD A, B
CPL
LD B, A
LD A, C
CPL
LD C, A
ADD A, L
LD A, B
ADC A, H
JR NC, DIV16
 
PUSH DE
EX DE, HL
LD HL, 0000
CALL DIV32R
EX DE, HL
EX (SP), HL
EX DE, HL
CALL DIV32E
POP BC
RET
DIV16
CALL DIV32E
LD BC, 0000
RET
DIV32R ; DE = HLDE/(-BC), HL = HLDE%(-BC), -BC < $8000
CALL $+3
rept 8
div_r
endm
RET
DIV32E ; DE = HLDE/(-BC), HL = HLDE%(-BC)
CALL $+3
rept 8
div_e
endm
RET
endp
</pre>
 
== Web links ==
 
* [http://www.smspower.org/Development/DivMod Division implementation for the Sega Master System]
* [http://map.tni.nl/articles/mult_div_shifts.php Multiplications and divisions on the MSX Assembly Page]
 
[[Category:Programming]]
22
edits