A byte-level study of the 277,214-byte ZIP that holds Mega Man 3 for MS-DOS: the container read as an object before it was opened, the twelve-bit LZW every file in the game goes through, four undocumented formats, and the 1,855 bytes this program shares with the same studio's 1990 Mega Man.
Nothing here is emulation, patching or preservation advocacy. It is measurement: every number carries the command that reproduces it, the predictions were written before the archive was extracted and are scored whether they won or lost, and the formats are described in the docstrings of the tools that read them.
It is also the first object in this collection with a sibling already measured
to the byte, and that changes what a chapter is for. Three open questions from
pc-megaman-doc are closed here,
one of its tools is corrected here, and the one inference this document put
above all the others fell — because the two games' menu is byte-identical and
their pixel format is not.
| title | Mega Man 3: The Robots are Revolting — there is no Mega Man 2 for PC |
| platform | MS-DOS, CGA / EGA / Tandy, 320 × 200, sixteen colours. No VGA: the 1990 game offered it and this one dropped it |
| year | 1992 — 64 of 64 files dated 18 July to 2 August 1992, and © 1992 CAPCOM drawn in pixels on the title screen |
| licensor | Capcom, on LOGO.STA and in the credits, as pixels |
| developer | Rozner Labs — A / ROZNER / LABS / PRODUCTION on ROZLABS.STA, as pixels |
| publisher | Hi Tech Expressions — its logo and PRESENTS on HITECHLO.STA, as pixels |
| credited | Stephen Rozner (design, programming, sound) and William Rozner (graphics). In 1990 one name did all four jobs |
| the container | 65 ZIP records, 65 CRC-32s verified, 0 header disagreements, 0 extra fields — and a central directory a 2008 sort re-ordered |
| the folder | 64 files, 392,593 bytes, 64 distinct SHA-1s |
| the executable | 36,114 bytes, EXEPACK'd short-header; unpacks to 55,456 of which 40.8 % is zero. One segment, 24 relocations |
| the rest of the code | there is none. The 1990 game shipped 71 % of its code in five per-stage .BIN modules; this one has no .BIN family |
| the codec | twelve-bit LZW, MSB first, no clear code, dictionary frozen at 0xFFE — and it is in the executable at 0xb280, which is where the format was confirmed a second time |
| the pixel | one byte per pixel, chunky, sixteen colours. Not 1990's four EGA planes. Converted to planes once per tile at load time |
| the palette | the 1990 tables, byte for byte, sixteen bytes apart. Thirty-two bytes that did not move |
| stages | seven: FCASTLE 190 × 168, FCITY 300 × 86, FOCEAN 320 × 96, FOILRIG 188 × 98, FREFINE 196 × 99, FSEWER 315 × 78, FTANKER 235 × 104 tiles |
| objects | 366 sixteen-byte records in the .ZSC files — the enemy placement that used to be compiled code |
| bosses | six, named twice: as ASCII in the executable and as pixel plates in BOSSSCRN.VFR, in the same order |
| tile | 16 × 16 px = 256 bytes; a bank is 256 tiles + 256 records of 32 bytes + four 256-byte tables = 74,752 |
| sprites | 326 frames in 43 banks, one file per drawn object; mask byte first, every eight pixels, exactly as in 1990 |
| audio | PC speaker only. No sound file, no sound chip touched |
| shared with the 1990 game | 1,855 bytes of program, in runs of ≥ 32, including 98 bytes of the options menu and 32 of palette. The Saga cell fills |
| leftovers | 118,293 decoded bytes, costing 16,509 as shipped — 4.21 %, against 9.89 % in 1990 |
| predictions | 53 clauses written before the zip was opened; 31 hit, 13 half, 9 miss = 70.8 % |
Everything above is derived in the chapters and every figure has a command.
| 00 — the predictions | fifty-three bets placed before the archive was extracted, and the one inference four of them hung on |
| 01 — the archive | sixty-four files, one container, and a game whose number is a lie |
| 02 — the spec sheet | every number, with the command that reproduces it |
| 03 — the container | what a folder has instead of a volume descriptor, and the one field a sort destroys |
| 04 — EXEPACK | thirty-six thousand bytes that are not nine tenths air, and 627 that were in the wrong place |
| 05 — the codec and the pixel | twelve-bit LZW, one byte a pixel, and a dictionary that runs out a third of the way through |
| 06 — inside the image | a manifest that closes, a menu minus one option, and three ways to spell one name |
07 — .ZSC |
seven maps, 366 objects, and the file that replaced a compiler |
08 — .ZBL |
256 tiles, 256 records, four tables — and the answer to somebody else's open question |
09 — .VFR |
forty-three files, 326 frames, and a hit box that used to be code |
10 — .STA |
six screens, the same three letters, and everything else different |
| 11 — against 1990 | 1,855 shared bytes, and what a studio keeps when it throws everything else away |
| 12 — the clocks | fourteen days, ten runs, and twenty-one minutes where there used to be twenty-four days |
| 13 — against the collection | the same problem, solved again, by somebody who had done it once |
| 14 — open questions | eight things this document could not close, and three it closed for another one |
| 15 — the scoring | fifty-three bets, one wrong idea that cost four, and a sibling that was a trap in exactly one place |
| 16 — the tools | thirteen scripts, and one bug found by being run somewhere new |
| 17 — leftovers | 4.21 % of the object, after a draft that said 26.51 % |
| 18 — corrections | six errors in the briefing, five in this session's own work, one in a tool two repositories old |
The tools expect the archive in the current directory and write everything they
produce into _work/, which is not in this repository. No game asset, render
or extracted file is committed here — this repository is text.
python tools/zipcensus.py Mega-Man-3-The-Robots-are-Revolting_DOS_EN.zip
python tools/zipcensus.py Mega-Man-3-The-Robots-are-Revolting_DOS_EN.zip --extract _work/game
python tools/clocks.py Mega-Man-3-The-Robots-are-Revolting_DOS_EN.zip
python tools/exepack.py _work/game/Mm.exe --out _work/mm.unpacked.bin
python tools/lzw.py --all _work/game # every compressed file, decoded and checked
python tools/pixels.py _work/mm.unpacked.bin
python tools/zsc.py --all _work/game --objects
python tools/zbl.py --all _work/game --recs
python tools/vfr.py --all _work/game --mask
python tools/sta.py --all _work/game --dir _work/render
python tools/crossmatch.py _work/exe _work/exe90 --raw --min 32
python tools/leftovers.py _work/game
python tools/toolclass.py tools
python tools/checkscore.py docs/15-prediction-scoring.md
Python 3. Pillow for anything that draws; capstone for the disassembly
(which uses ../pc-megaman-doc/tools/dis16.py). The decoders, the closure
checks and the container census need neither.
One of a set of independent studies of individual game releases, indexed at
pc-gamelist-doc. Its direct
sibling is pc-megaman-doc —
same studio, same programmer, same platform, twenty-one months earlier — and the
two are the only matched pair in the collection. The nearest neighbours in
method are pc-baronbaldric-doc
and pc-tubularworlds-doc:
same branch, same shape of object — a DOS executable, proprietary extension
families, no installer.