Skip to content

Latest commit

 

History

2 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Mega Man 3: The Robots are Revolting — PC/DOS, 1992

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.


The short card

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 LabsA / 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.


The chapters

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

Running the tools

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.


What this is part of

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.

About

Byte-level study of Mega Man 3: The Robots are Revolting (PC/DOS, 1992, Rozner Labs / Hi Tech Expressions): the ZIP read as an object, twelve-bit LZW, one byte per pixel, four undocumented formats, and the 1,855 bytes it shares with the same studio's 1990 Mega Man. 19 chapters, 13 tools, every figure with its command.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages