Sample RAM map: Difference between revisions

From NESdev Wiki
Jump to navigationJump to search
(link back to CPU memory map)
(putting direct page since parens since this terminology didn't really come into play until later 65x processors)
 
Line 4: Line 4:


It's up to you to find uses for this memory, within certain restrictions imposed by the NES's architecture.
It's up to you to find uses for this memory, within certain restrictions imposed by the NES's architecture.
Indirect addressing modes on 6502 rely on the "zero page" or "direct page", which lies at $0000-$00FF.
Indirect addressing modes on 6502 rely on the "zero page" (or "direct page"), which lies at $0000-$00FF.
Some other addressing modes can read or write the zero page slightly faster.
Some other addressing modes can read or write the zero page slightly faster.
The stack instructions (PHA, PLA, PHP, PLP, JSR, RTS, BRK, RTI) always access the "stack page", which lies at $0100-$01FF.
The stack instructions (PHA, PLA, PHP, PLP, JSR, RTS, BRK, RTI) always access the "stack page", which lies at $0100-$01FF.

Latest revision as of 02:00, 17 February 2023

Documents about programming for systems using the 6502 CPU often refer to RAM in 256-byte "pages". As described in CPU memory map, the NES has a 2048 byte RAM connected to the CPU, which provides eight such pages at $0000-$07FF. The optional PRG RAM chip on some cartridge boards is an 8192 byte SRAM that provides 32 pages at $6000-$7FFF.

It's up to you to find uses for this memory, within certain restrictions imposed by the NES's architecture. Indirect addressing modes on 6502 rely on the "zero page" (or "direct page"), which lies at $0000-$00FF. Some other addressing modes can read or write the zero page slightly faster. The stack instructions (PHA, PLA, PHP, PLP, JSR, RTS, BRK, RTI) always access the "stack page", which lies at $0100-$01FF. But you can use the parts of the stack page that those instructions aren't using.

Here's a sketch of a memory map that may work for your programs. Feel free to adapt it to fit your needs.

Addresses Size What can go there
$0000-$000F 16 bytes Local variables and function arguments
$0010-$00FF 240 bytes Global variables accessed most often, including certain pointer tables
$0100-$019F 160 bytes Data to be copied to nametable during next vertical blank (see The frame and NMIs)
$01A0-$01FF 96 bytes Stack
$0200-$02FF 256 bytes Data to be copied to OAM during next vertical blank
$0300-$03FF 256 bytes Variables used by sound player, and possibly other variables
$0400-$07FF 1024 bytes Arrays and less-often-accessed global variables