On this page
  1. Related
  2. Games
  3. References
  4. Sources

The fewer enemies remain, the faster or fiercer they get. In Space Invaders the speed-up falls out of the drawing: one alien moves per frame, so the rack steps once per pass over the live aliens1. Galaxian uses a threshold instead: with 3 or fewer aliens in the swarm, attackers other than flagships stop returning to it2.

  • Draw-boundSpace Invaders (1978). One alien moves per frame, so a step of the rack takes one frame per live alien.1,3,4
  • ThresholdGalaxian (1979). With 3 or fewer aliens in the swarm, attackers other than flagships stop returning to it.2

Games

GameYearHowNote
Space Invaders1978Draw-boundone alien moves per frame, so a step of the rack takes one frame per live alien
Galaxian1979Thresholdwith 3 or fewer aliens in the swarm, attackers other than flagships stop returning to it
Every claim about this mechanic, by game (4)
Space Invaders 1978Space Invaders moves its rack of aliens one alien per frame. The interrupt at scanline 96 calls CursorNextAlien, which skips dead aliens to the next live one and waits until the end-of-screen interrupt's DrawAlien has drawn it. Only when the cursor passes the last of the 55 slots does MoveRefAlien step the reference alien, from which every other alien is drawn. A step of the rack therefore takes one 60 Hz frame per live alien: 55 frames at the start, 1 for the last alien. The listing reads MAME's invaders set, Midway's release.Code
When the rack bumps an edge, RackBump reverses it and drops it 8 px: it sets the next step's drop from $200E, which the game's RAM copy fills with $F8 (-8), and MoveRefAlien clears the drop after one step. Its step to the right is 2 px, or 3 px when one alien is left; its step to the left is always 2 px.Code
Each pass of the game loop, SpeedShots checks the number of aliens left; below 9 it sets the alien shots' step ($207E, added to a shot's Y each move) to $FB, -5 px, in place of the $FC (-4 px) that the game's RAM copy puts there, so the aliens' shots fall faster.Code
Galaxian 1979Galaxian counts the aliens still in the swarm, leaving out those in flight, and sets HAVE_AGGRESSIVE_ALIENS when 3 or fewer remain. With the flag set, an attacking alien other than a flagship that reaches the bottom of the screen reappears at the top and attacks again instead of rejoining the swarm, once the player has spawned; before that, it rejoins. Flagships take a separate routine. The disassembly reads the Namco ROM, MAME's galaxian set.Code

References

  1. ^ abSpace Invaders moves its rack of aliens one alien per frame. The interrupt at scanline 96 calls CursorNextAlien, which skips dead aliens to the next live one and waits until the end-of-screen interrupt's DrawAlien has drawn it. Only when the cursor passes the last of the 55 slots does MoveRefAlien step the reference alien, from which every other alien is drawn. A step of the rack therefore takes one 60 Hz frame per live alien: 55 frames at the start, 1 for the last alien. The listing reads MAME's invaders set, Midway's release.CodeComputer Archeology, Space Invaders
    How we know
    7>>> binary 0000:roms/invaders.h + roms/invaders.g + roms/invaders.f.diag + roms/invaders.e
    
    content/Arcade/SpaceInvaders/Code.md line 7 at 1adc2a7 · upstream ↗
    28If I understand this right then the system gets RST 8 when the beam is *near* the middle of the screen and RST 10 
    
    content/Arcade/SpaceInvaders/Hardware.md lines 28–33 at 1adc2a7 · upstream ↗
    120; Main game-play timing loop
    ⋮
    1240078: CD 00 01        CALL    $0100               ; {code.DrawAlien} Draw the current alien (or exploding alien)
    
    content/Arcade/SpaceInvaders/Code.md lines 120–124 at 1adc2a7 · upstream ↗
    138; Continues here at scanline 96
    ⋮
    15400AB: CD 41 01        CALL    $0141               ; {code.CursorNextAlien} Advance cursor to next alien (move the alien if it is last one)
    
    content/Arcade/SpaceInvaders/Code.md lines 138–155 at 1adc2a7 · upstream ↗
    248CursorNextAlien:
    ⋮
    2600146: 3A 00 20        LD      A,($2000)           ; {ram.waitOnDraw} Still waiting on ...
    2610149: A7              AND     A                   ; ... this alien to be drawn?
    262014A: C0              RET     NZ                  ; Yes ... leave cursor in place
    ⋮
    2670154: 3C              INC     A                   ; Have we drawn all aliens ...
    2680155: FE 37           CP      $37                 ; ... at last position?
    2690157: CC A1 01        CALL    Z,$01A1             ; {code.MoveRefAlien} Yes ... move the bottom/right alien and reset index to 0
    270015A: 6F              LD      L,A                 ; HL now points to alien flag
    271015B: 46              LD      B,(HL)              ; Is alien ...
    272015C: 05              DEC     B                   ; ... alive?
    273015D: C2 54 01        JP      NZ,$0154            ; {} No ... skip to next alien
    
    content/Arcade/SpaceInvaders/Code.md lines 248–273 at 1adc2a7 · upstream ↗
    319MoveRefAlien:
    320; The "reference alien" is the bottom left. All other aliens are drawn relative to this
    321; reference. This routine moves the reference alien (the delta is set elsewhere) and toggles
    ⋮
    32601A5: 21 06 20        LD      HL,$2006            ; Set current alien ...
    32701A8: 36 00           LD      (HL),$00            ; ... index to 0
    ⋮
    33101AE: CD D9 01        CALL    $01D9               ; {code.AddDelta} Move alien
    
    content/Arcade/SpaceInvaders/Code.md lines 319–331 at 1adc2a7 · upstream ↗
    3910; The game starts with 55 aliens. The aliens are move/drawn one per interrupt which means it
    
    content/Arcade/SpaceInvaders/Code.md lines 3909–3911 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.

    In the claim ledger

  2. ^ abGalaxian counts the aliens still in the swarm, leaving out those in flight, and sets HAVE_AGGRESSIVE_ALIENS when 3 or fewer remain. With the flag set, an attacking alien other than a flagship that reaches the bottom of the screen reappears at the top and attacks again instead of rejoining the swarm, once the player has spawned; before that, it rejoins. Flagships take a separate routine. The disassembly reads the Namco ROM, MAME's galaxian set.CodeScottTunstall/Galaxianrevised
    How we know
    5058INIT_INFLIGHT_ALIEN:
    5059145C: 36 00         ld   (hl),$00            ; clear flag in ALIEN_SWARM_FLAGS - effectively removing it from swarm            
    
    galaxian.asm lines 5058–5059 at a16b402 · upstream ↗
    5615HANDLE_ALIEN_AGGRESSIVENESS:
    ⋮
    561916BD: 21 23 41      ld   hl,$4123            ; load HL with address of first alien (bottom rightmost) in ALIEN_SWARM_FLAGS
    562016C0: 11 06 00      ld   de,$0006            ; DE is an offset to add to HL after processing a row of aliens
    562116C3: 4B            ld   c,e                 ; Conveniently, E is also number of rows of aliens in swarm! (6) 
    562216C4: 3E 01         ld   a,$01               ; A is going to be used to total the number of aliens in the swarm 
    562316C6: 06 0A         ld   b,$0A               ; 10 aliens maximum per row
    562416C8: 86            add  a,(hl)              
    ⋮
    563316D4: 06 03         ld   b,$03               ; number of ports to write to maximum 
    563416D6: 3D            dec  a                   ; decrement total by 1 
    563516D7: 28 14         jr   z,$16ED             ; if total is zero, goto $16ED 
    ⋮
    564016DC: 10 F8         djnz $16D6
    ⋮
    564216DE: FE 02         cp   $02                 ;                  
    ⋮
    
    galaxian.asm lines 5615–5658 at a16b402 · upstream ↗
    3747INFLIGHT_ALIEN_REACHED_BOTTOM_OF_SCREEN:
    ⋮
    3758;if the player has not spawned, the alien will return to the swarm.
    ⋮
    3772; alien reappears at top of screen and will keep attacking - it will not return to swarm. 
    
    galaxian.asm lines 3747–3772 at a16b402 · upstream ↗
    the manual above is not correct with the Namco Galaxian ROM
    galaxian.asm#L167-L168 · 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.

    In the claim ledger

  3. ^When the rack bumps an edge, RackBump reverses it and drops it 8 px: it sets the next step's drop from $200E, which the game's RAM copy fills with $F8 (-8), and MoveRefAlien clears the drop after one step. Its step to the right is 2 px, or 3 px when one alien is left; its step to the left is always 2 px.CodeComputer Archeology, Space Invaders
    How we know
    31631597: 3A 0D 20        LD      A,($200D)           ; {ram.rackDirection} Get rack direction
    3164159A: A7              AND     A                   ; Moving right?
    3165159B: C2 B7 15        JP      NZ,$15B7            ; {} No ... handle moving left
    ⋮
    317015A5: 06 FE           LD      B,$FE               ; Delta X of -2
    317115A7: 3E 01           LD      A,$01               ; Rack now moving right
    ⋮
    317315A9: 32 0D 20        LD      ($200D),A           ; {ram.rackDirection} Set new rack direction
    317415AC: 78              LD      A,B                 ; B has delta X
    317515AD: 32 08 20        LD      ($2008),A           ; {ram.refAlienDXr} Set new delta X
    317615B0: 3A 0E 20        LD      A,($200E)           ; {ram.rackDownDelta} Set delta Y ...
    317715B3: 32 07 20        LD      ($2007),A           ; {ram.refAlienDYr} ... to drop rack by 8
    ⋮
    318315BE: CD F1 18        CALL    $18F1               ; {} Get moving-right delta X value of 2 (3 if just one alien left)
    318415C1: AF              XOR     A                   ; Rack now moving left
    ⋮
    
    content/Arcade/SpaceInvaders/Code.md lines 3163–3185 at 1adc2a7 · upstream ↗
    368418F1: 06 02           LD      B,$02               ; Rack moving right delta X
    368518F3: 3A 82 20        LD      A,($2082)           ; {ram.numAliens} Number of aliens on screen
    368618F6: 3D              DEC     A                   ; Just one left?
    368718F7: C0              RET     NZ                  ; No ... use right delta X of 2
    368818F8: 04              INC     B                   ; Just one alien ... move right at 3 instead of 2
    
    content/Arcade/SpaceInvaders/Code.md lines 3684–3689 at 1adc2a7 · upstream ↗
    39301E4: 06 C0           LD      B,$C0               ; Number of bytes
    39401E6: 11 00 1B        LD      DE,$1B00            ; RAM mirror in ROM
    39501E9: 21 00 20        LD      HL,$2000            ; Start of RAM
    39601EC: C3 32 1A        JP      $1A32               ; {code.BlockCopy} Copy [DE]->[HL] and return
    
    content/Arcade/SpaceInvaders/Code.md lines 393–396 at 1adc2a7 · upstream ↗
    40721B00: 01 00 00 10 00 00 00 00 02 78 38 78 38 00 F8 00
    
    content/Arcade/SpaceInvaders/Code.md line 4072 at 1adc2a7 · upstream ↗
    32601A5: 21 06 20        LD      HL,$2006            ; Set current alien ...
    ⋮
    32801AA: 23              INC     HL                  ; Point to DeltaX
    32901AB: 4E              LD      C,(HL)              ; Load DX into C
    33001AC: 36 00           LD      (HL),$00            ; Set DX to 0
    33101AE: CD D9 01        CALL    $01D9               ; {code.AddDelta} Move alien
    
    content/Arcade/SpaceInvaders/Code.md lines 326–331 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.

    In the claim ledger

  4. ^Each pass of the game loop, SpeedShots checks the number of aliens left; below 9 it sets the alien shots' step ($207E, added to a shot's Y each move) to $FB, -5 px, in place of the $FC (-4 px) that the game's RAM copy puts there, so the aliens' shots fall faster.CodeComputer Archeology, Space Invaders
    How we know
    150308D8: 3A 82 20        LD      A,($2082)           ; {ram.numAliens} Number of aliens on screen
    150408DB: FE 09           CP      $09                 ; More than 8?
    150508DD: D0              RET     NC                  ; Yes ... leave shot speed alone
    150608DE: 3E FB           LD      A,$FB               ; Normally FF (-4) ... now FB (-5)
    150708E0: 32 7E 20        LD      ($207E),A           ; {ram.alienShotDelta} Speed up alien shots
    
    content/Arcade/SpaceInvaders/Code.md lines 1503–1507 at 1adc2a7 · upstream ↗
    14050825: CD F3 15        CALL    $15F3               ; {code.CountAliens} Count aliens (count to 2082)
    ⋮
    14120838: CD D8 08        CALL    $08D8               ; {code.SpeedShots} Adjust alien shot speed
    
    content/Arcade/SpaceInvaders/Code.md lines 1404–1412 at 1adc2a7 · upstream ↗
    109305E5: 3A 7B 20        LD      A,($207B)           ; {ram.alienShotYr} Get shot's Y coordinate
    109405E8: 47              LD      B,A                 ; Hold it
    109505E9: 3A 7E 20        LD      A,($207E)           ; {ram.alienShotDelta} Get alien shot delta
    109605EC: 80              ADD     A,B                 ; Add to shots coordinate
    109705ED: 32 7B 20        LD      ($207B),A           ; {ram.alienShotYr} New shot Y coordinate
    
    content/Arcade/SpaceInvaders/Code.md lines 1093–1097 at 1adc2a7 · upstream ↗
    39301E4: 06 C0           LD      B,$C0               ; Number of bytes
    39401E6: 11 00 1B        LD      DE,$1B00            ; RAM mirror in ROM
    39501E9: 21 00 20        LD      HL,$2000            ; Start of RAM
    
    content/Arcade/SpaceInvaders/Code.md lines 393–396 at 1adc2a7 · upstream ↗
    40831B70: 0F 0B 00 18 26 0F 0B 00 18 04 11 24 1B 25 FC 
    
    content/Arcade/SpaceInvaders/Code.md line 4083 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.

    In the claim ledger

Sources

Code