diff options
| author | 2026-04-09 14:01:18 +0200 | |
|---|---|---|
| committer | 2026-04-09 14:01:38 +0200 | |
| commit | 016b00779e27eaa039f54a487a7411dd59bb69f7 (patch) | |
| tree | 760c7505f75323b8c5707ea55389e616df9ab27a | |
| parent | 5ad1cde7e833da74d6f6a7ef71465b33ca17ddef (diff) | |
tigeroad: add manual sprite dma trigger and irq4 [hap, Jim Westfall]
| -rw-r--r-- | src/mame/capcom/bionicc.cpp | 2 | ||||
| -rw-r--r-- | src/mame/capcom/tigeroad.cpp | 32 | ||||
| -rw-r--r-- | src/mame/capcom/tigeroad.h | 6 |
3 files changed, 29 insertions, 11 deletions
diff --git a/src/mame/capcom/bionicc.cpp b/src/mame/capcom/bionicc.cpp index 777e644851d..5dcc4fc39ba 100644 --- a/src/mame/capcom/bionicc.cpp +++ b/src/mame/capcom/bionicc.cpp @@ -200,7 +200,7 @@ void bionicc_state::main_map(address_map &map) map(0xe4002, 0xe4002).mirror(0x3ffc).w(FUNC(bionicc_state::audiocpu_nmi_w)); map(0xe4002, 0xe4003).mirror(0x3ffc).portr("DSW"); map(0xe8010, 0xe8017).w(FUNC(bionicc_state::scroll_w)); - map(0xe8018, 0xe8019).w(m_spriteram, FUNC(buffered_spriteram16_device::write)); + map(0xe8018, 0xe8019).w(m_spriteram, FUNC(buffered_spriteram16_device::write)); // should only work in vblank? map(0xe801a, 0xe801b).w(FUNC(bionicc_state::dmaon_w)); map(0xec000, 0xecfff).mirror(0x3000).ram().w(FUNC(bionicc_state::txvideoram_w)).share("txvideoram"); map(0xf0000, 0xf3fff).ram().w(FUNC(bionicc_state::fgvideoram_w)).share("fgvideoram"); diff --git a/src/mame/capcom/tigeroad.cpp b/src/mame/capcom/tigeroad.cpp index 09275218d5b..626951963b5 100644 --- a/src/mame/capcom/tigeroad.cpp +++ b/src/mame/capcom/tigeroad.cpp @@ -22,6 +22,9 @@ TODO: 010C6C: 207B 000E movea.l ($e,PC,D0.w), A0 ; table from 0x10c7c onward 010C70: 4E90 jsr (A0) ; throws address error here None of the available 5 vectors seems to fit here. + A full playthrough takes about half an hour. A faster way to test it is by + enabling all the cheats while running MAME unthrottled, and 'play' by looking + at the minimap. This comes with the risk that cheats might affect the bug. - what's up with the OBJ RAM test going up to 0xfe1807? address mirror? BTANB: @@ -89,6 +92,19 @@ void tigeroad_state::msm5205_w(u8 data) m_msm->data_w(data & 0xf); } +TIMER_DEVICE_CALLBACK_MEMBER(tigeroad_state::scanline) +{ + const int scanline = param; + + // vblank interrupt is on IRQ2 + if (scanline == 240) + m_maincpu->set_input_line(2, HOLD_LINE); + + // IRQ4 112 scanlines before IRQ2 + if (scanline == 128) + m_maincpu->set_input_line(4, HOLD_LINE); +} + // F1 Dream protection @@ -134,14 +150,14 @@ void tigeroad_state::main_map(address_map &map) map(0x000000, 0x03ffff).rom(); map(0xfe0800, 0xfe0cff).ram().share("spriteram"); - map(0xfe0d00, 0xfe1807).ram(); // still part of OBJ RAM + map(0xfe0d00, 0xfe1807).ram(); // still part of OBJ RAM map(0xfe4000, 0xfe4001).portr("P1_P2"); - map(0xfe4000, 0xfe4000).w(FUNC(tigeroad_state::videoctrl_w)); // char bank, coin counters, + ? + map(0xfe4000, 0xfe4000).w(FUNC(tigeroad_state::videoctrl_w)); // char bank, coin counters, + ? map(0xfe4002, 0xfe4003).portr("SYSTEM"); map(0xfe4002, 0xfe4002).w(m_soundlatch, FUNC(generic_latch_8_device::write)); map(0xfe4004, 0xfe4005).portr("DSW"); map(0xfe8000, 0xfe8003).w(FUNC(tigeroad_state::scroll_w)); - map(0xfe800e, 0xfe800f).nopw(); // fe800e = watchdog or IRQ acknowledge or sprite DMA + map(0xfe800e, 0xfe800f).w(m_spriteram, FUNC(buffered_spriteram16_device::write)); // should only work in vblank map(0xfec000, 0xfec7ff).ram().w(FUNC(tigeroad_state::videoram_w)).share("videoram"); map(0xff8000, 0xff87ff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); @@ -182,7 +198,7 @@ void pushman_state::bballs_map(address_map &map) map(0xe4002, 0xe4002).w(m_soundlatch, FUNC(generic_latch_8_device::write)); map(0xe4004, 0xe4005).portr("DSW"); map(0xe8000, 0xe8003).w(FUNC(pushman_state::scroll_w)); - map(0xe800e, 0xe800f).nopw(); // ? + map(0xe800e, 0xe800f).w(m_spriteram, FUNC(buffered_spriteram16_device::write)); map(0xec000, 0xec7ff).ram().w(FUNC(pushman_state::videoram_w)).share("videoram"); map(0xf8000, 0xf87ff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); @@ -640,18 +656,18 @@ void tigeroad_state::tigeroad(machine_config &config) // basic machine hardware M68000(config, m_maincpu, 10_MHz_XTAL); // verified on pcb m_maincpu->set_addrmap(AS_PROGRAM, &tigeroad_state::main_map); - m_maincpu->set_vblank_int("screen", FUNC(tigeroad_state::irq2_line_hold)); Z80(config, m_audiocpu, 3.579545_MHz_XTAL); // verified on pcb m_audiocpu->set_addrmap(AS_PROGRAM, &tigeroad_state::sound_map); + TIMER(config, "scantimer").configure_scanline(FUNC(tigeroad_state::scanline), "screen", 128, 112); + // video hardware BUFFERED_SPRITERAM16(config, "spriteram"); screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); screen.set_raw(24_MHz_XTAL / 4, 384, 0, 256, 260, 16, 240); screen.set_screen_update(FUNC(tigeroad_state::screen_update)); - screen.screen_vblank().set("spriteram", FUNC(buffered_spriteram16_device::vblank_copy_rising)); screen.set_palette(m_palette); GFXDECODE(config, m_gfxdecode, m_palette, gfx_tigeroad); @@ -718,19 +734,19 @@ void tigeroad_state::f1dream_comad(machine_config &config) // COMAD-01 PCB with // basic machine hardware M68000(config, m_maincpu, 10_MHz_XTAL); m_maincpu->set_addrmap(AS_PROGRAM, &tigeroad_state::main_map); - m_maincpu->set_vblank_int("screen", FUNC(tigeroad_state::irq2_line_hold)); Z80(config, m_audiocpu, 8_MHz_XTAL / 2); // 4MHz m_audiocpu->set_addrmap(AS_PROGRAM, &tigeroad_state::comad_sound_map); m_audiocpu->set_addrmap(AS_IO, &tigeroad_state::comad_sound_io_map); + TIMER(config, "scantimer").configure_scanline(FUNC(tigeroad_state::scanline), "screen", 128, 112); + // video hardware BUFFERED_SPRITERAM16(config, "spriteram"); screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); screen.set_raw(24_MHz_XTAL / 4, 384, 0, 256, 260, 16, 240); // assume same as tigeroad screen.set_screen_update(FUNC(tigeroad_state::screen_update)); - screen.screen_vblank().set("spriteram", FUNC(buffered_spriteram16_device::vblank_copy_rising)); screen.set_palette(m_palette); GFXDECODE(config, m_gfxdecode, m_palette, gfx_tigeroad); diff --git a/src/mame/capcom/tigeroad.h b/src/mame/capcom/tigeroad.h index f49d43c8b89..33d326fa23a 100644 --- a/src/mame/capcom/tigeroad.h +++ b/src/mame/capcom/tigeroad.h @@ -8,6 +8,7 @@ #include "cpu/z80/z80.h" #include "cpu/mcs51/i8051.h" #include "machine/gen_latch.h" +#include "machine/timer.h" #include "sound/msm5205.h" #include "sound/ymopn.h" #include "video/bufsprite.h" @@ -25,8 +26,8 @@ public: , m_audiocpu(*this, "audiocpu") , m_soundlatch(*this, "soundlatch") , m_palette(*this, "palette") - , m_has_coinlock(true) , m_spriteram(*this, "spriteram") + , m_has_coinlock(true) , m_videoram(*this, "videoram") , m_bgmap(*this, "bgmap") , m_msm(*this, "msm") @@ -45,7 +46,9 @@ protected: required_device<cpu_device> m_audiocpu; required_device<generic_latch_8_device> m_soundlatch; required_device<palette_device> m_palette; + required_device<buffered_spriteram16_device> m_spriteram; + TIMER_DEVICE_CALLBACK_MEMBER(scanline); void soundcmd_w(offs_t offset, u16 data, u16 mem_mask = ~0); void videoram_w(offs_t offset, u16 data, u16 mem_mask = ~0); void videoctrl_w(u8 data); @@ -58,7 +61,6 @@ protected: bool m_has_coinlock; private: - required_device<buffered_spriteram16_device> m_spriteram; required_shared_ptr<u16> m_videoram; required_region_ptr<u16> m_bgmap; optional_device<msm5205_device> m_msm; |
