aboutsummaryrefslogtreecommitdiff
This is my attempt at reverse-engineering Epyx's Jumpman Junior cartridge
for the Atari 800/XL/XE computers.

The end result of this will be fully commented & documented source code
for the game. I'm about 2/3 of the way there now, I think.

The source is in the file "jumpmanjr.dasm" [1]. It's generated by da65 [2],
and it can be assembled with ca65. At some point, when I've finished
mapping out the entire ROM, I'll be editing the source to make it more
human-readable, but for now da65's output will do.

If you just want to read the code, jumpmanjr.dasm and a text editor is all
you need... or, a web browser pointed at:

http://urchlay.naptime.net/repos/jumpmanjr/plain/jumpmanjr.html

There are also a few text files with notes about the various data tables
in the games, which will eventually become comments in the code, once
I stop needing to use da65.

There's also a cheats.txt that will explain how to use the atari800
debugger to give infinite lives, warp to a different level, etc. This
is useful for reverse-engineering the game, but it might also be fun
just to mess with...

If you want to modify the code or help me document it, see the
Makefile. You'll need:

- cc65, the 6502 cross-compiler suite. I use a git version from December
  30 2015, but other versions should work fine.

- a 'make' utility. I use GNU make, but BSD make should work fine as I
  don't use any of the GNU extensions.

- perl. I use v5.22.2, but any recent 5.x should work.

- A UNIX-ish environment (at least sh, echo, cp, mv, cat, true, and
  sed). Linux is what I use, but there's no reason you couldn't use BSD,
  OSX, Cygwin, etc.

- If you want to assemble your own (possibly) modified Jumpman Junior
  ROM, you'll need a way to run it. I use the Atari800 emulator. Other
  possibilities would be Atari++, Altirra (Windows or Wine only),
  MAME/MESS, or running on a real Atari via some sort of flash cartridge
  (or an old-school EPROM). If you're going to be modifying the ROM
  or helping me document it, you'll want an emulator with a debugger.

- If you want to regenerate the HTML version of the source, you'll need
  a recent version of vim and some patience (it takes over a minute to
  generate, on my system). Also if you want the background to be black
  like the jumpmanjr.html in the source, you'll have to edit 2html.vim...

Most of the above should be available as distro packages for any flavour
of Linux, with the possible exception of cc65 (which you can compile
easily enough).

If you come up with anything that should be added to the project, send
me your patch (preferably made with "git diff") to yalhcru@gmail.com. No,
I don't have a github/bitbucket/whatever account, email is fine.

The workflow I use is basically this:

1. Load main.info, mklevelinfo.pl, and jumpmanjr.dasm in a text editor.

2. Eyeball jumpmanjr.dasm, cogitate, and figure out what some bit of code
   actually does. This may also involve running the game in the
   emulator (via 'make test') and pressing F8 to get to the debugger [3],
   and dumping/changing memory, etc.

3. Edit & save main.info and/or mklevelinfo.pl. There's no point in
   editing jumpmanjr.dasm itself, it's a generated file and any
   changes would be overwritten.

4. Run 'make' (this is bound to the F9 key in my .vimrc), to regenerate
   jumpmanjr.dasm with your new labels/comments/etc. Reload jumpmanjr.dasm
   in your editor buffer, if you need to (depends on the editor).

5. GOTO 2

Also, another useful thing: in step 2 above, it's useful to try changing
parts of the code (or data tables) to see what effect it has on the game.
The way I do this:

1. Run 'make', which creates jumpmanjr.dasm and also copies it to
   jmjtest.dasm.

2. Edit jmjtest.dasm as desired. Be careful: running 'make' (or 'make
   all') again will overwrite your modified jmjtest.dasm with a copy of
   jumpmanjr.dasm...  but it'll rename the old one to jmjtest.dasm.bak
   first, so you can recover from a simple mistake.

3. Run 'make test', which assembles jmjtest.dasm to jmjtest.bin and launches
   it in the emulator [3]. If you've modified jmjtest.dasm, you can ignore the
   'Binary FAILS to reassemble correctly' message (since you already know
   your modified one isn't going to match the canonical one).

4. Play with it, see what happens. If you discover something useful, add
   it to main.info and/or mklevelinfo.pl.

Official XKCD comic of this project: https://xkcd.com/1349/

Notes:

[1] If you're wondering about the .dasm filename extension: ca65's standard
    extension for asm source is .s, which is also used for x86 and x86_64
    asm. I use vim, and its syntax highlighting for .s is terrible for
    ca65's syntax... so I wrote a 6502-specific syntax definition. Back
    when I did that, I used Matt Dillon's DASM (hence the .dasm)... but
    the syntax mode works fine for ca65 also, and ca65 doesn't care about
    the filename of its input (cl65 does care, but I'm not using it for this
    project). You can think of .dasm as being short for "disassembly" if you
    like.

[2] da65 is a very powerful and flexible disassembler, but has some
    limitations that make it impossible to just use its output as the
    final product. For one thing, no multi-line comments. Also, no comments
    without a label... and comments always precede the line they're a
    comment for (no way to place them in the right margin like usual 6502
    assembly style). And for this project, you'll notice a lot of labels
    with names like "foo_minus_one", because the Jumpman Junior author used
    1-based indexing (with DEX, BNE to check for loop exit), meaning instead
    of writing "LDA foo,X", he would have written "LDA foo-1,X" and
    initialized X to the actual table size instead of the size minus one.
    I can't find a way to make da65 produce negative label offsets...

[3] You can use labels from the source code in the atari800 debugger, if
    you enter "load labels jmjtest.lbl" at the debugger prompt. The
    Makefile will print this for your copy/pasting convenience, but I
    don't see a way to have atari800 automatically do this (short of
    modifying atari800, which is a project for another day).