sms: device finder. (nw)

This commit is contained in:
Ryan Holtz 2018-05-26 10:43:03 +02:00
parent e8a343e6b6
commit b5bf41c31a
3 changed files with 51 additions and 66 deletions

View File

@ -601,11 +601,11 @@ MACHINE_CONFIG_START(sms_state::sms1_ntsc)
MCFG_SCREEN_ADD("left_lcd", LCD) // This is needed for SegaScope Left LCD
MCFG_SCREEN_SMS_NTSC_RAW_PARAMS(XTAL(10'738'635)/2)
MCFG_SCREEN_UPDATE_DRIVER(sms_state, screen_update_sms1)
MCFG_SCREEN_UPDATE_DRIVER(sms_state, screen_update_sms1_left)
MCFG_SCREEN_ADD("right_lcd", LCD) // This is needed for SegaScope Right LCD
MCFG_SCREEN_SMS_NTSC_RAW_PARAMS(XTAL(10'738'635)/2)
MCFG_SCREEN_UPDATE_DRIVER(sms_state, screen_update_sms1)
MCFG_SCREEN_UPDATE_DRIVER(sms_state, screen_update_sms1_right)
MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, sms_state, screen_vblank_sms1))

View File

@ -58,6 +58,8 @@ public:
m_led_pwr(*this, "led_pwr"),
m_region_maincpu(*this, "maincpu"),
m_mainram(nullptr),
m_left_lcd(*this, "left_lcd"),
m_right_lcd(*this, "right_lcd"),
m_is_gamegear(false),
m_is_smsj(false),
m_is_mark_iii(false),
@ -117,6 +119,8 @@ public:
uint32_t screen_update_sms(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
uint32_t screen_update_sms1(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
uint32_t screen_update_sms1_left(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
uint32_t screen_update_sms1_right(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
uint32_t screen_update_gamegear(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
void screen_gg_sms_mode_scaling(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
DECLARE_WRITE_LINE_MEMBER(screen_vblank_sms1);
@ -187,8 +191,8 @@ protected:
uint8_t *m_BIOS;
// for 3D glass binocular hack
device_t *m_left_lcd;
device_t *m_right_lcd;
optional_device<screen_device> m_left_lcd;
optional_device<screen_device> m_right_lcd;
bitmap_rgb32 m_prevleft_bitmap;
bitmap_rgb32 m_prevright_bitmap;

View File

@ -1259,9 +1259,6 @@ WRITE_LINE_MEMBER(smssdisp_state::sms_store_int_callback)
VIDEO_START_MEMBER(sms_state,sms1)
{
m_left_lcd = machine().device("left_lcd");
m_right_lcd = machine().device("right_lcd");
m_main_scr->register_screen_bitmap(m_prevleft_bitmap);
m_main_scr->register_screen_bitmap(m_prevright_bitmap);
save_item(NAME(m_prevleft_bitmap));
@ -1316,82 +1313,66 @@ WRITE_LINE_MEMBER(sms_state::screen_vblank_sms1)
}
}
uint32_t sms_state::screen_update_sms1(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
uint8_t sscope = 0;
uint8_t sscope_binocular_hack;
uint8_t occluded_view = 0;
m_vdp->screen_update(screen, bitmap, cliprect);
return 0;
}
uint32_t sms_state::screen_update_sms1_left(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
uint8_t sscope = m_port_scope->read();
if (&screen != m_main_scr)
{
sscope = m_port_scope->read();
if (!sscope)
{
// without SegaScope, both LCDs for glasses go black
occluded_view = 1;
}
else if (&screen == m_left_lcd)
{
// with SegaScope, state 0 = left screen OFF, right screen ON
if (!(m_frame_sscope_state & 0x01))
occluded_view = 1;
}
else // it's right LCD
{
// with SegaScope, state 1 = left screen ON, right screen OFF
if (m_frame_sscope_state & 0x01)
occluded_view = 1;
}
}
if (!occluded_view)
if (sscope && BIT(m_frame_sscope_state, 0))
{
m_vdp->screen_update(screen, bitmap, cliprect);
// HACK: fake 3D->2D handling (if enabled, it repeats each frame twice on the selected lens)
// save a copy of current bitmap for the binocular hack
if (sscope)
{
sscope_binocular_hack = m_port_scope_binocular->read();
if (&screen == m_left_lcd)
{
if (sscope_binocular_hack & 0x01)
if (BIT(m_port_scope_binocular->read(), 0))
copybitmap(m_prevleft_bitmap, bitmap, 0, 0, 0, 0, cliprect);
}
else // it's right LCD
{
if (sscope_binocular_hack & 0x02)
copybitmap(m_prevright_bitmap, bitmap, 0, 0, 0, 0, cliprect);
}
}
}
else
{
// HACK: fake 3D->2D handling (if enabled, it repeats each frame twice on the selected lens)
// use the copied bitmap for the binocular hack
if (sscope)
{
sscope_binocular_hack = m_port_scope_binocular->read();
if (&screen == m_left_lcd)
{
if (sscope_binocular_hack & 0x01)
if (sscope && BIT(m_port_scope_binocular->read(), 0))
{
copybitmap(bitmap, m_prevleft_bitmap, 0, 0, 0, 0, cliprect);
return 0;
}
bitmap.fill(rgb_t::black(), cliprect);
}
else // it's right LCD
return 0;
}
uint32_t sms_state::screen_update_sms1_right(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
uint8_t sscope = m_port_scope->read();
// without SegaScope, both LCDs for glasses go black
// with SegaScope, state 1 = left screen ON, right screen OFF
if (sscope && !BIT(m_frame_sscope_state, 0))
{
if (sscope_binocular_hack & 0x02)
m_vdp->screen_update(screen, bitmap, cliprect);
// HACK: fake 3D->2D handling (if enabled, it repeats each frame twice on the selected lens)
// save a copy of current bitmap for the binocular hack
if (BIT(m_port_scope_binocular->read(), 1))
copybitmap(m_prevright_bitmap, bitmap, 0, 0, 0, 0, cliprect);
}
else
{
// HACK: fake 3D->2D handling (if enabled, it repeats each frame twice on the selected lens)
// use the copied bitmap for the binocular hack
if (sscope && BIT(m_port_scope_binocular->read(), 1))
{
copybitmap(bitmap, m_prevright_bitmap, 0, 0, 0, 0, cliprect);
return 0;
}
}
}
bitmap.fill(rgb_t::black(), cliprect);
}