hud and menu housekeeping

This commit is contained in:
scawful
2022-10-01 02:22:20 -05:00
parent 2d60b9654e
commit 55ed3943fd
4 changed files with 174 additions and 264 deletions

View File

@@ -41,26 +41,27 @@ pullpc
; upload tilemaps containing frame of menu and icons ; upload tilemaps containing frame of menu and icons
org $248000 org $248000
Menu_Tilemap: Menu_Tilemap:
incbin "tilemaps/menu_frame.tilemap" incbin "tilemaps/menu_frame.tilemap"
Menu_QuestIcons: Menu_QuestIcons:
incbin "tilemaps/quest_icons.tilemap" incbin "tilemaps/quest_icons.tilemap"
incsrc "menu_gfx_table.asm" incsrc "menu_gfx_table.asm"
incsrc "menu_draw_items.asm" incsrc "menu_draw_items.asm"
incsrc "menu_text.asm" incsrc "menu_text.asm"
incsrc "menu_palette.asm" incsrc "menu_palette.asm"
; Traverse jump table containing routines for Oracle of Secrets menu ; Subroutine table in menu_vectors
Menu_Entry: Menu_Entry:
{
PHB : PHK : PLB PHB : PHK : PLB
LDA.w $0200 LDA.w $0200 : ASL : TAX
ASL
TAX
JSR (.vectors,X) JSR (.vectors,X)
SEP #$20 SEP #$20
PLB PLB
RTL RTL
}
incsrc "menu_vectors.asm" incsrc "menu_vectors.asm"
; ============================================================================= ; =============================================================================
@@ -136,7 +137,10 @@ Menu_UploadLeft:
; 03 MENU SCROLL DOWN ; 03 MENU SCROLL DOWN
Menu_Scroll: 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: Menu_ScrollDown:
{ {
@@ -161,33 +165,6 @@ Menu_ScrollDown:
; 04 MENU ITEM SCREEN ; 04 MENU ITEM SCREEN
incsrc "menu_select_item.asm" 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: Menu_ItemScreen:
{ {
JSR Menu_CheckHScroll JSR Menu_CheckHScroll
@@ -250,7 +227,6 @@ Menu_ItemScreen:
STA.w $11CE, X STA.w $11CE, X
BRA .done BRA .done
.no_delete .no_delete
LDA.w #$3060 : STA.w $1108, X ; corner LDA.w #$3060 : STA.w $1108, X ; corner
LDA.w #$3070 : STA.w $1148, X LDA.w #$3070 : STA.w $1148, X
@@ -290,6 +266,7 @@ Menu_ScrollTo:
; ============================================================================= ; =============================================================================
; 06 MENU STATS SCREEN ; 06 MENU STATS SCREEN
incsrc "menu_scroll.asm"
Menu_StatsScreen: Menu_StatsScreen:
{ {
@@ -297,61 +274,6 @@ Menu_StatsScreen:
RTS 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 ; 07 MENU SCROLL FROM
@@ -440,8 +362,8 @@ Menu_Exit:
RTS RTS
} }
; =============================================================================
incsrc "menu_draw_bg.asm" incsrc "menu_draw_bg.asm"
incsrc "lw_map_names.asm" incsrc "lw_map_names.asm"
incsrc "menu_hud.asm" incsrc "menu_hud.asm"
; ============================================================================= ; =============================================================================

View File

@@ -1,26 +1,28 @@
; =============================================================================
; headsup display
org $0DFB91 org $0DFB91
JSL NewMenuUpdate JSL Hud_Update
RTS RTS
newIgnoreItemBox: newIgnoreItemBox:
JSL NewMenuUpdate_ignoreItemBox JSL Hud_Update_ignoreItemBox
RTS RTS
org $0DDD21 org $0DDD21
JSR newIgnoreItemBox JSR newIgnoreItemBox
; =============================================================================
org $268000 org $268000
NewMenuUpdate: Hud_Update:
{ {
JSR Hud_UpdateItemBox JSR Hud_Hud_UpdateItemBox
; *$6FB94 ALTERNATE ENTRY POINT .ignoreItemBox ; ALTERNATE ENTRY POINT
.ignoreItemBox
SEP #$30 SEP #$30
; the hook for optimization was placed here... ; need to draw partial heart still though.
; need to draw partial heart still though. update: optimization complete with great results
LDA.b #$FD : STA $0A LDA.b #$FD : STA $0A
LDA.b #$F9 : STA $0B LDA.b #$F9 : STA $0B
LDA.b #$0D : STA $0C LDA.b #$0D : STA $0C
@@ -51,12 +53,12 @@ NewMenuUpdate:
LDA $7EF36C : CMP $7EF36D : BEQ .healthUpdated LDA $7EF36C : CMP $7EF36D : BEQ .healthUpdated
; Seems absurd to have a branch of zero bytes, right? ; Seems absurd to have a branch of zero bytes, right?
SBC #$04 : CMP $7EF36D : BCS .healthUpdated SEC : SBC #$04 : CMP $7EF36D : BCS .healthUpdated
.healthUpdated .healthUpdated
; A = actual health + 0x03; ; A = actual health + 0x03;
LDA $7EF36D : ADC.b #$03 LDA $7EF36D : SEC : SBC #$03
REP #$30 REP #$30
@@ -64,30 +66,28 @@ NewMenuUpdate:
LDA $7EF36C : AND.w #$00FF : STA $02 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 JSR HUD_UpdateHearts
; *$6FC09 ALTERNATE ENTRY POINT ; reentry hook .ignoreHealth ; *$6FC09 ALTERNATE ENTRY POINT ; reentry hook
.ignoreHealth
REP #$30 REP #$30
; Magic amount indicator (normal, 1/2, or 1/4) ; Magic amount indicator (normal, 1/2, or 1/4)
LDA $7EF37B : AND.w #$00FF : CMP.w #$0001 : BCC .normalMagicMeter 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 ; draw 1/2 magic meter
; we really cared about that >_>
LDA.w #$28F7 : STA $7EC704 LDA.w #$28F7 : STA $7EC704
LDA.w #$2851 : STA $7EC706 LDA.w #$2851 : STA $7EC706
LDA.w #$28FA : STA $7EC708 LDA.w #$28FA : STA $7EC708
.normalMagicMeter .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) ; 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+0, X : STA $7EC746
LDA MagicTilemap+2, X : STA $7EC786 LDA MagicTilemap+2, X : STA $7EC786
LDA MagicTilemap+4, X : STA $7EC7C6 LDA MagicTilemap+4, X : STA $7EC7C6
@@ -163,34 +163,20 @@ NewMenuUpdate:
RTL RTL
} }
; ============================================================================== ; =============================================================================
; Update Items
namespace Hud
incsrc "menu_gfx_table.asm"
HudItems: HudItems:
dw BowsGFX dw BowsGFX : dw BoomsGFX : dw HookGFX
dw BoomsGFX dw BombsGFX : dw DekuMaskGFX : dw BottlesGFX
dw HookGFX dw HammerGFX : dw LampGFX : dw Fire_rodGFX
dw BombsGFX dw Ice_rodGFX : dw GoronMaskGFX : dw BottlesGFX
dw DekuMaskGFX dw ShovelGFX : dw JumpFeatherGFX : dw SomariaGFX
dw BottlesGFX dw ByrnaGFX : dw BunnyHoodGFX : dw BottlesGFX
dw HammerGFX dw PowderGFX : dw BookGFX : dw OcarinaGFX
dw LampGFX dw MirrorGFX : dw StoneMaskGFX : dw BottlesGFX
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: Hud_UpdateItemBox:
{ {
@@ -199,98 +185,18 @@ Hud_UpdateItemBox:
ASL : TAX ASL : TAX
LDY.w HudItems-2, X LDY.w HudItems-2, X
LDA.w $0000,Y : STA.l $7EC778 LDA.w $0000,Y : STA.l $7EC778-6
LDA.w $0002,Y : STA.l $7EC77A LDA.w $0002,Y : STA.l $7EC77A-6
LDA.w $0004,Y : STA.l $7EC7B8 LDA.w $0004,Y : STA.l $7EC7B8-6
LDA.w $0006,Y : STA.l $7EC7BA LDA.w $0006,Y : STA.l $7EC7BA-6
SEP #$30 SEP #$30
RTS RTS
} }
Vanilla_UpdateItemBox: namespace off
{
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
.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: HUD_UpdateHearts:
{ {
@@ -343,7 +249,7 @@ HUD_UpdateHearts:
; if not, we have to move down one tile in the tilemap ; if not, we have to move down one tile in the tilemap
LDX.w #$0000 LDX.w #$0000
LDA $07 : ADC.w #$0040 : STA $07 LDA $07 : CLC : ADC #$0040 : STA $07
.noLineChange .noLineChange
@@ -352,7 +258,7 @@ HUD_UpdateHearts:
RTS RTS
} }
; ============================================================================== ; =============================================================================
MagicTilemap: MagicTilemap:
dw $3CF5, $3CF5, $3CF5, $3CF5 dw $3CF5, $3CF5, $3CF5, $3CF5
@@ -373,65 +279,64 @@ MagicTilemap:
dw $3C4D, $3C5E, $3C5E, $3C5E dw $3C4D, $3C5E, $3C5E, $3C5E
dw $3C4E, $3C5E, $3C5E, $3C5E dw $3C4E, $3C5E, $3C5E, $3C5E
; ============================================================================== ; =============================================================================
HexToDecimal: 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 REP #$30
STZ $0003 STZ $0003
; The objects mentioned could be rupees, arrows, bombs, or keys.
LDX.w #$0000 LDX.w #$0000
LDY.w #$0002 LDY.w #$0002
.nextDigit .nextDigit
; If number of objects left < 100, 10
CMP $F9F9, Y : BCC .nextLowest10sPlace CMP $F9F9, Y : BCC .nextLowest10sPlace
SEC : SBC $F9F9, Y
; Otherwise take off another 100 objects from the total and increment $03
; $6F9F9, Y THAT IS, 100, 10
SBC $F9F9, Y
INC $03, X INC $03, X
BRA .nextDigit BRA .nextDigit
.nextLowest10sPlace .nextLowest10sPlace
INX : DEY #2 INX : DEY #2
; Move on to next digit (to the right)
BPL .nextDigit BPL .nextDigit
; Whatever is left is obviously less than 10, so store the digit at $05.
STA $05 STA $05
SEP #$30 SEP #$30
; Go through at most three digits.
LDX.b #$02 LDX.b #$02
; Repeat for all three digits.
.setNextDigitTile .setNextDigitTile
; Load each digit's computed value
LDA $03, X : CMP.b #$7F LDA $03, X : CMP.b #$7F
BEQ .blankDigit BEQ .blankDigit
; #$0-9 -> #$90-#$99
ORA.b #$90 ORA.b #$90
.blankDigit .blankDigit
; A blank digit.
STA $03, X STA $03, X
DEX : BPL .setNextDigitTile DEX : BPL .setNextDigitTile
RTS RTS
} }
; =============================================================================
; $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
}

57
Menu/menu_scroll.asm Normal file
View File

@@ -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
}
; -----------------------------------------------------------------------------

View File

@@ -156,4 +156,30 @@ Menu_DeleteCursor:
STZ $0207 STZ $0207
RTS 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
}
; ----------------------------------------------------------------------------- ; -----------------------------------------------------------------------------