From e7645c8444b98003af602bf9ff957a2852c6eb89 Mon Sep 17 00:00:00 2001 From: angelosa Date: Thu, 24 Oct 2019 21:06:16 +0200 Subject: [PATCH] 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] --- src/mame/drivers/ikki.cpp | 3 +- src/mame/drivers/markham.cpp | 70 ++++++++++++++++++++---------------- src/mame/includes/markham.h | 5 ++- src/mame/video/markham.cpp | 20 ++++++----- 4 files changed, 57 insertions(+), 41 deletions(-) diff --git a/src/mame/drivers/ikki.cpp b/src/mame/drivers/ikki.cpp index 7a1ecbec6c1..7496dec9f9a 100644 --- a/src/mame/drivers/ikki.cpp +++ b/src/mame/drivers/ikki.cpp @@ -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); diff --git a/src/mame/drivers/markham.cpp b/src/mame/drivers/markham.cpp index b0f4e3a6b63..77c7867f292 100644 --- a/src/mame/drivers/markham.cpp +++ b/src/mame/drivers/markham.cpp @@ -61,15 +61,11 @@ WRITE8_MEMBER(markham_state::coin_output_w) } } -template 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 ) diff --git a/src/mame/includes/markham.h b/src/mame/includes/markham.h index a8890e473e1..2d6b79d64e2 100644 --- a/src/mame/includes/markham.h +++ b/src/mame/includes/markham.h @@ -66,7 +66,7 @@ private: void strnskil_slave_map(address_map &map); DECLARE_WRITE8_MEMBER(coin_output_w); - template 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 diff --git a/src/mame/video/markham.cpp b/src/mame/video/markham.cpp index bced837ddf3..834faf958a5 100644 --- a/src/mame/video/markham.cpp +++ b/src/mame/video/markham.cpp @@ -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; - } } }