killed off the ancient vdp implementation so we're all using the current one now, also made c2 manage it's own palette instead of having the vdp do it for it, might need a bit of tweaking but it works. From Haze (nw)

This commit is contained in:
Scott Stone 2012-08-16 21:38:45 +00:00
parent 85aa24b036
commit 74a324d632
9 changed files with 236 additions and 1405 deletions

View File

@ -88,6 +88,8 @@
#define LOG_PALETTE 0
#define LOG_IOCHIP 0
int segac2_bg_pal_lookup[4];
int segac2_sp_pal_lookup[4];
static void recompute_palette_tables( running_machine &machine );
@ -113,12 +115,20 @@ static MACHINE_START( segac2 )
static MACHINE_RESET( segac2 )
{
segac2_state *state = machine.driver_data<segac2_state>();
megadriv_framerate = 60;
// megadriv_framerate = 60;
// megadriv_scanline_timer = machine.device<timer_device>("md_scan_timer");
// megadriv_scanline_timer->adjust(attotime::zero);
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;
megadriv_reset_vdp(machine);
@ -226,19 +236,19 @@ static WRITE16_HANDLER( palette_w )
/* set the color */
palette_set_color_rgb(space->machine(), offset, pal5bit(r), pal5bit(g), pal5bit(b));
megadrive_vdp_palette_lookup[offset] = (b) | (g << 5) | (r << 10);
megadrive_vdp_palette_lookup_sprite[offset] = (b) | (g << 5) | (r << 10);
// megadrive_vdp_palette_lookup[offset] = (b) | (g << 5) | (r << 10);
// megadrive_vdp_palette_lookup_sprite[offset] = (b) | (g << 5) | (r << 10);
tmpr = r >> 1;
tmpg = g >> 1;
tmpb = b >> 1;
megadrive_vdp_palette_lookup_shadow[offset] = (tmpb) | (tmpg << 5) | (tmpr << 10);
palette_set_color_rgb(space->machine(), offset + 0x800, pal5bit(tmpr), pal5bit(tmpg), pal5bit(tmpb));
// how is it calculated on c2?
tmpr = tmpr | 0x10;
tmpg = tmpg | 0x10;
tmpb = tmpb | 0x10;
megadrive_vdp_palette_lookup_highlight[offset] = (tmpb) | (tmpg << 5) | (tmpr << 10);
palette_set_color_rgb(space->machine(), offset + 0x1000, pal5bit(tmpr), pal5bit(tmpg), pal5bit(tmpb));
}
@ -1261,27 +1271,74 @@ static const ym3438_interface ym3438_intf =
static VIDEO_START(segac2_new)
{
VIDEO_START_CALL(megadriv);
megadrive_vdp_palette_lookup = auto_alloc_array(machine, UINT16, 0x1000/2);
megadrive_vdp_palette_lookup_sprite = auto_alloc_array(machine, UINT16, 0x1000/2);
megadrive_vdp_palette_lookup_shadow = auto_alloc_array(machine, UINT16, 0x1000/2);
megadrive_vdp_palette_lookup_highlight = auto_alloc_array(machine, UINT16, 0x1000/2);
}
// C2 doesn't use the internal VDP CRAM, instead it uses the digital output of the chip
// and applies it's own external colour circuity
static SCREEN_UPDATE_RGB32(segac2_new)
{
const pen_t *paldata = screen.machine().pens;
segac2_state *state = screen.machine().driver_data<segac2_state>();
if (!state->m_segac2_enable_display)
{
bitmap.fill(get_black_pen(screen.machine()));
bitmap.fill(get_black_pen(screen.machine()), cliprect);
return 0;
}
SCREEN_UPDATE32_CALL(megadriv);
sega_genesis_vdp_device *vdp = state->m_vdp;
/* Copy our screen buffer here */
for (int y = cliprect.min_y; y <= cliprect.max_y; y++)
{
UINT32* desty = &bitmap.pix32(y, 0);
UINT16* srcy;
srcy = vdp->m_render_line_raw;
for (int x = cliprect.min_x; x <= cliprect.max_x; x++)
{
UINT16 src = srcy[x];
switch (src & 0x1c0)
{
case 0x000:
desty[x] = paldata[(src&0x0f) | segac2_bg_pal_lookup[(src & 0x30)>>4] | 0x800];
break;
case 0x040:
desty[x] = paldata[(src&0x0f) | segac2_bg_pal_lookup[(src & 0x30)>>4]];
break;
case 0x080:
desty[x] = paldata[(src&0x0f) | segac2_sp_pal_lookup[(src & 0x30)>>4]];
break;
case 0x0c0:
// bg pen
desty[x] = paldata[(src&0x0f) | segac2_bg_pal_lookup[(src & 0x30)>>4] | 0x1000];
break;
case 0x100:
// shadow
desty[x] = paldata[(src&0x0f) | segac2_bg_pal_lookup[(src & 0x30)>>4] | 0x800];
break;
case 0x140:
// normal
desty[x] = paldata[(src&0x0f) | segac2_bg_pal_lookup[(src & 0x30)>>4]];
break;
case 0x180:
// sprite
desty[x] = paldata[(src&0x0f) | segac2_sp_pal_lookup[(src & 0x30)>>4]];
break;
case 0x1c0:
// highlight
desty[x] = paldata[(src&0x0f) | segac2_bg_pal_lookup[(src & 0x30)>>4] | 0x1000];
break;
}
}
}
return 0;
}
// the main interrupt on C2 comes from the vdp line used to drive the z80 interrupt on a regular genesis(!)
void genesis_vdp_sndirqline_callback_segac2(running_machine &machine, bool state)
{
@ -1335,7 +1392,7 @@ static MACHINE_CONFIG_START( segac, segac2_state )
MCFG_SCREEN_UPDATE_STATIC(segac2_new)
MCFG_SCREEN_VBLANK_STATIC( megadriv )
MCFG_PALETTE_LENGTH(2048)
MCFG_PALETTE_LENGTH(2048*3)
MCFG_VIDEO_START(segac2_new)

View File

@ -62,12 +62,10 @@
#include "machine/segaic16.h"
#include "machine/nvram.h"
#include "includes/segas18.h"
#include "includes/genesis.h"
#include "sound/2612intf.h"
#include "sound/rf5c68.h"
#include "includes/segaipt.h"
/*************************************
*
* Memory mapping tables
@ -105,7 +103,7 @@ void segas18_state::memory_mapper(sega_315_5195_mapper_device &mapper, UINT8 ind
{
case ROM_BOARD_171_SHADOW: break; // ???
case ROM_BOARD_171_5874:
case ROM_BOARD_171_5987: mapper.map_as_handler(0x00000, 0x00010, 0xfffff0, read16_delegate(FUNC(segas18_state::legacy_wrapper_r<genesis_vdp_r>), this), write16_delegate(FUNC(segas18_state::legacy_wrapper<genesis_vdp_w>), this)); break;
case ROM_BOARD_171_5987: mapper.map_as_handler(0x00000, 0x00010, 0xfffff0, read16_delegate(FUNC(segas18_state::genesis_vdp_r), this), write16_delegate(FUNC(segas18_state::genesis_vdp_w), this)); break;
default: assert(false);
}
break;
@ -113,7 +111,7 @@ void segas18_state::memory_mapper(sega_315_5195_mapper_device &mapper, UINT8 ind
case 1:
switch (m_romboard)
{
case ROM_BOARD_171_SHADOW: mapper.map_as_handler(0x00000, 0x00010, 0xfffff0, read16_delegate(FUNC(segas18_state::legacy_wrapper_r<genesis_vdp_r>), this), write16_delegate(FUNC(segas18_state::legacy_wrapper<genesis_vdp_w>), this)); break;
case ROM_BOARD_171_SHADOW: mapper.map_as_handler(0x00000, 0x00010, 0xfffff0, read16_delegate(FUNC(segas18_state::genesis_vdp_r), this), write16_delegate(FUNC(segas18_state::genesis_vdp_w), this)); break;
case ROM_BOARD_171_5874: mapper.map_as_rom(0x00000, 0x80000, 0xf80000, "rom1base", 0x80000, write16_delegate()); break;
case ROM_BOARD_171_5987: if (romsize <= 0x100000)
mapper.map_as_rom(0x00000, 0x80000, 0xf80000, "rom1base", 0x80000, write16_delegate(FUNC(segas18_state::rom_5987_bank_w), this));
@ -205,6 +203,9 @@ void segas18_state::machine_reset()
{
segaic16_tilemap_reset(machine(), 0);
megadriv_reset_vdp(machine());
genvdp_use_cram = 1;
// if we are running with a real live 8751, we need to boost the interleave at startup
if (m_mcu != NULL && m_mcu->type() == I8751)
synchronize(TID_INITIAL_BOOST);
@ -567,6 +568,22 @@ WRITE8_MEMBER( segas18_state::mcu_data_w )
m_mcu->set_input_line(MCS51_INT1_LINE, HOLD_LINE);
}
/*************************************
*
* VDP memory handlers
*
*************************************/
READ16_MEMBER( segas18_state::genesis_vdp_r )
{
return m_vdp->megadriv_vdp_r(space,offset,mem_mask);
}
WRITE16_MEMBER( segas18_state::genesis_vdp_w )
{
m_vdp->megadriv_vdp_w(space,offset,data,mem_mask);
}
/*************************************
@ -1195,6 +1212,19 @@ GFXDECODE_END
// are any of the VDP interrupt lines hooked up to anything?
void genesis_vdp_sndirqline_callback_segas18(running_machine &machine, bool state)
{
}
void genesis_vdp_lv6irqline_callback_segas18(running_machine &machine, bool state)
{
}
void genesis_vdp_lv4irqline_callback_segas18(running_machine &machine, bool state)
{
}
/*************************************
*
* Machine driver
@ -1216,6 +1246,17 @@ static MACHINE_CONFIG_START( system18, segas18_state )
MCFG_SEGA_315_5195_MAPPER_ADD("mapper", "maincpu", segas18_state, memory_mapper, mapper_sound_r, mapper_sound_w)
MCFG_DEVICE_ADD("gen_vdp", SEGA_GEN_VDP, 0)
sega_genesis_vdp_device::set_genesis_vdp_sndirqline_callback(*device, genesis_vdp_sndirqline_callback_segas18);
sega_genesis_vdp_device::set_genesis_vdp_lv6irqline_callback(*device, genesis_vdp_lv6irqline_callback_segas18);
sega_genesis_vdp_device::set_genesis_vdp_lv4irqline_callback(*device, genesis_vdp_lv4irqline_callback_segas18);
sega_genesis_vdp_device::set_genesis_vdp_alt_timing(*device, 1);
sega_genesis_vdp_device::set_genesis_vdp_palwrite_base(*device, 0x2000);
MCFG_TIMER_ADD_SCANLINE("scantimer", megadriv_scanline_timer_callback_alt_timing, "screen", 0, 1)
// video hardware
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(57.23) // verified on pcb
@ -1224,7 +1265,7 @@ static MACHINE_CONFIG_START( system18, segas18_state )
MCFG_SCREEN_UPDATE_DRIVER(segas18_state, screen_update)
MCFG_GFXDECODE(segas18)
MCFG_PALETTE_LENGTH(2048*3+2048)
MCFG_PALETTE_LENGTH(2048*3+2048 + 64*3)
MCFG_SEGA16SP_ADD_16B("segaspr1")

View File

@ -1,13 +1 @@
/* Todo, reorganise, cleanup etc.*/
/*----------- defined in video/genesis.c -----------*/
extern UINT16 genesis_bg_pal_lookup[4];
extern UINT16 genesis_sp_pal_lookup[4];
extern UINT8 genesis_vdp_regs[32];
void system18_vdp_start(running_machine &machine);
void system18_vdp_update(bitmap_ind16 &bitmap, const rectangle &cliprect);
READ16_HANDLER ( genesis_vdp_r );
WRITE16_HANDLER( genesis_vdp_w );
/* Todo, delete! */

View File

@ -452,8 +452,8 @@ extern WRITE16_HANDLER( jcart_ctrl_w );
extern READ16_HANDLER( jcart_ctrl_r );
/* machine/megavdp.c */
extern UINT16 (*vdp_get_word_from_68k_mem)(running_machine &machine, UINT32 source);
extern UINT16 vdp_get_word_from_68k_mem_default(running_machine &machine, UINT32 source);
extern UINT16 (*vdp_get_word_from_68k_mem)(running_machine &machine, UINT32 source, address_space* space);
extern UINT16 vdp_get_word_from_68k_mem_default(running_machine &machine, UINT32 source, address_space* space);
extern int megadriv_framerate;
extern int megadrive_total_scanlines;
extern int megadrive_vblank_flag;
@ -468,9 +468,7 @@ extern int genvdp_use_cram;
extern int megadrive_region_export;
extern int megadrive_region_pal;
TIMER_DEVICE_CALLBACK( megadriv_scanline_timer_callback );
TIMER_DEVICE_CALLBACK( megadriv_scanline_timer_callback_alt_timing );
/* machine/megadriv.c */
extern TIMER_DEVICE_CALLBACK( megadriv_scanline_timer_callback );
extern timer_device* megadriv_scanline_timer;
extern void megadriv_reset_vdp(running_machine &machine);

View File

@ -41,6 +41,7 @@
#include "machine/nvram.h"
#include "machine/segaic16.h"
#include "video/segaic16.h"
#include "machine/megavdp.h"
// ======================> segas18_state
@ -55,6 +56,7 @@ public:
m_maincpu(*this, "maincpu"),
m_soundcpu(*this, "soundcpu"),
m_mcu(*this, "mcu"),
m_vdp(*this, "gen_vdp"),
m_nvram(*this, "nvram"),
m_workram(*this, "workram"),
m_romboard(ROM_BOARD_INVALID),
@ -93,6 +95,10 @@ public:
DECLARE_WRITE8_MEMBER( soundbank_w );
DECLARE_WRITE8_MEMBER( mcu_data_w );
DECLARE_READ16_MEMBER( genesis_vdp_r );
DECLARE_WRITE16_MEMBER( genesis_vdp_w );
// custom I/O
DECLARE_READ16_MEMBER( ddcrew_custom_io_r );
DECLARE_READ16_MEMBER( lghost_custom_io_r );
@ -142,6 +148,7 @@ protected:
required_device<m68000_device> m_maincpu;
required_device<z80_device> m_soundcpu;
optional_device<i8751_device> m_mcu;
required_device<sega_genesis_vdp_device> m_vdp;
required_device<nvram_device> m_nvram;
// memory pointers

View File

@ -30,16 +30,10 @@ int megadrive_total_scanlines;
int megadrive_vblank_flag = 0;
int genesis_scanline_counter = 0;
int segac2_bg_pal_lookup[4];
int segac2_sp_pal_lookup[4];
// hacks for C2
int genvdp_use_cram = 0; // c2 uses it's own palette ram
UINT16* megadrive_vdp_palette_lookup;
UINT16* megadrive_vdp_palette_lookup_sprite; // for C2
UINT16* megadrive_vdp_palette_lookup_shadow;
UINT16* megadrive_vdp_palette_lookup_highlight;
int megadrive_region_export;
int megadrive_region_pal;
@ -75,6 +69,7 @@ sega_genesis_vdp_device::sega_genesis_vdp_device(const machine_config &mconfig,
m_genesis_vdp_lv6irqline_callback = genesis_vdp_lv6irqline_callback_default;
m_genesis_vdp_lv4irqline_callback = genesis_vdp_lv4irqline_callback_default;
m_use_alt_timing = 0;
m_palwrite_base = -1;
}
static TIMER_CALLBACK( megadriv_render_timer_callback )
@ -134,6 +129,14 @@ void sega_genesis_vdp_device::set_genesis_vdp_alt_timing(device_t &device, int u
dev.m_use_alt_timing = use_alt_timing;
}
void sega_genesis_vdp_device::set_genesis_vdp_palwrite_base(device_t &device, int palwrite_base)
{
sega_genesis_vdp_device &dev = downcast<sega_genesis_vdp_device &>(device);
dev.m_palwrite_base = palwrite_base;
}
void sega_genesis_vdp_device::device_start()
{
@ -178,6 +181,19 @@ void sega_genesis_vdp_device::device_start()
m_highpri_renderline = auto_alloc_array(machine(), UINT8, 320);
m_video_renderline = auto_alloc_array(machine(), UINT32, 320);
megadrive_vdp_palette_lookup = auto_alloc_array(machine(), UINT16, 0x40);
megadrive_vdp_palette_lookup_sprite = auto_alloc_array(machine(), UINT16, 0x40);
megadrive_vdp_palette_lookup_shadow = auto_alloc_array(machine(), UINT16, 0x40);
megadrive_vdp_palette_lookup_highlight = auto_alloc_array(machine(), UINT16, 0x40);
memset(megadrive_vdp_palette_lookup,0x00,0x40*2);
memset(megadrive_vdp_palette_lookup_sprite,0x00,0x40*2);
memset(megadrive_vdp_palette_lookup_shadow,0x00,0x40*2);
memset(megadrive_vdp_palette_lookup_highlight,0x00,0x40*2);
if (!m_use_alt_timing)
{
m_render_bitmap = auto_bitmap_ind16_alloc(machine(), machine().primary_screen->width(), machine().primary_screen->height());
@ -187,11 +203,14 @@ void sega_genesis_vdp_device::device_start()
m_render_line = auto_alloc_array(machine(), UINT16, machine().primary_screen->width());
}
m_render_line_raw = auto_alloc_array(machine(), UINT16, machine().primary_screen->width());
irq6_on_timer = machine().scheduler().timer_alloc(FUNC(irq6_on_timer_callback), (void*)this);
irq4_on_timer = machine().scheduler().timer_alloc(FUNC(irq4_on_timer_callback), (void*)this);
megadriv_render_timer = machine().scheduler().timer_alloc(FUNC(megadriv_render_timer_callback), (void*)this);
m_space68k = machine().device<legacy_cpu_device>(":maincpu")->space();
m_cpu68k = machine().device<legacy_cpu_device>(":maincpu");
}
void sega_genesis_vdp_device::device_reset()
@ -275,7 +294,12 @@ void sega_genesis_vdp_device::write_cram_value(running_machine &machine, int off
r = ((data >> 1)&0x07);
g = ((data >> 5)&0x07);
b = ((data >> 9)&0x07);
palette_set_color_rgb(machine,offset,pal3bit(r),pal3bit(g),pal3bit(b));
if (m_palwrite_base != -1)
{
palette_set_color_rgb(machine,offset + m_palwrite_base ,pal3bit(r),pal3bit(g),pal3bit(b));
palette_set_color_rgb(machine,offset + m_palwrite_base + 0x40 ,pal3bit(r>>1),pal3bit(g>>1),pal3bit(b>>1));
palette_set_color_rgb(machine,offset + m_palwrite_base + 0x80 ,pal3bit((r>>1)|0x4),pal3bit((g>>1)|0x4),pal3bit((b>>1)|0x4));
}
megadrive_vdp_palette_lookup[offset] = (b<<2) | (g<<7) | (r<<12);
megadrive_vdp_palette_lookup_sprite[offset] = (b<<2) | (g<<7) | (r<<12);
megadrive_vdp_palette_lookup_shadow[offset] = (b<<1) | (g<<6) | (r<<11);
@ -452,14 +476,13 @@ void sega_genesis_vdp_device::update_m_vdp_code_and_address(void)
((m_vdp_command_part2 & 0x0003) << 14);
}
UINT16 (*vdp_get_word_from_68k_mem)(running_machine &machine, UINT32 source);
UINT16 (*vdp_get_word_from_68k_mem)(running_machine &machine, UINT32 source, address_space* space68k);
UINT16 vdp_get_word_from_68k_mem_default(running_machine &machine, UINT32 source)
UINT16 vdp_get_word_from_68k_mem_default(running_machine &machine, UINT32 source, address_space* space68k)
{
// should we limit the valid areas here?
// how does this behave with the segacd etc?
// note, the RV bit on 32x is important for this to work, because it causes a normal cart mapping - see tempo
address_space *space68k = machine.device<legacy_cpu_device>("maincpu")->space();
//printf("vdp_get_word_from_68k_mem_default %08x\n", source);
@ -552,11 +575,11 @@ void sega_genesis_vdp_device::megadrive_do_insta_68k_to_vram_dma(running_machine
if (length==0x00) length = 0xffff;
/* This is a hack until real DMA timings are implemented */
device_spin_until_time(machine.device(":maincpu"), attotime::from_nsec(length * 1000 / 3500));
device_spin_until_time(m_cpu68k, attotime::from_nsec(length * 1000 / 3500));
for (count = 0;count<(length>>1);count++)
{
vdp_vram_write(vdp_get_word_from_68k_mem(machine, source));
vdp_vram_write(vdp_get_word_from_68k_mem(machine, source, m_space68k));
source+=2;
if (source>0xffffff) source = 0xe00000;
}
@ -582,7 +605,7 @@ void sega_genesis_vdp_device::megadrive_do_insta_68k_to_cram_dma(running_machine
{
//if (m_vdp_address>=0x80) return; // abandon
write_cram_value(machine, (m_vdp_address&0x7e)>>1, vdp_get_word_from_68k_mem(machine, source));
write_cram_value(machine, (m_vdp_address&0x7e)>>1, vdp_get_word_from_68k_mem(machine, source, m_space68k));
source+=2;
if (source>0xffffff) source = 0xfe0000;
@ -610,7 +633,7 @@ void sega_genesis_vdp_device::megadrive_do_insta_68k_to_vsram_dma(running_machin
{
if (m_vdp_address>=0x80) return; // abandon
m_vsram[(m_vdp_address&0x7e)>>1] = vdp_get_word_from_68k_mem(machine, source);
m_vsram[(m_vdp_address&0x7e)>>1] = vdp_get_word_from_68k_mem(machine, source, m_space68k);
source+=2;
if (source>0xffffff) source = 0xfe0000;
@ -2575,13 +2598,24 @@ void sega_genesis_vdp_device::genesis_render_videobuffer_to_screenbuffer(running
}
}
if (!(dat&0x20000))
m_render_line_raw[x] = 0x100;
else
m_render_line_raw[x] = 0x000;
if (drawn==0)
{
if (dat&0x10000)
lineptr[x] = megadrive_vdp_palette_lookup_sprite[(dat&0x0f) | segac2_sp_pal_lookup[(dat&0x30)>>4]];
{
lineptr[x] = megadrive_vdp_palette_lookup_sprite[(dat&0x3f)];
m_render_line_raw[x] |= (dat & 0x3f) | 0x080;
}
else
lineptr[x] = megadrive_vdp_palette_lookup[(dat&0x0f) | segac2_bg_pal_lookup[(dat&0x30)>>4]];
{
lineptr[x] = megadrive_vdp_palette_lookup[(dat&0x3f)];
m_render_line_raw[x] |= (dat & 0x3f) | 0x040;
}
}
@ -2619,6 +2653,11 @@ void sega_genesis_vdp_device::genesis_render_videobuffer_to_screenbuffer(running
}
}
if (!(dat&0x20000))
m_render_line_raw[x] = 0x100;
else
m_render_line_raw[x] = 0x000;
if (drawn==0)
{
@ -2631,23 +2670,27 @@ void sega_genesis_vdp_device::genesis_render_videobuffer_to_screenbuffer(running
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&0x0f) | segac2_bg_pal_lookup[(dat&0x30)>>4]];
lineptr[x] = megadrive_vdp_palette_lookup_shadow[(dat&0x3f)];
m_render_line_raw[x] |= (dat & 0x3f) | 0x000;
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&0x0f) | segac2_bg_pal_lookup[(dat&0x30)>>4]];
lineptr[x] = megadrive_vdp_palette_lookup[(dat&0x3f)];
m_render_line_raw[x] |= (dat & 0x3f) | 0x040;
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&0x0f) | segac2_sp_pal_lookup[(dat&0x30)>>4]];
lineptr[x] = megadrive_vdp_palette_lookup_sprite[(dat&0x3f)];
m_render_line_raw[x] |= (dat & 0x3f) | 0x080;
break;
case 0x0c000: // normal pri, highlight set = highlight?
case 0x1c000: // (sprite) normal pri, highlight set = highlight?
lineptr[x] = megadrive_vdp_palette_lookup_highlight[(dat&0x0f) | segac2_bg_pal_lookup[(dat&0x30)>>4]];
lineptr[x] = megadrive_vdp_palette_lookup_highlight[(dat&0x3f)];
m_render_line_raw[x] |= (dat & 0x3f) | 0x0c0;
break;
case 0x0a000: // shadow set, highlight set - not possible
@ -2655,9 +2698,10 @@ void sega_genesis_vdp_device::genesis_render_videobuffer_to_screenbuffer(running
case 0x1a000: // (sprite)shadow set, highlight set - not possible
case 0x1e000: // (sprite)shadow set, highlight set, normal set, not possible
default:
lineptr[x] = machine.rand()&0x3f;
lineptr[x] = m_render_line_raw[x] |= (machine.rand()&0x3f);
break;
}
}
@ -2701,28 +2745,6 @@ void sega_genesis_vdp_device::genesis_render_scanline(running_machine &machine)
VIDEO_START(megadriv)
{
megadrive_vdp_palette_lookup = auto_alloc_array(machine, UINT16, 0x40);
megadrive_vdp_palette_lookup_sprite = auto_alloc_array(machine, UINT16, 0x40);
megadrive_vdp_palette_lookup_shadow = auto_alloc_array(machine, UINT16, 0x40);
megadrive_vdp_palette_lookup_highlight = auto_alloc_array(machine, UINT16, 0x40);
memset(megadrive_vdp_palette_lookup,0x00,0x40*2);
memset(megadrive_vdp_palette_lookup_sprite,0x00,0x40*2);
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;
}
@ -2879,16 +2901,16 @@ void sega_genesis_vdp_device::vdp_handle_eof(running_machine &machine)
switch (MEGADRIVE_REG0C_RS0 | (MEGADRIVE_REG0C_RS1 << 1))
{
/* note, add 240 mode + init new timings! */
case 0:scr_width = 256;break;// configure_screen(0, 256-1, megadrive_visible_scanlines-1,(double)megadriv_framerate); break;
case 1:scr_width = 256;break;// configure_screen(0, 256-1, megadrive_visible_scanlines-1,(double)megadriv_framerate); mame_printf_debug("invalid screenmode!\n"); break;
case 2:scr_width = 320;break;// configure_screen(0, 320-1, megadrive_visible_scanlines-1,(double)megadriv_framerate); break; /* technically invalid, but used in rare cases */
case 3:scr_width = 320;break;// configure_screen(0, 320-1, megadrive_visible_scanlines-1,(double)megadriv_framerate); break;
case 0:scr_width = 256;break;
case 1:scr_width = 256;break;
case 2:scr_width = 320;break;
case 3:scr_width = 320;break;
}
// mame_printf_debug("my mode %02x", m_vdp_regs[0x0c]);
visarea.set(0, scr_width-1, 0, megadrive_visible_scanlines-1);
machine.primary_screen->configure(480, megadrive_total_scanlines, visarea, HZ_TO_ATTOSECONDS(megadriv_framerate));
machine.primary_screen->configure(480, megadrive_total_scanlines, visarea, machine.primary_screen->frame_period().attoseconds);
if(_32x_is_connected)

View File

@ -146,6 +146,11 @@ typedef void (*genesis_vdp_sndirqline_callback_func)(running_machine &machine, b
typedef void (*genesis_vdp_lv6irqline_callback_func)(running_machine &machine, bool state);
typedef void (*genesis_vdp_lv4irqline_callback_func)(running_machine &machine, bool state);
TIMER_DEVICE_CALLBACK( megadriv_scanline_timer_callback_alt_timing );
extern void megadriv_reset_vdp(running_machine &machine);
extern int genvdp_use_cram;
class sega_genesis_vdp_device : public device_t
{
public:
@ -155,8 +160,11 @@ public:
static void set_genesis_vdp_lv6irqline_callback(device_t &device, genesis_vdp_lv6irqline_callback_func callback);
static void set_genesis_vdp_lv4irqline_callback(device_t &device, genesis_vdp_lv4irqline_callback_func callback);
static void set_genesis_vdp_alt_timing(device_t &device, int use_alt_timing);
static void set_genesis_vdp_palwrite_base(device_t &device, int palwrite_base);
int m_use_alt_timing; // use MAME scanline timer instead, render only one scanline to a single line buffer, to be rendered by a partial update call.. experimental
int m_palwrite_base; // if we want to write to the actual MAME palette..
DECLARE_READ16_MEMBER( megadriv_vdp_r );
DECLARE_WRITE16_MEMBER( megadriv_vdp_w );
@ -181,6 +189,7 @@ public:
bitmap_ind16* m_render_bitmap;
UINT16* m_render_line;
UINT16* m_render_line_raw;
protected:
virtual void device_start();
@ -266,6 +275,13 @@ private:
UINT8* m_sprite_renderline;
UINT8* m_highpri_renderline;
UINT32* m_video_renderline;
UINT16* megadrive_vdp_palette_lookup;
UINT16* megadrive_vdp_palette_lookup_sprite; // for C2
UINT16* megadrive_vdp_palette_lookup_shadow;
UINT16* megadrive_vdp_palette_lookup_highlight;
address_space *m_space68k;
legacy_cpu_device* m_cpu68k;
};

File diff suppressed because it is too large Load Diff

View File

@ -69,9 +69,6 @@ void segas18_state::video_start()
// initialize the tile/text layers
segaic16_tilemap_init(machine(), 0, SEGAIC16_TILEMAP_16B, 0x000, 0, 8);
// create the VDP
system18_vdp_start(machine());
save_item(NAME(m_grayscale_enable));
save_item(NAME(m_vdp_enable));
save_item(NAME(m_vdp_mixing));
@ -132,26 +129,42 @@ void segas18_state::set_vdp_mixing(UINT8 mixing)
void segas18_state::draw_vdp(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int priority)
{
bitmap_ind8 &priority_bitmap = screen.machine().priority_bitmap;
for (int y = cliprect.min_y; y <= cliprect.max_y; y++)
{
UINT16 *src = &m_temp_bitmap.pix(y);
// UINT16 *src = vdp->m_render_line; // can't use this because we're not in RGB32, which we'll need to be if there are palette effects
// UINT16 *src2 = vdp->m_render_line_raw;
UINT16 *dst = &bitmap.pix(y);
UINT8 *pri = &priority_bitmap.pix(y);
for (int x = cliprect.min_x; x <= cliprect.max_x; x++)
{
UINT16 pix = src[x];
if (pix != 0xffff)
if (m_vdp->m_render_line_raw[x] & 0x100)
{
dst[x] = pix;
pri[x] |= priority;
int pix = m_vdp->m_render_line_raw[x] & 0x3f;
if (pix & 0xf)
{
switch (pix & 0xc0)
{
case 0x00:
dst[x] = pix + 0x2000; /* 0x2040 - would be shadow? */
break;
case 0x40:
case 0x80:
dst[x] = pix + 0x2000;
break;
case 0xc0:
dst[x] = pix + 0x2000; /* 0x2080 - would be higlight? */
break;
}
pri[x] |= priority;
}
}
}
}
}
/*************************************
*
* Video update
@ -214,10 +227,6 @@ UINT32 segas18_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap,
return 0;
}
// if the VDP is enabled, update our tmp_bitmap
if (m_vdp_enable)
system18_vdp_update(m_temp_bitmap, cliprect);
// reset priorities
machine().priority_bitmap.fill(0, cliprect);