commandob, bootleg set 1 · daughter board in the custom socketdecrypted = (src & 0x11) | ((src & 0xE0) >> 4) | ((src & 0x0E) << 4) bit 7 6 5 4 3 2 1 0 from 3 2 1 4 7 6 5 0 (bits 0 and 4 stay put)Ordinary data reads pass through untouched. The permutation is its own inverse, so the same wiring works in both directions — which is exactly why a bootlegger can replace a custom LSI with a handful of TTL.
A small green daughter board plugs into the 48-pin custom socket at 10M. The photograph of
this board shows, unmistakably, a DMPAL16L8NC (National, date code 8835), an
SN74LS367AN (TI, Portugal 8522) and a third 20-pin device above them — the 74LS244.
That is exactly what MAME records for commandob: “a 16L8A PAL (with a 74LS244P
and a 74LS367AP) on a tiny sub-board… plugged on what seems to be a ROM socket.”
The program ROM beside it is a single AM27256DC, so this board needed no ROM tricks.
The PAL was dumped on the sibling set-2 board and the fuse map decodes to something surprising:
every data output is simply its own input (D1'=D1, D2'=D2…).
The PAL is a plain tri-state buffer — it does not do the swap. The scramble lives in the
wiring of the second buffer, and the PAL only decides which of the two may drive the CPU
bus:
OE(D1',D2',D3',D5',D6',D7') = P8 * P9 * P11 Dn' = Dn /OE of the cross-wired buffer = /( P4*P9*( /P8 + /P11 ) )
| Cycle | Who drives the CPU bus | Result |
|---|---|---|
| Normal data read | PAL outputs enabled | byte passes through unchanged |
| Opcode fetch | PAL tri-stated, '367 enabled | cross-wiring swaps the bit groups |
| Write | '244 enabled | CPU data out to memory |
The '367 is a hex buffer — six channels, exactly the six bits that move. Because it
only goes one way, a separate 74LS244 carries the CPU→memory write direction. Bits
D0 and D4 are hard-wired straight across, matching the src & 0x11 term
that leaves those two alone.
MAME runs this set through init_spaceinv — decrypt everything, including the
very first opcode fetch — so its ROM stores byte 0 pre-encrypted:
| Board | byte 0 stored | CPU executes |
|---|---|---|
| Capcom original | 3E raw | 3E = LD A,n |
| this board | F2 encrypted | F2 → 3E |
That byte is the fingerprint of an always-on decryptor, and it is how this board was identified:
the ROM burned during its repair is byte-identical to MAME's
commandob_04_9m_27256.bin (CRC 348A7654), which differs from the original
cm04.9m in exactly that one byte. The
clean board goes the other way.
photographed The riser and its three chips, on this board.
measured PAL equations decoded from commandob2_pal16l8.bin
(CRC BDBCAF02) — the sibling set-2 device; this board's own PAL is not dumped in MAME.
documented The riser parts list, from commando.cpp.
deduced The cross-wiring, and the split of roles between '367 and '244
— forced by the logic (the PAL path is straight, the '367 has exactly six channels, and
something must carry writes), but not traced pin by pin.
Web/gen_variants.py