NES Advantage

Making NES Development Less Hard

About NES Advantage

How It Started

When I built my first NES game, I kept wishing there were a single repository of answers to the most commonly asked questions NES devs run into once they take those first steps beyond whichever intro tutorial they chose. What's the purpose of the header and interrupts that I copied into my code? What do I do when there are too many sprites on a scanline? How do I switch CHR ROM banks to fit more graphics on a cart?

There's an ever-growing number of books and tutorials about NES programming, but they tend to be aimed at beginning developers. That means they cover a lot of the same ground. Sometimes this is a good thing, since one tutorial might clarify what another explains poorly, but one can only read about hexadecimal counting or the STA opcode so many times.

Meanwhile, the collected wisdom of forty years of programming for the Famicom/NES is out there... but it lies scattered across the wilds of the internet. And not every tutorial, forum answer, or wiki entry is written clearly and cogently.

So as I hunted down answers, uncovered opinions and alternatives and (maybe) best practices, I started taking notes. Eventually I decided to share those notes with other coders, in the hopes they might prove useful. What you find here is my attempt at explaining things, based on how other people do things, filtered through my own trial and error.

What It Is (And Isn't)

The goal of NES Advantage is to create a central repository of useful resources for Famicom/NES coding, focused on techniques that might not be addressed in the usual "get started" books and tutorials. I hope to write many of these resources myself, both as a way to help myself learn and remember and to fill some of the gaps I've found in NES development pedagogy. In the meantime, I've included links to other tutorials and discussions I've found online, by way of creating an easy-to-reference archive.

I don't anticipate this site including lessons on basic topics like binary and hexadecimal, starting assembly, etc. There are many excellent such lessons already out there. I've linked to some in the Starter Resources.

How You Can Help

It's possible—nay, likely—nay, guaranteed—that there will be errors on this site. Or if not errors, at least inefficiencies. Things that can be done better. Best practices that are actually just pretty good or so-so practices.

If you find anything that can be improved, please tell me! I'm on a voyage, just like you. I took these notes because I was learning, and I made this site to help people like me. I'm no master. I'm barely a journeyman. I would be grateful for any corrections or suggestions.

If you have any tutorials of your own, or you'd like to write one, please tell me! Don't worry if you have no writing experience. I'm happy to do an editing pass, or even write the bulk of the text if you provide the technical know-how.

And of course, if you find these suggestions helpful, please do let me know.

About Me

I'm a software developer by day and a computer science master's student at Northeastern University. Under the guidance of Dr. Scott Valcourt, I'm currently coding a NES game as a Master's Project. I'm also an author and editor, particularly in the cozy fantasy space. My latest novel is Bard City Blues and I publish Wyngraf, the magazine of cozy fantasy.

Copyright ©2024 Nathaniel Webb/Nat20 Games