mirror of
https://github.com/holub/mame
synced 2025-07-03 17:08:39 +03:00
megadriv.c: small steps to keep a few 32x operations inside 32x. nw.
This commit is contained in:
parent
1015102ba1
commit
e43d8ac84e
@ -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;
|
||||||
|
@ -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 };
|
||||||
|
@ -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;
|
||||||
|
@ -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");
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user