Not one capture here. Every picture is drawn from the bytes of the ROM, by running in Python the very same decompressors, mirrors and band builders the Z80 runs, and then checked byte for byte against openMSX's VRAM: the eight stages dumped from the emulator come out with zero differences in colour (6,144 bytes), patterns (6,144) and the 704 tiles of the map. The listing and the numbers are reproducible with make, and reassembling gives back the ROM byte for byte.
The cartridge carries two cosine quadrants, one scaled to 255 (0x844E) and one to 128 (0x848F), and uses them to get the sine and cosine of an angle from 0 to 255. A cosine quadrant can only go down. These two go up once each, and the value that goes up is precisely the only one that departs from the function: entry 58 of the first is 0x2F where it should be 0x25, and entry 12 of the second is 0x74 where it should be 0x7A. The other 64 entries of each table fit the cosine with a mean deviation of 0.48 and 1.73. Two data typos, and a test now watches them.
0x6F44 is called exactly once, right after the game is reset. It wants the controller to read 0x2C in its low six bits -bits 2, 3 and 5: left and right at the same time plus the second button, which a joystick cannot do- and a key from keyboard rows 3, 4 or 5 as well. One of the three puts 26 lives into (0xE060); the other two touch the weapon in (0xE069).
At 0x4010 sits the second header, the one the Konami Game Master reads from the next slot: "CD" 07 39, that is RC-739. The 21 bytes that follow are laid out by a flags byte, and the layout works out byte for byte: it ends at 0x4024, exactly where code starts again. It declares the scene variable, the lives, the high score, the score, eight stages and one more address: 0x56C8, a routine of this cartridge that nothing inside it ever calls. What it does takes ten bytes: turn the stage the Game Master writes into (0xE061) into the internal index at (0xE062).
The scenery is assembled in bands of four rows, and the bitmap that says when the block pointer moves on advances six bytes per section while seven are read. So the last band of one section and the first of the next come from the same byte. And not only from the same byte: the scenery they give is identical, checked on all nine joins of each of the eight stages.
Stages 0, 3 and 7 share tiles and colour script. What tells them apart is (0xE661): the block reader (0x443B) translates five colour codes -0xE1, 0xEC, 0xE8, 0xE6 and 0xE5- by subtracting 0x50, and another 0x50 when the bank is 2. One 640-byte block gives all three sceneries. Stages 5 and 6 go further: they share tiles and colour, and differ only in the map.
0x5A73 pulls one byte out of 0x5A95 every eight frames and hands it to guarda_lo_recien_pulsado, the very door the joystick comes in through. That is 118 keypresses, some nineteen seconds at 50 Hz. The cp 0xFF that would end it never arrives: there is not a single 0xFF inside the block, and the demo is cut short some other way.
Each one is a 256 x 1952 pixel strip, drawn from the ROM block by block; not one is a capture. They read bottom to top, which is how they are played. Drag sideways to see all eight.
monta_el_marcador (0x565C) uploads them, the same in all eight.0x443B with (0xE661) set to one.0x2470 (0x553E).Under each picture is where it comes from and what is on it.
monta_el_titulo (0x47BA). The big logo is 33 tiles -eleven by three- written by a loop starting at tile 0x60.0x902D, each with its own offset and colour.0x9338.0xA993. They do not fit at once: the cartridge reloads them into THREE slots of the sprite sheet (0x1D00, 0x1E00 and 0x1F00) as they are needed.0x7772, each with ITS type's block loaded in the slot: without that the pattern byte is relative and draws nothing. The grey background is deliberate: nearly all of them are colour-1 silhouettes, that is black.0x63FB, a [pattern][colour] pair each. Only the last two animate, with four frames apiece.0x8250, which 0x8231 indexes with the count.0x54BE uploads at the start of every stage -the weapons, the shots and the items-. They are white because a sprite pattern has NO colour of its own: whichever table uses it supplies one, and the ones that have it are above.