; ============================================================================= ; headsup display org $0DFB91 JSL Hud_Update RTS newIgnoreItemBox: JSL Hud_Update_ignoreItemBox RTS org $0DDD21 JSR newIgnoreItemBox ; ============================================================================= org $268000 Hud_Update: { JSR Hud_Hud_UpdateItemBox .ignoreItemBox ; ALTERNATE ENTRY POINT SEP #$30 ; need to draw partial heart still though. LDA.b #$FD : STA $0A LDA.b #$F9 : STA $0B LDA.b #$0D : STA $0C LDA.b #$68 : STA $07 LDA.b #$C7 : STA $08 LDA.b #$7E : STA $09 REP #$30 ; Load Capacity health. LDA $7EF36C : AND.w #$00FF : STA $00 : STA $02 : STA $04 ; First, just draw all the empty hearts (capacity health) JSR HUD_UpdateHearts SEP #$30 LDA.b #$03 : STA $0A LDA.b #$FA : STA $0B LDA.b #$0D : STA $0C LDA.b #$68 : STA $07 LDA.b #$C7 : STA $08 LDA.b #$7E : STA $09 ; Branch if at full health LDA $7EF36C : CMP $7EF36D : BEQ .healthUpdated ; Seems absurd to have a branch of zero bytes, right? SEC : SBC #$04 : CMP $7EF36D : BCS .healthUpdated .healthUpdated ; A = actual health + 0x03; LDA $7EF36D : SEC : SBC #$03 REP #$30 AND.w #$00FC : STA $00 : STA $04 LDA $7EF36C : AND.w #$00FF : STA $02 ; filling in the full and partially filled hearts (actual health) JSR HUD_UpdateHearts .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 ; draw 1/2 magic meter LDA.w #$28F7 : STA $7EC704 LDA.w #$2851 : STA $7EC706 LDA.w #$28FA : STA $7EC708 .normalMagicMeter ; check player magic (ranges from 0 to 0x7F) ; X = ((MP & 0xFF)) + 7) & 0xFFF8) 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 LDA MagicTilemap+0, X : STA $7EC746 LDA MagicTilemap+2, X : STA $7EC786 LDA MagicTilemap+4, X : STA $7EC7C6 LDA MagicTilemap+6, X : STA $7EC806 ; Load how many rupees the player has LDA $7EF362 JSR HexToDecimal REP #$30 ; The tile index for the first rupee digit LDA $03 : AND.w #$00FF : ORA.w #$2400 : STA $7EC750 ; The tile index for the second rupee digit LDA $04 : AND.w #$00FF : ORA.w #$2400 : STA $7EC752 ; The tile index for the third rupee digit LDA $05 : AND.w #$00FF : ORA.w #$2400 : STA $7EC754 ; Number of bombs Link has. LDA $7EF343 : AND.w #$00FF JSR HexToDecimal REP #$30 ; The tile index for the first bomb digit LDA $04 : AND.w #$00FF : ORA.w #$2400 : STA $7EC758 ; The tile index for the second bomb digit LDA $05 : AND.w #$00FF : ORA.w #$2400 : STA $7EC75A ; Number of Arrows Link has. LDA $7EF377 : AND.w #$00FF ; converts hex to up to 3 decimal digits JSR HexToDecimal REP #$30 ; The tile index for the first arrow digit LDA $04 : AND.w #$00FF : ORA.w #$2400 : STA $7EC75E ; The tile index for the second arrow digit LDA $05 : AND.w #$00FF : ORA.w #$2400 : STA $7EC760 LDA.w #$007F : STA $05 ; Load number of Keys Link has LDA $7EF36F : AND.w #$00FF : CMP.w #$00FF : BEQ .noKeys JSR HexToDecimal .noKeys REP #$30 ; The key digit, which is optionally drawn. ; Also check to see if the key spot is blank LDA $05 : AND.w #$00FF : ORA.w #$2400 : STA $7EC764 CMP.w #$247F : BNE .dontBlankKeyIcon ; If the key digit is blank, also blank out the key icon. STA $7EC724 .dontBlankKeyIcon SEP #$30 RTL } ; ============================================================================= 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 Hud_UpdateItemBox: { REP #$30 LDA.w $0202 ASL : TAX LDY.w HudItems-2, X 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 } namespace off ; ============================================================================= HUD_UpdateHearts: { ; Draws hearts in a painfully slow loop ; I used DMA to speed it up in my custom code ; (but still needs fixing to work on 1/1/1 hardware) LDX.w #$0000 .nextHeart LDA $00 : CMP.w #$0008 : BCC .lessThanOneHeart ; Notice no SEC was needed since carry is assumedly set. SBC.w #$0008 : STA $00 LDY.w #$0004 JSR .drawHeart INX #2 BRA .nextHeart .lessThanOneHeart CMP.w #$0005 : BCC .halfHeartOrLess LDY.w #$0004 BRA .drawHeart .halfHeartOrLess CMP.w #$0001 : BCC .emptyHeart LDY.w #$0002 BRA .drawHeart .emptyHeart RTS .drawHeart ; Compare number of hearts so far on current line to 10 CPX.w #$0014 : BCC .noLineChange ; if not, we have to move down one tile in the tilemap LDX.w #$0000 LDA $07 : CLC : ADC #$0040 : STA $07 .noLineChange LDA [$0A], Y : TXY : STA [$07], Y RTS } ; ============================================================================= MagicTilemap: dw $3CF5, $3CF5, $3CF5, $3CF5 dw $3CF5, $3CF5, $3CF5, $3C5F dw $3CF5, $3CF5, $3CF5, $3C4C dw $3CF5, $3CF5, $3CF5, $3C4D dw $3CF5, $3CF5, $3CF5, $3C4E dw $3CF5, $3CF5, $3C5F, $3C5E dw $3CF5, $3CF5, $3C4C, $3C5E dw $3CF5, $3CF5, $3C4D, $3C5E dw $3CF5, $3CF5, $3C4E, $3C5E dw $3CF5, $3C5F, $3C5E, $3C5E dw $3CF5, $3C4C, $3C5E, $3C5E dw $3CF5, $3C4D, $3C5E, $3C5E dw $3CF5, $3C4E, $3C5E, $3C5E dw $3C5F, $3C5E, $3C5E, $3C5E dw $3C4C, $3C5E, $3C5E, $3C5E dw $3C4D, $3C5E, $3C5E, $3C5E dw $3C4E, $3C5E, $3C5E, $3C5E ; ============================================================================= HexToDecimal: { REP #$30 STZ $0003 LDX.w #$0000 LDY.w #$0002 .nextDigit CMP $F9F9, Y : BCC .nextLowest10sPlace SEC : SBC $F9F9, Y INC $03, X BRA .nextDigit .nextLowest10sPlace INX : DEY #2 BPL .nextDigit STA $05 SEP #$30 LDX.b #$02 .setNextDigitTile LDA $03, X : CMP.b #$7F BEQ .blankDigit ORA.b #$90 .blankDigit STA $03, X DEX : BPL .setNextDigitTile 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 }