Sega Mega Drive/Shadow and highlight
From Sega Retro
Shadow and highlight is a feature of the Sega Mega Drive VDP which allows the brightness of pixels to be adjusted to three different levels: normal, shadow and highlight. This increases the potential palette of colours from 512 to around 1536 (some of those will be duplicates). It also triples the number of colours that can be displayed on screen simultaneously.
Enable shadow and highlight mode
Shadow and highlight mode is controlled by mode register 4 (register $0C). The same register also controls screen resolution (320 or 256 pixel wide mode) and interlace mode.
The following code will set the appropriate register:
- move.w #$8Cxx,($c00004).l
Replace xx with one of the following values:
Interlace | ||||
disable | enable | double | ||
Resolution | 320 pixels wide | 89 | 8B | 8F |
256 pixels wide | 08 | 0A | 0E |
Rules
- A tile on the foreground (plane A) with low priority is shadowed, with high priority it's normal.
- Background (plane B) pixels are shadowed if the foreground is.
- If a background tile has high priority, it will appear normal and on top of a low priority foreground tile.
- Sprites are shadowed if the foreground is, unless their high priority bit is set, in which case they appear normal.
- A pixel in a sprite using palette line 4, colour 15 will highlight the pixel beneath it (planes only).
- If the pixel is shadowed by the first rule, it will appear normal.
- A pixel in a sprite using palette line 4, colour 16 will shadow the pixel beneath it (planes only).
- If the pixel is shadowed by the first rule, it will appear shadowed.
- Sprites can't shadow/highlight other sprites. If sprite with a shadow/highlight pixel occludes another sprite, the plane will be visible through that pixel (with shadow/highlight applied).
- Normal sprites can cover shadow/highlight sprites if they have a higher priority, as expected.
- Pixels in sprites using colour 15 of palette lines 1, 2 or 3 will always appear normal. Possibly a bug.
Disable shadow and highlight mode
The shadow/highlight enable bit is located in register 12 (Mode Set Register No. 4), which also contains settings for screen width and interlacing.
Use this instruction to set Mode Set Register No. 4 to the value $xx:
- move.w #$8Cxx,($c00004).l
To determine the value of $xx, use the following chart. The resulting value will be in binary, which can be converted to hexadecimal using a calculator:
MSB | LSB | |||||||
Reg. #12 | RS0 | 0 | 0 | 0 | S/TE | LSM0 | LSM1 | RS1 |
RS0/RS1 controls screen width:
- 00: 256 pixels (32 cells)
- 11: 320 pixels (40 cells)
LSM0/LSM1 controls interlacing:
- 00: No interlacing
- 01: Interlacing Mode 1
- 11: Interlacing Mode 2 (double resolution)
S/TE controls shadow/highlight:
- 0: Disabled
- 1: Enabled