Bare-metal InfoNES port for Raspberry Pi Zero / 1A+ (ARM1176 / BCM2835). It targets the CS140e
firmware/bootloader workflow, but it is not required: a direct SD-boot kernel.img is published as a
release artifact.
Requirements:
arm-none-eabi-gcc/arm-none-eabi-g++- CMake 3.27+
- Python 3 (for the UART gamepad helper)
Build:
cmake -B build -S .
cmake --build build -jArtifacts:
build/rpi_infones.elfbuild/rpi_infones.bin(raw binary for SD boot or pi-install)
Format the SD card as FAT32 and copy the Raspberry Pi boot firmware files to the SD root:
bootcode.binstart.elffixup.datconfig.txtkernel.img(either the staff bootloader, or this project’s binary)
config.txt should include:
kernel_address=0x8000enable_uart=1gpu_mem=64
Create a saves directory (SRAM writes go here):
/SAVES
ROMs:
- Place
.nesfiles anywhere on the SD card (menu starts at/). - Optional:
/Metadata/...can hold cover art (menu will look for it if present).
If you grabbed the release artifact, just copy the provided kernel.img to the SD root.
Copy the raw binary to the SD root as kernel.img:
cp build/rpi_infones.bin /Volumes/<SDCARD>/kernel.img
syncThen power the Pi. The GPU boot ROM loads kernel.img to 0x8000 and jumps to it, which matches this
project’s linker script (platform/memmap.ld).
Keep the staff kernel.img on the SD card and use the class pi-install tool to send the binary:
pi-install build/rpi_infones.binAfter the program starts, exit the UART bootloader on the host side before running the gamepad helper.
UART “gamepad” is supported. See:
UART_NES_Controller.md
Run the helper after the emulator starts:
./uart_nes_controller.py- Audio synthesis is enabled in the core, but there is no I2S backend wired up yet.
- A direct SD-boot
kernel.imgis available as a release artifact.