From 55ed3943fd98d217cfb2c798b023604a529b3dcc Mon Sep 17 00:00:00 2001 From: scawful Date: Sat, 1 Oct 2022 02:22:20 -0500 Subject: [PATCH] hud and menu housekeeping --- Menu/menu.asm | 106 +++------------- Menu/menu_hud.asm | 249 ++++++++++++-------------------------- Menu/menu_scroll.asm | 57 +++++++++ Menu/menu_select_item.asm | 26 ++++ 4 files changed, 174 insertions(+), 264 deletions(-) create mode 100644 Menu/menu_scroll.asm diff --git a/Menu/menu.asm b/Menu/menu.asm index 464b468..036700c 100644 --- a/Menu/menu.asm +++ b/Menu/menu.asm @@ -41,26 +41,27 @@ pullpc ; upload tilemaps containing frame of menu and icons org $248000 -Menu_Tilemap: +Menu_Tilemap: incbin "tilemaps/menu_frame.tilemap" -Menu_QuestIcons: +Menu_QuestIcons: incbin "tilemaps/quest_icons.tilemap" - incsrc "menu_gfx_table.asm" incsrc "menu_draw_items.asm" incsrc "menu_text.asm" incsrc "menu_palette.asm" -; Traverse jump table containing routines for Oracle of Secrets menu +; Subroutine table in menu_vectors Menu_Entry: +{ PHB : PHK : PLB - LDA.w $0200 - ASL - TAX + LDA.w $0200 : ASL : TAX + JSR (.vectors,X) + SEP #$20 PLB RTL +} incsrc "menu_vectors.asm" ; ============================================================================= @@ -136,7 +137,10 @@ Menu_UploadLeft: ; 03 MENU SCROLL DOWN Menu_Scroll: - dw 0, -3, -5, -7, -10, -12, -15, -20, -28, -40, -50, -60, -75, -90, -100, -125, -150, -175, -190, -200, -210, -220, -225, -230, -232, -234, -238 + dw 0, -3, -5, -7, -10, -12, -15, -20 + dw -28, -40, -50, -60, -75, -90, -100 + dw -125, -150, -175, -190, -200, -210 + dw -220, -225, -230, -232, -234, -238 Menu_ScrollDown: { @@ -161,33 +165,6 @@ Menu_ScrollDown: ; 04 MENU ITEM SCREEN incsrc "menu_select_item.asm" -Menu_InitItemScreen: -{ - SEP #$30 - LDY.w $0202 : BNE .all_good - - .loop - INY : CPY.b #$25 : BCS .bad - LDX.w Menu_AddressIndex-1, Y - LDA.l $7EF300, X - BEQ .loop - - STY.w $0202 - BRA .all_good - - .bad - STZ.w $0202 - - .all_good - - STZ $0207 - LDA.b #$04 - STA.w $0200 - RTS -} - -; ----------------------------------------------------------------------------- - Menu_ItemScreen: { JSR Menu_CheckHScroll @@ -250,7 +227,6 @@ Menu_ItemScreen: STA.w $11CE, X BRA .done - .no_delete LDA.w #$3060 : STA.w $1108, X ; corner LDA.w #$3070 : STA.w $1148, X @@ -290,6 +266,7 @@ Menu_ScrollTo: ; ============================================================================= ; 06 MENU STATS SCREEN +incsrc "menu_scroll.asm" Menu_StatsScreen: { @@ -297,61 +274,6 @@ Menu_StatsScreen: RTS } -; ----------------------------------------------------------------------------- - -Menu_CheckHScroll: -{ - LDA.b $F4 - BIT.b #$10 : BNE .leave_menu - LDA.b $F6 - BIT.b #$20 : BNE .left - BIT.b #$10 : BNE .right - - RTS - -.left - REP #$20 - LDA.w #$FFF8 - BRA .merge - -.right - REP #$20 - LDA.w #$0008 - -.merge - STA.w MenuScrollHDirection - - SEP #$30 - INC.w $0200 - LDA.b #$06 : STA.w $012F - RTS - -.leave_menu - LDA.b #$08 - STA.w $0200 - RTS -} - -; ----------------------------------------------------------------------------- - -Menu_ScrollHorizontal: -{ - REP #$21 ; set A to 16 bit, clear carry flag - - LDA.w $E4 ; BG3 Horizontal Scroll Value - ADC.w MenuScrollHDirection ; Direction set by Menu_CheckHScroll - AND.w #$01FF - STA.b $E4 - AND.w #$00FF - BNE .loop - - SEC - RTS - -.loop - CLC - RTS -} ; ============================================================================= ; 07 MENU SCROLL FROM @@ -440,8 +362,8 @@ Menu_Exit: RTS } -; ============================================================================= incsrc "menu_draw_bg.asm" incsrc "lw_map_names.asm" incsrc "menu_hud.asm" + ; ============================================================================= \ No newline at end of file diff --git a/Menu/menu_hud.asm b/Menu/menu_hud.asm index 40333fb..d5598cf 100644 --- a/Menu/menu_hud.asm +++ b/Menu/menu_hud.asm @@ -1,26 +1,28 @@ +; ============================================================================= +; headsup display + org $0DFB91 -JSL NewMenuUpdate -RTS + JSL Hud_Update + RTS newIgnoreItemBox: -JSL NewMenuUpdate_ignoreItemBox -RTS + JSL Hud_Update_ignoreItemBox + RTS org $0DDD21 -JSR newIgnoreItemBox + JSR newIgnoreItemBox +; ============================================================================= org $268000 -NewMenuUpdate: +Hud_Update: { - JSR Hud_UpdateItemBox + JSR Hud_Hud_UpdateItemBox -; *$6FB94 ALTERNATE ENTRY POINT -.ignoreItemBox +.ignoreItemBox ; ALTERNATE ENTRY POINT SEP #$30 - ; the hook for optimization was placed here... - ; need to draw partial heart still though. update: optimization complete with great results + ; need to draw partial heart still though. LDA.b #$FD : STA $0A LDA.b #$F9 : STA $0B LDA.b #$0D : STA $0C @@ -51,12 +53,12 @@ NewMenuUpdate: LDA $7EF36C : CMP $7EF36D : BEQ .healthUpdated ; Seems absurd to have a branch of zero bytes, right? - SBC #$04 : CMP $7EF36D : BCS .healthUpdated + SEC : SBC #$04 : CMP $7EF36D : BCS .healthUpdated .healthUpdated ; A = actual health + 0x03; - LDA $7EF36D : ADC.b #$03 + LDA $7EF36D : SEC : SBC #$03 REP #$30 @@ -64,30 +66,28 @@ NewMenuUpdate: LDA $7EF36C : AND.w #$00FF : STA $02 - ; this time we're filling in the full and partially filled hearts (actual health) + ; filling in the full and partially filled hearts (actual health) JSR HUD_UpdateHearts -; *$6FC09 ALTERNATE ENTRY POINT ; reentry hook -.ignoreHealth +.ignoreHealth ; *$6FC09 ALTERNATE ENTRY POINT ; reentry hook REP #$30 ; Magic amount indicator (normal, 1/2, or 1/4) LDA $7EF37B : AND.w #$00FF : CMP.w #$0001 : BCC .normalMagicMeter - ; draws a 1/2 magic meter (note, we could add in the 1/4 magic meter here if - ; we really cared about that >_> + ; draw 1/2 magic meter LDA.w #$28F7 : STA $7EC704 LDA.w #$2851 : STA $7EC706 LDA.w #$28FA : STA $7EC708 .normalMagicMeter - ; check how much magic power the player has at the moment (ranges from 0 to 0x7F) + ; check player magic (ranges from 0 to 0x7F) ; X = ((MP & 0xFF)) + 7) & 0xFFF8) - LDA $7EF36E : AND.w #$00FF : ADC.w #$0007 : AND.w #$FFF8 : TAX + LDA $7EF36E : AND.w #$00FF : CLC : ADC #$0007 : AND.w #$FFF8 : TAX - ; these four writes draw the magic power bar based on how much MP you have + ; these four writes draw the magic power bar based on how much MP you have LDA MagicTilemap+0, X : STA $7EC746 LDA MagicTilemap+2, X : STA $7EC786 LDA MagicTilemap+4, X : STA $7EC7C6 @@ -163,34 +163,20 @@ NewMenuUpdate: RTL } -; ============================================================================== -; Update Items +; ============================================================================= + +namespace Hud + incsrc "menu_gfx_table.asm" HudItems: - dw BowsGFX - dw BoomsGFX - dw HookGFX - dw BombsGFX - dw DekuMaskGFX - dw BottlesGFX - dw HammerGFX - dw LampGFX - dw Fire_rodGFX - dw Ice_rodGFX - dw GoronMaskGFX - dw BottlesGFX - dw ShovelGFX - dw JumpFeatherGFX - dw SomariaGFX - dw ByrnaGFX - dw BunnyHoodGFX - dw BottlesGFX - dw PowderGFX - dw BookGFX - dw OcarinaGFX - dw MirrorGFX - dw StoneMaskGFX - dw BottlesGFX + dw BowsGFX : dw BoomsGFX : dw HookGFX + dw BombsGFX : dw DekuMaskGFX : dw BottlesGFX + dw HammerGFX : dw LampGFX : dw Fire_rodGFX + dw Ice_rodGFX : dw GoronMaskGFX : dw BottlesGFX + dw ShovelGFX : dw JumpFeatherGFX : dw SomariaGFX + dw ByrnaGFX : dw BunnyHoodGFX : dw BottlesGFX + dw PowderGFX : dw BookGFX : dw OcarinaGFX + dw MirrorGFX : dw StoneMaskGFX : dw BottlesGFX Hud_UpdateItemBox: { @@ -199,98 +185,18 @@ Hud_UpdateItemBox: ASL : TAX LDY.w HudItems-2, X - LDA.w $0000,Y : STA.l $7EC778 - LDA.w $0002,Y : STA.l $7EC77A - LDA.w $0004,Y : STA.l $7EC7B8 - LDA.w $0006,Y : STA.l $7EC7BA + LDA.w $0000,Y : STA.l $7EC778-6 + LDA.w $0002,Y : STA.l $7EC77A-6 + LDA.w $0004,Y : STA.l $7EC7B8-6 + LDA.w $0006,Y : STA.l $7EC7BA-6 SEP #$30 RTS } -Vanilla_UpdateItemBox: -{ - SEP #$30 - - ; Dost thou haveth the the bow? - LDA $7EF340 : BEQ .havethNoBow - - ; Dost thou haveth the silver arrows? - ; (okay I'll stop soon) - CMP.b #$03 : BCC .havethNoSilverArrows - - ; Draw the arrow guage icon as silver rather than normal wood arrows. - LDA.b #$86 : STA $7EC71E - LDA.b #$24 : STA $7EC71F - LDA.b #$87 : STA $7EC720 - LDA.b #$24 : STA $7EC721 - - LDX.b #$04 - - ; check how many arrows the player has - LDA $7EF377 : BNE .drawBowItemIcon - - LDX.b #$03 - - BRA .drawBowItemIcon +namespace off -.havethNoSilverArrows - - LDX.b #$02 - - LDA $7EF377 : BNE .drawBowItemIcon - - LDX.b #$01 - -.drawBowItemIcon - - ; values of X correspond to how the icon will end up drawn: - ; 0x01 - normal bow with no arrows - ; 0x02 - normal bow with arrows - ; 0x03 - silver bow with no silver arrows - ; 0x04 - silver bow with silver arrows - TXA : STA $7EF340 - -.havethNoBow - - REP #$30 - - LDX $0202 : BEQ .noEquippedItem - - LDA $7EF33F, X : AND.w #$00FF - - CPX.w #$0004 : BNE .bombsNotEquipped - - LDA.w #$0001 - -.bombsNotEquipped - - CPX.w #$0010 : BNE .bottleNotEquipped - - TXY : TAX : LDA $7EF35B, X : AND.w #$00FF : TYX - -.bottleNotEquipped - - STA $02 - - TXA : DEC A : ASL A : TAX - - LDA $FA93, X : STA $04 - - LDA $02 : ASL #3 : TAY - - ; These addresses form the item box graphics. - LDA ($04), Y : STA $7EC74A : INY #2 - LDA ($04), Y : STA $7EC74C : INY #2 - LDA ($04), Y : STA $7EC78A : INY #2 - LDA ($04), Y : STA $7EC78C : INY #2 - -.noEquippedItem - - RTS -} - -; ============================================================================== +; ============================================================================= HUD_UpdateHearts: { @@ -343,7 +249,7 @@ HUD_UpdateHearts: ; if not, we have to move down one tile in the tilemap LDX.w #$0000 - LDA $07 : ADC.w #$0040 : STA $07 + LDA $07 : CLC : ADC #$0040 : STA $07 .noLineChange @@ -352,7 +258,7 @@ HUD_UpdateHearts: RTS } -; ============================================================================== +; ============================================================================= MagicTilemap: dw $3CF5, $3CF5, $3CF5, $3CF5 @@ -373,65 +279,64 @@ MagicTilemap: dw $3C4D, $3C5E, $3C5E, $3C5E dw $3C4E, $3C5E, $3C5E, $3C5E -; ============================================================================== +; ============================================================================= HexToDecimal: { - ; This apparently is a hex to decimal converter for use with displaying numbers - ; It's obviously slower with larger numbers... should find a way to speed it up. (already done) - REP #$30 - STZ $0003 - - ; The objects mentioned could be rupees, arrows, bombs, or keys. LDX.w #$0000 LDY.w #$0002 - .nextDigit - - ; If number of objects left < 100, 10 CMP $F9F9, Y : BCC .nextLowest10sPlace - - ; Otherwise take off another 100 objects from the total and increment $03 - ; $6F9F9, Y THAT IS, 100, 10 - SBC $F9F9, Y + SEC : SBC $F9F9, Y INC $03, X - BRA .nextDigit - .nextLowest10sPlace - INX : DEY #2 - - ; Move on to next digit (to the right) BPL .nextDigit - - ; Whatever is left is obviously less than 10, so store the digit at $05. STA $05 - SEP #$30 - - ; Go through at most three digits. LDX.b #$02 - -; Repeat for all three digits. .setNextDigitTile - - ; Load each digit's computed value LDA $03, X : CMP.b #$7F - BEQ .blankDigit - - ; #$0-9 -> #$90-#$99 ORA.b #$90 - .blankDigit - - ; A blank digit. STA $03, X - DEX : BPL .setNextDigitTile - RTS -} \ No newline at end of file +} + +; ============================================================================= +; $6FE77-$6FFC0 + +org $0DFE77 +HUD_Tilemap: +{ + dw $207F, $207F, $207F, $207F, $207F, $207F, $207F, $207F + dw $207F, $207F, $207F, $207F, $207F, $207F, $207F, $207F + dw $207F, $207F, $207F, $207F, $207F, $207F, $207F, $207F + dw $346C, $346D, $346E, $346F ; item frame top part + dw $207F, $207F, $207F, $207F, $207F, $207F, $207F, $207F + dw $207F, $207F, $207F, $207F, $207F, $207F, $207F, $207F + dw $207F, $207F, $207F, $207F, $207F, $207F, $207F, $207F + dw $207F, $207F, $207F, $207F, $34DE, $207F, $207F, $34DF + ; item frame left part + dw $207F, $207F, $207F, $207F, $207F, $207F, $207F, $207F + dw $207F, $207F, $207F, $207F, $207F, $207F, $207F, $207F + dw $207F, $207F, $207F, $207F, $207F, $207F, $207F, $207F + dw $207F, $207F, $207F, $207F, $34DE, $207F, $207F, $34DF + ; item frame right part + dw $207F, $207F, $207F, $207F, $207F, $207F, $207F, $207F + dw $207F, $207F, $207F, $207F, $207F, $207F, $207F, $207F + dw $207F, $207F, $207F, $207F, $207F, $207F, $207F, $207F + ; item frame bottom part + dw $207F, $207F, $207F, $207F, $347C, $347D, $347E, $341D + dw $207F, $207F, $207F, $207F, $207F, $207F, $207F, $207F + dw $207F, $207F, $207F, $207F, $207F, $207F, $207F, $207F + dw $207F, $207F, $207F, $207F, $207F, $207F, $207F, $207F + dw $207F, $207F, $207F, $207F, $207F, $207F, $207F, $207F + dw $207F, $207F, $207F, $207F, $207F, $207F, $207F, $207F + dw $207F +} diff --git a/Menu/menu_scroll.asm b/Menu/menu_scroll.asm new file mode 100644 index 0000000..c96b077 --- /dev/null +++ b/Menu/menu_scroll.asm @@ -0,0 +1,57 @@ +; ----------------------------------------------------------------------------- + +Menu_CheckHScroll: +{ + LDA.b $F4 + BIT.b #$10 : BNE .leave_menu + LDA.b $F6 + BIT.b #$20 : BNE .left + BIT.b #$10 : BNE .right + + RTS + +.left + REP #$20 + LDA.w #$FFF8 + BRA .merge + +.right + REP #$20 + LDA.w #$0008 + +.merge + STA.w MenuScrollHDirection + + SEP #$30 + INC.w $0200 + LDA.b #$06 : STA.w $012F + RTS + +.leave_menu + LDA.b #$08 + STA.w $0200 + RTS +} + +; ----------------------------------------------------------------------------- + +Menu_ScrollHorizontal: +{ + REP #$21 ; set A to 16 bit, clear carry flag + + LDA.w $E4 ; BG3 Horizontal Scroll Value + ADC.w MenuScrollHDirection ; Direction set by Menu_CheckHScroll + AND.w #$01FF + STA.b $E4 + AND.w #$00FF + BNE .loop + + SEC + RTS + +.loop + CLC + RTS +} + +; ----------------------------------------------------------------------------- \ No newline at end of file diff --git a/Menu/menu_select_item.asm b/Menu/menu_select_item.asm index a32e358..46e62f5 100644 --- a/Menu/menu_select_item.asm +++ b/Menu/menu_select_item.asm @@ -156,4 +156,30 @@ Menu_DeleteCursor: STZ $0207 RTS +; ----------------------------------------------------------------------------- + +Menu_InitItemScreen: +{ + SEP #$30 + LDY.w $0202 : BNE .all_good + +.loop + INY : CPY.b #$25 : BCS .bad + LDX.w Menu_AddressIndex-1, Y + LDA.l $7EF300, X + BEQ .loop + + STY.w $0202 + BRA .all_good + +.bad + STZ.w $0202 + +.all_good + STZ $0207 + LDA.b #$04 + STA.w $0200 + RTS +} + ; ----------------------------------------------------------------------------- \ No newline at end of file