Gustavo Pezzi – NES Programming with 6502 Assembly
Description Of NES Programming with 6502 Assembly
Learn the basics of Assembly 6502 and computer architecture programming games for the Nintendo Entertainment System
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!
What you’ll learn in NES Programming with 6502 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.
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.
Course content
1. Introduction
- Motivations & Learning Outcomes
- How to Take This Course
2. NES History & Early Years
- The NES in the History of Game Consoles
- The Early Years of Nintendo
3. NES Hardware Overview
- NES Hardware (Console)
- NES Hardware (Cartridge)
- Opening the NES Cabinet
- Quiz: NES Hardware
4. Review of Binary & Hexadecimal
- Binary Numbers
- Hexadecimal Numbers
- Quiz: Binary & Hexadecimal
5. The 6502 Processor
- 6502 Pinout
- 6502 Registers
- 6502 Status Flags
- Quiz: 6502 CPU
6. Assembler
- The Assembler Flow
- Popular 6502 Instructions
- The CA65 Assembler
- Installing CA65 on Windows
- Installing CA65 on macOS
- Installing CA65 on Linux
- Quiz: Assembler
7. Intro to 6502 Assembly
- 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
8. NES Graphics
- 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
9. Background Graphics
- CHR-ROM Tiles
- Loading Nametable Tiles
- Loading Attributes
- Dynamic CA65 Macros
- RAM Variables
- Pointers
- Loading Full Nametables
- Quiz: Pattern Tables & Nametables
- Displaying Text
10. Sprites
- NES Sprites
- Hello Mario
- OAM Decay
- Hiding Sprites
- Sprite Flickering
- Exercise: Hello Goomba
11. Controller Input
- NES Controller Architecture
- Joypad Input Routine
- Checking Button Presses
- Moving Sprites using the Joypad
- Quiz: Controller Input
12. Subpixel Movement
- Integer & Fractional Position
- Velocity & Acceleration
- Signed Velocity
- Animation Frames
- Quiz: Subpixel Movement
13. Random Numbers
- Generating Random Values
- Bitshift Operations
- Random Enemy Position
- Exercise: Random Values
14. Scrolling Background
- 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
15. Split Screen
- Scroll Split Screen
- Different Split Screen Techniques
- Sprite-0 Hit
- Separating Game Logic & NMI
- Saving Registers in the Stack
- Buffering
- Quiz: Split Screen
16. Game Objects (Actors)
- 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
17. Generating Random Numbers
- Random Numbers & LFSR
- 8-bit LFSR Example
- Random Airplane Position
- Random Submarine Position
- Quiz: Random Numbers
18. Collision Detection
- Sprite Collision Check
- Missile-Airplane Collision
- Point Inside Bounding Box
19. Incrementing Score Values
- Simulating BCD Increment
- A Routine to Increment Score
- Buffering Background Changes
- Incrementing Score on Enemy Hit
20. Title Screen
- CHR Bank Switching
- Game State Enumeration
- Adding a Title Screen
- Displaying Menu Items
- Quiz: CHR Bank Switching
21. Compressing Level Data
- Encoding & Compression
- LRE Compression
- Block Encoding
- Quiz: Data Encoding & Compression
22. Audio
- 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
23. Conclusion & Next Steps
Is this course for you?
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 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 Pezzi 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.
More courses from the same author: Gustavo Pezzi
Reviews
There are no reviews yet.