summaryrefslogtreecommitdiff
path: root/engine/math/math.asm
diff options
context:
space:
mode:
Diffstat (limited to 'engine/math/math.asm')
-rwxr-xr-xengine/math/math.asm190
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