summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author hap <happppp@users.noreply.github.com>2026-04-09 14:01:18 +0200
committer hap <happppp@users.noreply.github.com>2026-04-09 14:01:38 +0200
commit016b00779e27eaa039f54a487a7411dd59bb69f7 (patch)
tree760c7505f75323b8c5707ea55389e616df9ab27a
parent5ad1cde7e833da74d6f6a7ef71465b33ca17ddef (diff)
tigeroad: add manual sprite dma trigger and irq4 [hap, Jim Westfall]
-rw-r--r--src/mame/capcom/bionicc.cpp2
-rw-r--r--src/mame/capcom/tigeroad.cpp32
-rw-r--r--src/mame/capcom/tigeroad.h6
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;