megadriv.c: small steps to keep a few 32x operations inside 32x. nw.

This commit is contained in:
Fabio Priuli 2013-03-25 09:34:10 +00:00
parent 1015102ba1
commit e43d8ac84e
5 changed files with 92 additions and 142 deletions

View File

@ -97,7 +97,7 @@ public:
m_segacd(*this,"segacd"),
m_megadrive_ram(*this,"megadrive_ram")
{ }
optional_device<cpu_device> m_maincpu;
required_device<cpu_device> m_maincpu;
optional_device<cpu_device> m_z80snd;
required_device<sega_genesis_vdp_device> m_vdp;
optional_device<sega_32x_device> m_32x;

View File

@ -1602,7 +1602,7 @@ int _32x_fifo_available_callback(device_t *device, UINT32 src, UINT32 dst, UINT3
UINT32* sega_32x_device::_32x_render_videobuffer_to_screenbuffer_helper(int scanline)
void sega_32x_device::_32x_render_videobuffer_to_screenbuffer_helper(int scanline)
{
int x;
@ -1707,8 +1707,50 @@ UINT32* sega_32x_device::_32x_render_videobuffer_to_screenbuffer_helper(int scan
}
}
}
}
return m_32x_linerender;
int sega_32x_device::_32x_render_videobuffer_to_screenbuffer_lopri(int x, UINT16 &lineptr)
{
int drawn = 0;
if (m_32x_displaymode != 0)
{
if (!m_32x_videopriority)
{
if (!(m_32x_linerender[x] & 0x8000))
{
lineptr = m_32x_linerender[x] & 0x7fff;
drawn = 1;
}
}
else
{
if (m_32x_linerender[x] & 0x8000)
{
lineptr = m_32x_linerender[x] & 0x7fff;
drawn = 1;
}
}
}
return drawn;
}
void sega_32x_device::_32x_render_videobuffer_to_screenbuffer_hipri(int x, UINT16 &lineptr)
{
if (m_32x_displaymode != 0)
{
if (!m_32x_videopriority)
{
if (m_32x_linerender[x] & 0x8000)
lineptr = m_32x_linerender[x] & 0x7fff;
}
else
{
if (!(m_32x_linerender[x] & 0x8000))
lineptr = m_32x_linerender[x] & 0x7fff;
}
}
}
static const sh2_cpu_core sh2_conf_master = { 0, NULL, _32x_fifo_available_callback };

View File

@ -33,12 +33,12 @@ public:
required_device<dac_device> m_rch_pwm;
void pause_cpu();
// set some variables at start, depending on region (shall be moved to a device interface?)
void set_framerate(int rate) { m_framerate = rate; }
void set_32x_pal(bool pal) { m_32x_pal = pal ? 1 : 0; }
DECLARE_READ32_MEMBER( _32x_sh2_master_4000_common_4002_r );
DECLARE_READ32_MEMBER( _32x_sh2_slave_4000_common_4002_r );
DECLARE_READ32_MEMBER( _32x_sh2_common_4004_common_4006_r );
@ -104,7 +104,9 @@ public:
DECLARE_WRITE16_MEMBER( _32x_sh2_master_401e_w );
DECLARE_WRITE16_MEMBER( _32x_sh2_slave_401e_w );
UINT32* _32x_render_videobuffer_to_screenbuffer_helper(int scanline);
void _32x_render_videobuffer_to_screenbuffer_helper(int scanline);
int _32x_render_videobuffer_to_screenbuffer_lopri(int x, UINT16 &lineptr);
void _32x_render_videobuffer_to_screenbuffer_hipri(int x, UINT16 &lineptr);
int sh2_master_pwmint_enable, sh2_slave_pwmint_enable;
void _32x_check_framebuffer_swap(bool enabled);
@ -112,19 +114,12 @@ public:
void _32x_scanline_cb0();
void _32x_scanline_cb1(int scanline);
/* our current main rendering code needs to know this for mixing in */
int m_32x_displaymode;
int m_32x_videopriority;
/* our main vblank handler resets this */
int m_32x_hcount_compare_val;
int m_sh2_are_running;
int m_32x_240mode;
UINT16 m_32x_a1518a_reg;
UINT32 m_32x_linerender[320+258]; // tmp buffer (bigger than it needs to be to simplify RLE decode)
void handle_pwm_callback();
void calculate_pwm_timer();
UINT16 m_pwm_ctrl, m_pwm_cycle, m_pwm_tm_reg;
@ -138,6 +133,7 @@ public:
UINT16 get_hposition(void);
emu_timer *m_32x_pwm_timer;
protected:
virtual void device_start();
virtual void device_reset();
@ -145,7 +141,13 @@ protected:
// optional information overrides
// virtual const rom_entry *device_rom_region() const;
virtual machine_config_constructor device_mconfig_additions() const;
private:
int m_32x_displaymode;
int m_32x_videopriority;
UINT32 m_32x_linerender[320+258]; // tmp buffer (bigger than it needs to be to simplify RLE decode)
// virtual void device_config_complete();
int m_32x_adapter_enabled;
int m_32x_access_auth;

View File

@ -2498,124 +2498,50 @@ void sega_genesis_vdp_device::genesis_render_videoline_to_videobuffer(int scanli
void sega_genesis_vdp_device::genesis_render_videobuffer_to_screenbuffer(running_machine &machine, int scanline)
{
sega_32x_device *_32xdev = machine.device<sega_32x_device>("sega32x"); // take this out of the VDP eventually
UINT16*lineptr;
int x;
UINT16 *lineptr;
if (!m_use_alt_timing)
{
lineptr = &m_render_bitmap->pix16(scanline);
}
else
{
lineptr = m_render_line;
}
if (_32xdev) _32xdev->_32x_render_videobuffer_to_screenbuffer_helper(scanline);
if (!MEGADRIVE_REG0C_SHADOW_HIGLIGHT)
for (int x = 0; x < 320; x++)
{
for (x=0;x<320;x++)
UINT32 dat = m_video_renderline[x];
int drawn = 0;
// low priority 32x - if it's the bg pen, we have a 32x, and its display is enabled...
if (_32xdev && dat & 0x20000)
drawn = _32xdev->_32x_render_videobuffer_to_screenbuffer_lopri(x, lineptr[x]);
if (!(dat & 0x20000))
m_render_line_raw[x] = 0x100;
else
m_render_line_raw[x] = 0x000;
if (!drawn)
{
UINT32 dat;
dat = m_video_renderline[x];
int drawn = 0;
// low priority 32x - if it's the bg pen, we have a 32x, and it's display is enabled...
if (_32xdev)
if (!MEGADRIVE_REG0C_SHADOW_HIGLIGHT)
{
if ((dat&0x20000) && (_32xdev->m_32x_displaymode != 0))
if (dat & 0x10000)
{
if (!_32xdev->m_32x_videopriority)
{
if (!(_32xdev->m_32x_linerender[x]&0x8000))
{
lineptr[x] = _32xdev->m_32x_linerender[x]&0x7fff;
drawn = 1;
}
}
else
{
if ((_32xdev->m_32x_linerender[x]&0x8000))
{
lineptr[x] = _32xdev->m_32x_linerender[x]&0x7fff;
drawn = 1;
}
}
}
}
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&0x3f)];
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&0x3f)];
lineptr[x] = megadrive_vdp_palette_lookup[(dat & 0x3f)];
m_render_line_raw[x] |= (dat & 0x3f) | 0x040;
}
}
}
}
else
{
for (x=0;x<320;x++)
{
UINT32 dat;
dat = m_video_renderline[x];
int drawn = 0;
// low priority 32x - if it's the bg pen, we have a 32x, and it's display is enabled...
if (_32xdev)
{
if ((dat&0x20000) && (_32xdev->m_32x_displaymode != 0))
{
if (!_32xdev->m_32x_videopriority)
{
if (!(_32xdev->m_32x_linerender[x]&0x8000))
{
lineptr[x] = _32xdev->m_32x_linerender[x]&0x7fff;
drawn = 1;
}
}
else
{
if ((_32xdev->m_32x_linerender[x]&0x8000))
{
lineptr[x] = _32xdev->m_32x_linerender[x]&0x7fff;
drawn = 1;
}
}
}
}
if (!(dat&0x20000))
m_render_line_raw[x] = 0x100;
else
m_render_line_raw[x] = 0x000;
if (drawn==0)
{
/* Verify my handling.. I'm not sure all cases are correct */
switch (dat&0x1e000)
switch (dat & 0x1e000)
{
case 0x00000: // low priority, no shadow sprite, no highlight = shadow
case 0x02000: // low priority, shadow sprite, no highlight = shadow
@ -2623,26 +2549,26 @@ 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&0x3f)];
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&0x3f)];
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&0x3f)];
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&0x3f)];
lineptr[x] = megadrive_vdp_palette_lookup_highlight[(dat & 0x3f)];
m_render_line_raw[x] |= (dat & 0x3f) | 0x0c0;
break;
@ -2651,44 +2577,22 @@ 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] = m_render_line_raw[x] |= (machine.rand()&0x3f);
break;
}
}
}
}
// high priority 32x
if (_32xdev)
{
if (_32xdev->m_32x_displaymode != 0)
{
for (x=0;x<320;x++)
{
if (!_32xdev->m_32x_videopriority)
{
if ((_32xdev->m_32x_linerender[x]&0x8000))
lineptr[x] = _32xdev->m_32x_linerender[x]&0x7fff;
}
else
{
if (!(_32xdev->m_32x_linerender[x]&0x8000))
lineptr[x] = _32xdev->m_32x_linerender[x]&0x7fff;
lineptr[x] = m_render_line_raw[x] |= (machine.rand() & 0x3f);
break;
}
}
}
// high priority 32x
if (_32xdev)
_32xdev->_32x_render_videobuffer_to_screenbuffer_hipri(x, lineptr[x]);
}
}
void sega_genesis_vdp_device::genesis_render_scanline(running_machine &machine)
{
int scanline = genesis_get_scanline_counter(machine);
if (scanline >= 0 && scanline < m_visible_scanlines)
{
//if (MEGADRIVE_REG01_DMA_ENABLE==0) mame_printf_debug("off\n");

View File

@ -886,6 +886,8 @@ int base_md_cart_slot_device::get_cart_type(UINT8 *ROM, UINT32 len)
}
else
{
logerror("No SRAM detected from header, using fallback SRAM in case this is a broken header\n");
// Unfortunately, there are ROMs without correct info in the header,
// Hence, when loading from fullpath we do the SRAM mapping anyway...
// but treat it in a custom way