summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/amerihok.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/amerihok.cpp')
-rw-r--r--src/mame/drivers/amerihok.cpp82
1 files changed, 70 insertions, 12 deletions
diff --git a/src/mame/drivers/amerihok.cpp b/src/mame/drivers/amerihok.cpp
index 369f0bf885f..73276053c03 100644
--- a/src/mame/drivers/amerihok.cpp
+++ b/src/mame/drivers/amerihok.cpp
@@ -39,20 +39,44 @@ private:
virtual void machine_start() override;
virtual void machine_reset() override;
- DECLARE_WRITE8_MEMBER(control_w);
+ void control_w(u8 data);
+ void p2_w(u8 data);
+ u8 p3_r();
- required_device<cpu_device> m_maincpu;
+ required_device<z8_device> m_maincpu;
required_device<okim6376_device> m_oki;
void amerihok_data_map(address_map &map);
void amerihok_map(address_map &map);
+
+ u32 m_outputs[2];
+ u32 m_latched_outputs[2];
+ u8 m_old_p2;
};
-WRITE8_MEMBER(amerihok_state::control_w)
+void amerihok_state::control_w(u8 data)
{
m_oki->st_w(!BIT(data, 4));
m_oki->ch2_w(!BIT(data, 7));
}
+void amerihok_state::p2_w(u8 data)
+{
+ if (BIT(data, 5) && !BIT(m_old_p2, 5))
+ {
+ m_outputs[1] = (m_outputs[1] << 1) | BIT(m_outputs[0], 31);
+ m_outputs[0] = (m_outputs[0] << 1) | BIT(data, 6);
+ }
+
+ if (BIT(data, 7) && (m_outputs[0] != m_latched_outputs[0] || m_outputs[1] != m_latched_outputs[1]))
+ {
+ m_latched_outputs[0] = m_outputs[0];
+ m_latched_outputs[1] = m_outputs[1];
+ logerror("Outputs = %08X%08X\n", m_latched_outputs[1], m_latched_outputs[0]);
+ }
+
+ m_old_p2 = data;
+}
+
void amerihok_state::amerihok_map(address_map &map)
{
map(0x0000, 0xffff).rom().region("maincpu", 0);
@@ -60,17 +84,49 @@ void amerihok_state::amerihok_map(address_map &map)
void amerihok_state::amerihok_data_map(address_map &map)
{
+ map(0x1000, 0x1000).portr("1000");
map(0x2000, 0x2000).w(FUNC(amerihok_state::control_w));
+ map(0x3000, 0x3000).portr("3000");
map(0x4000, 0x4000).w(m_oki, FUNC(okim6376_device::write));
}
static INPUT_PORTS_START( amerihok )
+ PORT_START("1000")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_BUTTON1) PORT_CODE(KEYCODE_Z)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_BUTTON2) PORT_CODE(KEYCODE_X)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_BUTTON3) PORT_CODE(KEYCODE_C)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_BUTTON4) PORT_CODE(KEYCODE_V)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_BUTTON5) PORT_CODE(KEYCODE_B)
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_BUTTON6) PORT_CODE(KEYCODE_N)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_BUTTON7) PORT_CODE(KEYCODE_M)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_BUTTON8) PORT_CODE(KEYCODE_COMMA)
+
+ PORT_START("3000")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CODE(KEYCODE_A) PORT_NAME("Score Visitor")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CODE(KEYCODE_S) PORT_NAME("Score Home")
+ PORT_BIT(0xfc, IP_ACTIVE_HIGH, IPT_UNUSED)
+
+ PORT_START("P2")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_BUTTON9) PORT_CODE(KEYCODE_STOP)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_BUTTON10) PORT_CODE(KEYCODE_SLASH)
+ PORT_BIT(0xee, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_START("P3")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_CUSTOM) PORT_READ_LINE_DEVICE_MEMBER("oki", okim6376_device, busy_r)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_COIN1)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_COIN2)
INPUT_PORTS_END
void amerihok_state::machine_start()
{
+ std::fill(std::begin(m_outputs), std::end(m_outputs), 0);
+ std::fill(std::begin(m_latched_outputs), std::end(m_latched_outputs), 0);
+
+ save_item(NAME(m_outputs));
+ save_item(NAME(m_latched_outputs));
}
void amerihok_state::machine_reset()
@@ -78,19 +134,21 @@ void amerihok_state::machine_reset()
}
-MACHINE_CONFIG_START(amerihok_state::amerihok)
-
- /* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z8681, 12_MHz_XTAL)
- MCFG_DEVICE_PROGRAM_MAP(amerihok_map)
- MCFG_DEVICE_DATA_MAP(amerihok_data_map)
+void amerihok_state::amerihok(machine_config &config)
+{
+ Z8681(config, m_maincpu, 12_MHz_XTAL);
+ m_maincpu->set_addrmap(AS_PROGRAM, &amerihok_state::amerihok_map);
+ m_maincpu->set_addrmap(AS_DATA, &amerihok_state::amerihok_data_map);
+ m_maincpu->p2_in_cb().set_ioport("P2");
+ m_maincpu->p2_out_cb().set(FUNC(amerihok_state::p2_w));
+ m_maincpu->p3_in_cb().set_ioport("P3");
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("oki", OKIM6376, 1000000) // 64-pin QFP (probably actually MSM6650)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
-MACHINE_CONFIG_END
+ OKIM6376(config, m_oki, 12_MHz_XTAL / 96); // 64-pin QFP, type/clock unverified (probably clocked by Z8681 TOUT)
+ m_oki->add_route(ALL_OUTPUTS, "mono", 1.0);
+}