Before the basics
Background
A digital computer, such as a PC or NES, is filled with millions of tiny switches that can be turned on or off. Some switches store information for short time; these are called memory. Other switches calculate things based on the output of other switches; these are called logic. Each switch can be on or off, representing true or false, or the numbers 1 or 0. Multiple switches grouped together can represent larger values. A CPU reads machine code from a memory and treats it as instructions to perform arithmetic and logic operations on other values in memory or to perform input and output. Some of the input and output involve user interaction: the user gives commands to the computer, and the computer displays the result.
If you're confused, now is the opportunity to become familiar with the following basic concepts from computer engineering and computer science. These articles from Wikipedia are in English, and many have been translated into other languages.
- Computer (it's not just a PC)
- Bit
- Binary number
- Byte
- Arithmetic logic unit
- Binary prefix (KiB, MiB)
- Random-access memory (RAM)
- Read-only memory (ROM)
- Central processing unit (CPU)
- Computer program
- Input/output (I/O)
- Raster graphics
- Command-line interface
More advanced topics
It has been suggested that understanding these topics is not necessary to program low-complexity games in assembly language without sound, such as a workalike of Magnavox Odyssey tennis. They are held here for forthcoming sorting into a separate page.
- Games larger than one screen
- Audio
- Mapper
- High-level languages
Introducing the NES
The Nintendo Entertainment System has the following components:
- 2A03 CPU IC made by Ricoh
- CPU based on the MOS Technology 6502 8-bit microprocessor
- serial input for game controllers
- audio output comprising four tone generators and a delta modulation playback device
- 2 KiB of RAM for use by the CPU
- 2C02 PPU (picture processing unit)
- tile-based background image
- 64 sprites (individually moving objects)
- 25 colors out of 53
- 256x240 pixel progressive picture generator
- NTSC color encoder
- 2 KiB of RAM for use by the PPU
Cartridges have the following components:
- 16 KiB or more PRG ROM, for use by the CPU
- 8 KiB or more CHR ROM or CHR RAM, for use by the PPU (and in some cases by the CPU)
- (optional) Bank switching hardware for the ROMs
- (optional) Logic to generate interrupts
Important Considerations
The NES is not an easy system to develop games for anybody who does not have a good information and knowledge about the low-level workings of a computer. Developing games for NES can be tricky for developers who are used to tools like Unreal Engine, Unity, Godot, and game libraries and frameworks like Raylib, OpenGL, etc.
A few of such (at first) hard-to-grasp concepts and difficulties that one might face during their journey are:
- Memory-mapped I/O, memory mirroring, incomplete address decoding and mapping and mappers can be confusing to understand and deal with, at first.
- Issues like race conditions can pop up during the journey, such as not being able to write to video memory while the PPU is busy rendering the screen (you have to wait until the Vertical Blanking interval begins, of which the PPU can notify using an interrupt).
- One cannot have "pre-initialized" global variables unless coded manually (due to program residing entirely in the ROM).
If you do not have a good programming knowledge, then you should firstly consider getting programming experience. Knowledge of the 6502 assembly language is important and knowledge and experience in C programming language is extremely helpful, as it is often used and compiled and linked together with the 6502 assembly.
Not understanding concepts clearly such as memory-management and not having enough technical knowledge about the hardware can give one a hard time developing tools or games on the NES, such as if you don't understand the memory-range of the hardware and you allocate memory outside the range of what hardware can access, you might get bugs and problems popping up in your code. Hence, having a good grasp of assembly is essential as it allows you to gain experience to the memory mappings of the hardware and management of the same.
And most importantly, one should not expect much from the NES hardware, it has a 1.7 MHz processor compared to a modern processor like Intel i5-13400 processor which runs at 2.5 GHz. The PPU on the NES spends exactly 1 clock cycle per pixel. Another important thing is that PPU and CPU do not share any memory, both have their own buses.