PPU pattern tables: Difference between revisions
(Does the image make it easier to see than the ASCII art?) |
(→Addressing: replace weird "row/column" nomenclature with something that isn't tied to historical emulator layout) |
||
Line 44: | Line 44: | ||
DCBA98 76543210 | DCBA98 76543210 | ||
--------------- | --------------- | ||
0HNNNN NNNNPyyy | |||
|||||| |||||+++- T: Fine Y offset, the row number within a tile | |||||| |||||+++- T: Fine Y offset, the row number within a tile | ||
|||||| ||||+---- P: Bit plane (0: | |||||| ||||+---- P: Bit plane (0: less significant bit; 1: more significant bit) | ||
||++++-++++----- N: Tile number from name table | |||
|+-------------- H: Half of pattern table (0: "left"; 1: "right") | |+-------------- H: Half of pattern table (0: "left"; 1: "right") | ||
+--------------- 0: Pattern table is at $0000-$1FFF | +--------------- 0: Pattern table is at $0000-$1FFF |
Revision as of 05:47, 12 October 2023
The pattern table is an area of memory connected to the PPU that defines the shapes of tiles that make up backgrounds and sprites. This data is also known as CHR, and the memory attached to the PPU which contains it may either be CHR-ROM or CHR-RAM. CHR comes from "character", as related to computer text displays where each tile might represent a single letter character.
Each tile in the pattern table is 16 bytes, made of two planes. Each bit in the first plane controls bit 0 of a pixel's color color; the corresponding bit in the second plane controls bit 1.
- If neither bit is set to 1: The pixel is background/transparent.
- If only the bit in the first plane is set to 1: The pixel's color index is 1.
- If only the bit in the second plane is set to 1: The pixel's color index is 2.
- If both bits are set to 1: The pixel's color index is 3.
This diagram depicts how a tile for ½ (one-half fraction) is encoded, with .
representing a transparent pixel.
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 --------------- 0HNNNN NNNNPyyy |||||| |||||+++- T: Fine Y offset, the row number within a tile |||||| ||||+---- P: Bit plane (0: less significant bit; 1: more significant bit) ||++++-++++----- N: Tile number from name table |+-------------- H: Half of pattern table (0: "left"; 1: "right") +--------------- 0: Pattern table is at $0000-$1FFF
The value written to PPUCTRL ($2000) controls whether the background and sprites use the left half ($0000-$0FFF) or the right half ($1000-$1FFF) of the pattern table. PPUCTRL bit 4 applies to backgrounds, bit 3 applies to 8x8 sprites, and bit 0 of each OAM entry's tile number applies to 8x16 sprites.
For example, if rows of a tile are numbered 0 through 7, row 1 of tile $69 in the left pattern table is stored with plane 0 in $0691 and plane 1 in $0699.