mirror of
https://github.com/BrianPugh/game-and-watch-patch.git
synced 2025-12-16 07:16:26 +01:00
52 lines
2.1 KiB
Markdown
52 lines
2.1 KiB
Markdown
Custom firmware for the Game and Watch: Super Mario Bros. console.
|
|
|
|
# What is this?
|
|
This repo contains custom code as well as a patching utility to add additional
|
|
functionality to the stock Game and Watch firmware.
|
|
|
|
# Features
|
|
* Works correctly with [retro-go](https://github.com/kbeckmann/game-and-watch-retro-go) in internal flash bank 2.
|
|
* Press button combination (`LEFT` + `A` + `GAME`) to launch retro-go from internal flash bank 2.
|
|
|
|
# Usage
|
|
Place your `internal_flash_backup.bin` and `flash_backup.bin` in the root of this
|
|
repo. To extract these from your console, see the [game and watch backup repo](https://github.com/ghidraninja/game-and-watch-backup)
|
|
|
|
Install python dependencies via:
|
|
```
|
|
pip install -r requirements.txt
|
|
```
|
|
|
|
To just build and flash, run:
|
|
```
|
|
make flash
|
|
```
|
|
|
|
# Advanced usage
|
|
Other potentially useful make targets:
|
|
|
|
```
|
|
make clean
|
|
make patch # Generates the patched bin at build/internal_flash_patched.bin, but doesn't flash
|
|
make flash_stock_int
|
|
make flash_stock_ext
|
|
make flash_patch_int
|
|
```
|
|
|
|
# TODO
|
|
* Figure out safe place in RAM to store global/static variables. The current
|
|
configuration described in the linker file is unsafe, but currently we have
|
|
no global/static variables.
|
|
* Maybe slim external flash ROM (remove easter eggs, ROMs, etc) to make room
|
|
for more homebrew.
|
|
|
|
# Development
|
|
Main stages to developing a feature:
|
|
1. Find a place to take control in the stock rom (usually function calls).
|
|
2. Add the stock function and its address to `Core/Inc/stock_firmware.h`.
|
|
3. Implement your own function, possibly in `Core/Src/main.c`. There's a good chance your custom function will call the function in (2). You will also probably have to add `-Wl,--undefined=my_custom_function` to `LDFLAGS` in the Makefile so that it doesn't get optimized out as unreachable code.
|
|
4. Add a patch definition to `patches/patches.py`.
|
|
|
|
# Journal
|
|
This is my first time ever developing patches for a closed source binary. [I documented my journey in hopes that it helps other people](docs/journal.md). If you have any recommendations, tips, tricks, or anything like that, please leave a github issue and I'll update the documentation!
|