summaryrefslogtreecommitdiff
path: root/engine/routines/getsquareroot.asm
diff options
context:
space:
mode:
authorRemy Oukaour <remy.oukaour@gmail.com>2017-12-24 19:35:35 -0500
committerRemy Oukaour <remy.oukaour@gmail.com>2017-12-24 19:35:35 -0500
commit7d4486e6a34a5163575400f21e806471be496e3d (patch)
treec0cc5f242b92420325d12a9cdedd6c1a3bcc3a4f /engine/routines/getsquareroot.asm
parent15f1fc7c6ce0444ebfd87b1edc22da0ffd61c667 (diff)
Remove all code from main.asm (some labeled INCBINs, like out-of-context graphics, are still present)
engine/routines/ stores isolated out-of-context routines as individual files. It might be preferable later to append them to their related engine/ files in unique little SECTIONs, relying on the linkerscript to place them appropriately; or some other organization method. In the meantime, they're now easily findable apart from main.asm's other content.
Diffstat (limited to 'engine/routines/getsquareroot.asm')
-rw-r--r--engine/routines/getsquareroot.asm30
1 files changed, 30 insertions, 0 deletions
diff --git a/engine/routines/getsquareroot.asm b/engine/routines/getsquareroot.asm
new file mode 100644
index 000000000..009d9f4fe
--- /dev/null
+++ b/engine/routines/getsquareroot.asm
@@ -0,0 +1,30 @@
+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 $ff
+ 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
+root set 1
+ rept $ff
+ dw root*root
+root set root+1
+ endr