data/claims/gradius.yamlGradius (US NES release), read in the ROM
Game: Gradius.
In the US NES Gradius each capsule moves the meter's cursor one slot along six, back to the first after the sixth, and a press of the power-up button buys the lit slot and clears the cursor. Taking the slots in the bar's order, Speed Up adds 1 to a speed count; Missile can be bought once; Double and Laser write 2 or 1 to one shared byte, so each replaces the other; Option adds 1 up to 2; and ? sets a shield counter to 5 when it's 0. A slot that can't be bought leaves the cursor where it is. gradius/power-meter
About: Gradius Power-up meter
Value
{
"slots": 6,
"max_options": 2,
"shield": 5
}0x095B-0x0983 — $894B-$8973, a capsule: increment the cursor at $42; at 7, set it back to 1Gradius (USA) · 0x0984-0x09F2 — $8974-$89E2: on bit `$40` of the player's button byte, jump through a seven-entry table by $42 (0 does nothing). Slot 1 increments $40 with no check; slot 2 increments $41 only if it's 0; slots 3 and 4 store 2 and 1 to $44 unless it already holds that value; slot 5 increments $45 only below 2; slot 6 stores 5 to $46 only if it's 0. Each purchase stores 0 to $42 and calls $EC1E with `$0E`; each refusal returns first.Checked by claude, 2026-10-21 — disassembled $894B-$89E2 in the pinned ROM with da65; the routine after it ($89E3-$8A2F) grays out Missile when $41 is set, Double when $44 is 2, Laser when $44 is 1, Option at 2, and ? when $46 is set, which ties each byte to its slotThe slot names are the ones the bar shows on screen; the code ties each to a byte by the order of its jump table. The speed count has no cap in this routine. What the shield's 5 counts (hits absorbed, or something else) hasn't been traced.
Cited by: Gradius, Option, Power-up meter
Start pauses the US NES Gradius, and while it's paused a routine compares each new press with a ten-entry table, Up Up Down Down Left Right Left Right B A: the same ten bytes as Contra's table. A wrong press sends the count back to 0, unlike Contra's, where a miss stores $FF and ends the check. The full sequence sets the speed count to 1, buys Missile, sets the options to 2 and the shield counter to 5, and leaves Double or Laser as they were. It also decrements a per-player byte that must not be negative for the check to run. gradius/konami-code
About: Gradius Cheat code
Value
{
"speed": 1,
"missile": 1,
"options": 2,
"shield": 5
}0x1AEA-0x1B4D — $9ADA-$9B3D: with the pause flag $15 clear, Start (`$10`) sets it and saves the sound registers; with it set, if the player's byte at $3B is not negative, run the check with table 2, and at a count of 10 call $9C5E, decrement $3B, and zero the count; Start clears $15 and restores the soundGradius (USA) · 0x1775-0x1794 — $9765-$9784, the check: point at table X, skip when the count at $33 is negative or no button is new, increment it on a match and set it to 0 on a missGradius (USA) · 0x1795-0x17AC — $9785-$979C: two table pointers ($9789, $9793), then the two ten-byte tables; the second is 08 08 04 04 02 01 02 01 40 80Gradius (USA) · 0x1C6E-0x1C7C — $9C5E-$9C6C, the grant: 5 to $46 (shield), 1 to $41 (missile) and $40 (speed), 2 to $45 (options); $44 (Double or Laser) is not writtenContra (US), annotated disassembly (vermiceli) · src/bank7.asm#L954-L955konami_code_lookup_table:
.byte $08,$08,$04,$04,$02,$01,$02,$01,$40,$80Contra (US), annotated disassembly (vermiceli) · src/bank7.asm#L937-L940beq konami_input_index_correct ; on success, goto konami_input_index_correct
lda #$ff ; incorrect sequence for Konami code
sta KONAMI_CODE_NUM_CORRECT ; since incorrect set KONAMI_CODE_NUM_CORRECT (number of successful inputs) to $ffChecked by claude, 2026-10-21 — disassembled the pause routine, the shared check, both tables, and the grant in the pinned ROM with da65, and tied $40-$46 to the meter's slots through the purchase routine (gradius/power-meter); read Contra's table and failure store at the pinned commitThe button bits follow the layout vermiceli's Contra disassembly names (Up $08, Down $04, Left $02, Right $01, B $40, A $80); the tables match byte for byte. One other routine calls the grant ($9C72-$9C78), which the atlas hasn't identified. When $3B is set back to 0 hasn't been traced, so the atlas doesn't say how often the code works.
Cited by: Cheat code, Gradius
When a player's lives byte drops below 0 in the US NES Gradius, the game-over state waits, for as long as $B0 is nonzero and then 120 frames ($78), and meanwhile runs the code check with its other ten-entry table, Down Up B A B A B A B A. If the count has reached ten when the wait ends, the player comes back with the lives byte at 3, the value a new game sets. gradius/continue-code
Value: 3 lives byte
CodeGradius (USA) ·0x17AD-0x17D4 — $979D-$97C4: decrement the player's lives byte at $20,X; if it's negative, branch to $97F1Gradius (USA) · 0x1801-0x1839 — $97F1-$9829: clear the player's bit in $0A, set the state $1B to `$C0`, draw text `$1C`, and store `$78` in the timer $4CGradius (USA) · 0x170B-0x1774 — $96FB-$9764, state bit `$40`: while $B0 is nonzero, run the check with table 1 ($9789) without counting $4C down ($96FF branches to $975D); after that, while $4C is nonzero, count it down and run the check; when $4C reaches 0 with the count at 10, store 3 in $20,X, set the player's bit in $0A again, and resumeGradius (USA) · 0x1795-0x17AC — $9785-$979C: the first table, at $9789, is 04 08 40 80 40 80 40 80 40 80Gradius (USA) · 0x0308-0x0316 — $82F8-$8306, in the new-game setup: store 3 in both players' lives bytes, $20 and $21Checked by claude, 2026-10-21 — disassembled the death and game-over routines, the game-over state, the tables, and the new-game setup in the pinned ROM with da65The atlas hasn't traced whether the first ship of a game also takes a life from the byte, so it doesn't convert 3 into a count of ships. The same state also answers Start when no player is active, by running the new-game setup at $82D5 and setting the main mode to 4, which leads into play; whether that is a second way to continue hasn't been traced. A probe should settle it, and confirm text $1C as GAME OVER.