summaryrefslogtreecommitdiff
path: root/engine/math/math.asm
diff options
context:
space:
mode:
authorEldred Habert <eldredhabert0@gmail.com>2018-06-10 17:08:55 +0200
committerGitHub <noreply@github.com>2018-06-10 17:08:55 +0200
commitb0e8bae78e0972b13370ff6e31c80f18b67348fc (patch)
tree7d83ac3340a0535aa85269e7247008164f9b8d7d /engine/math/math.asm
parent20f07292a54097dd3b704bc79bd50097c1d16502 (diff)
parentbfdaa1151902023fc69c97328cf12bdd88816185 (diff)
Merge pull request #18 from PikalaxALT/math_etc
More dism progress in ROM0
Diffstat (limited to 'engine/math/math.asm')
-rw-r--r--engine/math/math.asm200
1 files changed, 200 insertions, 0 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