James Pond 2: Codename RoboCod (Amiga CD32, 1993) — measurements of the pressed disc: what is on it, how much of it is nothing, and the code that reproduces every figure.
No porting, no reverse-engineering toward a re-release, no assets. This is a description of one CD and the commands that produced it.
→ Start at docs/00-predictions.md, which was written before the volume was walked, and docs/13-prediction-scoring.md, which scores it. The wrong predictions are left in place with the measurement above them; they are the most useful pages here.
The platform-level findings — the ones that belong to the format rather than to this title — go to the shared checklist, cd32-platformnotes-doc, which this disc is the nineteenth entry in.
A 1991 two-floppy Amiga platform game, converted for AGA and the CD32 in 1993, pressed onto a disc where the game is 1.47 % of the file bytes.
python tools/budget.py
data track 100125 sectors 57.97 % of the disc 30.07 % of a CD
track 2 pregap 150 sectors 0.09 % of the disc
audio 2..8 72450 sectors 41.95 % of the disc 21.76 % of a CD
TOTAL 172725 sectors 51.87 % of a 333,000-sector CD
system area + descriptors + path tables + .TM + root 23 0.023 %
the hole, LBA 23..65558, all zero 65536 65.552 %
directory extents (6 directories) 8 0.008 %
file extents (135 files) 34376 34.385 %
trailing run, all zero 32 0.032 %
SUM 99975 100.000 % -> exact
Nine things this disc produced.
1. A hole of exactly 128.000000 MiB. 65,536 sectors — 2^16 — of verified zero, in front of the files, 65.55 % of the declared volume. It is the third round hole in this set after Myth's 50.000000 MiB and Gunship 2000's 100 MiB, and there has never been a ragged one. Add the 8.02 MiB of zero padding inside the CDXL chunks, the 32-sector trailing run and the 150-sector overrun and 69.74 % of the 195 MiB data track is zero.
2. And the hole is not why the data track is big. The prediction file ranked four hypotheses for a 195.6 MiB data track under a two-floppy platformer — a hole, video, audio-in-the-data-track, or a genuinely large game — and treated them as alternatives. Two of them are true at once: 65.55 % hole and 93.90 % of the file bytes are CDXL video, 65,976,124 bytes in three streams holding 2,631 frames. No disc in this set had previously been both.
3. Cartoon, FI5H, RoboCod — the disc is a three-way menu and the game is
one option. The boot script is a shell-level main loop: Lab select /
RoboSelect / three if blocks on an environment variable / Skip select BACK, forever. One branch plays a 2 m 43 s cartoon (Main.cdxl, 2,038
frames), one opens a three-language electronic book, one starts the game.
4. A three-language manual with no characters in it. 115 IFF ILBM pages,
320 × 200 × 8 planes, ByteRun1, in English, French and German — 7.36 MB of
raster reduced to 2.98 MB — and a prose census over the whole disc of 10,875
bytes. All 115 pages share one byte-identical palette; exactly one page
is byte-identical across the three languages and it is the largest and
inkiest, i.e. the one illustration with no text. 17 pages carry a Deluxe Paint
DPPS chunk — ten English, seven French, zero German, a build split from a
chunk nobody reads. Page 1 says the book is called FI5H FILE.
5. All seven Red Book tracks are reachable, from a table, with the TOC never
read. RoboCod issues exactly three CD commands — CD_PLAYTRACK (37) and
CD_PAUSE (40) twice, pause and resume — and no CD_INFO, CD_TOCMSF,
CD_TOCLSN or CD_GETNUMTRACKS anywhere. The track number comes from byte
11 of an 86-record, 12-byte-per-level table, where bit 7 of the music id
chooses Red Book or Paula; every one of the 86 chooses Red Book, and tracks 3
to 8 are used 15 / 14 / 19 / 9 / 24 / 5 times, with track 2 from a constant in
the front end.
6. A programmer's apology, and the copper list agrees with it to the bit. A
469-byte unreachable message in the game executable reads "I'm sorry that
RoboCod hasn't got more colours but if I'd have gone to 8 planes it'd have been
so slow… I'm not stupid enough to leave debug symbols in". The one stored
copper list has BPLCON0 = $5201 — five bitplanes, 32 colours — and the
hunk chain has no HUNK_SYMBOL and no HUNK_DEBUG. Both claims true. And
the same list writes the 32 colour registers twice, with BPLCON3 LOCT
toggled between the passes, so the palette is 24-bit: 32 simultaneous
colours out of 16.7 million.
7. The boot script is a signed development diary, and its dates check out.
S/Startup-Sequence is 3,922 bytes of which twenty-one are the launcher.
The rest is a comment by Dean Ashton — who is also the name in the ISO 9660
data-preparer field, the sixth individual there in nineteen discs. Three of
its claims are testable and all three pass: it says the script was written at
1:30am on 14.07.93 and four files are stamped 00:03 to 01:18 that morning; it
says "it's now Sunday 15th August 1993, at 10:05am" and 15 August 1993 was a
Sunday with three directories rebuilt 36 to 45 minutes later; it says "Friday
13th was so bad for us" about converting animation, and 13 August 1993 was a
Friday with Intro.cdxl stamped 21:33 that evening. It also names the tools
that touched the disc and appear nowhere else on it — 16-bit TARGA captures
with the red and blue cables swapped, an ARexx script written to fix them, an
A3000 that died, a flaky NEC drive on an A4000/040 — and carries a 22-line
credit list, five entries longer than the game's own.
8. Nothing is packed, and there is a mechanism. Zero occurrences of thirteen
cruncher magics across all 205,056,000 bytes; no file whose first longword is
its own size; one file of 135 above 6.7 entropy with an innocent explanation.
The reason is in the hunk table: all three of RoboCod's hunks are CHIP,
1,185,496 bytes of a 2 MB budget, so there is no room for a decrunch buffer.
9. The size band's floor moves for the second time in two discs. The game is 1,033,508 bytes on disc and 1,258,076 resident — 18.1 % and 23.1 % below Alfred Chicken's, which had just broken a floor that stood for seventeen discs. Both times the disc that moved it was a platform game whose content lives somewhere other than the data track. The ceiling has never moved.
And Akiko is untouched: zero $B80000 pointer loads across all eight
address registers, zero C2P-port references, and 122 C2P merge constants as
data against zero as immediates. Nineteen discs, and the chunky-to-planar
port has now been zero on every one of them; this disc reaches the drive
through cd.device and the CD32's save EEPROM through nonvolatile.library,
so even the two non-graphics uses of the chip go through Commodore's own
layers.
CATALOG 0000000000000
TRACK 01 MODE1/2048 205,056,000 bytes = 100,125 sectors exactly
TRACK 02 AUDIO PREGAP 00:02:00 3:00.00 180.000000 s
TRACK 03 AUDIO 3:50.00 230.000000 s
TRACK 04 AUDIO 2:13.49 133.493333 s
TRACK 05 AUDIO 2:37.84 157.840000 s
TRACK 06 AUDIO 1:30.00 90.000000 s
TRACK 07 AUDIO 1:11.00 71.000000 s
TRACK 08 AUDIO 1:43.67 103.666667 s
16:06.00 966.000000 s, 72,450 sectors
volume identifier RoboCod_CD system identifier CDTV
application identifier RoboCod_CD32 publisher Millennium Interactive Ltd
data preparer Dean Ashton - ISOCD 1.04 by Pantaray, Inc. USA -
creation date 1993-08-17 10:12:55 (+0)
volume space size 99,975 sectors image 100,125 overrun 150
.TM block 2,048 bytes at LBA 21, SHA-1 c5ffcef2… — identical to sixteen
previous CD32-era discs
135 files in six directories. The whole tree:
/RoboCod 959,956 the game: 86 levels, all art, all sound, three CHIP hunks
/RoboLoader 7,048 blanks the screen and starts it
/RoboSelect 66,504 the three-way selection screen
/C/{assign,cdgsxl,EBook,FreeAnimation,SetPatch} 115,500
/CDXL/{ident,Intro,Main}.cdxl 65,976,124 93.90 % of the file bytes
/Devs/system-configuration 232
/Libs/{asl,iffparse,lowlevel,nonvolatile}.library 58,308
/Pages/ebook.{uk,fr,gr}.* 3,075,365 115 pages + 3 chapter indices
/S/Startup-Sequence 3,922 and it is the best file here
| 00-predictions.md | written before the volume was walked, never edited except to add the measurement under each |
| 01-volume-and-mastering.md | the descriptor, the preparer field and the correlation it tests, the 150-sector overrun and the pregap it equals, the sector budget, the 128 MiB hole, the .TM block |
(the .TM trademark block is in 01, not a chapter of its own) |
|
| 03-timestamps.md | one 1978 file falsified by its own $VER:, a clean ten-week build log, and a prose comment whose three dates the filesystem confirms |
| 04-boot-chain.md | the shell-level main loop, FreeAnimation in five instructions, the 68020-and-AGA requirement in nine, and the 44-line signed diary |
| 05-compression.md | thirteen magics over 205 MB returning zero, the two magic-free tells returning zero, and the chip-RAM budget that explains why |
| 06-graphics.md | the apology and the copper list that confirms it, five planes with a 24-bit LOCT palette, the AGA gate, the Blitter's three questions, C2P at zero |
| 07-cdxl.md | three streams, 2,631 chunks, a header whose audioSize field disagrees with its chunk size by 3,324 bytes and a scan that settles which is right; HAM6 identified from arithmetic; a closed-loop audio resampler in an interrupt handler |
| 08-audio.md | seven tracks measured from the payloads, four cut to whole seconds and three not, and the 86-entry table that makes every one of them reachable without reading the TOC |
| 09-text-and-the-ebook.md | a sixth string model: a complete three-language manual containing no characters, measured in pixels — and the one render that answers what measurement cannot |
| 10-code-and-engine.md | one file, three CHIP hunks, 69 library calls, two interrupt servers, 16 jump tables, and the level table read column by column |
| 11-size-band.md | the floor moves from 1.26 MB to 1.03 MB, and what the band was really measuring |
| 12-open-questions.md | ten open, two answered mid-session by rendering one page |
| 13-prediction-scoring.md | four hits, three misses, two mixed — and the misses are worth more |
| 14-tools.md | what each tool measures, the fourteen scans that returned nothing, and why one tool's output is deliberately not committed |
| 15-leftovers.md | 69.74 % zero, three hidden messages, and what to do next in order |
Put the eight track files and the cue sheet in the repository root — they are not committed — and run:
mkdir -p extract notes
python tools/pvd.py "James Pond 2 - Robocod (1993)(Millennium)(Track 1 of 8)[!].iso"
python tools/isodump.py "James Pond 2 - Robocod (1993)(Millennium)(Track 1 of 8)[!].iso" \
--extract extract --json notes/iso.json
python tools/budget.py
python tools/census.py extract
python tools/audiotracks.py .
python tools/cdxl.py extract/CDXL/*.cdxl --scan
python tools/pages.py extract/Pages
python tools/leveltable.py extract/RoboCod
Plain Python 3, no dependencies except Capstone for tools/dis68k.py and
Pillow for tools/render.py. The stored output of every one of those runs is
in notes/, so each number in the documents can be checked before the image is
even opened.
What is not in this repository: the disc image, the audio tracks, any extracted file, any decoded picture, and any executable. Only measurements and the code that makes them.
Hunk offsets, not file offsets. Every address quoted for RoboCod in the
form $xxxx is an offset into hunk 0, which begins at file offset 40
(a three-hunk header with no resident list). tools/dis68k.py is invoked with
--base 0x28 so its listing column is the file offset; the constants inside
the code are hunk offsets. EBook's hunk 0 begins at file offset 72.
Mixing the two is the largest source of silent error on this format.
Capstone's M68K backend prints wrong-but-plausible immediates on 68020 code. The raw byte column is the authority, and every constant quoted in these documents was re-read from it.