mirror of
https://github.com/holub/mame
synced 2025-04-23 00:39:36 +03:00
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:
parent
5d5e0345e0
commit
e7645c8444
@ -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);
|
||||
|
||||
|
@ -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 )
|
||||
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user