summaryrefslogtreecommitdiff
path: root/engine/multiply_divide.asm
diff options
context:
space:
mode:
Diffstat (limited to 'engine/multiply_divide.asm')
-rwxr-xr-xengine/multiply_divide.asm143
1 files changed, 143 insertions, 0 deletions
diff --git a/engine/multiply_divide.asm b/engine/multiply_divide.asm
new file mode 100755
index 00000000..4aa5fa26
--- /dev/null
+++ b/engine/multiply_divide.asm
@@ -0,0 +1,143 @@
+_Multiply: ; 37d41 (d:7d41)
+ ld a, $8
+ ld b, a
+ xor a
+ ld [H_DIVIDEND], a ; $ff95 (aliases: H_PRODUCT, H_PASTLEADINGZEROES, H_QUOTIENT)
+ ld [$ff9b], a
+ ld [H_SAVEDNUMTOPRINT], a ; $ff9c
+ ld [$ff9d], a
+ ld [$ff9e], a
+.asm_37d4f
+ ld a, [H_REMAINDER] ; $ff99 (aliases: H_DIVISOR, H_MULTIPLIER, H_POWEROFTEN)
+ srl a
+ ld [H_REMAINDER], a ; $ff99 (aliases: H_DIVISOR, H_MULTIPLIER, H_POWEROFTEN)
+ jr nc, .asm_37d77
+ ld a, [$ff9e]
+ ld c, a
+ ld a, [$ff98]
+ add c
+ ld [$ff9e], a
+ ld a, [$ff9d]
+ ld c, a
+ ld a, [$ff97]
+ adc c
+ ld [$ff9d], a
+ ld a, [H_SAVEDNUMTOPRINT] ; $ff9c
+ ld c, a
+ ld a, [H_NUMTOPRINT] ; $ff96 (aliases: H_MULTIPLICAND)
+ adc c
+ ld [H_SAVEDNUMTOPRINT], a ; $ff9c
+ ld a, [$ff9b]
+ ld c, a
+ ld a, [H_DIVIDEND] ; $ff95 (aliases: H_PRODUCT, H_PASTLEADINGZEROES, H_QUOTIENT)
+ adc c
+ ld [$ff9b], a
+.asm_37d77
+ dec b
+ jr z, .asm_37d94
+ ld a, [$ff98]
+ sla a
+ ld [$ff98], a
+ ld a, [$ff97]
+ rl a
+ ld [$ff97], a
+ ld a, [H_NUMTOPRINT] ; $ff96 (aliases: H_MULTIPLICAND)
+ rl a
+ ld [H_NUMTOPRINT], a ; $ff96 (aliases: H_MULTIPLICAND)
+ ld a, [H_DIVIDEND] ; $ff95 (aliases: H_PRODUCT, H_PASTLEADINGZEROES, H_QUOTIENT)
+ rl a
+ ld [H_DIVIDEND], a ; $ff95 (aliases: H_PRODUCT, H_PASTLEADINGZEROES, H_QUOTIENT)
+ jr .asm_37d4f
+.asm_37d94
+ ld a, [$ff9e]
+ ld [$ff98], a
+ ld a, [$ff9d]
+ ld [$ff97], a
+ ld a, [H_SAVEDNUMTOPRINT] ; $ff9c
+ ld [H_NUMTOPRINT], a ; $ff96 (aliases: H_MULTIPLICAND)
+ ld a, [$ff9b]
+ ld [H_DIVIDEND], a ; $ff95 (aliases: H_PRODUCT, H_PASTLEADINGZEROES, H_QUOTIENT)
+ ret
+
+_Divide: ; 37da5 (d:7da5)
+ xor a
+ ld [$ff9a], a
+ ld [$ff9b], a
+ ld [H_SAVEDNUMTOPRINT], a ; $ff9c
+ ld [$ff9d], a
+ ld [$ff9e], a
+ ld a, $9
+ ld e, a
+.asm_37db3
+ ld a, [$ff9a]
+ ld c, a
+ ld a, [H_NUMTOPRINT] ; $ff96 (aliases: H_MULTIPLICAND)
+ sub c
+ ld d, a
+ ld a, [H_REMAINDER] ; $ff99 (aliases: H_DIVISOR, H_MULTIPLIER, H_POWEROFTEN)
+ ld c, a
+ ld a, [H_DIVIDEND] ; $ff95 (aliases: H_PRODUCT, H_PASTLEADINGZEROES, H_QUOTIENT)
+ sbc c
+ jr c, .asm_37dce
+ ld [H_DIVIDEND], a ; $ff95 (aliases: H_PRODUCT, H_PASTLEADINGZEROES, H_QUOTIENT)
+ ld a, d
+ ld [H_NUMTOPRINT], a ; $ff96 (aliases: H_MULTIPLICAND)
+ ld a, [$ff9e]
+ inc a
+ ld [$ff9e], a
+ jr .asm_37db3
+.asm_37dce
+ ld a, b
+ cp $1
+ jr z, .asm_37e18
+ ld a, [$ff9e]
+ sla a
+ ld [$ff9e], a
+ ld a, [$ff9d]
+ rl a
+ ld [$ff9d], a
+ ld a, [H_SAVEDNUMTOPRINT] ; $ff9c
+ rl a
+ ld [H_SAVEDNUMTOPRINT], a ; $ff9c
+ ld a, [$ff9b]
+ rl a
+ ld [$ff9b], a
+ dec e
+ jr nz, .asm_37e04
+ ld a, $8
+ ld e, a
+ ld a, [$ff9a]
+ ld [H_REMAINDER], a ; $ff99 (aliases: H_DIVISOR, H_MULTIPLIER, H_POWEROFTEN)
+ xor a
+ ld [$ff9a], a
+ ld a, [H_NUMTOPRINT] ; $ff96 (aliases: H_MULTIPLICAND)
+ ld [H_DIVIDEND], a ; $ff95 (aliases: H_PRODUCT, H_PASTLEADINGZEROES, H_QUOTIENT)
+ ld a, [$ff97]
+ ld [H_NUMTOPRINT], a ; $ff96 (aliases: H_MULTIPLICAND)
+ ld a, [$ff98]
+ ld [$ff97], a
+.asm_37e04
+ ld a, e
+ cp $1
+ jr nz, .asm_37e0a
+ dec b
+.asm_37e0a
+ ld a, [H_REMAINDER] ; $ff99 (aliases: H_DIVISOR, H_MULTIPLIER, H_POWEROFTEN)
+ srl a
+ ld [H_REMAINDER], a ; $ff99 (aliases: H_DIVISOR, H_MULTIPLIER, H_POWEROFTEN)
+ ld a, [$ff9a]
+ rr a
+ ld [$ff9a], a
+ jr .asm_37db3
+.asm_37e18
+ ld a, [H_NUMTOPRINT] ; $ff96 (aliases: H_MULTIPLICAND)
+ ld [H_REMAINDER], a ; $ff99 (aliases: H_DIVISOR, H_MULTIPLIER, H_POWEROFTEN)
+ ld a, [$ff9e]
+ ld [$ff98], a
+ ld a, [$ff9d]
+ ld [$ff97], a
+ ld a, [H_SAVEDNUMTOPRINT] ; $ff9c
+ ld [H_NUMTOPRINT], a ; $ff96 (aliases: H_MULTIPLICAND)
+ ld a, [$ff9b]
+ ld [H_DIVIDEND], a ; $ff95 (aliases: H_PRODUCT, H_PASTLEADINGZEROES, H_QUOTIENT)
+ ret