Changes

Jump to: navigation, search

Programming:Integer Multiplication

1,686 bytes added, 23:18, 26 July 2007
/* Faster, accurate 8bit * 8bit Unsigned */
[[User:Executioner|Executioner]] 03:58, 8 May 2007 (CEST)
 
Ok, here is the new 8K routine, first the routine to build the tables:
 
<pre>
.maketabs
ld hl,hltab1
.makelp5
ld a,l
ld bc,0
rla:rl b:rla:rl c
rla:rl b:rla:rl c
rla:rl b:rla:rl c
rla:rl b:rla:rl c
ld a,b
add a
add restab / 256
ld (hl),a
inc h
ld a,c
add a
add restab / 256
ld (hl),a
dec h
inc l
jr nz,makelp5
ld h,restab / 256 + 2
.makelp6
ld (hl),l
inc l
jr nz,makelp6
inc h:inc h
ld b,2
.makelp8
push bc
xor a
rr b:rra:rrca
rr b:rra:rrca
rr b:rra:rrca
rr b:rra:rrca
.makelp7
push hl
push af
call mulLbyA
ex de,hl
pop af
pop hl
ld (hl),e
inc h
ld (hl),d
dec h
inc l
jr nz,makelp7
inc h:inc h
pop bc
inc b
bit 4,b
jr z,makelp8
ret
 
.mulLbyA ; MAX times ; MIN times
ld e,l ; 1 ; 1
ld d,0 ; 3 ; 3
add a ; 4 ; 4
ld h,a ; 5 ; 5
jr c,ncad0 ; 8 ; 8
ld l,d
.ncad0
add hl,hl ; 11 ; 11
jr nc,ncad1 ; 13 ; 14
add hl,de ; 16
.ncad1
add hl,hl ; 19 ; 17
jr nc,ncad2 ; 21 ; 20
add hl,de ; 24
.ncad2
add hl,hl ; 27 ; 23
jr nc,ncad3 ; 29 ; 26
add hl,de ; 32
.ncad3
add hl,hl ; 35 ; 29
jr nc,ncad4 ; 37 ; 32
add hl,de ; 40
.ncad4
add hl,hl ; 43 ; 35
jr nc,ncad5 ; 45 ; 38
add hl,de ; 48
.ncad5
add hl,hl ; 51 ; 41
jr nc,ncad6 ; 53 ; 44
add hl,de ; 56
.ncad6
add hl,hl ; 59 ; 47
ld a,h ; 60 ; 48
ret nc ; 61 ; 50?
add hl,de ; 64
ld a,h ; 65
ret
 
ds -$ and #ff
 
.hltab1
ds 256
.hltab2
ds 256
.restab
ds 512 * 16
</pre>
 
And the routine to do the multiplication:
 
<pre>
.umultCL ; Using 8 bit only (25us - DE = L * C)
ld h,hltab2 / 256 ; 2
ld b,(hl) ; 4
dec h ; 5
ld h,(hl) ; 7
ld l,c ; 8
ld a,(hl) ; 10
add a ; 11
inc h ; 12
ld d,(hl) ; 14
rl d ; 16
ld h,b ; 17
add (hl) ; 19
ld e,a ; 20
inc h ; 21
ld a,(hl) ; 23
adc d ; 24
ld d,a ; 25
ret
</pre>
== 16bit * 16bit Unsigned ==
151
edits