diff options
author | entrpntr <entrpntr@gmail.com> | 2020-03-17 15:23:39 -0400 |
---|---|---|
committer | entrpntr <entrpntr@gmail.com> | 2020-03-17 15:23:39 -0400 |
commit | c248b30aa7487b51a9182a833b1db29f14a7267c (patch) | |
tree | ea00fee853340ff7a4b2ab2da8cb902105e854f1 /engine/math/math.asm | |
parent | d7327a64949c5abb607299184507c89e4c4f1387 (diff) |
Cleanup of files for banks $01 and $04 for main.asm.
Diffstat (limited to 'engine/math/math.asm')
-rwxr-xr-x | engine/math/math.asm | 190 |
1 files changed, 190 insertions, 0 deletions
diff --git a/engine/math/math.asm b/engine/math/math.asm new file mode 100755 index 00000000..cdac2d37 --- /dev/null +++ b/engine/math/math.asm @@ -0,0 +1,190 @@ +_Multiply:: ; 67bd + +; hMultiplier is one byte. + ld a, 8 + ld b, a + + xor a + ldh [hProduct], a + ldh [hMathBuffer + 1], a + ldh [hMathBuffer + 2], a + ldh [hMathBuffer + 3], a + ldh [hMathBuffer + 4], a + +.loop + ldh a, [hMultiplier] + srl a + ldh [hMultiplier], a + jr nc, .next + + ldh a, [hMathBuffer + 4] + ld c, a + ldh a, [hMultiplicand + 2] + add c + ldh [hMathBuffer + 4], a + + ldh a, [hMathBuffer + 3] + ld c, a + ldh a, [hMultiplicand + 1] + adc c + ldh [hMathBuffer + 3], a + + ldh a, [hMathBuffer + 2] + ld c, a + ldh a, [hMultiplicand + 0] + adc c + ldh [hMathBuffer + 2], a + + ldh a, [hMathBuffer + 1] + ld c, a + ldh a, [hProduct] + adc c + ldh [hMathBuffer + 1], a + +.next + dec b + jr z, .done + +; hMultiplicand <<= 1 + + ldh a, [hMultiplicand + 2] + add a + ldh [hMultiplicand + 2], a + + ldh a, [hMultiplicand + 1] + rla + ldh [hMultiplicand + 1], a + + ldh a, [hMultiplicand + 0] + rla + ldh [hMultiplicand + 0], a + + ldh a, [hProduct] + rla + ldh [hProduct], a + + jr .loop + +.done + ldh a, [hMathBuffer + 4] + ldh [hProduct + 3], a + + ldh a, [hMathBuffer + 3] + ldh [hProduct + 2], a + + ldh a, [hMathBuffer + 2] + ldh [hProduct + 1], a + + ldh a, [hMathBuffer + 1] + ldh [hProduct + 0], a + + ret + +_Divide:: ; 681d + xor a + ldh [hMathBuffer + 0], a + ldh [hMathBuffer + 1], a + ldh [hMathBuffer + 2], a + ldh [hMathBuffer + 3], a + ldh [hMathBuffer + 4], a + + ld a, 9 + ld e, a + +.loop + ldh a, [hMathBuffer + 0] + ld c, a + ldh a, [hDividend + 1] + sub c + ld d, a + + ldh a, [hDivisor] + ld c, a + ldh a, [hDividend + 0] + sbc c + jr c, .next + + ldh [hDividend + 0], a + + ld a, d + ldh [hDividend + 1], a + + ldh a, [hMathBuffer + 4] + inc a + ldh [hMathBuffer + 4], a + + jr .loop + +.next + ld a, b + cp 1 + jr z, .done + + ldh a, [hMathBuffer + 4] + add a + ldh [hMathBuffer + 4], a + + ldh a, [hMathBuffer + 3] + rla + ldh [hMathBuffer + 3], a + + ldh a, [hMathBuffer + 2] + rla + ldh [hMathBuffer + 2], a + + ldh a, [hMathBuffer + 1] + rla + ldh [hMathBuffer + 1], a + + dec e + jr nz, .next2 + + ld e, 8 + ldh a, [hMathBuffer + 0] + ldh [hDivisor], a + xor a + ldh [hMathBuffer + 0], a + + ldh a, [hDividend + 1] + ldh [hDividend + 0], a + + ldh a, [hDividend + 2] + ldh [hDividend + 1], a + + ldh a, [hDividend + 3] + ldh [hDividend + 2], a + +.next2 + ld a, e + cp 1 + jr nz, .okay + dec b + +.okay + ldh a, [hDivisor] + srl a + ldh [hDivisor], a + + ldh a, [hMathBuffer + 0] + rr a + ldh [hMathBuffer + 0], a + + jr .loop + +.done + ldh a, [hDividend + 1] + ldh [hDivisor], a + + ldh a, [hMathBuffer + 4] + ldh [hDividend + 3], a + + ldh a, [hMathBuffer + 3] + ldh [hDividend + 2], a + + ldh a, [hMathBuffer + 2] + ldh [hDividend + 1], a + + ldh a, [hMathBuffer + 1] + ldh [hDividend + 0], a + + ret |