X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=device%2Flib%2Fz80%2Fmul.s;h=e81ac80040b958cb5be49d3e9b458f748d5900d7;hb=5a1d5e778e85664f4e6657019348b4756b16eacb;hp=4f3e793a2f912db9bfe768f94f640af0d4e3cdf3;hpb=f239a9f256f022ade8216daba928e817f2d5f528;p=fw%2Fsdcc diff --git a/device/lib/z80/mul.s b/device/lib/z80/mul.s index 4f3e793a..e81ac800 100644 --- a/device/lib/z80/mul.s +++ b/device/lib/z80/mul.s @@ -1,103 +1,53 @@ - ;; Originally from GBDK by Pascal Felber. - - .area _CODE + .area _CODE -__mulschar_rrx_s:: - ld hl,#2 - add hl,sp - - ld e,(hl) - inc hl - ld l,(hl) +__mulint_rrx_s:: + pop af + pop hl + pop de + push de + push hl + push af ;; Fall through -__mulschar_rrx_hds:: - ;; Need to sign extend before going in. - ld c,l - - ld a,l - rla - sbc a,a - ld b,a - - ld a,e - rla - sbc a,a - ld d,a - - jp .mul16 - -__muluchar_rrx_s:: - ld hl,#2 - add hl,sp - - ld e,(hl) - - inc hl - ld c,(hl) - ;; Clear the top - xor a - ld d,a - ld b,a - - jp .mulu16 - -__mulsint_rrx_s:: -__muluint_rrx_s:: - ld hl,#2 - add hl,sp - - ld e,(hl) - inc hl - ld d,(hl) - inc hl - ld a,(hl) - inc hl - ld h,(hl) - ld l,a - - ;; Fall through - __muluchar_rrx_hds:: -__mulsint_rrx_hds:: -__muluint_rrx_hds:: +__mulint_rrx_hds:: ;; Parameters: - ;; HL, DE (left, right irrelivent) + ;; hl, de (left, right irrelevant) ld b,h ld c,l - + ;; 16-bit multiplication - ;; + ;; ;; Entry conditions - ;; BC = multiplicand - ;; DE = multiplier - ;; + ;; bc = multiplicand + ;; de = multiplier + ;; ;; Exit conditions - ;; DE = less significant word of product + ;; hl = less significant word of product ;; ;; Register used: AF,BC,DE,HL -.mul16: -.mulu16: - LD HL,#0x00 ; Product = 0 - LD A,#15 ; Count = bit length - 1 - ;; Shift-and-add algorithm - ;; If MSB of multiplier is 1, add multiplicand to partial product - ;; Shift partial product, multiplier left 1 bit -.mlp: - SLA E ; Shift multiplier left 1 bit - RL D - jp NC,.mlp1 ; Jump if MSB of multiplier = 0 - ADD HL,BC ; Add multiplicand to partial product -.mlp1: - ADD HL,HL ; Shift partial product left - DEC A - jp NZ,.mlp ; Continue until count = 0 - ;; Add multiplicand one last time if MSB of multiplier is 1 - BIT 7,D ; Get MSB of multiplier - JR Z,.mend ; Exit if MSB of multiplier is 0 - ADD HL,BC ; Add multiplicand to product -.mend: - ; HL = result - ret +__mul16:: + xor a,a + ld l,a + or a,b + ld b,#16 + + ;; Optimise for the case when this side has 8 bits of data or + ;; less. This is often the case with support address calls. + jr NZ,2$ + ld b,#8 + ld a,c +1$: + ;; Taken from z88dk, which originally borrowed from the + ;; Spectrum rom. + add hl,hl +2$: + rl c + rla ;DLE 27/11/98 + jr NC,3$ + add hl,de +3$: + djnz 1$ + ret