data/claims/metroid.yamlMetroid (nmikstas's disassembly and the US ROM)
Game: Metroid.
Wikidata lists Nintendo Research & Development 1 as the developer of Metroid and Nintendo as its publisher, and dates its release on the Famicom Disk System in Japan 6 August 1986. metroid/release
Q2530723, P178 developer, P123 publisher, and P577 publication date qualified by P291 place and P400 platform — read through the Query Service on 2026-10-20; for the NES in North America it holds two dates, 1 and 15 August 1987+1986-08-06T00:00:00Z … +1987-08-15T00:00:00Z … +1987-08-00T00:00:00ZCited by: Invincibility frames, Metroid
nmikstas's disassembly of Metroid, assembled with Ophis, equals the PRG ROM of Metroid (USA) byte for byte. metroid/build
0x1C010-0x1C029 — bank 7 $C000, RandomNumbers, the first routine of the engine bankmetroid-disassembly: Metroid software disassembly · build_script#L32-L33out00=($(md5sum Output_Files/Bank00.bin))
org00="8890cbea191c4218a754aa926ca61c9a"Checked by claude-agent, 2026-10-20 — assembled Header.asm and Bank00-07.asm with Ophis (michaelcmartin/Ophis); every bank matches the md5 in build_script, and the eight banks together equal the ROM after its 16-byte header (SHA-1 fdbfc7871962f72a1ef57e5a7e456164fb93430b)The repo's README says the work "started off as a disassembly of the game engine by Kent Hansen many years ago". Much of bank 7's crash detection keeps raw labels such as LF282.
Cited by: Metroid
Samus's health is binary-coded decimal in tenths of a unit; HealthHi holds the full energy tanks in its high nibble and the tens digit in its low nibble, and HealthLo holds the ones digit in its high nibble. metroid/health-format
About: Metroid Health upgrade
Codemetroid-disassembly: Metroid software disassembly ·Source_Files/Metroid_Defines.asm#L270-L272.alias HealthLo $0106 ;Lower health digit in upper 4 bits.
.alias HealthHi $0107 ;Upper health digit in lower 4 bits
;# of full tanks in upper 4 bits.metroid-disassembly: Metroid software disassembly · Source_Files/Bank07.asm#L8211-L8212 ldx #$00 ;Increase HealthHi by 0.
ldy #$50 ;Increase HealthLo by 5.Metroid (USA) · 0x1CEA2-0x1CF08 — bank 7 $CE92, SubtractHealth, which subtracts in base 10Checked by claude-agent, 2026-10-20 — read the defines and the base-10 subtract and add routines$50 in HealthLo is 5 units, so its low nibble is a tenths digit the display leaves out.
Cited by: Health upgrade, Metroid
Samus starts with 30 units of energy and no energy tanks. metroid/start-health
About: Metroid Health upgrade
Value: 30 units
Codemetroid-disassembly: Metroid software disassembly ·Source_Files/Bank07.asm#L1580-L1583 LDA #$00 ;
STA HealthLo ;Starting health is
LDA #$03 ;set to 30 units.
STA HealthHi ;Metroid (USA) · 0x1C8E1-0x1C93A — bank 7 SamusInit, $C8D1Checked by claude-agent, 2026-10-20 — read SamusInit; the probe reads 30.0 when play beginsCited by: Health upgrade, Metroid
When an enemy touches Samus, the game charges her the base damage of the current area, two bytes in that area's bank at $95CE, whatever the enemy; Brinstar's is 8 units, Norfair's 10, Kraid's hideout's 20, Ridley's hideout's 24, and Tourian's 30. metroid/area-damage
About: Metroid Damage formula
Value
{
"brinstar": 8,
"norfair": 10,
"kraid": 20,
"ridley": 24,
"tourian": 30
}Source_Files/Bank07.asm#L7997-L8000LF306: lda $95CE
sta HealthLoChange
lda $95CF
sta HealthHiChangemetroid-disassembly: Metroid software disassembly · Source_Files/Bank01.asm#L1829-L1830L95CE: .byte $80 ;Base damage caused by area enemies to lower health byte.
L95CF: .byte $00 ;Base damage caused by area enemies to upper health byte.metroid-disassembly: Metroid software disassembly · Source_Files/Bank02.asm#L1844-L1845L95CE: .byte $00 ;Base damage caused by area enemies to lower health byte.
L95CF: .byte $01 ;Base damage caused by area enemies to upper health byte.metroid-disassembly: Metroid software disassembly · Source_Files/Bank04.asm#L1845-L1846L95CE: .byte $00 ;Base damage caused by area enemies to lower health byte.
L95CF: .byte $02 ;Base damage caused by area enemies to upper health byte.metroid-disassembly: Metroid software disassembly · Source_Files/Bank05.asm#L1849-L1850L95CE: .byte $40 ;Base damage caused by area enemies to lower health byte.
L95CF: .byte $02 ;Base damage caused by area enemies to upper health byte.metroid-disassembly: Metroid software disassembly · Source_Files/Bank03.asm#L1852-L1853L95CE: .byte $00 ;Base damage caused by area enemies to lower health byte.
L95CF: .byte $03 ;Base damage caused by area enemies to upper health byte.metroid-disassembly: Metroid software disassembly · README.md#L18-L22* Bank01 - Brinstar
* Bank02 - Norfair
* Bank03 - Tourian
* Bank04 - Kraid Hideout
* Bank05 - Ridley HideoutMetroid (USA) · 0x1F316-0x1F320 — bank 7 $F306, the loadMetroid (USA) · 0x55DE-0x55DF — bank 1 $95CE, Brinstar's bytes; banks 2-5 hold the others at the same addressChecked by claude-agent, 2026-10-20 — read the enemy contact path (LF282 and LF2ED reach LF306) and each area bank's two bytes, decoded by health-formatTwo other routines in bank 7 charge a flat 5 units (`lda
Cited by: Metroid
With the Varia suit, SubtractHealth halves every amount it takes from Samus. metroid/varia
About: Metroid Damage formula
Codemetroid-disassembly: Metroid software disassembly ·Source_Files/Bank07.asm#L2523-L2531LCEAC: lda SamusGear ;
LCEAF: and #gr_VARIA ;Check is Samus has Varia.
LCEB1: beq + ;
LCEB3: lsr HealthLoChange ;If Samus has Varia, divide damage by 2.
LCEB5: lsr HealthHiChange ;Metroid (USA) · 0x1CEA2-0x1CF08 — bank 7 SubtractHealth, $CE92Checked by claude-agent, 2026-10-20 — read SubtractHealth from its entry to the base-10 subtractionThe halving works on decimal digits, so the routine adds $4F back when a bit carries out of HealthHiChange ($01 halves to 5.0 units).
Cited by: Metroid
A hit sets SamusBlink to $32, which is 50, gives Samus an upward speed of $FD with the hit gravity $38, and takes the push direction from the hit; the comment says "Set blink for 32 frames". metroid/blink-set
About: Metroid Invincibility frames
Value: 50
Codemetroid-disassembly: Metroid software disassembly ·Source_Files/Bank07.asm#L2421-L2443CheckHealthStatus:
LCDFA: lda SamusHit ;
and #$20 ;Has Samus been hit?
beq +++ ;If not, branch to check if still blinking from recent hit.
lda #$32 ;
sta SamusBlink ;Samus has been hit. Set blink for 32 frames.
…
* lda SamusHit
and #$08
lsr
lsr
lsr
…The atlas reads this differently: #$32 is hex: the blink is set to 50, and CheckHealthStatus counts it down by 1 a frame, so Samus blinks for 50 frames.Metroid (USA) · 0x1CE0A-0x1CE93 — bank 7 CheckHealthStatus, $CDFAChecked by claude-agent, 2026-10-20 — read CheckHealthStatusCited by: Invincibility frames, Knockback, Metroid
Each frame, the crash detection skips the contact check between Samus and the enemies while SamusBlink is above 0. metroid/blink-guard
About: Metroid Invincibility frames
Codemetroid-disassembly: Metroid software disassembly ·Source_Files/Bank07.asm#L7696-L7702* ldy #$00
lda SamusBlink
bne NextEnemy
jsr IsSamusDead
beq NextEnemy
jsr LF140
jsr LF282Metroid (USA) · 0x1F044-0x1F14F — bank 7 crash detection, $F034, which ends by calling SubtractHealthChecked by claude-agent, 2026-10-20 — read the crash detection loop from LF034 to its jump to SubtractHealthThe same guard covers the Memus at the top of the routine and the enemy slots from $60 on.
Cited by: Invincibility frames, Metroid
CheckHealthStatus, which Samus's routines call once per frame, lowers SamusBlink by 1 each time, so the blink lasts 50 frames of game logic. metroid/blink-countdown
About: Metroid Invincibility frames
Codemetroid-disassembly: Metroid software disassembly ·Source_Files/Bank07.asm#L2448-L2450* lda SamusBlink
beq CheckHealthBeep
dec SamusBlinkmetroid-disassembly: Metroid software disassembly · Source_Files/Bank07.asm#L2342LCD7E:* JSR CheckHealthStatus ;($CDFA)Check if Samus hit, blinking or Health low.Metroid (USA) · 0x1CE0A-0x1CE93 — bank 7 CheckHealthStatusChecked by claude-agent, 2026-10-20 — read the countdown and SetSamusData's callOn the frame of a hit, the routine sets 50 and then counts it to 49.
Cited by: Invincibility frames, Metroid
On each frame of the blink, CheckHealthStatus sets Samus's horizontal speed in the push direction to the blink counter divided by 16, so the push ends when the counter falls below 16; below 48, it skips the push on any frame Samus has horizontal acceleration. metroid/push
Source_Files/Bank07.asm#L2451-L2463 ldx DmgPushDir
inx
beq +++
jsr Adiv16 ; / 16
cmp #$03
bcs +
ldy SamusHorzAccel
bne +++
jsr LCF4E
* dex
bne +
jsr TwosCompliment ;($C3D4)
…metroid-disassembly: Metroid software disassembly · Source_Files/Metroid_Defines.asm#L165.alias DmgPushDir $72 ;#$00=Push Samus left when hit, #$01=Push right, #$FF=No push. Metroid (USA) · 0x1CE0A-0x1CE93 — bank 7 CheckHealthStatusChecked by claude-agent, 2026-10-20 — read the blink branch; A holds the counter before its decrement, Adiv16 shifts right four times, and LCF4E clears the speed and linear counter before the new speed is storedThe probe reads ObjHorzSpeed as 1 throughout the push, so later movement code limits the stored 3 and 2; how is open. Lava sets DmgPushDir to $FF, no push.
Measured in the ROM, a crawler held against Samus in Brinstar's first room takes 8 units with each hit, and the next hit lands 50 game frames later; one of the two gaps also held 2 lag frames, for 52 frames of video. metroid/blink-measured
About: Metroid Invincibility frames
Value
{
"probe": {
"gameGaps": [
50,
50
],
"videoGaps": [
52,
50
],
"health": [
220,
140,
60
]
}
}0x1CE0A-0x1CE93 — bank 7 CheckHealthStatus, which the probe's hits runmetroid-disassembly: Metroid software disassembly · Source_Files/Bank07.asm#L2421-L2504 — CheckHealthStatuslda #$32
sta SamusBlink
…
lda SamusBlink
beq CheckHealthBeep
dec SamusBlinkThe atlas reads this differently: #$32 is hex: the blink is set to 50, and CheckHealthStatus counts it down by 1 a frame, so Samus blinks for 50 frames. (metroid/blink-set)Checked by claude-agent, 2026-10-25 — Read CheckHealthStatus (Bank07.asm L2421-2504) at the pinned commit: a hit sets SamusBlink to $32 (50; the comment says 32 frames) and each frame decrements it; the damage, the 50-frame gap, and the lag frames are the probe's measurement in the ROM.Probe: probes/zelda-metroid/metroid.mjsHealth is in tenths of a unit in the probe's values.
Cited by: Invincibility frames, Metroid
Measured the same way, with the crawler moved off Samus during each blink, the three pushes carried her 37, 45, and 44 px away from it; two lifted her 19 px and one 2 px. metroid/push-measured
Value
{
"probe": {
"moved": [
37,
45,
44
],
"rise": [
19,
2,
19
]
}
}0x1CE0A-0x1CE93 — bank 7 CheckHealthStatusmetroid-disassembly: Metroid software disassembly · Source_Files/Bank07.asm#L2421-L2463 — the hit and blink brancheslda SamusHit
and #$08
lsr
lsr
lsr
sta DmgPushDir
* lda #$FD
sta ObjVertSpeed
lda #$38
sta SamusGravityThe atlas reads this differently: #$32 is hex: the blink is set to 50, and CheckHealthStatus counts it down by 1 a frame, so Samus blinks for 50 frames. (metroid/blink-set)Checked by claude-agent, 2026-10-25 — Read the hit and blink branches of CheckHealthStatus (Bank07.asm L2421-2463) at the pinned commit: a hit takes the push direction from bit 3 of SamusHit, sets vertical speed $FD and hit gravity $38; the distances are the probe's measurement in the ROM.Probe: probes/zelda-metroid/metroid.mjsThe second hit's flags were $38 where the others' were $28; why it lifted Samus only 2 px is open.
In lava, Samus's blink is set to 50 on every frame, so enemies can't touch her, while the lava takes 0.7 units twice every 8 frames without a push; the Varia suit cuts that to once, and SubtractHealth halves it to 0.3 units. metroid/lava
About: Metroid Invincibility frames
Codemetroid-disassembly: Metroid software disassembly ·Source_Files/Bank07.asm#L5432-L5450LE27B: sty DmgPushDir ;Don't push Samus from lava damage.
LE27D: jsr ClearHealthChange ;($F323)Clear any pending health changes to Samus.
LE280: lda #$32 ;
LE282: sta SamusBlink ;Make Samus blink.
…
LE28F: lsr ;This portion of the code causes Samus to be damaged by
LE290: and #$03 ;lava twice every 8 frames if she does not have the varia
LE292: bne ++ ;but only once every 8 frames if she does.
…
LE29D:* lda #$07 ;
LE29F: sta HealthLoChange ;Samus takes lava damage.
LE2A1: jsr SubtractHealth ;($CE92)metroid-disassembly: Metroid software disassembly · Source_Files/Bank07.asm#L2523-L2527LCEAC: lda SamusGear ;
LCEAF: and #gr_VARIA ;Check is Samus has Varia.
…
LCEB3: lsr HealthLoChange ;If Samus has Varia, divide damage by 2.Metroid (USA) · 0x1E279-0x1E2B8 — bank 7 LavaAndMoveCheck, $E269Checked by claude-agent, 2026-10-20 — read LavaAndMoveCheck and SubtractHealth; $07 in HealthLo is 0.7 units (health-format), and halved it is $03Cited by: Invincibility frames, Knockback, Metroid
The main loop calls RandomNumbers once per frame, after the frame's work; it adds 5 to RandomNumber1 five times, 25 in all, so the byte steps through all 256 values every 256 frames. metroid/rng
About: Metroid Random number generator
Codemetroid-disassembly: Metroid software disassembly ·Source_Files/Bank07.asm#L34-L47RandomNumbers:
…
LC002: LDX #$05 ;
LC004:* LDA RandomNumber1 ;
LC006: CLC ;
LC007: ADC #$05 ;
LC009: STA RandomNumber1 ;2E is increased by #$19 every frame and
…
LC012: DEX ;
LC013: BNE - ;metroid-disassembly: Metroid software disassembly · Source_Files/Bank07.asm#L170-L177WaitNMIEnd:
…
LC0D3:* JSR RandomNumbers ;($C000)Update pseudo random numbers.
LC0D6: JMP MainLoop ;($C0BC)Jump to top of subroutine.Metroid (USA) · 0x1C010-0x1C029 — bank 7 $C000Checked by claude-agent, 2026-10-20 — read RandomNumbers and the main loop; 25 is odd, so the step has period 256The comment's #$19 is 25. Whether an enemy drops anything therefore depends on the frame it dies.
Cited by: Item drop table, Metroid
When an enemy dies, a RandomNumber1 below 16 drops nothing; otherwise its low 3 bits pick from ItemDropTbl, which holds a missile at 0 and 3, energy at 1, 4, and 6, and $89 at 2, 5, and 7. metroid/drop-roll
About: Metroid Item drop table
Codemetroid-disassembly: Metroid software disassembly ·Source_Files/Bank07.asm#L4575-L4581 LDA RandomNumber1
CMP #$10
BCC LDD5B
* AND #$07
TAY
LDA ItemDropTbl,y
STA EnAnimFrame,xmetroid-disassembly: Metroid software disassembly · Source_Files/Bank07.asm#L4722-L4732;The following table determines what, if any, items an enemy will drop when it is killed.
ItemDropTbl:
LDE35: .byte $80 ;Missile.
LDE36: .byte $81 ;Energy.
LDE37: .byte $89 ;No item.
LDE38: .byte $80 ;Missile.
LDE39: .byte $81 ;Energy.
LDE3A: .byte $89 ;No item.
LDE3B: .byte $81 ;Energy.
LDE3C: .byte $89 ;No item.Metroid (USA) · 0x1DD0C-0x1DD84 — bank 7 $DCFC, the drop codeMetroid (USA) · 0x1DE45-0x1DE4C — bank 7 $DE35, ItemDropTblChecked by claude-agent, 2026-10-20 — read the drop code from LDCFC to LDD5B and the tableCited by: Item drop table, Metroid, Metroid Fusion
Item $89 drops only for an enemy whose byte in the area's table at $968B has bit 0 set, and Samus collects it as 20 units of energy; the table's comment calls it "No item". metroid/drop-89
About: Metroid Item drop table
Codedisputedmetroid-disassembly: Metroid software disassembly ·Source_Files/Bank07.asm#L4592-L4599* LDY MaxEnergyPickup
CPY CrntEnrgyPickups
BEQ LDD5B
INC CrntEnrgyPickups
CMP #$89
BNE --
LSR $00
BCS --metroid-disassembly: Metroid software disassembly · Source_Files/Bank07.asm#L8534-L8535LF74B: ldy EnDataIndex,x
lda $968B,ymetroid-disassembly: Metroid software disassembly · Source_Files/Bank07.asm#L8203-L8216 ldy #$00
ldx #$03
pla
bne ++
dex
pla
cmp #$81
bne +
ldx #$00 ;Increase HealthHi by 0.
ldy #$50 ;Increase HealthLo by 5.
…
sty HealthLoChange
…metroid-disassembly: Metroid software disassembly · Source_Files/Bank01.asm#L1878L968B: .byte $01, $01, $01, $00, $86, $04, $89, $80, $81, $00, $00, $00, $82, $00, $00, $00 Metroid (USA) · 0x1F493-0x1F4E3 — bank 7 $F483, the pickup codeMetroid (USA) · 0x569B-0x56AA — bank 1 $968B, Brinstar's tableChecked by claude-agent, 2026-10-20 — traced LDCFC (LF74B's byte goes to $00, which LSR tests) and the pickup's stack (frame pushed, data index pushed; a frame other than $81 leaves X=2, Y=0)Disputed: The table's comment calls `$89` "No item"; it drops nothing only for enemies whose `$968B` byte has bit 0 clear. In Brinstar, data indexes 0, 1, 2, 6, and 8 have it set.
Cited by: Item drop table, Metroid
Each door re-rolls the room's caps from RandomNumber1, 0 to 15 missile drops and 64 to 94 energy drops, and zeroes the counts. A drop that would pass its cap is lost; one that passes the test adds to its count, even a $89 roll that the enemy then can't drop. metroid/drop-caps
About: Metroid Item drop table
Codedisputedmetroid-disassembly: Metroid software disassembly ·Source_Files/Bank01.asm#L1381-L1388L8B1B: STA CrntMslePickups ;
L8B1D: STA CrntEnrgyPickups ;Reset current missile and energy power-up counters.
L8B1F: LDA RandomNumber1 ;
L8B21: AND #$0F ;Randomly recalculate max missile pickups(16 max, 0 min).
L8B23: STA MaxMissilePickup ;
L8B25: ASL ;
L8B26: ORA #$40 ;*2 for energy pickups and set bit 6(128 max, 64 min).
L8B28: STA MaxEnergyPickup ;metroid-disassembly: Metroid software disassembly · Source_Files/Bank07.asm#L4584-L4599 LDY MaxMissilePickup
CPY CrntMslePickups
BEQ LDD5B
LDA MaxMissiles
BEQ LDD5B
INC CrntMslePickups
…
INC CrntEnrgyPickups
CMP #$89
BNE --
LSR $00
BCS --Metroid (USA) · 0x4B2B-0x4B39 — bank 1 $8B1B-$8B29, the reset in SamusEnterDoor; each area bank has its own copyMetroid (USA) · 0x1DD0C-0x1DD84 — bank 7, the drop codeChecked by claude-agent, 2026-10-20 — read SamusEnterDoor's reset and the drop code's two cap testsDisputed: The comments give "16 max" missile drops and "128 max" energy drops; `AND #$0F` gives at most 15, and `ASL` then `ORA #$40` at most 94. The defines call the counts power-ups "collected by Samus", but the drop code counts each drop that passes its cap, collected or not, and even a `$89` it then withholds.
A missile drop also needs missile capacity (MaxMissiles above 0). A room whose missile cap rolls 0 drops no missiles.
Cited by: Item drop table, Metroid
Until the first door, the caps on missile and energy drops are 39 when the game starts in Brinstar, because SamusInit stores the mirroring value $27 into them, or 47 ($2F) elsewhere. metroid/start-caps
About: Metroid Item drop table
Codemetroid-disassembly: Metroid software disassembly ·Source_Files/Bank07.asm#L1564-L1572 LDY #$27
LDA InArea
AND #$0F
BEQ + ;Branch if Samus starting in Brinstar.
LSR ScrollDir ;If not in Brinstar, change scroll direction from left
LDY #$2F ;to down. and set PPU for horizontal mirroring.
* STY MirrorCntrl ;
STY MaxMissilePickup
STY MaxEnergyPickupMetroid (USA) · 0x1C8E1-0x1C93A — bank 7 SamusInit, $C8D1Checked by claude-agent, 2026-10-20 — read SamusInit from LDY #$27 to the storesCited by: Metroid
A small energy ball gives Samus 5 units and a $89 ball 20; a missile gives 2 missiles; an enemy whose data index carries the 30-unit flag gives 30 units or 30 missiles instead. metroid/pickup-amounts
About: Metroid Item drop table
Codemetroid-disassembly: Metroid software disassembly ·Source_Files/Bank07.asm#L8203-L8224 ldy #$00
ldx #$03
pla
bne ++
…
PickupMissile:
lda #$02
ldy EnDataIndex,x
beq +
lda #$1Emetroid-disassembly: Metroid software disassembly · Source_Files/Bank07.asm#L4566-L4570 JSR LF74B
STA $00
JSR $80B0
AND #$20
STA EnDataIndex,xmetroid-disassembly: Metroid software disassembly · Source_Files/Bank01.asm#L89-L91L80B0: LDY EnDataIndex,X
L80B3: LDA $977B,Y
L80B6: ASL ;*2Metroid (USA) · 0x1F493-0x1F4E3 — bank 7 $F483, the pickup codeChecked by claude-agent, 2026-10-20 — traced the pickup code's three paths (flag set: X=3; frame $81: Y=$50; else X=2) and PickupMissile; the flag is bit 4 of the area's $977B byte, doubled and masked with $20Missiles stop at the capacity, MaxMissiles. No Brinstar data index has the flag; in Tourian, indexes 0 and 1 do ($50).
Cited by: Item drop table, Metroid
In Tourian, enemies with data index 2 or 4 drop nothing, and any other kill that would drop nothing resets both caps to 1 and both counts to 0 and rolls the same RandomNumber1 again, skipping the test for 16. metroid/tourian-drops
About: Metroid Item drop table
Codemetroid-disassembly: Metroid software disassembly ·Source_Files/Bank07.asm#L4555-L4562LDCFC: LDA InArea
CMP #$13
BNE +
LDA EnDataIndex,x
CMP #$04
BEQ +++++
CMP #$02
BEQ +++++metroid-disassembly: Metroid software disassembly · Source_Files/Bank07.asm#L4601-L4614LDD5B: ldx PageIndex
lda InArea
cmp #$13
beq ++
* jmp KillObject ;($FA18)Free enemy data slot.
* lda RandomNumber1
ldy #$00
sty CrntEnrgyPickups
sty CrntMslePickups
iny
sty MaxMissilePickup
…Metroid (USA) · 0x1DD0C-0x1DD84 — bank 7, the drop codeChecked by claude-agent, 2026-10-20 — counted Ophis's anonymous labels: +++++ from line 4560 is the jmp KillObject at 4605, and ----- from 4614 is the AND #$07 at 4578Each retry shifts the enemy's $968B byte right once more, so a $89 roll that fails one pass can succeed on the next. The atlas hasn't tied Tourian's data indexes to enemies.
Cited by: Item drop table, Metroid
Called in the ROM for all 256 values of RandomNumber1, the drop code gives a Brinstar enemy of data index 0 60 missiles, 90 small energy balls, 90 $89 balls, and 16 nothing; index 3, whose byte in the table LF74B reads ($968B + data index, kept in $00) has bit 0 clear, gives 106 nothing and no $89. metroid/drop-measured
About: Metroid Item drop table
Value
{
"probe": {
"index0": {
"missile": 60,
"energy": 90,
"big": 90,
"none": 16
},
"index3": {
"missile": 60,
"energy": 90,
"big": 0,
"none": 106
},
"nomissiles": {
"missile": 0,
"energy": 90,
"big": 90,
"none": 76
},
"capped": {
"missile": 0,
"energy": 0,
"big": 0,
"none": 256
}
}
}0x1DD0C-0x1DD84 — bank 7 $DCFC, the code the probe calls with Brinstar's bank mappedmetroid-disassembly: Metroid software disassembly · Source_Files/Bank07.asm#L4555-L4614 — the drop codeJSR LF74B
STA $00
…
LDA RandomNumber1
CMP #$10
BCC LDD5B
* AND #$07
TAY
LDA ItemDropTbl,y
…
CMP #$89
BNE --
…metroid-disassembly: Metroid software disassembly · Source_Files/Bank07.asm#L8534-L8536 — LF74B: the byte the drop code keeps in $00ldy EnDataIndex,x
lda $968B,y
rtsChecked by claude-agent, 2026-10-25 — Read the drop code (Bank07.asm L4555-4614) and LF74B (L8534-8536) at the pinned commit: $00 holds the byte at $968B + EnDataIndex; RandomNumber1 below $10 drops nothing, otherwise its low 3 bits index ItemDropTbl, the missile and energy caps can cancel the drop, and a $89 ball stays only when bit 0 of $00 is set; the counts are the probe's calls of that code in the ROM for all 256 values.Probe: probes/zelda-metroid/metroid.mjsWithout missile capacity, the 60 missile rolls drop nothing; at both caps, nothing drops.
Cited by: Item drop table, Metroid
An energy tank adds a tank, up to 6, and fills Samus's health to her new maximum. metroid/energy-tank
About: Metroid Health upgrade
Value: 6
Codemetroid-disassembly: Metroid software disassembly ·Source_Files/Bank07.asm#L4354-L4363LDC00:* LDA TankCount ;
LDC03: CMP #$06 ;Has Samus got 6 energy tanks?
LDC05: BEQ + ;If so, she can't have any more.
LDC07: INC TankCount ;Otherwise give her a new tank.
LDC0A:* LDA TankCount ;
LDC0D: JSR Amul16 ;Get tank count and shift into upper nibble.
LDC10: ORA #$09 ;
LDC12: STA HealthHi ;Set new tank count. Upper health digit set to 9.
LDC15: LDA #$99 ;Max out low health digit.
LDC17: STA HealthLo ;Health is now FULL!Metroid (USA) · 0x1DC07-0x1DC2B — bank 7 $DBF7, the missile and energy tank pickupChecked by claude-agent, 2026-10-20 — read MissileEnergyPickupCited by: Health upgrade, Metroid
Samus's health can't exceed 99.9 units above her tanks, units for tanks, which is 699.9 with all six. metroid/max-health
About: Metroid Health upgrade
Codemetroid-disassembly: Metroid software disassembly ·Source_Files/Bank07.asm#L2576-L2584LCF14: LDA TankCount ;
LCF17: JSR Amul16 ;($C2C5)*16. Move tank count to upper 4 bits.
LCF1A: ORA #$0F ;Set lower 4 bits.
LCF1C: CMP HealthHi ;
LCF1F: BCS + ;Is life less than max? if so, branch.
LCF21: AND #$F9 ;Life is more than max amount.
LCF23: STA HealthHi ;
LCF26: LDA #$99 ;Set life to max amount.
LCF28: STA HealthLo ;Metroid (USA) · 0x1CF09-0x1CF3D — bank 7 AddHealth, $CEF9Checked by claude-agent, 2026-10-20 — read AddHealth's cap; $x9 and $99 decode as 99.9 above the tanks (health-format)The tanks' energy sits in the high nibble of HealthHi, the full tanks, and the display shows the rest as two digits.
Cited by: Health upgrade, Metroid
A missile tank raises Samus's missile capacity by 5. metroid/missile-tank
Source_Files/Bank07.asm#L4349-L4351LDBF7:* BEQ + ;Branch if item is an energy tank.
LDBF9: LDA #$05 ;
LDBFB: JSR AddToMaxMissiles ;($DD97)Increase missile capacity by 5.Metroid (USA) · 0x1DC07-0x1DC2B — bank 7 $DBF7Checked by claude-agent, 2026-10-20 — read MissileEnergyPickupCited by: Ammunition, Metroid