summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/ambush.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/ambush.cpp')
-rw-r--r--src/mame/drivers/ambush.cpp65
1 files changed, 46 insertions, 19 deletions
diff --git a/src/mame/drivers/ambush.cpp b/src/mame/drivers/ambush.cpp
index 2becacfa56e..d870631d5af 100644
--- a/src/mame/drivers/ambush.cpp
+++ b/src/mame/drivers/ambush.cpp
@@ -45,6 +45,7 @@
#include "emu.h"
#include "cpu/z80/z80.h"
+#include "machine/74259.h"
#include "machine/watchdog.h"
#include "sound/ay8910.h"
#include "screen.h"
@@ -61,6 +62,7 @@ public:
ambush_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_gfxdecode(*this, "gfxdecode"),
+ m_outlatch(*this, "outlatch%u", 1),
m_video_ram(*this, "video_ram"),
m_sprite_ram(*this, "sprite_ram"),
m_attribute_ram(*this, "attribute_ram"),
@@ -80,21 +82,24 @@ public:
TILE_GET_INFO_MEMBER(mariobl_char_tile_info);
TILE_GET_INFO_MEMBER(dkong3abl_char_tile_info);
- DECLARE_WRITE8_MEMBER(flip_screen_w);
+ DECLARE_WRITE_LINE_MEMBER(flip_screen_w);
DECLARE_WRITE8_MEMBER(scroll_ram_w);
- DECLARE_WRITE8_MEMBER(color_bank_w);
+ DECLARE_WRITE_LINE_MEMBER(color_bank_1_w);
+ DECLARE_WRITE_LINE_MEMBER(color_bank_2_w);
DECLARE_MACHINE_START(ambush);
DECLARE_MACHINE_START(mariobl);
DECLARE_MACHINE_START(dkong3abl);
- DECLARE_WRITE8_MEMBER(coin_counter_w);
- DECLARE_WRITE8_MEMBER(unk_w);
+ DECLARE_WRITE_LINE_MEMBER(coin_counter_1_w);
+ DECLARE_WRITE_LINE_MEMBER(coin_counter_2_w);
+ DECLARE_WRITE8_MEMBER(output_latches_w);
private:
void register_save_states();
required_device<gfxdecode_device> m_gfxdecode;
+ optional_device_array<ls259_device, 2> m_outlatch;
required_shared_ptr<uint8_t> m_video_ram;
required_shared_ptr<uint8_t> m_sprite_ram;
required_shared_ptr<uint8_t> m_attribute_ram;
@@ -120,10 +125,7 @@ static ADDRESS_MAP_START( main_map, AS_PROGRAM, 8, ambush_state )
AM_RANGE(0xc200, 0xc3ff) AM_RAM AM_SHARE("sprite_ram")
AM_RANGE(0xc400, 0xc7ff) AM_RAM AM_SHARE("video_ram")
AM_RANGE(0xc800, 0xc800) AM_READ_PORT("sw1")
- AM_RANGE(0xcc00, 0xcc03) AM_WRITE(unk_w)
- AM_RANGE(0xcc04, 0xcc04) AM_WRITE(flip_screen_w)
- AM_RANGE(0xcc05, 0xcc05) AM_WRITE(color_bank_w)
- AM_RANGE(0xcc07, 0xcc07) AM_WRITE(coin_counter_w)
+ AM_RANGE(0xcc00, 0xcc07) AM_WRITE(output_latches_w)
ADDRESS_MAP_END
static ADDRESS_MAP_START( main_portmap, AS_IO, 8, ambush_state )
@@ -145,8 +147,7 @@ static ADDRESS_MAP_START( bootleg_map, AS_PROGRAM, 8, ambush_state )
AM_RANGE(0x8000, 0x9fff) AM_ROM
AM_RANGE(0xa000, 0xa000) AM_DEVREAD("watchdog", watchdog_timer_device, reset_r)
AM_RANGE(0xa100, 0xa100) AM_READ_PORT("sw1")
- AM_RANGE(0xa204, 0xa204) AM_WRITE(coin_counter_w)
- AM_RANGE(0xa206, 0xa206) AM_WRITE(color_bank_w)
+ AM_RANGE(0xa200, 0xa207) AM_DEVWRITE("outlatch", ls259_device, write_d0)
AM_RANGE(0xb000, 0xbfff) AM_ROM
AM_RANGE(0xe000, 0xffff) AM_ROM
ADDRESS_MAP_END
@@ -508,9 +509,9 @@ uint32_t ambush_state::screen_update_bootleg(screen_device &screen, bitmap_ind16
return 0;
}
-WRITE8_MEMBER( ambush_state::flip_screen_w )
+WRITE_LINE_MEMBER(ambush_state::flip_screen_w)
{
- flip_screen_set(data);
+ flip_screen_set(state);
}
WRITE8_MEMBER( ambush_state::scroll_ram_w )
@@ -519,9 +520,14 @@ WRITE8_MEMBER( ambush_state::scroll_ram_w )
m_char_tilemap->set_scrolly(offset, data + 1);
}
-WRITE8_MEMBER( ambush_state::color_bank_w )
+WRITE_LINE_MEMBER(ambush_state::color_bank_1_w)
{
- m_color_bank = data & 0x03;
+ m_color_bank = (m_color_bank & 0x02) | (state ? 0x01 : 0x00);
+}
+
+WRITE_LINE_MEMBER(ambush_state::color_bank_2_w)
+{
+ m_color_bank = (m_color_bank & 0x01) | (state ? 0x02 : 0x00);
}
@@ -651,15 +657,20 @@ MACHINE_START_MEMBER( ambush_state, dkong3abl )
m_char_tilemap->set_transparent_pen(0);
}
-WRITE8_MEMBER( ambush_state::coin_counter_w )
+WRITE_LINE_MEMBER(ambush_state::coin_counter_1_w)
+{
+ machine().bookkeeping().coin_counter_w(0, state);
+}
+
+WRITE_LINE_MEMBER(ambush_state::coin_counter_2_w)
{
- machine().bookkeeping().coin_counter_w(0, data & 0x01);
- machine().bookkeeping().coin_counter_w(1, data & 0x02);
+ machine().bookkeeping().coin_counter_w(1, state);
}
-WRITE8_MEMBER( ambush_state::unk_w )
+WRITE8_MEMBER(ambush_state::output_latches_w)
{
- logerror("unk_w: %02x = %02x\n", offset, data);
+ m_outlatch[0]->write_bit(offset, BIT(data, 0));
+ m_outlatch[1]->write_bit(offset, BIT(data, 1));
}
@@ -673,6 +684,15 @@ static MACHINE_CONFIG_START( ambush )
MCFG_CPU_IO_MAP(main_portmap)
MCFG_CPU_VBLANK_INT_DRIVER("screen", ambush_state, irq0_line_hold)
+ // addressable latches at 8B and 8C
+ MCFG_DEVICE_ADD("outlatch1", LS259, 0)
+ MCFG_ADDRESSABLE_LATCH_Q4_OUT_CB(WRITELINE(ambush_state, flip_screen_w))
+ MCFG_ADDRESSABLE_LATCH_Q5_OUT_CB(WRITELINE(ambush_state, color_bank_1_w))
+ MCFG_ADDRESSABLE_LATCH_Q7_OUT_CB(WRITELINE(ambush_state, coin_counter_1_w))
+ MCFG_DEVICE_ADD("outlatch2", LS259, 0)
+ MCFG_ADDRESSABLE_LATCH_Q5_OUT_CB(WRITELINE(ambush_state, color_bank_2_w))
+ MCFG_ADDRESSABLE_LATCH_Q7_OUT_CB(WRITELINE(ambush_state, coin_counter_2_w))
+
MCFG_WATCHDOG_ADD("watchdog")
MCFG_MACHINE_START_OVERRIDE(ambush_state, ambush)
@@ -703,6 +723,13 @@ static MACHINE_CONFIG_DERIVED( mariobl, ambush )
MCFG_CPU_MODIFY("maincpu")
MCFG_CPU_PROGRAM_MAP(bootleg_map)
+ // To be verified: do these bootlegs only have one LS259?
+ MCFG_DEVICE_REMOVE("outlatch1")
+ MCFG_DEVICE_REMOVE("outlatch2")
+ MCFG_DEVICE_ADD("outlatch", LS259, 0)
+ MCFG_ADDRESSABLE_LATCH_Q4_OUT_CB(WRITELINE(ambush_state, coin_counter_1_w))
+ MCFG_ADDRESSABLE_LATCH_Q6_OUT_CB(WRITELINE(ambush_state, color_bank_1_w))
+
MCFG_MACHINE_START_OVERRIDE(ambush_state, mariobl)
MCFG_SCREEN_MODIFY("screen")