Sega Mega Drive/Planes
From Sega Retro
In addition to sprites, the Sega Mega Drive uses three planes to display graphics. These planes consist of two grids of tiles - a foreground (plane A) and background (plane B) - which can be moved independently, as well as a static window plane. The content of the planes is determined by nametables, which are stored in VRAM. Planes A & B can be moved around by modifying the horizontal scroll table (in VRAM) and vertical scroll table (in VSRAM).
Contents
Nametables
Size
The dimensions of the foreground and background planes are set by VDP register $10. Both planes have the same size. The following are the possible size settings:
Size | Space in VRAM (for 1 plane) | Code |
---|---|---|
256x256 pixels (32x32 cells) | 2048 ($800) bytes | move.w #$9000,($c00004).l |
512x256 pixels (64x32 cells) | 4096 ($1000) bytes | move.w #$9001,($c00004).l |
1024x256 pixels (128x32 cells) | 8192 ($2000) bytes | move.w #$9003,($c00004).l |
256x512 pixels (32x64 cells) | 4096 ($1000) bytes | move.w #$9010,($c00004).l |
512x512 pixels (64x64 cells) | 8192 ($2000) bytes | move.w #$9011,($c00004).l |
256x1024 pixels (32x128 cells) | 8196 ($2000) bytes | move.w #$9030,($c00004).l |
Dimensions of 512x1024 pixels (64x128 cells) and 1024x1024 pixels (128x128 cells) are not valid, because the space used by a plane can't exceed 8196 ($2000) bytes.
Location
Nametables for all three planes are stored in VRAM, and their location is set by VDP registers 02, 03 and 04. Nametables can't be placed anywhere in VRAM, rather they must be aligned to particular multiples.
Nametable | Valid locations | Code |
---|---|---|
Foreground (Plane A) | 0, $2000, $4000, $6000, $8000, $A000, $C000, $E000 | move.w #$8200+($xxxx>>10),($c00004).l |
Background (Plane B) | 0, $2000, $4000, $6000, $8000, $A000, $C000, $E000 | move.w #$8400+($xxxx>>13),($c00004).l |
Window (320 pixel wide mode) | 0, $1000, $2000, $3000, $4000, $5000, $6000, $7000, $8000, $9000, $A000, $B000, $C000, $D000, $E000, $F000 | move.w #$8300+($xxxx>>10),($c00004).l |
Window (256 pixel wide mode) | 0, $800, $1000, $1800, $2000, $2800, $3000, $3800, $4000, $4800, $5000, $5800, $6000, $6800, $7000, $7800, $8000, $8800, $9000, $9800, $A000, $A800, $B000, $B800, $C000, $C800, $D000, $D800, $E000, $E800, $F000, $F800 | move.w #$8300+($xxxx>>10),($c00004).l |
Format
A nametable consists of one word per tile, with the following format:
- PR: Priority. 1 = high; 0 = low.
- PL: Palette line.
- V: Vertical flip. 1 = flipped; 0 = normal.
- H: Horizontal flip. 1 = flipped; 0 = normal.
- T10-T0: Tile index. The number of the tile in VRAM to use, or its address divided by $20.