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_segacd(*this,"segacd"),
m_megadrive_ram(*this,"megadrive_ram") m_megadrive_ram(*this,"megadrive_ram")
{ } { }
optional_device<cpu_device> m_maincpu; required_device<cpu_device> m_maincpu;
optional_device<cpu_device> m_z80snd; optional_device<cpu_device> m_z80snd;
required_device<sega_genesis_vdp_device> m_vdp; required_device<sega_genesis_vdp_device> m_vdp;
optional_device<sega_32x_device> m_32x; 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; 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 }; static const sh2_cpu_core sh2_conf_master = { 0, NULL, _32x_fifo_available_callback };

View File

@ -104,7 +104,9 @@ public:
DECLARE_WRITE16_MEMBER( _32x_sh2_master_401e_w ); DECLARE_WRITE16_MEMBER( _32x_sh2_master_401e_w );
DECLARE_WRITE16_MEMBER( _32x_sh2_slave_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; int sh2_master_pwmint_enable, sh2_slave_pwmint_enable;
void _32x_check_framebuffer_swap(bool enabled); void _32x_check_framebuffer_swap(bool enabled);
@ -112,19 +114,12 @@ public:
void _32x_scanline_cb0(); void _32x_scanline_cb0();
void _32x_scanline_cb1(int scanline); 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 */ /* our main vblank handler resets this */
int m_32x_hcount_compare_val; int m_32x_hcount_compare_val;
int m_sh2_are_running; int m_sh2_are_running;
int m_32x_240mode; int m_32x_240mode;
UINT16 m_32x_a1518a_reg; 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 handle_pwm_callback();
void calculate_pwm_timer(); void calculate_pwm_timer();
UINT16 m_pwm_ctrl, m_pwm_cycle, m_pwm_tm_reg; UINT16 m_pwm_ctrl, m_pwm_cycle, m_pwm_tm_reg;
@ -138,6 +133,7 @@ public:
UINT16 get_hposition(void); UINT16 get_hposition(void);
emu_timer *m_32x_pwm_timer; emu_timer *m_32x_pwm_timer;
protected: protected:
virtual void device_start(); virtual void device_start();
virtual void device_reset(); virtual void device_reset();
@ -145,7 +141,13 @@ protected:
// optional information overrides // optional information overrides
// virtual const rom_entry *device_rom_region() const; // virtual const rom_entry *device_rom_region() const;
virtual machine_config_constructor device_mconfig_additions() const; virtual machine_config_constructor device_mconfig_additions() const;
private: 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(); // virtual void device_config_complete();
int m_32x_adapter_enabled; int m_32x_adapter_enabled;
int m_32x_access_auth; 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) 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 sega_32x_device *_32xdev = machine.device<sega_32x_device>("sega32x"); // take this out of the VDP eventually
UINT16 *lineptr;
UINT16*lineptr;
int x;
if (!m_use_alt_timing) if (!m_use_alt_timing)
{
lineptr = &m_render_bitmap->pix16(scanline); lineptr = &m_render_bitmap->pix16(scanline);
}
else else
{
lineptr = m_render_line; lineptr = m_render_line;
}
if (_32xdev) _32xdev->_32x_render_videobuffer_to_screenbuffer_helper(scanline); if (_32xdev) _32xdev->_32x_render_videobuffer_to_screenbuffer_helper(scanline);
for (int x = 0; x < 320; x++)
if (!MEGADRIVE_REG0C_SHADOW_HIGLIGHT)
{ {
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; if (!MEGADRIVE_REG0C_SHADOW_HIGLIGHT)
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 (dat & 0x10000)
{ {
if (!_32xdev->m_32x_videopriority) lineptr[x] = megadrive_vdp_palette_lookup_sprite[(dat & 0x3f)];
{
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)];
m_render_line_raw[x] |= (dat & 0x3f) | 0x080; m_render_line_raw[x] |= (dat & 0x3f) | 0x080;
} }
else 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; 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 else
m_render_line_raw[x] = 0x000;
if (drawn==0)
{ {
/* Verify my handling.. I'm not sure all cases are correct */ /* 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 0x00000: // low priority, no shadow sprite, no highlight = shadow
case 0x02000: // low priority, 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 0x10000: // (sprite) low priority, no shadow sprite, no highlight = shadow
case 0x12000: // (sprite) low priority, 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? 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; m_render_line_raw[x] |= (dat & 0x3f) | 0x000;
break; break;
case 0x4000: // normal pri, no shadow sprite, no highlight = normal; case 0x4000: // normal pri, no shadow sprite, no highlight = normal;
case 0x8000: // low pri, highlight sprite = 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; m_render_line_raw[x] |= (dat & 0x3f) | 0x040;
break; break;
case 0x14000: // (sprite) normal pri, no shadow sprite, no highlight = normal; case 0x14000: // (sprite) normal pri, no shadow sprite, no highlight = normal;
case 0x18000: // (sprite) low pri, highlight sprite = 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; m_render_line_raw[x] |= (dat & 0x3f) | 0x080;
break; break;
case 0x0c000: // normal pri, highlight set = highlight? case 0x0c000: // normal pri, highlight set = highlight?
case 0x1c000: // (sprite) 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; m_render_line_raw[x] |= (dat & 0x3f) | 0x0c0;
break; 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 0x1a000: // (sprite)shadow set, highlight set - not possible
case 0x1e000: // (sprite)shadow set, highlight set, normal set, not possible case 0x1e000: // (sprite)shadow set, highlight set, normal set, not possible
default: default:
lineptr[x] = m_render_line_raw[x] |= (machine.rand()&0x3f); lineptr[x] = m_render_line_raw[x] |= (machine.rand() & 0x3f);
break; 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;
} }
} }
} }
// 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) void sega_genesis_vdp_device::genesis_render_scanline(running_machine &machine)
{ {
int scanline = genesis_get_scanline_counter(machine); int scanline = genesis_get_scanline_counter(machine);
if (scanline >= 0 && scanline < m_visible_scanlines) if (scanline >= 0 && scanline < m_visible_scanlines)
{ {
//if (MEGADRIVE_REG01_DMA_ENABLE==0) mame_printf_debug("off\n"); //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 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, // Unfortunately, there are ROMs without correct info in the header,
// Hence, when loading from fullpath we do the SRAM mapping anyway... // Hence, when loading from fullpath we do the SRAM mapping anyway...
// but treat it in a custom way // but treat it in a custom way