markham.cpp: improved master irq firing and rowscroll in Strength & Skill, which was causing missing sprites in stage 2 and 3 at least [Angelo Salese]

This commit is contained in:
angelosa 2019-10-24 21:06:16 +02:00
parent 5d5e0345e0
commit e7645c8444
4 changed files with 57 additions and 41 deletions

View File

@ -242,7 +242,8 @@ TIMER_DEVICE_CALLBACK_MEMBER(ikki_state::ikki_irq)
{
int scanline = param;
if(scanline == 240 || scanline == 120) // TODO: where non-timer IRQ happens?
// TODO: where non-vblank IRQ happens?
if(scanline == 240 || scanline == 120)
{
m_maincpu->set_input_line(0,HOLD_LINE);

View File

@ -61,15 +61,11 @@ WRITE8_MEMBER(markham_state::coin_output_w)
}
}
template<int Bit>
WRITE8_MEMBER(markham_state::flipscreen_w)
{
// Strength & Skill hardware only
m_scroll_ctrl = data >> 5;
if (flip_screen() != (BIT(data, Bit)))
if (flip_screen() != (BIT(data, 0)))
{
flip_screen_set(BIT(data, Bit));
flip_screen_set(BIT(data, 0));
machine().tilemap().mark_all_dirty();
}
}
@ -82,10 +78,25 @@ READ8_MEMBER(markham_state::strnskil_d800_r)
return (m_irq_source);
}
WRITE8_MEMBER(markham_state::strnskil_master_output_w)
{
m_scroll_ctrl = data >> 5;
if (flip_screen() != (BIT(data, 3)))
{
flip_screen_set(BIT(data, 3));
machine().tilemap().mark_all_dirty();
}
// bit 0: master CPU bus request?
}
TIMER_DEVICE_CALLBACK_MEMBER(markham_state::strnskil_scanline)
{
int scanline = param;
// same as Ikki, whereas if non-vblank IRQ isn't in-sync with slave CPU irqs then stage 2/3 lacks any sprite whatsoever.
// TODO: maybe this is just a timer device that dispatches irqs to both CPUs and running at VSync*2. Verify on real HW or schematics.
if (scanline == m_irq_scanline_end || scanline == m_irq_scanline_start)
{
m_maincpu->set_input_line(0, HOLD_LINE);
@ -205,7 +216,7 @@ void markham_state::markham_master_map(address_map &map)
map(0xe009, 0xe009).nopw(); /* to CPU2 busreq */
map(0xe00c, 0xe00d).writeonly().share("xscroll");
map(0xe00e, 0xe00e).w(FUNC(markham_state::flipscreen_w<0>));
map(0xe00e, 0xe00e).w(FUNC(markham_state::flipscreen_w));
}
void markham_state::strnskil_master_map(address_map &map)
@ -223,8 +234,7 @@ void markham_state::strnskil_master_map(address_map &map)
map(0xd804, 0xd804).portr("P1");
map(0xd805, 0xd805).portr("P2");
/* same write used here is used for scrolling */
map(0xd808, 0xd808).w(FUNC(markham_state::flipscreen_w<3>));
map(0xd808, 0xd808).w(FUNC(markham_state::strnskil_master_output_w));
map(0xd809, 0xd809).w(FUNC(markham_state::coin_output_w));
map(0xd80a, 0xd80b).writeonly().share("xscroll");
}
@ -543,6 +553,26 @@ static GFXDECODE_START( gfx_markham )
GFXDECODE_ENTRY( "gfx1", 0x0000, spritelayout, 0, 64 )
GFXDECODE_END
void markham_state::machine_start()
{
save_item(NAME(m_coin2_lock_cnt));
/* banbam specific */
save_item(NAME(m_packet_buffer));
save_item(NAME(m_packet_reset));
save_item(NAME(m_packet_write_pos));
}
void markham_state::machine_reset()
{
/* prevent phantom coins again */
m_coin2_lock_cnt = 3;
/* banbam specific */
m_packet_write_pos = 0;
m_packet_reset = true;
}
void markham_state::markham(machine_config &config)
{
/* basic machine hardware */
@ -554,7 +584,7 @@ void markham_state::markham(machine_config &config)
m_subcpu->set_addrmap(AS_PROGRAM, &markham_state::markham_slave_map);
m_subcpu->set_vblank_int("screen", FUNC(markham_state::irq0_line_hold));
config.m_minimum_quantum = attotime::from_hz(6000);
config.m_minimum_quantum = attotime::from_hz(CPU_CLOCK/256);
/* video hardware */
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
@ -786,26 +816,6 @@ ROM_START( pettanp )
ROM_LOAD( "sun-8212.ic3", 0x000, 0x800, NO_DUMP ) // very much likely to be same as banbam and arabian
ROM_END
void markham_state::machine_start()
{
save_item(NAME(m_coin2_lock_cnt));
/* banbam specific */
save_item(NAME(m_packet_buffer));
save_item(NAME(m_packet_reset));
save_item(NAME(m_packet_write_pos));
}
void markham_state::machine_reset()
{
/* prevent phantom coins again */
m_coin2_lock_cnt = 3;
/* banbam specific */
m_packet_write_pos = 0;
m_packet_reset = true;
}
/* Markham hardware */
GAME( 1983, markham, 0, markham, markham, markham_state, empty_init, ROT0, "Sun Electronics", "Markham", MACHINE_SUPPORTS_SAVE )

View File

@ -66,7 +66,7 @@ private:
void strnskil_slave_map(address_map &map);
DECLARE_WRITE8_MEMBER(coin_output_w);
template<int Bit> DECLARE_WRITE8_MEMBER(flipscreen_w);
DECLARE_WRITE8_MEMBER(flipscreen_w);
DECLARE_WRITE8_MEMBER(videoram_w);
// markham specific
@ -74,6 +74,7 @@ private:
// strnskil specific
DECLARE_READ8_MEMBER(strnskil_d800_r);
DECLARE_WRITE8_MEMBER(strnskil_master_output_w);
// protection comms for banbam/pettanp
DECLARE_READ8_MEMBER(banbam_protection_r);
@ -124,6 +125,8 @@ private:
uint8_t m_packet_buffer[2];
uint8_t m_packet_write_pos;
bool m_packet_reset;
u8 m_strnskil_slave_irq;
};
#endif // MAME_INCLUDES_MARKHAM_H

View File

@ -64,7 +64,7 @@ VIDEO_START_MEMBER(markham_state, strnskil)
video_start();
m_bg_tilemap->set_scroll_rows(32);
m_irq_scanline_start = 96;
m_irq_scanline_start = 109;
m_irq_scanline_end = 240;
save_item(NAME(m_irq_source));
@ -141,16 +141,18 @@ uint32_t markham_state::screen_update_strnskil(screen_device &screen, bitmap_ind
for (row = 0; row < 32; row++)
{
if (m_scroll_ctrl != 0x07)
switch (scroll_data[m_scroll_ctrl * 32 + row])
{
switch (scroll_data[m_scroll_ctrl * 32 + row])
{
case 2:
m_bg_tilemap->set_scrollx(row, -~m_xscroll[1]);
case 4:
m_bg_tilemap->set_scrollx(row, -~m_xscroll[0]);
case 2:
m_bg_tilemap->set_scrollx(row, -~m_xscroll[1]);
break;
case 4:
m_bg_tilemap->set_scrollx(row, -~m_xscroll[0]);
break;
default:
// case 6 and 0
m_bg_tilemap->set_scrollx(row, 0);
break;
}
}
}