SNES Development Part 1: Getting Started

This page summarizes the projects mentioned and recommended in the original post on news.ycombinator.com

Our great sponsors
  • WorkOS - The modern identity platform for B2B SaaS
  • InfluxDB - Power Real-Time Data Analytics at Scale
  • SaaSHub - Software Alternatives and Reviews
  • bass

    fork of byuu's bass assembler (by ARM9)

  • snestracker

    Super Nintendo Entertainment System Music Software. Super Famicom Music Software

    The README says "the latest version of SNES Tracker is available exclusively via Patreon a few weeks before it becomes available on github". In https://github.com/bazz1tv/snestracker/releases, v0.2.0 was released in 2020-09-29 and says "the next version, v0.2.1 is already released to Patreon!" In reality, v0.2.1 was released publicly months later on 2021-02-19, with a tasteless notice saying "Note: the next version, v0.2.2 and v0.2.3 is already released to Patreon! This includes a critical bugfix (app hanging)."

    The public Github repository you linked hasn't been updated in 11 months (v0.2.2 source and releases last updated in 2021-03-15), and v0.2.2 actually dates back to 2020-11-08 on Patreon. The Patreon (https://www.patreon.com/bazz1) was last updated in 2021-03-14 with v0.2.4, yet continues to take money for the past 11 months of silence. I've heard that he's stopped supplying builds to Patreon subscribers, and only giving them to Twitch subscribers.

    This is my first time looking at his Twitch, and wow that's a lot of livestreaming uploads. I don't know if SNES Tracker is still being developed or not, and if Twitch subscribers receive newer builds of the tracker. In any case I'm definitely not subscribing.

    I tried cloning the repo to view the current publicly released state. It has over 100 MB of files previously in history but deleted in a more recent commit, polluting non-shallow clones. I couldn't get it to build easily, so I downloaded the prebuilt Windows v0.2.2. The user interface is bare-bones and written in SDL, though I didn't poke around very deeply.

    In any case I'll consider checking on his Twitch streams, and see if he can help me, though I prefer interacting with other people who don't behave in ethically dubious ways. I've already figured out how to make the S-DSP output sound. I'm currently working on learning S-SMP/SPC700 programming, writing/picking a hardware driver, (if I write my own driver) picking efficiently-implementable behaviors while remaining musically useful, or (if I pick an existing driver) learning the driver and build system. Eventually I want a characterization of the SNES's analog frequency/phase response (DAC impulse response plus analog filtering) so I can implement it in software. I feel eliminating unneeded audio latency, and implementing aliasing-free hardware-accurate resampling/filtering, are aspects that most emulators (even accurate ones like bsnes/higan) get wildly wrong, which I can improve with effort.

  • WorkOS

    The modern identity platform for B2B SaaS. The APIs are flexible and easy-to-use, supporting authentication, user identity, and complex enterprise features like SSO and SCIM provisioning.

  • Mesen-SX

    Homebrew development oriented fork of Mesen-S - a cross-platform (Windows & Linux) SNES emulator built in C++ and C#. Deprecated; see https://github.com/SourMesen/Mesen2/

    Personally instead of Mesen-S, I'd use the fork at https://github.com/NovaSquirrel/Mesen-SX, which contains a fix for saving settings on Linux Mono 6.12 (https://github.com/NovaSquirrel/Mesen-SX/commit/c374ca8b9ed3...).

    I'm more interested in SPC700 development for SNES music. Mesen-SX has a SPC debugger separate from the main debugger, but I'm not sure if it's more or less useful than bsnes-plus (I know the Mesen emulators have a far worse Linux UI when running under Mono, and I haven't tried running the Windows Mesen under Mono or real .NET yet). I don't know enough to judge if the disassembler is better or worse than bsnes-plus though.

  • gb-wordle

    A WORDLE clone for the Nintendo Game Boy

    I really want to make a retro version of my turn based strategy game Proximity[1] (pretty simple game and I've mostly made a version in Pico-8 already, so it should be doable) for NES, GB, SNES, GBA, and/or something similar, but I'd like to do it with the least time and effort (because I really don't have a lot of time anymore).

    It seems like the new GBDK might be the easiest, especially since I recently ran into the source code[2] for a Wordle clone someone made using it that I could reference, but is there perhaps an even easier way? Most software kits assume you're moving sprites around on a screen and don't seem like a good fit for the project.

    [1]: https://www.newgrounds.com/portal/view/183428

    [2]: https://github.com/stacksmashing/gb-wordle

  • alttpo

    Contains AngelScript code for bsnes-as integration and alttp-server

    I've developed quite a few SNES-related things for fun, mostly using Go and C++, with some 65816 ASM sprinkled in.

    https://github.com/alttpo/alttpo - A Link To The Past Online. Lets multiple players see and interact with one another in the same game world and synchronize their progress through the game. Exclusive to a customized fork of the bsnes emulator which provides a scripting language and PPU-integrated drawing routines to render remote player sprites. In retrospect, I consider this a dead-end architecture; redesigned in o2 project (see below).

    https://github.com/alttpo/o2 - Second version of alttpo (see above) but this time targeted at SNES hardware console support (via SD2SNES flash cart USB feature) and does not require a customized emulator nor a scripting language. Trade-off here is a loss of the visual aspect (cannot see remote player sprites) due to tight hardware limitations in the amount of VRAM and limited SNES CPU cycles available. Work is in progress to gain back the remote sprite rendering as an optional add-on via the bsnes-plus WASM module support (see below). This project includes a 65816 machine code emitter library (pure Go) with support for named labels of branch targets. There is also a bare-bones headless SNES emulator library (pure Go) included for unit tests to verify the generated 65816 ASM and ROM patching mechanism.

    https://github.com/alttpo/bsnes-plus - A fork of bsnes-plus in development that invokes WebAssembly modules when certain general SNES events occur, e.g. `on_nmi`, `on_power`, `on_reset`, `on_frame_present`. WASM code has access to a draw-list API for drawing into the various PPU layers, e.g. extra sprites, text (with PCF font support), basic shapes. WASM code can also receive arbitrary binary messages from external applications, e.g. to update remote player positions or exchange custom sprite graphics.

  • o2

    ALttP Online 2.0 designed for console support

    I've developed quite a few SNES-related things for fun, mostly using Go and C++, with some 65816 ASM sprinkled in.

    https://github.com/alttpo/alttpo - A Link To The Past Online. Lets multiple players see and interact with one another in the same game world and synchronize their progress through the game. Exclusive to a customized fork of the bsnes emulator which provides a scripting language and PPU-integrated drawing routines to render remote player sprites. In retrospect, I consider this a dead-end architecture; redesigned in o2 project (see below).

    https://github.com/alttpo/o2 - Second version of alttpo (see above) but this time targeted at SNES hardware console support (via SD2SNES flash cart USB feature) and does not require a customized emulator nor a scripting language. Trade-off here is a loss of the visual aspect (cannot see remote player sprites) due to tight hardware limitations in the amount of VRAM and limited SNES CPU cycles available. Work is in progress to gain back the remote sprite rendering as an optional add-on via the bsnes-plus WASM module support (see below). This project includes a 65816 machine code emitter library (pure Go) with support for named labels of branch targets. There is also a bare-bones headless SNES emulator library (pure Go) included for unit tests to verify the generated 65816 ASM and ROM patching mechanism.

    https://github.com/alttpo/bsnes-plus - A fork of bsnes-plus in development that invokes WebAssembly modules when certain general SNES events occur, e.g. `on_nmi`, `on_power`, `on_reset`, `on_frame_present`. WASM code has access to a draw-list API for drawing into the various PPU layers, e.g. extra sprites, text (with PCF font support), basic shapes. WASM code can also receive arbitrary binary messages from external applications, e.g. to update remote player positions or exchange custom sprite graphics.

  • bsnes-plus-wasm

    debug-oriented fork of bsnes, with added wasm runtime for scripting

    I've developed quite a few SNES-related things for fun, mostly using Go and C++, with some 65816 ASM sprinkled in.

    https://github.com/alttpo/alttpo - A Link To The Past Online. Lets multiple players see and interact with one another in the same game world and synchronize their progress through the game. Exclusive to a customized fork of the bsnes emulator which provides a scripting language and PPU-integrated drawing routines to render remote player sprites. In retrospect, I consider this a dead-end architecture; redesigned in o2 project (see below).

    https://github.com/alttpo/o2 - Second version of alttpo (see above) but this time targeted at SNES hardware console support (via SD2SNES flash cart USB feature) and does not require a customized emulator nor a scripting language. Trade-off here is a loss of the visual aspect (cannot see remote player sprites) due to tight hardware limitations in the amount of VRAM and limited SNES CPU cycles available. Work is in progress to gain back the remote sprite rendering as an optional add-on via the bsnes-plus WASM module support (see below). This project includes a 65816 machine code emitter library (pure Go) with support for named labels of branch targets. There is also a bare-bones headless SNES emulator library (pure Go) included for unit tests to verify the generated 65816 ASM and ROM patching mechanism.

    https://github.com/alttpo/bsnes-plus - A fork of bsnes-plus in development that invokes WebAssembly modules when certain general SNES events occur, e.g. `on_nmi`, `on_power`, `on_reset`, `on_frame_present`. WASM code has access to a draw-list API for drawing into the various PPU layers, e.g. extra sprites, text (with PCF font support), basic shapes. WASM code can also receive arbitrary binary messages from external applications, e.g. to update remote player positions or exchange custom sprite graphics.

  • InfluxDB

    Power Real-Time Data Analytics at Scale. Get real-time insights from all types of time series data with InfluxDB. Ingest, query, and analyze billions of data points in real-time with unbounded cardinality.

  • iigs-game-engine

    A tile-based game engine for the Apple IIgs written in 65816 asssembly language

    And if there are people specifically interested in console-style IIgs game development, I've picked up and significantly enhanced my old graphics engine that was used for the IIgs Super Mario Bros demo.

    It's available on github at https://github.com/lscharen/iigs-game-engine

NOTE: The number of mentions on this list indicates mentions on common posts plus user suggested alternatives. Hence, a higher number means a more popular project.

Suggest a related project

Related posts