The code

One dead loop, and the whole machine in the interrupt

INIT (0x4010) leaves a jp 0x4043 in the H.KEYI hook and falls into a jr to itself. From there the main program does nothing: the entire game runs inside the per-frame interrupt.

0x40A5 reads the 0xE000 / 0xE001 pair — the state and the sub-state — and dispatches through 0x4071, which is a pop hl / add a,a / jp (hl): the table of eight states sits right after the CALL, at 0x40C9, so the return address is itself the pointer to the table. Inside each state, djnz chains split the sub-states.

The gameplay frame

0x4540 does the whole frame: dumps the sprites to VRAM, advances the background, moves the plane and the wave, and walks the seven object slots at 0xE200, 16 bytes each. Each slot carries its type, and 0x534F dispatches it with a push bc / ret through the table of 21 routines at 0x535F.

The landscape is compressed, and drawn bottom-up

There is a single 1920-row stage that repeats, with the difficulty climbing (0xE1D3, capped at 2). PASO_DE_FONDO (0x5837) redraws it whole once every sixteen frames, and the fine scroll comes out of a table trick:

It is written into the name table bottom-up from 0x3AE1, in 24 rows of 23 columns: the eight on the right are the score panel.

The landscape characters are 0x40 to 0xA7, with patterns at 0x6DCA and colours at 0x702B. Characters 0x00 to 0x0F have no pattern at all: 0x4B71 gives each one a solid colour, and they are the sea and the flatlands.

Two in-house decompressors

The graphics are all compressed, with two of the house's own interpreters: 0x439C writes to VRAM and 0x43D8 to the name table. The second has a nice touch: entering at 0x43F3 it writes zeros instead of the data, so the same script both paints and erases.

The sound is Konami's three-channel player

0x79D8 and 0x7A7A drive the house PSG player, with twelve bytes of state per channel —ld de,0x000C at 0x7A89, and the bases 0xE01A, 0xE026 and 0xE032 sit twelve apart—. It is the same framework Konami spread across its MSX cartridges.