F-1 Spirit

A 128 KB MegaROM from 1987, the first in this series with a mapper and an SCC sound chip. Its 21 tracks are lists of pieces that can be rewritten, and there is an editor to do it.

Konami · 1987 · Cartridge RC-752, 128 KB · MSX1 · Konami SCC · Dump 3b9afd12…

There is not a single screenshot here. The tracks are drawn by repeating the chain the cartridge follows to paint them, and the minimaps by integrating their paths. The rest —the listing and the numbers— comes out of the binary and is reproduced with make.

The game in numbers

99.6 %of the binary explained
977routines identified
21tracks
31,591bytes of code
98,977bytes of data
504bytes unidentified

What turns up when you take it apart

The road's depth is three different drawings

In SCREEN 2 the pattern table is three banks, one per third of the screen. F-1 Spirit loads different drawings under the same index in the top third and the bottom one, and that is where the road's sense of depth comes from. Bits 7, 6 and 5 of the loader's flags say which third each tile goes to.

A track is four levels of indirection

Each race has a sequence of (piece, flags) pairs. A piece is 24 bytes: 3 rows of 8 metatiles. A metatile is 16 bytes: 4 rows of 4 tiles. One row of a piece fills the screen's width. The flags do not move the track: they rotate the row of metatiles modulo 8, and that rotation, accumulated from one piece to the next, is what makes it wind.

One minimap step is two track pieces

The minimap is not computed: it is 21 byte paths, two signed nibbles each, that move the marker. Its shape does not come from the sequence, but its length does: across all 21 races, steps = pieces / 2 + 1.

Three recorded games

Three blocks share one format -pairs of (control mask, how many frames it lasts)- adding up to 43.6 s, 84 s and 12.5 s. The masks are combinations of the direction bits and the two buttons: they are recorded games, what the machine plays by itself.

What it draws

None of these images is a screenshot: they are drawn from the ROM by tools/imagenes_web.py.

The title screen, built with the steps of MONTA_PRESENTACION (0x5CB5): tiles 16 to 58 from p15 0xB777, the tile list at 0x6D34 -which mixes six-byte records with 0x17 orders that pull from the table of 85 resources- and the picture at p08 0x8280, decompressed with the buffer RLE at p01 0x637A, which on top of copying and repeating can write runs of ascending and descending tile numbers. The colours are the ones the fade at 0x5E4A leaves behind: on an MSX1 there is no palette to touch, so the picture appears by painting the tile colours one at a time.
The title screen, built with the steps of MONTA_PRESENTACION (0x5CB5): tiles 16 to 58 from p15 0xB777, the tile list at 0x6D34 -which mixes six-byte records with 0x17 orders that pull from the table of 85 resources- and the picture at p08 0x8280, decompressed with the buffer RLE at p01 0x637A, which on top of copying and repeating can write runs of ascending and descending tile numbers. The colours are the ones the fade at 0x5E4A leaves behind: on an MSX1 there is no palette to touch, so the picture appears by painting the tile colours one at a time.
The start of the RALLY track, drawn by following the cartridge's own chain: the sequence of pieces, their metatiles and the tiles from the three banks.
The start of the RALLY track, drawn by following the cartridge's own chain: the sequence of pieces, their metatiles and the tiles from the three banks.
And the fifth race of the championship. Each 32 x 12 tile band is one piece of the sequence.
And the fifth race of the championship. Each 32 x 12 tile band is one piece of the sequence.
The 21 minimap outlines, integrated from their paths of signed nibbles. All 21 close: the deltas add up to zero on both axes.
The 21 minimap outlines, integrated from their paths of signed nibbles. All 21 close: the deltas add up to zero on both axes.