From 791ebaf55252dd40d2aba73b36424aa12fcb98a7 Mon Sep 17 00:00:00 2001 From: scawful Date: Sat, 6 Dec 2025 23:25:16 -0500 Subject: [PATCH] Fix menu navigation: restore original up/down behavior MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Keep loop counters in FindNextItem/FindPrevItem (prevents infinite recursion) - Restore FindNextDownItem/FindNextUpItem to original logic: - Move ONE row, then delegate to FindNextItem if slot empty - Fix boundary check in FindNextUpItem: use BEQ/BPL for signed comparison (CMP #$01 : BCS was wrong - unsigned comparison treats $FE as 254 >= 1) The original design: Up/Down navigate rows, delegate to horizontal scan if target slot is empty. The loop counters in horizontal navigation prevent infinite loops when all items are empty. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- Menu/menu_select_item.asm | 72 ++++++++++++++++++++++----------------- 1 file changed, 41 insertions(+), 31 deletions(-) diff --git a/Menu/menu_select_item.asm b/Menu/menu_select_item.asm index 643bec9..67ca78a 100644 --- a/Menu/menu_select_item.asm +++ b/Menu/menu_select_item.asm @@ -83,14 +83,22 @@ Menu_ItemCursorPositions: Menu_FindNextItem: { - LDY.w $0202 : INY - CPY.b #$19 : BCC .no_reset - LDY.b #$01 - .no_reset - STY.w $0202 - LDX.w Menu_AddressIndex-1, Y - LDA.l $7EF300, X - BEQ Menu_FindNextItem + PHX ; Save X for counter + LDX.b #$18 ; Max 24 items + .loop + LDY.w $0202 : INY + CPY.b #$19 : BCC .no_reset + LDY.b #$01 + .no_reset + STY.w $0202 + PHX + LDX.w Menu_AddressIndex-1, Y + LDA.l $7EF300, X + PLX + BNE .found ; Item exists, done + DEX : BNE .loop ; Keep searching + .found + PLX RTS } @@ -98,13 +106,21 @@ Menu_FindNextItem: Menu_FindPrevItem: { - LDY.w $0202 : DEY : BNE .no_reset - LDY.b #$18 - .no_reset - STY.w $0202 - LDX.w Menu_AddressIndex-1, Y - LDA.l $7EF300, X - BEQ Menu_FindPrevItem + PHX ; Save X for counter + LDX.b #$18 ; Max 24 items + .loop + LDY.w $0202 : DEY : BNE .no_reset + LDY.b #$18 + .no_reset + STY.w $0202 + PHX + LDX.w Menu_AddressIndex-1, Y + LDA.l $7EF300, X + PLX + BNE .found ; Item exists, done + DEX : BNE .loop ; Keep searching + .found + PLX RTS } @@ -116,10 +132,10 @@ Menu_FindNextDownItem: CMP.b #$19 : BCC .no_reset SBC.b #$18 .no_reset - TAY : STY.w $0202 + TAY : STY.w $0202 LDX.w Menu_AddressIndex-1, Y - LDA.l $7EF300, X - BEQ Menu_FindNextItem + LDA.l $7EF300, X + BEQ Menu_FindNextItem ; If empty, scan horizontally (now safe) RTS } @@ -128,21 +144,15 @@ Menu_FindNextDownItem: Menu_FindNextUpItem: { LDA.w $0202 : SEC : SBC.b #$06 - BPL .no_reset : BNE .no_reset - CLC : ADC.b #$18 + BEQ .wrap ; If zero, wrap + BPL .no_reset ; If positive (1+), valid + .wrap + CLC : ADC.b #$18 ; Wrap to bottom row .no_reset - TAY : STY.w $0202 - CPY.b #$19 : BCS .reset_up - LDX.w Menu_AddressIndex-1, Y - LDA.l $7EF300, X - BEQ Menu_FindNextItem - RTS - .reset_up - LDY.b #$01 - STY.w $0202 + TAY : STY.w $0202 LDX.w Menu_AddressIndex-1, Y - LDA.l $7EF300, X - BEQ Menu_FindNextItem + LDA.l $7EF300, X + BEQ Menu_FindNextItem ; If empty, scan horizontally (now safe) RTS }