summaryrefslogtreecommitdiff
path: root/engine/math/getsquareroot.asm
diff options
context:
space:
mode:
authormid-kid <esteve.varela@gmail.com>2018-03-25 18:24:14 +0200
committermid-kid <esteve.varela@gmail.com>2018-03-25 18:24:14 +0200
commitbe76ee56a89e72c0b87a605321bb1670e86f8220 (patch)
tree277ffa2bc094e74b27ec5b72f748b93e58b3437f /engine/math/getsquareroot.asm
parent0d9241889fc8a2f047b9fd6db25e55de1e721877 (diff)
Organize the engine/ directory, director's cut
Cleaned up `engine/routines`, in favor of moving files into more appropriate directories. predef-related routines are now in top-level `engine`. `rtc/delete_save_change_clock.asm` has been split into both `menus/delete_save.asm` and `rtc/reset_password.asm`. Made a new subdirectory: * engine/math: Contains all generic math-related routines.
Diffstat (limited to 'engine/math/getsquareroot.asm')
-rw-r--r--engine/math/getsquareroot.asm32
1 files changed, 32 insertions, 0 deletions
diff --git a/engine/math/getsquareroot.asm b/engine/math/getsquareroot.asm
new file mode 100644
index 000000000..412fd04ff
--- /dev/null
+++ b/engine/math/getsquareroot.asm
@@ -0,0 +1,32 @@
+NUM_SQUARE_ROOTS EQU 255
+
+GetSquareRoot: ; 13b87
+; Return the square root of de in b.
+
+; Rather than calculating the result, we take the index of the
+; first value in a table of squares that isn't lower than de.
+
+ ld hl, .Squares
+ ld b, 0
+.loop
+; Make sure we don't go past the end of the table.
+ inc b
+ ld a, b
+ cp NUM_SQUARE_ROOTS
+ ret z
+
+; Iterate over the table until b**2 >= de.
+ ld a, [hli]
+ sub e
+ ld a, [hli]
+ sbc d
+
+ jr c, .loop
+ ret
+
+.Squares: ; 13b98
+x = 1
+rept NUM_SQUARE_ROOTS
+ dw x * x
+x = x + 1
+endr