Extra life
An additional life or reserve character awarded during play, often for reaching a score threshold.
On this page
An extra life adds a life or reserve character during play. These nine implementations tie awards to score, though settings can disable them, and schedules range from one award to recurring thresholds1,2,3,4,5,6,7,8,9.
- OnceSpace Invaders (1978). One ship at 1,500 points, or 1,000 by DIP switch.1Galaxian (1979). One ship at 7,000 points, or 10,000, 12,000, or 20,000 by DIP switch.3Pac-Man (1980). One life at 10,000 points, or 15,000 or 20,000 by DIP switch.4Donkey Kong (1981). One life at 7,000 points, or 10,000, 15,000, or 20,000 by DIP switch.6
- RepeatingAsteroids (1979). A ship every 10,000 points.2Defender (1981). A ship and a smart bomb every 10,000 points by default.5Galaga (1981). Fighters at two DIP-set scores, then at every multiple of the second, such as 20,000, 70,000, and every 70,000.7Contra (1987). At 20,000 points and every 30,000 after, up to 99 lives.8Super C (1990). At 30,000 points and every 20,000 after, up to 99 lives.9
#Award schedules
Space Invaders, Galaxian, Pac-Man, and Donkey Kong each award one extra life or ship at a single DIP-switch threshold. Each game’s flag blocks a second award for that player1,3,4,6.
Asteroids awards a ship whenever the score passes a multiple of every 10,000 points2,2. Defender awards a ship and a smart bomb at each replay level, which begins at the replay setting and increases by that setting; its default is a ship and a smart bomb every 10,000 points (default)5,5.
Galaga uses two DIP-selected award scores. Some settings repeat at each interval after the second score, using that second score as the interval; others stop after the second award, and one in each of its two tables disables awards7.
The US NES Contra and Super C each award a life at a first score threshold, then advance the next threshold by a fixed interval. Super C reverses Contra’s first threshold and interval, and both cap the life count at 998,8,9.
Games
| Game | Year | How | Note |
|---|---|---|---|
| Space Invaders | 1978 | Once | one ship at 1,500 points, or 1,000 by DIP switch |
| Galaxian | 1979 | Once | one ship at 7,000 points, or 10,000, 12,000, or 20,000 by DIP switch |
| Pac-Man | 1980 | Once | one life at 10,000 points, or 15,000 or 20,000 by DIP switch |
| Donkey Kong | 1981 | Once | one life at 7,000 points, or 10,000, 15,000, or 20,000 by DIP switch |
| Asteroids | 1979 | Repeating | a ship every 10,000 points |
| Defender | 1981 | Repeating | a ship and a smart bomb every 10,000 points by default |
| Galaga | 1981 | Repeating | fighters at two DIP-set scores, then at every multiple of the second, such as 20,000, 70,000, and every 70,000 |
| Contra | 1987 | Repeating | at 20,000 points and every 30,000 after, up to 99 lives |
| Super C | 1990 | Repeating | at 30,000 points and every 20,000 after, up to 99 lives |
| Super Mario Bros.: The Lost Levels | 1986 | Other condition | grabbing the flagpole gives a life when the coin count's two digits match the timer's last digit |
| Super Mario Bros. 2 | 1988 | Other condition | the slot machine's cherries and triples win lives |
| Sonic the Hedgehog | 1991 | Other condition | 100 rings earn a life |
| Sonic the Hedgehog 2 | 1992 | Other condition | 100 rings earn a life, and 200 another |
Every claim about this mechanic, by game (10)
References
- ^ abcSpace Invaders awards one extra ship per player when the upper two digits of the score reach 15, or 10 with DIP switch bit 3 set: at 1,500 or 1,000 points. It then clears the player's award flag, so no second ship follows.CodeComputer Archeology, Space Invaders
How we know
1574; Award extra ship if score has reached ceiling 15750935: CD 10 19 CALL $1910 ; {code.CurPlyAlive} Get descriptor of sorts 15760938: 2B DEC HL ; Back up ... 15770939: 2B DEC HL ; ... two bytes 1578093A: 7E LD A,(HL) ; Has extra ship ... 1579093B: A7 AND A ; already been awarded? 1580093C: C8 RET Z ; Yes ... ignore 1581093D: 06 15 LD B,$15 ; Default 1500 1582093F: DB 02 IN A,($02) ; {hard.INP2} Read DIP settings 15830941: E6 08 AND $08 ; Extra ship at 1000 or 1500 15840943: CA 48 09 JP Z,$0948 ; {} 0=1500 15850946: 06 10 LD B,$10 ; Awarded at 1000 ⋮
content/Arcade/SpaceInvaders/Code.md lines 1574–1592 at 1adc2a7 · upstream ↗ 1606096B: CD 10 19 CALL $1910 ; {code.CurPlyAlive} Get descriptor for active player of some sort 1607096E: 2B DEC HL ; Back up ... 1608096F: 2B DEC HL ; ... two bytes 16090970: 36 00 LD (HL),$00 ; Flag extra ship has been awarded
content/Arcade/SpaceInvaders/Code.md lines 1606–1609 at 1adc2a7 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-25.
Checked by a second AI model, 2026-10-21.
Checked by a second AI model, 2026-10-25.
- ^ abcdAsteroids gives a ship each time a player's score passes a multiple of 10,000: the score is two BCD bytes, and when an addition carries into the thousands byte and leaves its low digit 0, the player gains a ship.CodeComputer Archeology, Asteroids
How we know
SED ; Set Decimal Mode ADC $52,X ; {ram.ply1ScoreTens} Add To Current Players Score, Tens STA $52,X ; {ram.ply1ScoreTens} BCC $73B0 ; {} Increase In Thousands?, No, Branch LDA $53,X ; {ram.ply1ScoreThous} Current Players Score, Thousands ADC #$00 ; Add In The Carry STA $53,X ; {ram.ply1ScoreThous} AND #$0F ; Will Be 0 If Another 10,000 Points Reached BNE $73B0 ; {} Branch If Not Enough Points For Bonus Ship … INC $57,X ; {ram.ply1CurShips} Award Bonus Ship
content/Arcade/Asteroids/Code.md#L1430-L1444 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-22.
Checked by a second AI model, 2026-10-22.
- ^ abcGalaxian awards one extra ship, a "bonus galixip", when the score's top digits reach the DIP setting: 7,000, 10,000, 12,000, or 20,000 points. A per-player flag then blocks any further award.CodeScottTunstall/Galaxianrevised
How we know
9070128: 3A 00 70 ld a,($7000) ; read state of dip switch 3,4,5,6 908012B: E6 03 and $03 ; mask in state of dip switches 3 & 4 909012D: 21 52 01 ld hl,$0152 9100130: E7 rst $20 ; call routine to fetch value @ HL + A 9110131: 32 AC 40 ld ($40AC),a ; write BONUS GALIXIP @ value
galaxian.asm lines 907–911 at a16b402 · upstream ↗ 9270152: 07 10 12 20galaxian.asm line 927 at a16b402 · upstream ↗ 758621C2: 1B dec de ; point to 3rd and 4th digits of player score 758721C3: 67 ld h,a ; load H with first two digits of player score 758821C4: 1A ld a,(de) 758921C5: 6F ld l,a ; load L with 3rd and 4th digits of player score 759021C6: 29 add hl,hl 759121C7: 29 add hl,hl 759221C8: 29 add hl,hl 759321C9: 29 add hl,hl ; multiply HL * 16, which shifts all bits left 4 places. 759421CA: 7C ld a,h 759521CB: 21 AC 40 ld hl,$40AC ; read BONUS_GALIXIP_FOR value 759621CE: BE cp (hl) 759721CF: D4 9C 22 call nc,$229C ; call AWARD_EXTRA_LIFE if our score is higher
galaxian.asm lines 7586–7597 at a16b402 · upstream ↗ 7809AWARD_EXTRA_LIFE:galaxian.asm lines 7809–7822 at a16b402 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-25.
Revised after a check by a second AI model, 2026-10-21.
Checked by a second AI model, 2026-10-25.
- ^ abcPac-Man awards one extra life when the score reaches the DIP-switch setting: 10,000, 15,000, or 20,000 points, or never. The table holds BCD thousands (10, 15, 20, and
$FFfor none). After each score change the code compares the score's ten-thousands and thousands digits with the setting, and a flag bit stops a second award.Codemburkley/pacman-crevisedHow we know
11383 BONUS_LIFE = BONUS_LIFE_DATA[DIP_SWITCH_BONUS];pacman.c line 11383 at 3277e56 · upstream ↗ 11419 /* Bonus life data (in BCD: 10,000, 15,000, 20,000 or none */ ⋮ 11423 // 2728 10 15 20 ff 68 00 7d 00
pacman.c lines 11419–11423 at 3277e56 · upstream ↗ 35#define BONUS_LIFE_DATA (&ROM[0x2728]) 36#define DIFFICULTY_DATA ((uint16_t*)(&ROM[0x272c]))
data.h lines 35–36 at 3277e56 · upstream ↗ 12361 uint16_t hl = (score[2] << 8) + score[1]; ⋮ 12369 hl *= 16; ⋮ 12377 if (hl>>8 > BONUS_LIFE-1) 12378 extraLife_2b33 (&score[2]);
pacman.c lines 12359–12378 at 3277e56 · upstream ↗ 12637void extraLife_2b33 (uint8_t *score) ⋮ 12647 if ((score[1] & 1) != 0) 12648 return; ⋮ 12655 score[1] |= 1; ⋮ 12665 P1_REAL_LIVES++;
pacman.c lines 12637–12665 at 3277e56 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-25.
Revised after a check by a second AI model, 2026-10-21.
Checked by a second AI model, 2026-10-25.
- ^ abcdDefender gives an extra ship and an extra smart bomb at each replay level: the level starts at the replay setting and rises by it each time it is passed. The operator default is 10,000 points, with 3 ships to a game.Codemwenge/defender
How we know
510*CHECK REPLAY 511SCRX LDD REPLA ;REPLAYS AVAILABLE 512 BEQ SCRXX ;NO ⋮ 515 BSR RCHK 516 BLO SCRXX ;NO 517 LDA 1,Y ;GET NEXT LEVEL 518 ADDA REPLA+1 ⋮ 525 INC PLAS-1,X 526 INC PSBC-1,X
src/defa7.src lines 510–526 at e740063 · upstream ↗ 1152 LDX #REPLAY 1153 JSR RCMOSD 1154 STD REPLA 1155 STD P1RP
src/defa7.src lines 1152–1156 at e740063 · upstream ↗ 801 FCB $01,$00 ;REPLAY @10,000 802 FCB $03 ;NSHIP
src/romc8.src lines 801–802 at e740063 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-22.
Checked by a second AI model, 2026-10-22.
- ^ abcDonkey Kong awards one extra life when the score reaches the DIP-switch setting: 7,000, 10,000, 15,000, or 20,000 points. A flag set on the award stops any further one for that player.Codefurrykef/dkdasm
How we know
13490214 79 LD A,C ; load A with original value of dip switches 13500215 0F RRCA ; 13510216 0F RRCA ; rotate right twice 13520217 E603 AND #03 ; mask bits, now between 0 and 3 13530219 47 LD B,A ; copy to B. used in minisub below for loop counter 1354021A 3E07 LD A,#07 ; A := 7 = default score for extra life 1355021C CA2602 JP Z,#0226 ; on zero, jump ahead and use 7 ⋮ 1357021F 3E05 LD A,#05 ; A : = 5 ⋮ 13590221 C605 ADD A,#05 ; add 5 13600223 27 DAA ; decimal adjust 13610224 10FB DJNZ #0221 ; loop until done ⋮ 13630226 77 LD (HL),A ; store the result in score for extra life
dkong.asm lines 1348–1363 at 4d296c5 · upstream ↗ bit 2 : / 00 = 7000 01 = 10000 10 = 15000 11 = 20000
dkong.asm#L54 · upstream ↗ 16000350 3A2D62 LD A,(#622D) ; load A with high score indicator 16010353 A7 AND A ; has this player already been awarded extra life? 16020354 C0 RET NZ ; yes, return ⋮ 16110361 7E LD A,(HL) ; load A with a byte of the player's score 16120362 E6F0 AND #F0 ; mask bits 16130364 47 LD B,A ; copy to B 16140365 23 INC HL ; next score byte 16150366 7E LD A,(HL) ; load A with byte of player's score 16160367 E60F AND #0F ; mask bits 16170369 B0 OR B ; mix together the 2 score bytes ⋮ 1622036E 212160 LD HL,ExtraLifeThreshold ; load HL with score needed for extra life 16230371 BE CP (HL) ; compare player's score to high score. is it greater? ⋮
dkong.asm lines 1600–1629 at 4d296c5 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-25.
Checked by a second AI model, 2026-10-21.
Checked by a second AI model, 2026-10-25.
- ^ abcGalaga awards extra fighters at a first and a second score set by DIP switches, and with some settings again at every interval after the second, the interval being the second score: one setting gives 20,000, 70,000, and every 70,000 points. The three switches index one of two 8-entry tables, picked by bit 2 of the starting-fighter setting. In the first, five settings repeat, two award only the first two scores, and one awards none; in the second, every first score is 30,000, three settings repeat, four award at most the first two, and one awards none. The source reassembles MAME's
galagaset, Namco rev. B.Codeneiderm/arcaderevisedHow we know
1995; Bonus Ships Awarded (DSWB) ⋮ 1997; 0x20 20-60-60 ON ON OFF 1 1998; 0x10 20-70-70 ON OFF ON 2 ⋮ 2002; 0x18 20-60 OFF OFF ON 6 2003; 0x38 30-80 OFF OFF OFF 7 2004; 0x00 None ON ON ON 0 2005; Bonus config displayed in following format: 2006; 1ST BONUS X0000 PTS 2007; 2ND BONUS XX0000 PTS 2008; AND EVERY XX0000 PTS
galag/galagao_ASxxx/rom0/gg1-4.s lines 1995–2008 at 248be0d · upstream ↗ 2010l_38AB: 2011 ld hl,#_sfr_dsw4 ; bonus levels ⋮ 2023 and #0x07 2024 jp z,l_392D ⋮ 2026 ld c,a 2027 ld a,(b_mchn_cfg_nships) ; Bonus levels depend upon number of fighters starting. 2028 and #0x04 ; note: num_ships = mchn_cfg_nships + 1 2029 add a,a 2030 add a,c ; add dsw value 2031 add a,a ; a:=a*2 ... use as offset into table 2032 ld hl,#str_3AA4 ; bonus config data 2033 rst 0x10 ; HL += A...A==2,C,4,6,E,8,A ⋮
galag/galagao_ASxxx/rom0/gg1-4.s lines 2010–2036 at 248be0d · upstream ↗ 2529str_3AA4: 2530 .db 0xFF,0xFF ;; NO BONUS SHIPS GIVEN WITH THIS SETTING 2531 .db 0x02,0x06 2532 .db 0x02,0x07 2533 .db 0x02,0x08 2534 .db 0x03,0x0A 2535 .db 0x03,0x0C 2536 .db 0x02,0x06 + 0x80 ;; bit-7 means there's no 'and-every' bonus 2537 .db 0x03,0x08 + 0x80 ;; bit-7 means there's no 'and-every' bonus ⋮ 2540str_3AB4: 2541 .db 0xFF,0xFF,0x03,0x0A,0x03,0x0C,0x03,0x0F,0x03,0x8A,0x03,0x8C,0x03,0x8F,0x03,0xFF
galag/galagao_ASxxx/rom0/gg1-4.s lines 2529–2541 at 248be0d · upstream ↗ 265; if bit 7 is set, the third bonus award does not applygalag/galagao_ASxxx/rom0/game_ctrl.s lines 265–267 at 248be0d · upstream ↗ ; looks like a bonus may be awarded. … ; actv_plyr_state[0x1E] += mchn_cfg_bonus[1] … ; sound-fx count/enable registers, bonus ship awarded sound (set non-zero) … ; new spare ship added
galag/galagao_ASxxx/rom0/game_ctrl.s#L1196-L1213 · upstream ↗ The following binary files (Namco rev. B):
README.md#L16 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-25.
Checked by a second AI model, 2026-10-21.
Revised after a check by a second AI model, 2026-10-25.
- ^ abcdThe US NES Contra awards its first extra life at 20,000 points and each later one 30,000 points past the last threshold, and caps lives at 99.Codevermiceli/nes-contra-us
How we know
1177 lda #$c8 ; set default high score. #$c8 is 200 decimal 1178 sta EXTRA_LIFE_SCORE_LOW ; starting score for extra life (20,000)
src/bank7.asm lines 1177–1178 at 687d651 · upstream ↗ 1283; every time an extra life is obtained, #$12c is added to points required to get next extra life (300 decimal, 30,000 in game score) ⋮ 1291 lda #$2c ; a = #$2c (12c = 300 decimal) (high byte will be set to #$01 a few lines down) ⋮ 1294 adc EXTRA_LIFE_SCORE_LOW,y ; add 300 decimal to low byte of score required to get extra life
src/bank7.asm lines 1283–1294 at 687d651 · upstream ↗ 1310 inc P1_NUM_LIVES,x ; if X is $01, then set P2 number of lives 1311 lda P1_NUM_LIVES,x ; load incremented number into memory 1312 cmp #$63 ; compare to #$63 (99 decimal) 1313 bcc @set_num_lives ; can't have more than 99 lives 1314 lda #$63 ; a = #$63 (63 = 99 decimal)
src/bank7.asm lines 1310–1314 at 687d651 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-21.
Checked by a second AI model, 2026-10-21.
- ^ abcThe US NES Super C awards its first extra life at 30,000 points and each later one 20,000 points past the last threshold, the reverse of Contra's 20,000 and 30,000, and caps lives at 99 as Contra does.Codevermiceli/nes-super-c · vermiceli/nes-contra-us
How we know
1516 lda #$30 1517 sta NEXT_1_UP_SCORE_MID,x 1518 lda #$00 1519 sta NEXT_1_UP_SCORE_HI,x ; sets initial score to obtain to get an extra life to 0030000
src/bank-f.asm lines 1516–1519 at be6ccce · upstream ↗ 1757@give_1_up: ⋮ 1759 ldx #$20 1760 lda NEXT_1_UP_SCORE_MID,y 1761 clc ; adding 0020000 to the required score to get the next 1-up
src/bank-f.asm lines 1757–1763 at be6ccce · upstream ↗ 1777 lda PLAYER_NUM_LIVES,x 1778 cmp #$63 ; see if at max number of lives (99 in decimal) 1779 bcc @inc_num_lives 1780 lda #$63 1781 sta PLAYER_NUM_LIVES,x ; set number of lives to #$63 if #$63 or greater
src/bank-f.asm lines 1777–1781 at be6ccce · upstream ↗ 1177 lda #$c8 ; set default high score. #$c8 is 200 decimal 1178 sta EXTRA_LIFE_SCORE_LOW ; starting score for extra life (20,000)
src/bank7.asm lines 1177–1178 at 687d651 · upstream ↗ 1283; every time an extra life is obtained, #$12c is added to points required to get next extra life (300 decimal, 30,000 in game score) ⋮ 1291 lda #$2c ; a = #$2c (12c = 300 decimal) (high byte will be set to #$01 a few lines down) ⋮ 1293@set_extra_life_inc_num_lives: 1294 adc EXTRA_LIFE_SCORE_LOW,y ; add 300 decimal to low byte of score required to get extra life 1295 sta EXTRA_LIFE_SCORE_LOW,y ; player score for extra life - low byte 1296 lda #$01 ; a = #$01
src/bank7.asm lines 1283–1296 at 687d651 · upstream ↗ 1312 cmp #$63 ; compare to #$63 (99 decimal) 1313 bcc @set_num_lives ; can't have more than 99 lives 1314 lda #$63 ; a = #$63 (63 = 99 decimal)
src/bank7.asm lines 1312–1314 at 687d651 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-25.
Checked by a second AI model, 2026-10-21.
Checked by a second AI model, 2026-10-25.
Sources
Code
- Cantrell, Christopher. 2026. “Computer Archeology: Space Invaders.” Commit 1adc2a7. topherCantrell/computerarcheology @ 1adc2a7 · licence, all uses
- Howell, Lonnie, Mark McDougall, and Christopher Cantrell. 2026. “Computer Archeology: Asteroids.” Commit 1adc2a7. topherCantrell/computerarcheology @ 1adc2a7 · licence, all uses
- Tunstall, Scott. 2025. “Galaxian: annotated reverse engineering.” Commit a16b402. ScottTunstall/Galaxian @ a16b402 · licence, all uses
- Burkley, Mark. 2025. “pacman-c: a C translation of the Pac-Man ROM.” Commit 3277e56. mburkley/pacman-c @ 3277e56 · licence, all uses
- Jarvis, Eugene, Sam Dicker, and Robert Hargreaves. 2023. “Defender (1981) by Eugene Jarvis and Sam Dicker: the 6809 source.” Commit e740063. mwenge/defender @ e740063 · licence, all uses
- Willms, Jeff and Kef Schecter. 2014. “dkdasm: Donkey Kong hacking kit.” Commit 4d296c5. furrykef/dkdasm @ 4d296c5 · licence, all uses
- Neidermeier, Glenn. 2026. “Gyaraga: commented and compilable Galaga source.” Commit 248be0d. neiderm/arcade @ 248be0d · licence, all uses
- (vermiceli), Michael Miceli. 2026. “Contra (US), annotated disassembly (vermiceli).” Commit 687d651. vermiceli/nes-contra-us @ 687d651 · licence, all uses
- (vermiceli), Michael Miceli. 2026. “Super C (US), annotated disassembly (vermiceli).” Commit be6ccce. vermiceli/nes-super-c @ be6ccce · licence, all uses