What you'll learn

NES programming assembly

This course is a complete immersion into the world of the Nintendo Entertainment System. We will learn how to program games for the NES using 6502 assembly while exploring the building blocks of computer architecture. The rudimentary hardware of the NES is a perfect sandbox for us to learn important concepts of low-level programming.

mos 6502 cpu

At the end of the course, you'll have a working knowledge of 6502 assembly language, a comprehensive understanding of the NES hardware, and a toy homebrew game project that we'll code together from scratch. We'll start with small examples and proceed to glue everything together in a final project that demonstrates how a simple NES game works.

The tools you'll need

We'll use a simple code editor, an assembler called CA65, and a NES emulator called FCEUX. All these tools are cross-platform, so you'll be able to follow along on either Windows, macOS, or Linux!

operating system

Is this course for you?

nes game development

This is a self-contained course with no formal prerequisites. However, you will probably get the most out of it if you already know the basics of coding (if-else, loops, functions).

If you like retro game development and want to learn more about computer architecture and low-level programming, then this course is definitely for you!

About the instructor

gustavo pezzi

Gustavo Pezzi is a university lecturer in London, UK. He has won multiple education awards as a teacher and is also the founder of pikuma.com.

Gustavo teaches fundamentals of computer science and mathematics; his academic path includes institutions such as Pittsburg State University, City University of London, and University of Oxford.

teaching certification
higher education academy
pgclt teaching certification
bpp university award

Course content

25 hours total length 23 Chapters Last updated August 2022
  • Motivations & Learning Outcomes
  • How to Take This Course
  • The NES in the History of Game Consoles
  • The Early Years of Nintendo
  • NES Hardware (Console)
  • NES Hardware (Cartridge)
  • Opening the NES Cabinet
  • Quiz: NES Hardware
  • Binary Numbers
  • Hexadecimal Numbers
  • Quiz: Binary & Hexadecimal
  • 6502 Pinout
  • 6502 Registers
  • 6502 Status Flags
  • Quiz: 6502 CPU
  • The Assembler Flow
  • Popular 6502 Instructions
  • The CA65 Assembler
  • Installing CA65 on Windows
  • Installing CA65 on macOS
  • Installing CA65 on Linux
  • Quiz: Assembler
  • iNES Header
  • Our First Assembly Code
  • Assembler & Linker
  • The FCEUX Emulator
  • Exercise: Our First Assembly Bug
  • Addressing Modes
  • Instruction Set
  • Exercise: 6502 Warmup Exercises
  • CPU Memory Map
  • Clearing RAM Addresses
  • NES Graphics & the PPU
  • NTSC, PAL, & VBlank
  • PPU Memory Map
  • Color Palette
  • NES Initialization Code
  • Include Files
  • PPU Address Latch
  • Unnamed Labels & Subroutines
  • Quiz: Picture Frame & VBlank
  • CHR-ROM Tiles
  • Loading Nametable Tiles
  • Loading Attributes
  • Dynamic CA65 Macros
  • RAM Variables
  • Pointers
  • Loading Full Nametables
  • Quiz: Pattern Tables & Nametables
  • Displaying Text
  • NES Sprites
  • Hello Mario
  • OAM Decay
  • Hiding Sprites
  • Sprite Flickering
  • Exercise: Hello Goomba
  • NES Controller Architecture
  • Joypad Input Routine
  • Checking Button Presses
  • Moving Sprites using the Joypad
  • Quiz: Controller Input
  • Integer & Fractional Position
  • Velocity & Acceleration
  • Signed Velocity
  • Animation Frames
  • Quiz: Subpixel Movement
  • Generating Random Values
  • Bitshift Operations
  • Random Enemy Position
  • Exercise: Random Values
  • Nametable Mirroring
  • Horizontal & Vertical Scrolling
  • Swapping Nametables
  • Loading Background Dynamically
  • Dynamic Scrolling
  • Drawing Column of Tiles Off-Screen
  • Loading Attributes Off-Screen
  • Quiz: Background Scrolling
  • Scroll Split Screen
  • Different Split Screen Techniques
  • Sprite-0 Hit
  • Separating Game Logic & NMI
  • Saving Registers in the Stack
  • Buffering
  • Quiz: Split Screen
  • Array of Actors
  • Adding & Removing Actors
  • A Routine to Add Actors
  • Looping Array of Actors
  • Rendering Actors
  • Updating Actor Position
  • One Missile Per Button Press
  • Removing Actors
  • Relative vs. Absolute Jumps
  • Spawning Submarines
  • Spawning Airplanes
  • Quiz: Managing Game Objects
  • Random Numbers & LFSR
  • 8-bit LFSR Example
  • Random Airplane Position
  • Random Submarine Position
  • Quiz: Random Numbers
  • Sprite Collision Check
  • Missile-Airplane Collision
  • Point Inside Bounding Box
  • Simulating BCD Increment
  • A Routine to Increment Score
  • Buffering Background Changes
  • Incrementing Score on Enemy Hit
  • CHR Bank Switching
  • Game State Enumeration
  • Adding a Title Screen
  • Displaying Menu Items
  • Quiz: CHR Bank Switching
  • Encoding & Compression
  • LRE Compression
  • Block Encoding
  • Quiz: Data Encoding & Compression
  • The APU
  • NES Audio
  • FamiStudio Tracker
  • NES Sound Engines
  • FamiStudio Sound Engine
  • Writing a Custom Sound Engine
  • Evolution of Famicom Audio
  • Quiz: NES Audio & the APU
  • Polishing our Game Code
  • Developing NES Games in C
  • Conclusion & Next Steps

How is this course different?

The 6502 processor is an extremely important part of computing history, powering many popular game consoles and microcomputers of the past, like the NES, the Commodore 64, the Apple II, and even the Tamagotchi.

nes programming tutorial

Differently than other online resources about retro game programming, this course is not simply a documentation of assembly mnemonics that only experienced developers can digest. This course tries to be as beginner-friendly as possible, giving you the chance to learn assembly in a fun way.

nes programming tutorial

Trying to understand how modern computers work under the hood can be overwhelming. The small architecture of the NES is our chance to take a step back and look at the fundamental building blocks of computing. So, if you want to really learn how digital machines work and finally lose your fear of the expression "assembly programming", then get ready and buckle up! We are about to go on a super cool nerd trip together.

What students are saying

5.00
5 star
100.0%
4 star
0.0%
3 star
0.0%
2 star
0.0%
1 star
0.0%
Dominic Warchalowski
"Absolutely amazing course! I've been wanting to learn 6502 and specifically NES programming for a couple of years, but everytime I tried to follow tutorials on other video platforms or websites, it immediately went too in-depth or skipped over some of the fundamental stuff. This course absolutely makes sure you understand all the fundamentals you need to know before you start programming. And every subject gets the same amount of attention, making sure that you get a chance to really absorb all the information and build a complete understanding from the architecture to the programming. This course is worth more than it currently costs! If you're interested in programming the NES but still have some doubts, trust me and buy this course. No regrets :)!"
24 Jan 2023
Emilia Rinta-Aho
"Amazing course! This course was a very comprehensive, well organized and very well explained introduction into everything NES! Can't wait to get into creating my own game and to see what Gustavo brings us next!"
10 Jan 2023
Steven Johnson
"Great Stuff! Just finished this and it was well worth the time and effort. Super thorough content as usual covering pretty much everything needed to make a NES game from scratch. Really enjoyed, highly recommend. Thanks Gustavo!"
02 Jan 2023
Jordan Brown
Jordan Brown
"Deeply Informative, Interesting, and Fun! This is an excellent course that takes you through all the steps of programming a game on the NES; all the way from overviewing the actual circuitry of the console itself and getting basic colours appearing on-screen, right up to creating music and polishing away bugs. I had so much fun on this course and I'm really looking forward to making all kinds of things on the venerable NES system now!"
06 Nov 2022
David Montes
"Amazing instructor! Gustavo is a top-notch instructor and each lesson is done so well with helpful graphics that really help you understand the material. Can't recommend this course enough!"
16 Oct 2022

Other similar courses

C++ 2D Game Engine Development

30 hours
  • Learn to make a simple 2D game engine using modern C++, SDL, ECS, and Lua.
raycasting texture c

Raycasting Engine Programming with C

18 hours
  • Write a raycasting engine with textures and sprites using the C programming language.

Game Physics Engine Programming

35 hours
  • Learn how to create a 2D rigid-body game physics engine from scratch with C++.