What you need

This is what you will need to program an NES game…

1. A 6502 compiler
2. A tile editor
3. A text editor
4. A tile arranging program
5. A good NES emulator
. a music tracker
7. a test cartridge


6502 Compiler

For my examples I will exclusively work with cc65.


(Click on Windows snapshot)


I am using the neslib library (by Shiru), and my own support library. You can get both from any of my NES examples.



Tile Editor

You need a tile editor to create the graphics. I personally prefer YY-CHR. You can get it here…(this is the updated and improved version).


Here’s a link to the old version, in case you are interested.



I prefer to work first in GIMP (similar to Photoshop), convert to indexed (4 color), then copy/paste over to YY-CHR later. You should be working in the 2bpp NES format (the default), when you use YY-CHR.

Here is a link where you can download GIMP.



Text Editor

You can use any kind of text editor to write your code. I’ve been using Notepad++ myself.



I’ve heard that people are using VSCode to write their C code. You might prefer that.


Tile Arranger

To make background maps, I recommend, NES Screen Tool. It shows the NES color limitations very well, and is good for making single screen games. It also gives you nametable addresses and attribute table addresses, which comes in handy. I think I used 2.51, and if you have an older version, it won’t open the .nss files in my source code. Get it here…


NESST isn’t being updated. But there is  a new version by FrankenGraphics that has lots of new features. You could use this instead.



And, if you are making a scrolling game, I would also pick up Tiled Map Editor. I will go into more detail later, but you can make a data array out of the exported .csv files from Tiled.



NES Emulator

And, next is an NES emulator. I used to use FCEUX. It has some nice debugging tools. A newer emulator, MESEN, has become popular, so you should get that too.

FCEUX is here…


Mesen is here…


You may have to change the video display to display every pixel. I’ve seen people say “the NES is 256×224 pixels”, but that is not true. Older TVs tended to cut off a few pixels from the top/bottom of the picture, but the NES generates a full 240 pixels high. One of my TVs displays nearly the entire 240 pixels. You should assume that some users will see the entire picture, so in FCEUX go to Config/Video/Drawing Area, and set the output to the full 0 to 239.


Music Tracker

I don’t want to go into too much detail yet, but you will also need to get Famitracker for making music and/or sound effects for your game.


(update, the original link no longer works, here is a backup)



I use the famitone2 music code (by Shiru), which works well with neslib library, and is much smaller/faster than the famitracker driver. But you still need to write the songs in famitracker.



I made my own forks of famitone, to add more features and effects. Version 3 adds volume column and all notes. Version 5 has several of the pitch effects working (vibrato, portamento, etc).




Test cartridge

Playing the game in an emulator is nice, but the real test is playing on a real NES with a flash cartridge.

I have a PowerPak, but if I were buying one today, I would probably get a N8 Everdrive from krikzz (directly or from their Amazon page or from StoneAgeGamer). The PowerPak uses a compact flash card, and the N8 uses an SD card.

For the PowerPak, I needed to buy a special attachment to connect a compact flash drive to my computer, but most computers have SD card slots.



OPTIONAL… I have been writing simple python 3 scripts to process some of the data into C arrays. You don’t need to, but it might be helpful if you installed python 3, to use my tutorial files. I just use simple scripts for “automating the boring stuff”.



Next Time…

cc65 – in more detail.


Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s