Jump to content

What triggers the kill screen in Assault/Sky Alien?

Recommended Posts

Last year I started playing Assault (aka Sky Alien), a nifty little game that's vastly more engaging than your average off-brand Atari 2600 shooter. It's a lot like Demon Attack but has side-to-side shooting, an overheating mechanic, and four types of enemies. Three enemy types shoot different projectiles (bullets, lasers, cluster bombs), while the fourth drops ground-based attackers (hence the side-to-side shooting).


All four types start to split in two starting with Wave 5, and become intermittently invisible/invincible starting with Wave 9.


In the course of checking it out, I discovered this video, which has a kill screen at Wave 13, whereupon all the enemies are invisible 100% of the time and you can no longer kill them:



However, when I played Assault today on my Harmony cart (and 7800), I didn't hit any kill screen at Wave 13. Instead, the enemies started dropping ground troops, even if they weren't the kind that normally does so, and the game kept going. I made it to Wave 15.


Then I discovered this video, under the Sky Alien title, in which the player hits the kill screen at Wave 19. (You can kill the ground-based enemies, I suppose, but you can't hit the invisible alien ships above.)



I think the enemy patterns he sees in Wave 13-15 are the same as what I saw.


All this makes me wonder: what the heck triggers the kill screen in this game? I've done some snooping in the RAM in Stella and made initial attempts at some kind of memory map (not sure all of these are 100% correct):


$80-82 - score in BCD

$90 - position of player

$91 - position of the enemy on the ground

$A1-A6 - position of enemy ships

$C2 - setting this to $FF fires a shot immediately

$C4-C5 - position of mothership

$C7 - slowly counting up? something to do with screen roll/scanlines (writing $52 is OK but $53 screws up display)

$DB - some kind of global counter

$E5 - lives in reserve

$E9 - enemies remaining in mothership (setting this to $00 ends the wave immediately if there are no enemies onscreen)

$EE, EF - something to do with shooting?

$F0, F1 - seem to affect color of score


I was able to make it past Wave 20 using the same ROM I used in my Harmony cart, which suggests that the trigger for the kill screen isn't the wave number. I don't think it's the score either, since the scores in those two videos don't match -- 12910 vs. 19751. (Getting 999,999 points doesn't end the game -- the manual makes it sound as if it does, à la Activision, but it just stops you from earning any more points.)


I haven't found the level number in RAM, not sure if it's stored there as such. My breakpoint skills are zero.


What I'm wondering is whether we might be dealing with a situation like Berzerk, in which there's some global counter that eventually triggers the kill screen by making the enemy ships invisible 100% of the time. Maybe it's an overall timer, maybe it's the number of enemies killed, or something else. Or is it just an emulation bug? But that seems hard to believe.


One thing is that the first video (above) takes a long time to clear Wave 12 and reach 13, while the other video reaches Wave 19 in much less time. That makes me wonder whether it's a global timer that's overflowing -- again, like Berzerk.


Any insights would be appreciated! I'm out of my depth here, but would love to know the answer so that I can figure out if "beating" this game is feasible. Also, I'm wondering if the difficulty switches have any effect on gameplay -- this page claims they do, but I'm not sure I'm seeing anything.

Share this post

Link to post
Share on other sites

Might be a programming error. E.g. a missed # for an immediate load.

  • Thanks 1

Share this post

Link to post
Share on other sites

After looking into the code, it definitely it is a programming error. The bug occurs if you hit the last alien just before it becomes invisible (so that the invisible flag is set during its explosion) and the next wave is with enemies jumping up and down.


During the jumping wave, the invisible flag isn't updated (or reset) so that the invaders stay invisible forever. Here is the table which defines the waves:

    .byte   $00,$05,$0a,$0f,$90             
    .byte   $95,$9a,$9f,$a0,$a5,$aa,$af,$90 
    .byte   $a1,$9e,$af,$94,$a5,$9e,$af,$98 
    .byte   $a9,$9e,$af,$9c,$ad,$9e,$af,$98 
    .byte   $ad,$aa,$9f,$a8,$ad,$9a,$af,$ac 
    .byte   $9d,$ae,$af,$ac,$ad,$ae,$af,$ac 
    .byte   $ad,$ae,$af                     
; $9x defines a jumping wave
; $ax defines an invisible wave

The bug can happen earliest in wave 13, then 15, 17, 19...


The attached ROM should fix the bug. It resets the invisible flag during jumping waves.


BTW: The game maxes out at wave 50 and stays there forever.

Assault (1983) (Bomb) (fixed).bin

Edited by Thomas Jentzsch
  • Like 3
  • Thanks 2

Share this post

Link to post
Share on other sites

Fantastic, Thomas! Thanks so much for looking into this -- your efforts are everything I could have hoped for. :) Very grateful.


BTW which RAM location holds the wave number? For some reason I wasn't able to figure it out. Is it stored in some non-obvious way?

Share this post

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

  • Create New...