Sega Mega Drive/Scrolling
From Sega Retro
The Sega Mega Drive is able to scroll the background and foreground (planes B & A) independently, both horizontally and vertically.
Horizontal scrolling
Horizontal scrolling is controlled by a table located in VRAM. The address for the table is set by VDP register $0D, while the format is set by register $0B. There are three possible settings for this register:
Type | Space in VRAM | Format | Code to set VDP |
---|---|---|---|
Whole screen | 4 bytes | FFFF BBBB
|
move.w #$8B00,($c00004).l |
8 pixel strips | 896 ($380) bytes (NTSC) 960 ($3C0) bytes (PAL) |
FFFF BBBB 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 FFFF BBBB 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 FFFF BBBB...
|
move.w #$8B02,($c00004).l |
Per scanline | 896 ($380) bytes (NTSC) 960 ($3C0) bytes (PAL) |
FFFF BBBB FFFF BBBB FFFF BBBB...
|
move.w #$8B03,($c00004).l |
Vertical scrolling
The vertical scrolling table is located in VSRAM. Its format is set by register $0B. There are only two types of vertical scrolling: whole screen and 16 pixel strips:
Type | Space in VSRAM | Format | Code to set VDP |
---|---|---|---|
Whole screen | 4 bytes | FFFF BBBB
|
As above. |
16 pixel strips | 64 ($40) bytes (256 pixel wide mode) 80 ($50) bytes (320 pixel wide mode) |
FFFF BBBB FFFF BBBB FFFF BBBB...
|
with whole screen horizontal:move.w #$8B04,($c00004).lwith 8 pixel horizontal: move.w #$8B06,($c00004).lwith scanline horizontal: move.w #$8B07,($c00004).l |
Format
One word is used to define how much each scrollable unit (whole screen, strip or scanline) is shifted:
7
6
5
4
3
2
1
0
0
0
0
0
0
0
S9-S8
7
6
5
4
3
2
1
0
S7-S0
- S9-S0: Number of pixels to shift. Between 0 and 1024 ($400).
- n.b. Nametables are at most 1024 pixels wide or tall. Planes "wrap around", so it's not possible to have part of the screen with no plane.