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
  • 1st word controls foreground
  • 2nd word controls background
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...
  • 1st word controls 1st foreground strip
  • 2nd word controls 1st background strip
  • The next 14 words are unused, then the pattern repeats for the 2nd strip etc.
move.w #$8B02,($c00004).l
Per scanline 896 ($380) bytes (NTSC)
960 ($3C0) bytes (PAL)
FFFF BBBB FFFF BBBB FFFF BBBB...
  • Alternating words control foreground and background scanlines
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
  • 1st word controls foreground
  • 2nd word controls background
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...
  • Alternating words control foreground and background strips
with whole screen horizontal:
move.w #$8B04,($c00004).l
with 8 pixel horizontal:
move.w #$8B06,($c00004).l
with 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.