B board · sheet 4/6 · manual page 35

The object ROM sheet

Where the pixels actually live. Six EPROMs, four shift registers, two empty sockets and a timing PROM that tells the whole engine what to do on each line.

This sheet is part ofHow sprites work

The subsystem followed end to end, across every sheet that builds it.

What this sheet is for

Every frame of your soldier running, every enemy, every explosion is stored in the EPROMs on this sheet. Sprites are four bits per pixel, and those four bits are split across two chips: 7E, 8E and 9E supply two colour layers, 7H, 8H and 9H the other two, read simultaneously so all four bits of a pixel arrive together.

Eight pixels come out at once and are pushed out one at a time by the '194 shift registers at 7J to 10J, with 8K and 9C telling them when to reload and which direction to walk. 10K chooses which end to listen to, which is the whole of horizontal mirroring.

FROM A PICTURE NUMBER TO FOUR BITS PER DOT7K '139pick a bank6 x 27128fetch 8 pixels7J - 10J'194 shifters10K '257which end first

Sprites are four bits deep, so every pixel is split across two chips read at the same instant. Mirroring is free: a '194 shifts either way, so a flipped sprite is the same artwork clocked out backwards.

The bank that was never fitted

7K decodes two attribute bits into four bank selects. Three banks are populated. The sockets for the fourth pair, 10E and 10H, are on the board and fully wired, and empty.

Capcom designed the capacity and never used it. MAME reaches the same conclusion from the software side: its draw loop simply skips any sprite whose bank is 3. An empty socket on the board and a conditional in the emulator, describing the same two absent chips.

The other timing PROM

6E is a small lookup table addressed by the scanline counter, and it does for the sprite engine what the PROM on the CPU sheet does for interrupts: it says what should be happening on each line - clearing, filling, or playing out.

6F holds those decisions steady for a whole line, producing the signals that swap the two buffers and blank the sprite output when it should not be seen. 6H turns that timing into per-buffer commands - wipe this one, load a starting X position into that one - and 6J gates the pixel clock into a write pulse for whichever buffer is being filled.

It is the same philosophy as the palette and the interrupt schedule: anything that is a fixed decision gets pushed into a table, where changing it costs a new burn rather than a redesign.

Every chip on this sheet

Click any of them to open the schematic with that chip selected in both panels.

← open the schematic for this sheet