mirror of
https://github.com/holub/mame
synced 2025-04-22 16:31:49 +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_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;
|
||||
|
@ -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 };
|
||||
|
@ -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;
|
||||
|
@ -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");
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user