diff --git a/src/mame/drivers/megadriv.c b/src/mame/drivers/megadriv.c index 53d90665388..881a36d5ed0 100644 --- a/src/mame/drivers/megadriv.c +++ b/src/mame/drivers/megadriv.c @@ -72,6 +72,9 @@ static int megadrive_vblank_flag = 0; static int megadrive_irq6_pending = 0; static int megadrive_irq4_pending = 0; +int segac2_bg_pal_lookup[4] = { 0x00, 0x10, 0x20, 0x30 }; +int segac2_sp_pal_lookup[4] = { 0x00, 0x10, 0x20, 0x30 }; + // hacks for C2 int genvdp_use_cram = 1; // c2 uses it's own palette ram int genesis_has_z80 = 1; // c2 doesn't have a z80.. @@ -3015,6 +3018,17 @@ VIDEO_START(megadriv) memset(megadrive_vdp_palette_lookup_shadow,0x00,0x40*2); memset(megadrive_vdp_palette_lookup_highlight,0x00,0x40*2); + + /* no special lookups */ + segac2_bg_pal_lookup[0] = 0x00; + segac2_bg_pal_lookup[1] = 0x10; + segac2_bg_pal_lookup[2] = 0x20; + segac2_bg_pal_lookup[3] = 0x30; + + segac2_sp_pal_lookup[0] = 0x00; + segac2_sp_pal_lookup[1] = 0x10; + segac2_sp_pal_lookup[2] = 0x20; + segac2_sp_pal_lookup[3] = 0x30; } VIDEO_UPDATE(megadriv) @@ -4306,9 +4320,9 @@ static void genesis_render_videobuffer_to_screenbuffer(running_machine *machine, UINT32 dat; dat = video_renderline[x]; if (dat&0x10000) - lineptr[x] = megadrive_vdp_palette_lookup_sprite[dat&0x3f]; + lineptr[x] = megadrive_vdp_palette_lookup_sprite[(dat&0x0f) | segac2_sp_pal_lookup[(dat&0x30)>>4]]; else - lineptr[x] = megadrive_vdp_palette_lookup[dat&0x3f]; + lineptr[x] = megadrive_vdp_palette_lookup[(dat&0x0f) | segac2_bg_pal_lookup[(dat&0x30)>>4]]; } } else @@ -4328,31 +4342,29 @@ static void genesis_render_videobuffer_to_screenbuffer(running_machine *machine, case 0x10000: // (sprite) low priority, no shadow sprite, no highlight = shadow case 0x12000: // (sprite) low priority, shadow sprite, no highlight = shadow case 0x16000: // (sprite) normal pri, shadow sprite, no highlight = shadow? - lineptr[x] = megadrive_vdp_palette_lookup_shadow[dat&0x3f]; + lineptr[x] = megadrive_vdp_palette_lookup_shadow[(dat&0x0f) | segac2_bg_pal_lookup[(dat&0x30)>>4]]; break; case 0x4000: // normal pri, no shadow sprite, no highlight = normal; case 0x8000: // low pri, highlight sprite = normal; - lineptr[x] = megadrive_vdp_palette_lookup[dat&0x3f]; + lineptr[x] = megadrive_vdp_palette_lookup[(dat&0x0f) | segac2_bg_pal_lookup[(dat&0x30)>>4]]; break; case 0x14000: // (sprite) normal pri, no shadow sprite, no highlight = normal; case 0x18000: // (sprite) low pri, highlight sprite = normal; - lineptr[x] = megadrive_vdp_palette_lookup_sprite[dat&0x3f]; + lineptr[x] = megadrive_vdp_palette_lookup_sprite[(dat&0x0f) | segac2_sp_pal_lookup[(dat&0x30)>>4]]; break; case 0x0c000: // normal pri, highlight set = highlight? case 0x1c000: // (sprite) normal pri, highlight set = highlight? - lineptr[x] = megadrive_vdp_palette_lookup_highlight[dat&0x3f]; + lineptr[x] = megadrive_vdp_palette_lookup_highlight[(dat&0x0f) | segac2_bg_pal_lookup[(dat&0x30)>>4]]; break; case 0x0a000: // shadow set, highlight set - not possible case 0x0e000: // shadow set, highlight set, normal set, not possible case 0x1a000: // (sprite)shadow set, highlight set - not possible case 0x1e000: // (sprite)shadow set, highlight set, normal set, not possible - lineptr[x] = megadrive_vdp_palette_lookup_highlight[mame_rand(machine)&0x3f]; - default: lineptr[x] = mame_rand(Machine)&0x3f; break; diff --git a/src/mame/drivers/segac2.c b/src/mame/drivers/segac2.c index e43053b1bb8..548785cbd0c 100644 --- a/src/mame/drivers/segac2.c +++ b/src/mame/drivers/segac2.c @@ -100,7 +100,7 @@ static UINT8 prot_write_buf; /* remembers what was written */ static UINT8 prot_read_buf; /* remembers what was returned */ /* palette-related variables */ -static UINT8 alt_palette_mode; +UINT8 segac2_alt_palette_mode; static UINT8 palbank; static UINT8 bg_palbase; static UINT8 sp_palbase; @@ -145,7 +145,7 @@ static MACHINE_RESET( segac2 ) /* reset the protection */ prot_write_buf = 0; prot_read_buf = 0; - alt_palette_mode = 0; + segac2_alt_palette_mode = 0; palbank = 0; bg_palbase = 0; @@ -242,7 +242,7 @@ static WRITE16_HANDLER( segac2_upd7759_w ) static READ16_HANDLER( palette_r ) { offset &= 0x1ff; - if (alt_palette_mode) + if (segac2_alt_palette_mode) offset = ((offset << 1) & 0x100) | ((offset << 2) & 0x80) | ((~offset >> 2) & 0x40) | ((offset >> 1) & 0x20) | (offset & 0x1f); return paletteram16[offset + palbank * 0x200]; } @@ -253,10 +253,10 @@ extern UINT16* megadrive_vdp_palette_lookup_shadow; extern UINT16* megadrive_vdp_palette_lookup_highlight; -UINT16 megadrive_vdp_palette_lookup_segac2[0x800]; -UINT16 megadrive_vdp_palette_lookup_sprite_segac2[0x800]; -UINT16 megadrive_vdp_palette_lookup_shadow_segac2[0x800]; -UINT16 megadrive_vdp_palette_lookup_highlight_segac2[0x800]; +UINT16* megadrive_vdp_palette_lookup_segac2; +UINT16* megadrive_vdp_palette_lookup_sprite_segac2; +UINT16* megadrive_vdp_palette_lookup_shadow_segac2; +UINT16* megadrive_vdp_palette_lookup_highlight_segac2; /* handle writes to the paletteram */ @@ -267,7 +267,7 @@ static WRITE16_HANDLER( palette_w ) /* adjust for the palette bank */ offset &= 0x1ff; - if (alt_palette_mode) + if (segac2_alt_palette_mode) offset = ((offset << 1) & 0x100) | ((offset << 2) & 0x80) | ((~offset >> 2) & 0x40) | ((offset >> 1) & 0x20) | (offset & 0x1f); offset += palbank * 0x200; @@ -326,36 +326,30 @@ static WRITE16_HANDLER( palette_w ) ******************************************************************************/ +extern int segac2_bg_pal_lookup[4]; +extern int segac2_sp_pal_lookup[4]; + static void recompute_palette_tables(void) { int i; - int genesis_bg_pal_lookup[4]; - int genesis_sp_pal_lookup[4]; - for (i = 0; i < 4; i++) { int bgpal = 0x000 + bg_palbase * 0x40 + i * 0x10; int sppal = 0x100 + sp_palbase * 0x40 + i * 0x10; - if (!alt_palette_mode) + if (!segac2_alt_palette_mode) { - genesis_bg_pal_lookup[i] = bgpal; - genesis_sp_pal_lookup[i] = sppal; + segac2_bg_pal_lookup[i] = 0x200 * palbank + bgpal; + segac2_sp_pal_lookup[i] = 0x200 * palbank + sppal; } else { - genesis_bg_pal_lookup[i] = ((bgpal << 1) & 0x180) + ((~bgpal >> 2) & 0x40) + (bgpal & 0x30); - genesis_sp_pal_lookup[i] = ((~sppal << 2) & 0x100) + ((sppal << 2) & 0x80) + ((~sppal >> 2) & 0x40) + ((sppal >> 2) & 0x20) + (sppal & 0x10); + segac2_bg_pal_lookup[i] = 0x200 * palbank + ((bgpal << 1) & 0x180) + ((~bgpal >> 2) & 0x40) + (bgpal & 0x30); + segac2_sp_pal_lookup[i] = 0x200 * palbank + ((~sppal << 2) & 0x100) + ((sppal << 2) & 0x80) + ((~sppal >> 2) & 0x40) + ((sppal >> 2) & 0x20) + (sppal & 0x10); } } - megadrive_vdp_palette_lookup = &megadrive_vdp_palette_lookup_segac2[palbank * 0x200 + bg_palbase * 0x40]; - megadrive_vdp_palette_lookup_sprite = &megadrive_vdp_palette_lookup_sprite_segac2[palbank * 0x200 + 0x100+sp_palbase * 0x40]; - megadrive_vdp_palette_lookup_shadow = &megadrive_vdp_palette_lookup_shadow_segac2[palbank * 0x200 + bg_palbase * 0x40]; - megadrive_vdp_palette_lookup_highlight = &megadrive_vdp_palette_lookup_highlight_segac2[palbank * 0x200 + bg_palbase * 0x40]; - - } @@ -522,7 +516,7 @@ static WRITE16_HANDLER( control_w ) prot_write_buf = prot_read_buf = 0; /* bit 2 controls palette shuffling; only ribbit and twinsqua use this feature */ - alt_palette_mode = ((~data & 4) >> 2); + segac2_alt_palette_mode = ((~data & 4) >> 2); recompute_palette_tables(); } @@ -1390,6 +1384,12 @@ VIDEO_START(segac2_new) { VIDEO_START_CALL(megadriv); + + megadrive_vdp_palette_lookup_segac2 = auto_malloc(0x1000); + megadrive_vdp_palette_lookup_sprite_segac2 = auto_malloc(0x1000); + megadrive_vdp_palette_lookup_shadow_segac2 = auto_malloc(0x1000); + megadrive_vdp_palette_lookup_highlight_segac2 = auto_malloc(0x1000); + megadrive_vdp_palette_lookup = megadrive_vdp_palette_lookup_segac2; megadrive_vdp_palette_lookup_sprite = megadrive_vdp_palette_lookup_sprite_segac2; megadrive_vdp_palette_lookup_shadow = megadrive_vdp_palette_lookup_shadow_segac2;