diff options
author | PikalaxALT <pikalaxalt@gmail.com> | 2018-06-08 14:59:43 -0400 |
---|---|---|
committer | PikalaxALT <pikalaxalt@gmail.com> | 2018-06-08 14:59:43 -0400 |
commit | e0102c42ecf581c7a85e627b63c9609972787581 (patch) | |
tree | 0441372635932ef826f372f8e6ce96379db8537e | |
parent | eec62f6e5bcfab7cbd5fdf2f8c2c2be6f3a6a97d (diff) |
Multiply and Divide functions ported from Crystal
-rw-r--r-- | engine/math/math.asm | 200 | ||||
-rw-r--r-- | hram.asm | 26 | ||||
-rw-r--r-- | shim.sym | 2 |
3 files changed, 226 insertions, 2 deletions
diff --git a/engine/math/math.asm b/engine/math/math.asm new file mode 100644 index 0000000..4395009 --- /dev/null +++ b/engine/math/math.asm @@ -0,0 +1,200 @@ +include "constants.asm" + +SECTION "Multiply and Divide Engine", ROMX [$6810], BANK [$1] + +_Multiply:: ; 6810 + +; 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 +; 6870 + + +_Divide:: ; 6870 + 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 +; 68f3 @@ -98,11 +98,37 @@ hSpriteOffset:: ; ffb1 db ; TODO +UNION + +; ffb3 +hProduct:: +hDividend:: + ; ds 4 + db + +; ffb4 +hMultiplicand:: +hQuotient:: + ds 3 + +; ffb7 +hMultiplier:: +hDivisor:: +hRemainder:: + db + +; ffb8 +hMathBuffer:: + ds 5 + +NEXTU + hPrintNumLeadingDigit:: db ; ffb3 digit one place-value up hPrintNumDividend:: ds 3 ; ffb4 big-endian hPrintNumDivisor:: ds 3 ; ffb7 big-endian hPrintNumTemp:: ds 3 ; ffba big-endian +ENDU ds 19 ; TODO @@ -54,8 +54,6 @@ 01:6445 Function6445 01:66B1 Function66b1 01:6713 Function6713 -01:6810 _Multiply -01:6870 _Divide 01:68F3 ItemAttributes 02:4000 Function8000 |