summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPikalaxALT <pikalaxalt@gmail.com>2018-06-08 14:59:43 -0400
committerPikalaxALT <pikalaxalt@gmail.com>2018-06-08 14:59:43 -0400
commite0102c42ecf581c7a85e627b63c9609972787581 (patch)
tree0441372635932ef826f372f8e6ce96379db8537e
parenteec62f6e5bcfab7cbd5fdf2f8c2c2be6f3a6a97d (diff)
Multiply and Divide functions ported from Crystal
-rw-r--r--engine/math/math.asm200
-rw-r--r--hram.asm26
-rw-r--r--shim.sym2
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
diff --git a/hram.asm b/hram.asm
index c49ace3..0e26198 100644
--- a/hram.asm
+++ b/hram.asm
@@ -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
diff --git a/shim.sym b/shim.sym
index 540508d..8dd532b 100644
--- a/shim.sym
+++ b/shim.sym
@@ -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