aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiquel Sabaté Solà <mssola@mssola.com>2026-03-06 16:06:56 +0100
committerMiquel Sabaté Solà <mssola@mssola.com>2026-03-06 16:06:56 +0100
commitf3737201eda72e51730a0762be98598fee08d86b (patch)
tree5dd72353503b84f1024dea2423bfdd247c42bea6
parentb01c36807ec2fd07e21fac03cc201b2832425cf9 (diff)
downloadjetpac.nes-f3737201eda72e51730a0762be98598fee08d86b.tar.gz
jetpac.nes-f3737201eda72e51730a0762be98598fee08d86b.zip
Fix a cycling bug when shooting carelessly
When shooting like crazy and killing random enemies, after a while a cycling bug would appear which would make enemies to turn in weird directions, die unexpectedly, and other weird shenanigans. This comes back to commit 7c493ba3f338 ("Improve a bit the performance on enemy death"), which removed the saving/restoring of the value on the 'y' register. That being said, this register was actually being needed at least by Bullets::update(), so in certain situations this register might have a bad value (e.g. via the Explosions::create() call). Fixes: 7c493ba3f338 ("Improve a bit the performance on enemy death") Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
-rw-r--r--.nasm/segments.txt2
-rw-r--r--src/enemies.s13
2 files changed, 14 insertions, 1 deletions
diff --git a/.nasm/segments.txt b/.nasm/segments.txt
index 2367e2f..f89b010 100644
--- a/.nasm/segments.txt
+++ b/.nasm/segments.txt
@@ -1,4 +1,4 @@
- HEADER: 16/16 (100%)
-- ROM0: 6448/32762 (19.68%)
+- ROM0: 6452/32762 (19.69%)
- ROMV: 6/6 (100%)
- ROM2: 8192/8192 (100%)
diff --git a/src/enemies.s b/src/enemies.s
index facb255..7097af5 100644
--- a/src/enemies.s
+++ b/src/enemies.s
@@ -613,7 +613,16 @@
.endproc
;; The enemy has been set to dust, remove it.
+ ;;
+ ;; NOTE: the 'x' register is modified, the 'y' register is _preserved_.
.proc bite_the_dust
+ ;; This function might be called by loops which abuse index
+ ;; registers. Luckily that's not the case for the 'x' register, but at
+ ;; least the loop on Bullets::update() does heavy use of the 'y'
+ ;; register. Preserve it now on the stack.
+ tya
+ pha
+
;; Invalidate this enemy.
lda #$FF
ldx Enemies::zp_pool_index
@@ -634,6 +643,10 @@
ldx Enemies::zp_pool_index
sta Enemies::zp_enemies_pool_base + 3, x
+ ;; Restore back the value for the 'y' register.
+ pla
+ tay
+
rts
.endproc