PPU pattern tables: Difference between revisions

From NESdev Wiki
Jump to navigationJump to search
m (→‎Addressing: typo fix)
(Bold title; →‎Addressing: made diagram style consistent with the rest of the wiki)
Line 1: Line 1:
=Overview=
The '''pattern table''' is an area of memory connected to the PPU that defines the shapes of tiles that make up backgrounds and sprites.
 
Backgrounds and sprites are drawn with tiles.
The pattern table, at $0000-$1FFF in PPU address space, defines the shapes of these tiles.
Each tile in the pattern table is 16 bytes, made of two planes.
Each tile in the pattern table is 16 bytes, made of two planes.
The first plane controls bit 0 of the color; the second plane controls bit 1. Any pixel whose color is 0 is background/transparent (represented by '.' in the following diagram):
The first plane controls bit 0 of the color; the second plane controls bit 1. Any pixel whose color is 0 is background/transparent (represented by '.' in the following diagram):
Line 29: Line 26:
Traditionally, they are displayed as two side-by-side 128x128 pixel sections, each representing 16x16 tiles from the pattern table, with $0000-$0FFF on the left and $1000-$1FFF on the right.
Traditionally, they are displayed as two side-by-side 128x128 pixel sections, each representing 16x16 tiles from the pattern table, with $0000-$0FFF on the left and $1000-$1FFF on the right.


=Addressing=
An important aspect of a [[mapper]]'s capability is how finely it allows bank switching parts of the pattern table.
 
For a given 12-bit address in the pattern table, the address can be decoded as follows:


CBA9876543210 (high order bits first)
== Addressing ==
-------------
HRRRRCCCCPTTT


Where the letters mean:
PPU addresses within the pattern tables can be decoded as follows:


#. H - Hand (0 = "left", 1 = "right")
DCBA98 76543210
#. R - Tile row
---------------
#. C - Tile column
0HRRRR CCCCPTTT
#. P - Bit plane (0 = "lower", 1 = "upper")
|||||| |||||+++- T: Fine Y offset, the row number within a tile
#. T - Fine Y offset (i.e. the row number of a given 8×8 tile)
|||||| ||||+---- P: Bit plane (0: "lower"; 1: "upper")
|||||| ++++----- C: Tile column
||++++---------- R: Tile row
|+-------------- H: Half of sprite table (0: "left"; 1: "right")
+--------------- 0: Pattern table is at $0000-$1FFF

Revision as of 00:30, 22 March 2015

The pattern table is an area of memory connected to the PPU that defines the shapes of tiles that make up backgrounds and sprites. Each tile in the pattern table is 16 bytes, made of two planes. The first plane controls bit 0 of the color; the second plane controls bit 1. Any pixel whose color is 0 is background/transparent (represented by '.' in the following diagram):

Bit Planes            Pixel Pattern
$0xx0=$41  01000001
$0xx1=$C2  11000010
$0xx2=$44  01000100
$0xx3=$48  01001000
$0xx4=$10  00010000
$0xx5=$20  00100000         .1.....3
$0xx6=$40  01000000         11....3.
$0xx7=$80  10000000  =====  .1...3..
                            .1..3...
$0xx8=$01  00000001  =====  ...3.22.
$0xx9=$02  00000010         ..3....2
$0xxA=$04  00000100         .3....2.
$0xxB=$08  00001000         3....222
$0xxC=$16  00010110
$0xxD=$21  00100001
$0xxE=$42  01000010
$0xxF=$87  10000111

The pattern table is divided into two 256-tile sections: $0000-$0FFF, nicknamed "left", and $1000-$1FFF, nicknamed "right". The nicknames come from how emulators with a debugger display the pattern table. Traditionally, they are displayed as two side-by-side 128x128 pixel sections, each representing 16x16 tiles from the pattern table, with $0000-$0FFF on the left and $1000-$1FFF on the right.

An important aspect of a mapper's capability is how finely it allows bank switching parts of the pattern table.

Addressing

PPU addresses within the pattern tables can be decoded as follows:

DCBA98 76543210
---------------
0HRRRR CCCCPTTT
|||||| |||||+++- T: Fine Y offset, the row number within a tile
|||||| ||||+---- P: Bit plane (0: "lower"; 1: "upper")
|||||| ++++----- C: Tile column
||++++---------- R: Tile row
|+-------------- H: Half of sprite table (0: "left"; 1: "right")
+--------------- 0: Pattern table is at $0000-$1FFF