Health upgrade
A pickup that raises the most health a character can hold, whole or in pieces.
A health upgrade raises the maximum health a character can hold. These games either add capacity with one pickup or build it from a set of pieces, and they differ in how much health the pickup restores.
- Whole containersMetroid (1986). Energy tanks, each filling Samus's health to the new maximum.1,2,3,4The Legend of Zelda (1986). Heart containers only, three to sixteen.5,6Zelda II: The Adventure of Link (1987). Heart and magic containers, four of each to start, 32 meter units apiece.7Metroid II: Return of Samus (1991). Up to 5 energy tanks, each one refilling her energy.8,9Super Metroid (1994). Energy tanks of 100 each, from 99 at the start, each refilling her energy.10,11Metroid Fusion (2002). Energy tanks of 100 from 99 at the start, each refilling her energy, up to 2099.12,13Metroid: Zero Mission (2004). Energy tanks of 100, or 50 on Hard, from 99 at the start, each refilling her energy.14,15
- PiecesThe Legend of Zelda: A Link to the Past (1991). Four Pieces of Heart make a container; up to 20 hearts.16,17The Legend of Zelda: Link's Awakening (1993). Four Pieces of Heart make a container, as in A Link to the Past.18,19The Legend of Zelda: Oracle of Seasons and Oracle of Ages (2001). Four Pieces of Heart make a Heart Container, which adds a heart and a 16-heart refill.20,21The Legend of Zelda: The Minish Cap (2004). Four Pieces of Heart make a container, and every piece refills Link's health; up to 20 hearts.22
#Whole pickups
The Legend of Zelda starts with 3 hearts6 and adds one container and one full heart per pickup, up to 165 containers6,5. Zelda II: The Adventure of Link starts with four heart containers and four separate magic containers; each heart container holds 32 meter units, with one unit below the full amount7.
In Metroid, Samus starts with 30 units1, and an energy tank adds a tank and fills her health to its new maximum1,2. Her health is stored in tenths of a unit, and the tank limit is 62; at that limit the maximum is 699.9 units4,3. Metroid II: Return of Samus starts Samus at 99 units8; each energy tank refills her to the tank count plus 99, up to 5 tanks at most9,8,9.
Super Metroid starts Samus at 99 energy10, and each tank adds 100 energy11 to her maximum and fills her energy to that maximum10,11. Metroid Fusion also starts at 99 energy12; its tanks add 100 and refill her, up to 100 per tank, up to 209913,12,13. Metroid: Zero Mission starts at 99 energy14 too, but tank capacity depends on difficulty: each adds 10015 on Easy or Normal and 5015 on Hard, then refills Samus to the new maximum14,15.
#Piece sets
A Link to the Past converts every 416 Piece of Heart into a container16. A container adds one heart up to 20 hearts17; one from a complete set restores Link to the new maximum, while a boss’s container restores one heart17. Link’s Awakening also takes 418 pieces per container18. Its fourth piece adds one heart to the maximum and queues 6418 eighth-heart units of health, while a boss container queues a full refill18,19.
In both Oracle games, 420 pieces make a container, and health counts in quarter hearts by the disassembly annotators’ reading of a code comment20. A container adds one heart and queues a refill of 6421 quarter-heart units, capped at the maximum21. The Minish Cap converts 422 pieces into a container, up to 20 hearts22. Each piece restores Link’s current health to its maximum, and the fourth also adds a heart to his capacity22.
Games
| Game | Year | How | Note |
|---|---|---|---|
| Metroid | 1986 | Whole containers | energy tanks, each filling Samus's health to the new maximum |
| The Legend of Zelda | 1986 | Whole containers | heart containers only, three to sixteen |
| Zelda II: The Adventure of Link | 1987 | Whole containers | heart and magic containers, four of each to start, 32 meter units apiece |
| Super Mario Bros. 2 | 1988 | Whole containers | up to two mushrooms a level, each adding a mark until the level ends |
| Metroid II: Return of Samus | 1991 | Whole containers | up to 5 energy tanks, each one refilling her energy |
| Super Metroid | 1994 | Whole containers | energy tanks of 100 each, from 99 at the start, each refilling her energy |
| Metroid Fusion | 2002 | Whole containers | energy tanks of 100 from 99 at the start, each refilling her energy, up to 2099 |
| Metroid: Zero Mission | 2004 | Whole containers | energy tanks of 100, or 50 on Hard, from 99 at the start, each refilling her energy |
| The Legend of Zelda: A Link to the Past | 1991 | Pieces | four Pieces of Heart make a container; up to 20 hearts |
| The Legend of Zelda: Link's Awakening | 1993 | Pieces | four Pieces of Heart make a container, as in A Link to the Past |
| The Legend of Zelda: Oracle of Seasons and Oracle of Ages | 2001 | Pieces | four Pieces of Heart make a Heart Container, which adds a heart and a 16-heart refill |
| The Legend of Zelda: The Minish Cap | 2004 | Pieces | four Pieces of Heart make a container, and every piece refills Link's health; up to 20 hearts |
Every claim about this mechanic, by game (24)
References
- ^ abcSamus starts with 30 units of energy and no energy tanks.Codenmikstas/metroid-disassembly · “Metroid (USA)”
How we know
1580 LDA #$00 ; 1581 STA HealthLo ;Starting health is 1582 LDA #$03 ;set to 30 units. 1583 STA HealthHi ;
Source_Files/Bank07.asm lines 1580–1583 at 4270d57 · upstream ↗ In the cartridge (“Metroid (USA)”): bank 7 SamusInit, $C8D1. We don't reproduce the bytes.
Checked against the evidence by its author, an AI model, 2026-10-20.
Checked by a second AI model, 2026-10-21.
- ^ abcAn energy tank adds a tank, up to 6, and fills Samus's health to her new maximum.Codenmikstas/metroid-disassembly · “Metroid (USA)”
How we know
4354LDC00:* LDA TankCount ; 4355LDC03: CMP #$06 ;Has Samus got 6 energy tanks? 4356LDC05: BEQ + ;If so, she can't have any more. 4357LDC07: INC TankCount ;Otherwise give her a new tank. 4358LDC0A:* LDA TankCount ; 4359LDC0D: JSR Amul16 ;Get tank count and shift into upper nibble. 4360LDC10: ORA #$09 ; 4361LDC12: STA HealthHi ;Set new tank count. Upper health digit set to 9. 4362LDC15: LDA #$99 ;Max out low health digit. 4363LDC17: STA HealthLo ;Health is now FULL!
Source_Files/Bank07.asm lines 4354–4363 at 4270d57 · upstream ↗ In the cartridge (“Metroid (USA)”): bank 7 $DBF7, the missile and energy tank pickup. We don't reproduce the bytes.
Checked against the evidence by its author, an AI model, 2026-10-20.
Checked by a second AI model, 2026-10-21.
- ^ abSamus's health can't exceed 99.9 units above her tanks, units for tanks, which is 699.9 with all six.Codenmikstas/metroid-disassembly · “Metroid (USA)”
How we know
2576LCF14: LDA TankCount ; 2577LCF17: JSR Amul16 ;($C2C5)*16. Move tank count to upper 4 bits. 2578LCF1A: ORA #$0F ;Set lower 4 bits. 2579LCF1C: CMP HealthHi ; 2580LCF1F: BCS + ;Is life less than max? if so, branch. 2581LCF21: AND #$F9 ;Life is more than max amount. 2582LCF23: STA HealthHi ; 2583LCF26: LDA #$99 ;Set life to max amount. 2584LCF28: STA HealthLo ;
Source_Files/Bank07.asm lines 2576–2584 at 4270d57 · upstream ↗ In the cartridge (“Metroid (USA)”): bank 7 AddHealth, $CEF9. We don't reproduce the bytes.
Checked against the evidence by its author, an AI model, 2026-10-20.
Checked by a second AI model, 2026-10-21.
- ^ abSamus's health is binary-coded decimal in tenths of a unit;
HealthHiholds the full energy tanks in its high nibble and the tens digit in its low nibble, andHealthLoholds the ones digit in its high nibble.Codenmikstas/metroid-disassembly · “Metroid (USA)”How we know
270.alias HealthLo $0106 ;Lower health digit in upper 4 bits. 271.alias HealthHi $0107 ;Upper health digit in lower 4 bits 272 ;# of full tanks in upper 4 bits.
Source_Files/Metroid_Defines.asm lines 270–272 at 4270d57 · upstream ↗ 8211 ldx #$00 ;Increase HealthHi by 0. 8212 ldy #$50 ;Increase HealthLo by 5.
Source_Files/Bank07.asm lines 8211–8212 at 4270d57 · upstream ↗ In the cartridge (“Metroid (USA)”): bank 7 $CE92, SubtractHealth, which subtracts in base 10. We don't reproduce the bytes.
Checked against the evidence by its author, an AI model, 2026-10-20.
Checked by a second AI model, 2026-10-21.
- ^ abcA heart container adds one container and one full heart, up to 16 containers; a new file starts with three.Codealdonunez/zelda1-disassembly · “Legend of Zelda, The (USA) (Rev 1)”
How we know
4585@TakeHeartContainer: 4586 ; For heart containers, cap at $10. 4587 ; Add a heart container and a heart. 4588 LDA Items, Y 4589 CMP #$F0 4590 BCS L6C28_Exit ; If we already have max hearts, return. 4591 ADC #$11 4592 JMP SetItemValue ; Go set the item value and return.
src/Z_01.asm lines 4585–4592 at 50a1c86 · upstream ↗ In the cartridge (“Legend of Zelda, The (USA) (Rev 1)”): bank 1, as in item-ids. We don't reproduce the bytes.
Checked against the evidence by its author, an AI model, 2026-10-20.
Checked by a second AI model, 2026-10-21.
- ^ abcLink's health is
HeartValues, whose high nibble is the heart containers less one and whose low nibble is the full hearts, plus a partial heart inHeartPartialfrom$00to$FF; a new file starts at$22and$FF, three containers and three hearts.Codealdonunez/zelda1-disassembly · “Legend of Zelda, The (USA) (Rev 1)”How we know
1667 ; Initialize file B hearts value to 3 heart containers and 2 hearts. 1668 LDY #$18 1669 LDA #$22 1670 STA ($C0), Y 1671 INY ; Initialize file B heart partial to full. 1672 LDA #$FF
src/Z_02.asm lines 1667–1672 at 50a1c86 · upstream ↗ 4681CompareHeartsToContainers: 4682 LDA HeartValues ⋮ 4684 AND #$0F ⋮ 4687 LSR 4688 LSR 4689 LSR 4690 LSR 4691 CMP $00
src/Z_01.asm lines 4681–4691 at 50a1c86 · upstream ↗ In the cartridge (“Legend of Zelda, The (USA) (Rev 1)”): bank 2 $9EF0, UpdateModeERegister, which writes the new file. We don't reproduce the bytes.
Checked against the evidence by its author, an AI model, 2026-10-20.
Checked by a second AI model, 2026-10-21.
- ^ abA new game starts with four heart containers and four magic containers. Picking up a container adds one, and a full meter holds 32 units per container less one, so four containers fill to 127.CodeFiendsOfTheElements/z2disassembly
How we know
17AFF - Number of Magic Containers to begin game … 17B00 - Number of Heart Containers to begin game
src/prg5.asm#L7062-L7064 · upstream ↗ 6165 INC $0775,x ; 0x1e7dd $E7CD FE 75 07 ; 0E = Magic Containers, 0F = Heart Containerssrc/prg7.asm lines 6158–6165 at c4c3a4c · upstream ↗ 1823 LDA $0783,x ; 0x1cb28 $CB18 BD 83 07 ; Current number of Magic/Heart Containerssrc/prg7.asm lines 1815–1831 at c4c3a4c · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-21.
Checked by a second AI model, 2026-10-21.
- ^ abcA new game starts with 99 units of energy, no energy tanks, and 30 of 30 missiles.Codealex-west/M2RoS
How we know
20 db $00 ; Samus' equipment ⋮ 23 dw $0099 ; Samus' health 24 dw $0030 ; Samus' max missiles 25 dw $0030 ; Samus' missiles
SRC/data/initialSave.asm lines 20–25 at 031aea3 · upstream ↗ 9942pickup_missileTank: ;{ 9943 ; Add 10 to max missiles 9944 ld a, [samusMaxMissilesLow] 9945 add $10 9946 daa
SRC/bank_000.asm lines 9942–9946 at 031aea3 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-21.
Checked by a second AI model, 2026-10-21.
- ^ abcAn energy tank adds a tank, up to 5, and fills Samus's energy, setting its high byte to the tank count and its low byte to 99.Codealex-west/M2RoS
How we know
9895pickup_energyTank: ;{ 9896 ; Check if energy tanks are at max 9897 ld a, [samusEnergyTanks] 9898 cp $05 ; Max Energy tanks ⋮ 9904 ; Set current health to max 9905 ld [samusCurHealthHigh], a 9906 ld a, $99 9907 ld [samusCurHealthLow], a
SRC/bank_000.asm lines 9895–9907 at 031aea3 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-21.
Checked by a second AI model, 2026-10-21.
- ^ abcA new save file starts Samus with 99 energy and no missiles.CodeInsaneFirebat/sm_disassembly
How we know
6230NewSaveFile:src/bank_81.asm lines 6230–6236 at 7af131e · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-21.
Checked by a second AI model, 2026-10-21.
- ^ abcAn energy tank adds its argument, 100, to Samus's maximum energy and sets her energy to the new maximum.CodeInsaneFirebat/sm_disassembly
How we know
1452Instruction_PLM_CollectHealth_EnergyTank:src/bank_84.asm lines 1452–1461 at 7af131e · upstream ↗ dw Instruction_PLM_CollectHealth_EnergyTank,$0064
src/bank_84.asm#L15449 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-21.
Checked by a second AI model, 2026-10-21.
- ^ abcWhen
SamusInitruns with no file loading (gIsLoadingFileclear) and an unnamed flag,gUnk_3000be3, clear, it copiessEquipment_EmptyintogEquipment: 99 energy of 99, 10 missiles of 10, 10 power bombs of 10, and no weapon flags (MBF_NONE). The atlas reads this as a new game's start. Zero Mission starts with the same 99 energy, but with every ammunition count at 0.Codemetroidret/mf · metroidret/mzmHow we know
7523 if (gUnk_3000be3 || gIsLoadingFile) 7524 return; ⋮ 7526 gEquipment = sEquipment_Empty;
src/samus.c lines 7523–7526 at a6d6187 · upstream ↗ 47const struct Equipment sEquipment_Empty = { 48 .currentEnergy = 99, 49 .maxEnergy = 99, 50 .currentMissiles = 10, 51 .maxMissiles = 10, 52 .currentPowerBombs = 10, 53 .maxPowerBombs = 10, 54 .beamStatus = BF_NONE, 55 .weaponsStatus = MBF_NONE,
src/data/samus/samus_animation_pointers.c lines 47–55 at a6d6187 · upstream ↗ 236// --- Energy and ammo --- 237#define STARTING_ENERGY 99 238#define STARTING_MISSILES 10 239#define STARTING_POWER_BOMBS 10
include/constants/samus.h lines 236–239 at a6d6187 · upstream ↗ 8071 if (!gIsLoadingFile) ⋮ 8073 // Zero out most of samus's data 8074 DMA3_FILL_32(0, &gSamusData, sizeof(gSamusData)); 8075 DMA3_FILL_32(0, &gEquipment, sizeof(gEquipment)); ⋮ 8087 gEquipment.maxEnergy = 99; 8088 gEquipment.currentEnergy = 99;
src/samus.c lines 8071–8088 at 2aae289 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-22.
Checked by a second AI model, 2026-10-22.
- ^ abcAn energy tank adds 100 to Samus's maximum energy and sets her energy to the new maximum, unless the new maximum would pass
MAX_ENERGY_AMOUNT, 20 tanks plus the starting 99, or 2099. The tank code reads no difficulty. Zero Mission's tank also adds 100 and refills, or 50 on Hard, and stops at 12 tanks: 1299 on Easy and Normal and 699 on Hard (computed).Codemetroidret/mf · metroidret/mzmrevisedHow we know
267 else if (i == TANK_TYPE_ENERGY) ⋮ 269 if (gEquipment.maxEnergy + ENERGY_INCREASE_AMOUNT <= MAX_ENERGY_AMOUNT) ⋮ 271 gEquipment.maxEnergy += ENERGY_INCREASE_AMOUNT; 272 gEquipment.currentEnergy = gEquipment.maxEnergy;
src/bg_clip.c lines 267–274 at a6d6187 · upstream ↗ 241#ifndef REGION_JP 242#define ENERGY_INCREASE_AMOUNT 100 ⋮ 246// Default 2099 247#define MAX_ENERGY_AMOUNT (20 * ENERGY_INCREASE_AMOUNT + STARTING_ENERGY)
include/constants/samus.h lines 241–247 at a6d6187 · upstream ↗ 531 else if (i == ITEM_TYPE_ENERGY) ⋮ 533 if (sNumberOfTanksPerArea[MAX_AMOUNT_OF_AREAS - 1].energy * sTankIncreaseAmount[gDifficulty].energy + sStartingHealthAmmo.energy >= gEquipment.maxEnergy + sTankIncreaseAmount[gDifficulty].energy) ⋮ 535 gEquipment.maxEnergy += sTankIncreaseAmount[gDifficulty].energy; 536 gEquipment.currentEnergy = gEquipment.maxEnergy;
src/bg_clip.c lines 531–537 at 2aae289 · upstream ↗ 52 [MAX_AMOUNT_OF_AREAS - 1] = { 53 .energy = 12,
src/data/block_data.c lines 52–53 at 2aae289 · upstream ↗ 60const struct TankList sStartingHealthAmmo = { 61 .energy = 99, ⋮ 67const struct TankList sTankIncreaseAmount[DIFF_COUNT] = { 68 [DIFF_EASY] = { 69 .energy = 100, ⋮ 74 [DIFF_NORMAL] = { 75 .energy = 100, ⋮ 80 [DIFF_HARD] = { 81 .energy = 50,
src/data/block_data.c lines 60–81 at 2aae289 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-22.
Revised after a check by a second AI model, 2026-10-22.
- ^ abcWhen a game starts rather than loads a file (
gIsLoadingFileclear),SamusInitfillsgEquipmentwith zeros and then sets Samus's maximum and current energy to 99, so she starts with 99 energy, no tanks, and no missiles, super missiles, or power bombs. Metroid starts her with 30 units.Codemetroidret/mzm · nmikstas/metroid-disassemblyHow we know
8071 if (!gIsLoadingFile) ⋮ 8073 // Zero out most of samus's data 8074 DMA3_FILL_32(0, &gSamusData, sizeof(gSamusData)); 8075 DMA3_FILL_32(0, &gEquipment, sizeof(gEquipment)); ⋮ 8083 // Set starting info 8084 gSamusData.pose = SPOSE_FACING_THE_FOREGROUND; 8085 gSamusData.direction = KEY_LEFT; ⋮ 8087 gEquipment.maxEnergy = 99; 8088 gEquipment.currentEnergy = 99;
src/samus.c lines 8071–8088 at 2aae289 · upstream ↗ 16struct Equipment { 17 u16 maxEnergy; 18 u16 maxMissiles; 19 u8 maxSuperMissiles; 20 u8 maxPowerBombs; 21 u16 currentEnergy; 22 u16 currentMissiles; 23 u8 currentSuperMissiles; 24 u8 currentPowerBombs;
include/structs/samus.h lines 16–24 at 2aae289 · upstream ↗ 1580 LDA #$00 ; 1581 STA HealthLo ;Starting health is 1582 LDA #$03 ;set to 30 units. 1583 STA HealthHi ;
Source_Files/Bank07.asm lines 1580–1583 at 4270d57 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-22.
Checked by a second AI model, 2026-10-22.
- ^ abcdOn Easy and Normal an energy tank adds 100 to Samus's maximum energy, and on Hard 50, and sets her energy to the new maximum. A tank adds nothing if the maximum plus one more tank would pass 12 tanks plus the starting 99, so the maximum is 1299, or 699 on Hard (computed). In Metroid each tank holds 100 units, up to 6 tanks and 699.9 units, with the same refill.Codemetroidret/mzm · nmikstas/metroid-disassembly
How we know
531 else if (i == ITEM_TYPE_ENERGY) ⋮ 533 if (sNumberOfTanksPerArea[MAX_AMOUNT_OF_AREAS - 1].energy * sTankIncreaseAmount[gDifficulty].energy + sStartingHealthAmmo.energy >= gEquipment.maxEnergy + sTankIncreaseAmount[gDifficulty].energy) ⋮ 535 gEquipment.maxEnergy += sTankIncreaseAmount[gDifficulty].energy; 536 gEquipment.currentEnergy = gEquipment.maxEnergy;
src/bg_clip.c lines 531–537 at 2aae289 · upstream ↗ 52 [MAX_AMOUNT_OF_AREAS - 1] = { 53 .energy = 12,
src/data/block_data.c lines 52–53 at 2aae289 · upstream ↗ 60const struct TankList sStartingHealthAmmo = { 61 .energy = 99, ⋮ 67const struct TankList sTankIncreaseAmount[DIFF_COUNT] = { 68 [DIFF_EASY] = { 69 .energy = 100, ⋮ 74 [DIFF_NORMAL] = { 75 .energy = 100, ⋮ 80 [DIFF_HARD] = { 81 .energy = 50,
src/data/block_data.c lines 60–81 at 2aae289 · upstream ↗ 4354LDC00:* LDA TankCount ; 4355LDC03: CMP #$06 ;Has Samus got 6 energy tanks? 4356LDC05: BEQ + ;If so, she can't have any more. 4357LDC07: INC TankCount ;Otherwise give her a new tank. 4358LDC0A:* LDA TankCount ; 4359LDC0D: JSR Amul16 ;Get tank count and shift into upper nibble. 4360LDC10: ORA #$09 ; 4361LDC12: STA HealthHi ;Set new tank count. Upper health digit set to 9. 4362LDC15: LDA #$99 ;Max out low health digit. 4363LDC17: STA HealthLo ;Health is now FULL!
Source_Files/Bank07.asm lines 4354–4363 at 4270d57 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-22.
Checked by a second AI model, 2026-10-22.
- ^ abcEach Piece of Heart adds 1 to a count kept modulo 4; the piece that brings it back to 0 grants item
$26, a heart container.Codespannerisms/usdasmHow we know
20390|05F08A| LDA.l $7EF36B 20391|05F08E| INC A 20392|05F08F| AND.b #$03 20393|05F091| STA.l $7EF36B 20394|05F095| BNE .not_full_set ⋮ 20400|05F09C| LDY.b #$26 ; ITEMGET 26
bank_05.asm lines 20390–20402 at bcdd96e · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-21.
Checked by a second AI model, 2026-10-21.
- ^ abcA heart container adds 8 to Link's life capacity, one heart, up to
$A0, 20 hearts. The one from four pieces refills his life to the new capacity; the one a boss leaves adds a single heart of life.Codespannerisms/usdasmHow we know
13497|08C45A| CMP.b #$26 ; ITEMGET 26 13498|08C45C| BEQ .refill_hp ⋮ 13503|08C462| CMP.b #$3E ; ITEMGET 3E ⋮ 13509|08C46D| CMP.b #$A0 ⋮ 13513|08C472| ADC.b #$08 13514|08C474| STA.l $7EF36C ⋮ 13518|08C47D| ADC.b #$08 13519|08C47F| STA.l $7EF372 ⋮ 13525.refill_hp ⋮ 13538|08C49B| SBC.b $00 13539|08C49D| STA.b $00 ⋮ 13543|08C4A4| ADC.b $00 ⋮
bank_08.asm lines 13496–13544 at bcdd96e · upstream ↗ 13234|08C2DD| dw $FFFF ; FIGHTER SWORD ⋮ 13272|08C329| dw $0158 ; HEART CONTAINER FROM 4/4 - MESSAGE 0158 ⋮ 13296|08C359| dw $FFFF ; BOSS HC
bank_08.asm lines 13233–13297 at bcdd96e · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-21.
Checked by a second AI model, 2026-10-21.
- ^ abcdeLink's Awakening keeps A Link to the Past's four Pieces of Heart per container. The fourth piece clears the count, adds a heart to Link's maximum, and queues
$40of health, eight hearts' worth.Codezladx/LADX-Disassembly · spannerisms/usdasm · “Legend of Zelda, The - Link's Awakening (USA, Europe) (Rev 2)”revisedHow we know
2922 ; If found 4 heart pieces… ⋮ 2929 ; Clear heart pieces count ⋮ 2935 ; Increase the maximum number of hearts
src/code/entities/bank3.asm lines 2922–2937 at 2a5c2c0 · upstream ↗ 20390|05F08A| LDA.l $7EF36B 20391|05F08E| INC A 20392|05F08F| AND.b #$03 20393|05F091| STA.l $7EF36B 20394|05F095| BNE .not_full_set ⋮ 20400|05F09C| LDY.b #$26 ; ITEMGET 26
bank_05.asm lines 20390–20402 at bcdd96e · upstream ↗ In the cartridge (“Legend of Zelda, The - Link's Awakening (USA, Europe) (Rev 2)”): the same count test, reset, `$40` of health, and `inc` of the maximum in the 1993 Game Boy release, bank 3. We don't reproduce the bytes.
Checked against the evidence by its author, an AI model, 2026-10-21.
Revised after a check by a second AI model, 2026-10-21.
- ^ abA heart container left by a boss adds a heart to Link's maximum and queues
$FFof health, a full refill.Codezladx/LADX-Disassembly · “Legend of Zelda, The - Link's Awakening (USA, Europe) (Rev 2)”revisedHow we know
2768 ; Increase max health, and fully restore healthsrc/code/entities/bank3.asm lines 2766–2772 at 2a5c2c0 · upstream ↗ In the cartridge (“Legend of Zelda, The - Link's Awakening (USA, Europe) (Rev 2)”): the same `inc` of the maximum and `$FF` of health in the 1993 release, bank 3. We don't reproduce the bytes.
Checked against the evidence by its author, an AI model, 2026-10-21.
Revised after a check by a second AI model, 2026-10-21.
- ^ abcIn both US releases Link's health counts in quarter hearts, the annotators' reading in a comment that calls the starting
$0c"3 hearts". The fourth Piece of Heart resets the count to 0 and gives Link a Heart Container with a parameter of 4, one heart. Link's Awakening DX also takes four pieces, but there the fourth adds a heart to a maximum kept in whole hearts and queues$40of health in eighths, eight hearts' worth.CodeStewmath/oracles-disasm · zladx/LADX-DisassemblyrevisedHow we know
389initialFileVariables_standardGame:code/fileManagement.s lines 389–391 at 21c924a · upstream ↗ 251 ; TREASURE_HEART_PIECE (0x2b) 252 .db <wNumHeartPieces 253 .db $02
data/ages/treasureCollectionBehaviours.s lines 251–254 at 21c924a · upstream ↗ 219 ; TREASURE_HEART_PIECE (0x2b) 220 .db <wNumHeartPieces 221 .db $02
data/seasons/treasureCollectionBehaviours.s lines 219–222 at 21c924a · upstream ↗ 2018@func: 2019 ld a,(wNumHeartPieces) 2020 add b 2021 add a 2022 push af 2023 sub $08 2024 jr nz,+ ⋮ 2026 ld (wNumHeartPieces),a 2027 dec a ⋮ 2029 ld (w7d0ef),a
code/textbox.s lines 2018–2029 at 21c924a · upstream ↗ 308 ; You got 4 pieces of heart. That's 1 heart container 309.ifdef ROM_AGES ⋮ 322 ld a,SND_FILLED_HEART_CONTAINER 323 call playSound 324 ld a,TREASURE_HEART_CONTAINER 325 ld c,$04 326 jp giveTreasure
code/textbox.s lines 308–326 at 21c924a · upstream ↗ 2922 ; If found 4 heart pieces… ⋮ 2929 ; Clear heart pieces count ⋮ 2935 ; Increase the maximum number of hearts
src/code/entities/bank3.asm lines 2922–2937 at 2a5c2c0 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-22.
Revised after a check by a second AI model, 2026-10-22.
- ^ abcIn both US releases a Heart Container adds its parameter to Link's maximum health, 4 quarters (one heart) for every Heart Container treasure object the data defines and for the one the fourth Piece of Heart gives. It always brings a heart refill of
$40, which is sixteen hearts (computed, in the quarter hearts a comment gives), capped at the maximum. Link's Awakening DX's boss container adds a heart and queues$FFof health instead.CodeStewmath/oracles-disasm · zladx/LADX-DisassemblyrevisedHow we know
246 ; TREASURE_HEART_CONTAINER (0x2a) 247 .db <wLinkMaxHealth 248 .db $8a
data/ages/treasureCollectionBehaviours.s lines 246–249 at 21c924a · upstream ↗ 214 ; TREASURE_HEART_CONTAINER (0x2a) 215 .db <wLinkMaxHealth 216 .db $8a
data/seasons/treasureCollectionBehaviours.s lines 214–217 at 21c924a · upstream ↗ 21; a: Add [param] to [b0]. (Heart container) ⋮ 23; c: Add [param] to [b0], using [b0+1] as a cap. (Health refill)
data/ages/treasureCollectionBehaviours.s lines 1–23 at 21c924a · upstream ↗ 265 m_BeginTreasureSubids TREASURE_HEART_CONTAINER 266 m_TreasureSubid $1a, $04, $16, $3b, TREASURE_OBJECT_HEART_CONTAINER_00
data/ages/treasureObjectData.s lines 265–268 at 21c924a · upstream ↗ 230 m_BeginTreasureSubids TREASURE_HEART_CONTAINER 231 m_TreasureSubid $1a, $04, $16, $3b, TREASURE_OBJECT_HEART_CONTAINER_00
data/seasons/treasureObjectData.s lines 230–233 at 21c924a · upstream ↗ 13; b1: Parameter (value of 'c' to pass to "giveTreasure")data/ages/treasureObjectData.s lines 8–13 at 21c924a · upstream ↗ 117 call @giveTreasure ⋮ 119 ; Check if adding this item requires adding another item. 120 push af 121 ld hl,@extraItemsToAddTable 122 call @findItemInTable 123 call nz,@giveTreasure
code/treasureAndDrops.s lines 115–123 at 21c924a · upstream ↗ 199; When Link obtains any item in the first column, he will obtain the item in the second 200; column with the parameter in the third column. ⋮ 204 .db TREASURE_HEART_CONTAINER TREASURE_HEART_REFILL $40
code/treasureAndDrops.s lines 199–204 at 21c924a · upstream ↗ 319; [de] += c. 320@modea: 321 ld a,(de) 322 add c 323 ld (de),a 324 ret ⋮ 326; [de] += c, and [de+1] is the cap for this value. ⋮ 328@modec: ⋮ 339 cp (hl) ⋮ 347 add c 348 ld (de),a 349 jr ++ ⋮
code/treasureAndDrops.s lines 319–362 at 21c924a · upstream ↗ 2768 ; Increase max health, and fully restore healthsrc/code/entities/bank3.asm lines 2768–2772 at 2a5c2c0 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-22.
Revised after a check by a second AI model, 2026-10-22.
- ^ abcdThe Minish Cap counts Link's health in eighths of a heart, as A Link to the Past does and as the zladx annotators' comment on Link's Awakening's health byte says ("$08 = 1 heart"); a new file starts him at 24, three hearts. When Link holds up a Piece of Heart, the code refills his health to its maximum and adds 1 to the piece count. The fourth piece resets the count to 0 and then does what a Heart Container does: it adds 8 to the maximum, capped at 160 (20 hearts, A Link to the Past's cap), and refills his health again. Both earlier games also make a container from every fourth piece.Codezeldaret/tmc · spannerisms/usdasm · zladx/LADX-Disassemblyrevised
How we know
134 case 2: 135 if (super->type != ITEM_HEART_CONTAINER) { 136 if (super->type != ITEM_HEART_PIECE) { 137 break; ⋮ 139 ModHealth(160); 140 gSave.stats.heartPieces++; 141 if (gSave.stats.heartPieces < 4) { 142 break; ⋮ 144 gSave.stats.heartPieces = 0; ⋮ 146 gSave.stats.maxHealth += 8; 147 if (gSave.stats.maxHealth > 160) { 148 gSave.stats.maxHealth = 160; ⋮
src/object/linkHoldingItem.c lines 131–150 at 6fb6dfb · upstream ↗ 204s32 ModHealth(s32 delta) { ⋮ 208 newHealth = stats->health + delta; ⋮ 212 if (stats->maxHealth < newHealth) { 213 newHealth = stats->maxHealth; ⋮ 215 stats->health = newHealth;
src/gameUtils.c lines 204–216 at 6fb6dfb · upstream ↗ 1688 save->stats.health = 24; 1689 save->stats.maxHealth = 24;
src/fileselect.c lines 1688–1689 at 6fb6dfb · upstream ↗ 776 maxQuarterHearts = gSave.stats.maxHealth / 2; ⋮ 797 maxHearts = maxQuarterHearts / 4;
src/fileselect.c lines 776–797 at 6fb6dfb · upstream ↗ 20390|05F08A| LDA.l $7EF36B 20391|05F08E| INC A 20392|05F08F| AND.b #$03 20393|05F091| STA.l $7EF36B 20394|05F095| BNE .not_full_set ⋮ 20400|05F09C| LDY.b #$26 ; ITEMGET 26
bank_05.asm lines 20390–20402 at bcdd96e · upstream ↗ 13529|08C48B| LDA.l $7EF36C 13530|08C48F| CMP.b #$A0 13531|08C491| BEQ .not_heart ⋮ 13533|08C493| CLC 13534|08C494| ADC.b #$08 13535|08C496| STA.l $7EF36C
bank_08.asm lines 13527–13535 at bcdd96e · upstream ↗ 2922 ; If found 4 heart pieces… ⋮ 2929 ; Clear heart pieces count ⋮ 2935 ; Increase the maximum number of hearts
src/code/entities/bank3.asm lines 2922–2937 at 2a5c2c0 · upstream ↗ 3382; Amount of health ($08 = 1 heart) 3383wHealth::
src/constants/memory/wram.asm lines 3382–3384 at 2a5c2c0 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-22.
Revised after a check by a second AI model, 2026-10-22.
Sources
Code
- Núñez, Aldo. 2021. “zelda1-disassembly: A complete disassembly of The Legend of Zelda.” Commit 50a1c86. aldonunez/zelda1-disassembly @ 50a1c86 · licence, all uses
- n.d. “Legend of Zelda, The (USA) (Rev 1).” · licence, all uses
- Trax and Entroper. 2023. “z2disassembly: Disassembly of Zelda II: The Adventure of Link for NES.” Commit c4c3a4c. FiendsOfTheElements/z2disassembly @ c4c3a4c · licence, all uses
- nmikstas and Kent Hansen. 2025. “metroid-disassembly: Metroid software disassembly.” Commit 4270d57. nmikstas/metroid-disassembly @ 4270d57 · licence, all uses
- n.d. “Metroid (USA).” · licence, all uses
- alex-west. 2026. “M2RoS: Return of Samus Disassembly.” Commit 031aea3. alex-west/M2RoS @ 031aea3 · licence, all uses
- InsaneFirebat and P.JBoy. 2026. “sm_disassembly: a relocatable disassembly of Super Metroid.” Commit 7af131e. InsaneFirebat/sm_disassembly @ 7af131e · licence, all uses
- metroidret contributors. 2026. “mf: a decompilation of Metroid Fusion (metroidret/mf).” Commit a6d6187. metroidret/mf @ a6d6187 · licence, all uses
- metroidret contributors. 2026. “mzm: a decompilation of Metroid: Zero Mission (metroidret/mzm).” Commit 2aae289. metroidret/mzm @ 2aae289 · licence, all uses
- (spannerisms), kan. 2026. “usdasm: A Link to the Past US Disassembly.” Commit bcdd96e. spannerisms/usdasm @ bcdd96e · licence, all uses
- zladx contributors. 2026. “LADX-Disassembly: Disassembly of Link's Awakening DX.” zladx. Commit 2a5c2c0. zladx/LADX-Disassembly @ 2a5c2c0 · licence, all uses
- n.d. “Legend of Zelda, The - Link's Awakening (USA, Europe) (Rev 2).” · licence, all uses
- Stewmath and oracles-disasm contributors. 2026. “oracles-disasm: a disassembly of Oracle of Ages and Oracle of Seasons (Stewmath/oracles-disasm).” Commit 21c924a. Stewmath/oracles-disasm @ 21c924a · licence, all uses
- zeldaret. 2026. “tmc: a decompilation of The Legend of Zelda: The Minish Cap (zeldaret/tmc).” Commit 6fb6dfb. zeldaret/tmc @ 6fb6dfb · licence, all uses