Difference between revisions of "Z80 Routines:Math:Multiplication"
From WikiTI
(added categorization) |
|||
Line 7: | Line 7: | ||
They can easily be unrolled to gain some speed. | They can easily be unrolled to gain some speed. | ||
− | == 8*8 multiplication == | + | == Unsigned versions == |
+ | |||
+ | === 8*8 multiplication === | ||
The following routine multiplies h by e and places the result in hl | The following routine multiplies h by e and places the result in hl | ||
Line 31: | Line 33: | ||
</nowiki> | </nowiki> | ||
− | == 16*8 multiplication == | + | === 16*8 multiplication === |
The following routine multiplies de by a and places the result in ahl (which means a is the most significant byte of the product, l the least significant and h the intermediate one...) | The following routine multiplies de by a and places the result in ahl (which means a is the most significant byte of the product, l the least significant and h the intermediate one...) | ||
Line 59: | Line 61: | ||
</nowiki> | </nowiki> | ||
− | == 16*16 multiplication == | + | === 16*16 multiplication === |
The following routine multiplies bc by de and places the result in dehl. | The following routine multiplies bc by de and places the result in dehl. | ||
Line 89: | Line 91: | ||
ret | ret | ||
</nowiki> | </nowiki> | ||
+ | |||
+ | == Signed versions == | ||
+ | |||
+ | <!-- do the routines later, basically try to use cpu instruction that preserve bit 7 (sign) or if this is not possible, just take the sign out, do the multiplication and give the sign afterwards and accordingly. --> | ||
+ | |||
+ | === 8*8 multiplication === | ||
+ | |||
+ | === 16*8 multiplication === |
Revision as of 00:47, 9 November 2009
Contents
Introduction
All these routines use the restoring multiplication algorithm, adapted to the z80 architecture to maximize speed. They can easily be unrolled to gain some speed.
Unsigned versions
8*8 multiplication
The following routine multiplies h by e and places the result in hl
mult_h_e ld l, 0 ld d, l sla h ; optimised 1st iteration jr nc, $+3 ld l, e ld b, 7 _loop: add hl, hl jr nc, $+3 add hl, de djnz _loop ret
16*8 multiplication
The following routine multiplies de by a and places the result in ahl (which means a is the most significant byte of the product, l the least significant and h the intermediate one...)
mult_a_de ld c, 0 ld h, c ld l, h add a, a ; optimised 1st iteration jr nc, $+4 ld h,d ld l,e ld b, 7 _loop: add hl, hl rla jr nc, $+4 add hl, de adc a, c ; yes this is actually adc a, 0 but since c is free we set it to zero and so we can save 1 byte and up to 3 T-states per iteration djnz _loop ret
16*16 multiplication
The following routine multiplies bc by de and places the result in dehl.
mult_de_bc ld h, 0 ld l, h sla e ; optimised 1st iteration rl d jr nc, $+4 ld h, b ld l, c ld a, 15 _loop: add hl, hl rl e rl d jr nc, $+6 add hl, bc jr nc, $+3 inc de dec a jr nz, _loop ret