Hello from Brazil, I thought it was amazing what you did, I've been researching how to create games for SNES for a long time, without success, I read the other comments and understood how it works, only one thing that wasn't clear to me is how much and the maximum size a ROM can be, I know it can vary depending on the cartridge hardware. could you help me with this please
Keeping SNES Alive!
This game was created for the Ludum Dare 46 game jam event on the theme "Keep It Alive." For me, making new games for retro consoles is the best way to keep them alive! So, for this Ludum Dare, I choose to create a brand new game for my favorite console: the Super Nintendo (SNES). You can play the game above through an online emulator. Of course you can also download the ROM file to play it with any SNES emulator you want, and even on a real console if you have a Flash Cart at home!
The game itself is quite simple: 4 SNES are laying around, with only 1 cartridge of a homebrew SNES game for them to play with (the game is Yo-Yo Shuriken, a SNES game I made in 2019 that was released on cartridge like the old days). Using any button you can make the cartridge "jump" so you can move from one console to another. Be careful not to miss the cartridge slot, else it's a game over. And don't let any SNES without a game play session for too long either, or it's a game over too!
The game was programmed in C using the wonderful PVSNESlib by Alekmaul.
The music was composed by XRACECAR. The track is titled "7049 Bytes of Memories" and is used under a Creative Commons CC-BY-NS-SA license:
A fun fact about the audio: the "shlack" sound that you hear when the cartridge enters a console is an actual recording of the noise made by my SNES power button (recorded directly from my childhood console, still alive and kicking after 30 years!)
Besides music and a couple of sound effects coming from my previous games, all the others parts of this game where created by me from scratch during the event! All in all, I spent about 10 hours in total making the game (I wish I could have more time, but real life isn't always as you hoped ;)).
Last but not the least, the full source code is included. I spent about 2 additional hours cleaning up and commenting the code, as I hope it'll help and motivate you to start making new SNES games too!
Click download now to get access to the following files:
Log in with itch.io to leave a comment.
I never tried to do large SNES games (for now), but from what I've read the maximum "standard" size for games is 4MB (32 Mbits): https://problemkaputt.de/fullsnes.htm#snescartridges
But by using special chips inside the cartridge, you can go way larger: the two largest SNES games from the commercial era (Star Ocean and Tales of Phantasia) where 6MB (48 Mbits) each. And nowadays, using the SD2SNES / FXPAKPRO Flashcart with the MSU-1 mapper, you can go up to 4GB in size: http://nerdlypleasures.blogspot.com/2018/01/sd2snes-and-msu-1.html
But honestly, with the way the SNES stores audio and graphics data (very efficient formats = small sizes), 4MB is quite a large amount of space to make cool SNES games :)
Fun Fact: Retroarch actually uses this game in the web version as a Pre-Loaded Game!
hey, how did yo learn how to code this?
He has a good article about SNES development : https://www.patreon.com/posts/article-making-37640075
There is info about other projects/platforms too :)
Well, it's entertaining for some plays but i think this was made more for the message than the game, an the message is good.
I have 2 questions:
1. Is it possible to use this ROM on a modded SNES classic?
2. Do you have any tips for developing SNES games? I have been interested in doing so but can't figure out where to start.
Hi, yes, this is possible to use this ROM on a SNES classic, or any other SNES emulator!
Regarding SNES development, the "easiest" way is to make it in C. You won't have as much power/control as programming in pure assembly, but it is still possible to make fun games (both Yo-Yo Shuriken and Keeping SNES alive were programmed 100% in C). I recommend you to use PVSNESlib, that is a framework that gather everything to get you started: C compiler, tools to convert images and sound in SNES formats, etc. The SNES is a quite complex beast (for a 16 bit console), with several display mode, some oddities in how sprites are handled, etc. You can start making a simple game by tweaking stuff, but eventually you'll have to read some technical doc about how the console works :).
Anyway, to get you started, here is a link to download and install PVSNESlib: https://github.com/alekmaul/pvsneslib
I recommend you to read the wiki first on how to set the whole thing up: https://github.com/alekmaul/pvsneslib/wiki If you're already familiar with makefile and c compilers like gcc, this should be quite straightforward.
Then you can read the examples in the lib, or you can read the source code of my game Keeping SNES alive to see how to make a simple game. My game is simple but it does cover all the basics: two layers of BG in mode 1, 16x16 and 32x32 sprites, music and sound effects, VRAM transfer constraints, input, etc. I did a lot of comments in the code to explain what each line does.
Although making a SNES game in C is still quite a challenge (compared to C development on NES or Genesis for example), this is a way easier route than going straight to assembler IMHO.
Regarding docs, besides PVSNESlib wiki, I'll recommend:
-The NoCash SNES specs (technical, but thorough) https://problemkaputt.de/fullsnes.htm
-The SNESdev section of the NESdev forum: https://forums.nesdev.com/viewforum.php?f=12 The community is very helpful and skilled. They saved my life more than once when I was making my first SNES game :)
And feel free to ask me if you need any help!
I'm looking forward your fist SNES game! :)
Thanks so much for the advice! Are there any special restrictions that need to be followed when developing for SNES?
Well, there are a lot of restrictions, but unlike other consoles the SNES has several display modes and is able to switch them during display (thanks to the HDMA feature). So graphical restrictions can vary a lot. But I'll try to give you a rough picture:
- For backgrounds, the most common display mode, Mode 1, has 3 active layers. Two layers can hold a 16 colors image each, while the third one is limited to 4 colors only. There are additional modes that display a single layer of 256 colors, or 4 layers of 4 colors each.
- And of course, there is the famous "Mode 7" that can display a single 256 color image that can be rotated and scaled freely. This allow you to make rotating backgrounds like in Super Metroid or Castlevania IV. For 3D effect like in F-Zero or Super Mario Kart, you'll need to use the HDMA feature in addition to mode 7, so that's quite an advanced topic :). I haven't toyed with mode 7 yet, but I hope to be able to use it in a project someday!
- For sprites, the SNES can display up to 128 sprites on screen (a huge number!). Each sprite can be either of "small size" or "large size". Like the display modes, you can choose what numbers of pixels "small" and "large" actually refer to, from the following size: 8x8, 16x16, 32x32 and 64x64. For example, in Yo-Yo Shuriken I used 16x16 sprites for "small" (player and enemies) and 32x32 for "large" (the explosions). The larger your sprite are, the more VRAM they'll take, and of course the total amount of VRAM is limited :)
- I don't remember the exact number, but IIRC the SNES can only display 320 pixels on a single line, meaning that you can have about 20 sprites of 16x16px on a single line (compared to the NES who can only display 4 sprites of 16x16px, this is huge)
- Regarding colors, the SNES have 8 palettes of 16 colors for backgrounds, and 8 palettes of 16 colors for sprites. This is why SNES graphics are so colorful :).
- Regarding audio, the SNES is very powerful for it's release date, and can play sample based music (i.e. tracker music). But you need to fit all the samples and sound effects in the limited RAM space (honestly, there is quite a lot of Sound RAM available, but this is the main limit for audio). Also, you have 8 audio channels available - so if you use 2 channels for Sound Effects, your music can only have 6 channels (that is already quite good IMHO).
- To summarize, compared to 8 bit consoles, the SNES is much less restricted in graphics and audio. Honestly, the main thing you'll fight with, especially when developing in C, is the total amount of CPU power available. The SNES can display loads of sprites on screen, but it will have an hard time to check collision for all of them in a single frame for example.
Thanks for the clarification. One last question: Is there a size limit for ROMs that the SNES can run? I'm sure there is a limit for cartridges but if you are running the game with an emulator, is there a limit to how big the game can be?
Yes, but there are fairly large compared to 8-bit console. The largest commercial games where 6 megabytes (48mbit), so that quite a lot of data as the SNES graphics and audio data don't take that much space!
And if you really need more space, I think you can have mapper chips or cartridge mapping configurations that allow you to go beyond this limit. Although I haven't looked into that to be honest - for now the standard size fits my SNES projects ;)).
I didn't even know you could still make games for the SNES!
this is a very exciting prospect - and I agree, making new games for old consoles is the best way to keep them alive!
thank you so much for making this, and thereby giving me the opportunity to learn about this.
maybe someday I'll be a good enough programmer to make a SNES game myself.
Nice one - it's really challenging too! 🤓👍