This repository holds a commented disassembly of Frogger for MSX (Konami, 1983, cartridge RC-704). Everything here is generated from the binary and can be reproduced from it.
Put the ROM in the root as frogger.rom. It is 8192 bytes exactly:
sha256 0d60ff78e1ab466bce6e888193ca62d6df71fa07344c8ea31f7a8b486323c5f5
make comprueba checks it for you.
make # trace, listing, reassembly, checks and tests
make listado # rebuild src/frogger.asm from the notes
make verify # reassemble and compare against the ROM, byte for byte
make sanity # nothing declared as data may come out as code,
# and not one byte may be left unassigned
make test # the test suite
make imagenes # rebuild the pictures from the ROM
make web # rebuild this site
src/frogger.entries | the entry points, each with its justification |
src/frogger.nocode | the four tables the tracer must not read as code |
src/frogger.notes | the only file edited by hand: every annotation |
src/frogger.asm | the listing, generated by tools/mkasm.py |
tools/ | the tracer, the listing generator and the measuring tools |
tests/ | 23 checks over the listing and the notes |
docs/ | this site |
Annotations are anchored to an address, so they survive a retrace. The directives follow theNestruo's conventions:
L | a label and what the routine does |
C | a comment on that one line |
B | a block header before that address |
D | a range of data, with a name and an explanation |
F | how wide the rows of a data block are |
The tracer follows the real flow from the entry points. Whatever cannot be worked out statically — the interrupt hook, the four tables embedded behind a call — is declared by hand in the .entries file, each with the reason written next to it.
Nothing here is a guess dressed up as a fact. Where something is not known, it is in Open questions and it says so.
make verify reassembles the listing and compares the result against the original ROM. It has to come out identical, byte for byte. make sanity then checks what reassembly cannot catch: that no range declared as data is being read as code, and that not one of the 8192 bytes is left unassigned.