+thegoldenband Posted September 22, 2021 Share Posted September 22, 2021 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. Quote Link to comment Share on other sites More sharing options...
Thomas Jentzsch Posted September 23, 2021 Share Posted September 23, 2021 Might be a programming error. E.g. a missed # for an immediate load. 1 Quote Link to comment Share on other sites More sharing options...
Thomas Jentzsch Posted September 23, 2021 Share Posted September 23, 2021 (edited) 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: LFF64 .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 September 23, 2021 by Thomas Jentzsch 3 2 Quote Link to comment Share on other sites More sharing options...
+thegoldenband Posted September 24, 2021 Author Share Posted September 24, 2021 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? Quote Link to comment Share on other sites More sharing options...
Thomas Jentzsch Posted September 24, 2021 Share Posted September 24, 2021 $E8 1 Quote Link to comment Share on other sites More sharing options...
Recommended Posts
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.