# Super Mario Bros. 2, Discombobulated
[![Logo](tools/logo.png "Logo")](https://xkeeper0.github.io/smb2)\
A disassembly of Super Mario Bros. 2.

This project is intended to fully disassemble, comment, and understand
everything about the game *Super Mario Bros. 2* on the NES. In addition to the
disassembly, there is also [documentation about the game's formats](https://xkeeper0.github.io/smb2),
though those are more of a work in progress than the disassembly.

As an added bonus, a fully understood disassembly will also make modifying and
changing the game easier!

----

## Building

This is designed for use with [asm6f](https://github.com/freem/asm6f/).
For your convenience, binaries of that have been included. (Windows/Linux)

[![Build Status](https://travis-ci.com/Xkeeper0/smb2.svg?branch=asm6)](https://travis-ci.com/Xkeeper0/smb2)

### Windows
Open a command prompt window and run:

    build           (builds PRG0)
    build -dREV_A   (builds PRG1)
    build -dSM_USA  (builds Super Mario USA)

This will build the ROM from the assembly, and print any errors in the process.
It will then output the SHA-256 hashes of PRG0 and PRG1, as well as the SHA-256
hash of the assembled ROM, useful if you intend to keep a one-to-one build.

### Linux, etc
A version of `asm6f` built under Ubuntu has been included under `tools/`.
To build, run the following command:

	./build.sh           (builds PRG0)
	./build.sh -dREV_A   (builds PRG1)
	./build.sh -dSM_USA  (builds Super Mario USA)
	./build.sh test      (builds both PRG0 and PRG1, verifying they match)

The build script will also display a message if the built ROM's SHA-256 hash
matches either PRG0 or PRG1.

### Output
The build process will generate a few files:

* `bin/smb2.nes`, your assembled ROM.
* `bin/smb2.lst`, the assembler listing. Use this to see how the code assembled.
* `bin/assembler.txt`, the log from the assembler
* `bin/smb2.*.nl`, name-listing files for FCEUX's debugger.
* Some other cruft, probably. welp

**By default, the build script will create a byte-for-byte copy of the game**,
matching these two SHA-256 hashes:

* PRG0: `47ba60fad332fdea5ae44b7979fe1ee78de1d316ee027fea2ad5fe3c0d86f25a`
* PRG1: `6ca47e9da206914730895e45fef4f7393e59772c1c80e9b9befc1a01d7ecf724`

You can edit `config.asm` to change some build options; see that file for details.

## Assembly
The "source" lives in the `src` directory:

* `prg-x-x.asm` are the program banks. They are grouped in pairs, as that is how
  SMB2 loads them. If you want to change this, you will need to split them apart again.
* `defs.asm` defines various enums and identifiers.
* `ram.asm` contains labels and definitions for RAM addresses.
* `extras/` contains some additional fun things (see `config.asm`).
* `levels/` contains level and enemy data.
* `music/` contains music and sound data.
* This list is growing as we split the disassembly into smaller parts.


## Contributing
* Fork the repository.
* Make changes.
* Submit a pull request!
* You are also encouraged to visit the [Discord server](https://discord.gg/TsWMMeV)
  if you have any questions.


## See Also
* [Data Crystal's SMB2 page](http://datacrystal.romhacking.net/wiki/Super_Mario_Bros._2)
* [CaptainSouthbird's SMB3 disassembly](https://github.com/Drakim/smb3) and [Drakim's asm6f version](https://github.com/Drakim/smb3)
* [Our Discord server](https://discord.gg/TsWMMeV)
