Skip to content
Hardware

PPU: The NES Picture Processor

Dedicated silicon for smooth scrolling and sprites

The Ricoh 2C02 Picture Processing Unit gave the NES hardware sprites, tile-based backgrounds, and smooth scrolling—defining the look of 8-bit console gaming.

NES graphicsprocessorsricohnintendo 1983–present

Overview

The Picture Processing Unit (PPU) was Nintendo’s secret weapon. While home computers relied on the CPU for graphics, the NES offloaded rendering to dedicated hardware. This freed the 6502 for game logic and gave the console its characteristic smooth scrolling and fluid sprite animation.

Fast facts

  • Resolution: 256×240 pixels (NTSC crops to ~256×224 visible).
  • Colours: 52 available colours, 25 on screen simultaneously.
  • Backgrounds: two nametables (screens) of 32×30 tiles.
  • Sprites: 64 sprites, 8 per scanline maximum.
  • Tile size: 8×8 pixels for both backgrounds and sprites.

Memory architecture

Address RangeContents
$0000-$0FFFPattern table 0 (left, 256 tiles)
$1000-$1FFFPattern table 1 (right, 256 tiles)
$2000-$23FFNametable 0
$2400-$27FFNametable 1
$2800-$2BFFNametable 2 (mirror or RAM)
$2C00-$2FFFNametable 3 (mirror or RAM)
$3F00-$3F1FPalette RAM

CPU interface registers

AddressRegisterPurpose
$2000PPUCTRLNMI enable, sprite size, pattern tables
$2001PPUMASKColour emphasis, sprite/BG enable
$2002PPUSTATUSVBlank flag, sprite 0 hit
$2003OAMADDRSprite memory address
$2004OAMDATASprite memory data
$2005PPUSCROLLScroll position (write twice: X, Y)
$2006PPUADDRVRAM address (write twice: high, low)
$2007PPUDATAVRAM data read/write

Sprite attributes

Each of the 64 sprites uses 4 bytes in OAM (Object Attribute Memory):

BytePurpose
0Y position (sprite appears on next scanline)
1Tile index
2Attributes (palette, priority, flip H/V)
3X position

Key techniques

  • VBlank timing: all VRAM updates must happen during the ~2270 cycles of vertical blank.
  • Sprite 0 hit: detect when sprite 0’s opaque pixel overlaps background for mid-screen effects.
  • Scroll splitting: change scroll mid-frame using sprite 0 hit or mapper IRQs.
  • Attribute table tricks: work around the 16×16 pixel colour grid constraint.

Limitations and workarounds

  • 8 sprites per scanline: exceeded sprites flicker; games cycle priority to spread flicker.
  • Colour granularity: 16×16 pixel attribute blocks; design around this constraint.
  • No line-by-line scroll: requires sprite 0 hit or mapper assistance.
  • Pattern table size: 512 tiles total; mappers add bank switching.

See also