summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/chexx.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/chexx.cpp')
-rw-r--r--src/mame/drivers/chexx.cpp172
1 files changed, 108 insertions, 64 deletions
diff --git a/src/mame/drivers/chexx.cpp b/src/mame/drivers/chexx.cpp
index 091b2e6b44a..e263087927f 100644
--- a/src/mame/drivers/chexx.cpp
+++ b/src/mame/drivers/chexx.cpp
@@ -36,16 +36,15 @@ public:
, m_maincpu(*this, "maincpu")
, m_via(*this, "via6522")
, m_digitalker(*this, "digitalker")
- , m_aysnd(*this, "aysnd")
, m_digits(*this, "digit%u", 0U)
, m_leds(*this, "led%u", 0U)
, m_lamps(*this, "lamp%u", 0U)
+ , m_dsw(*this, "DSW")
+ , m_input(*this, "INPUT")
+ , m_coin(*this, "COIN")
{
}
- // callbacks
- TIMER_DEVICE_CALLBACK_MEMBER(update);
-
// handlers
DECLARE_READ8_MEMBER(via_a_in);
DECLARE_READ8_MEMBER(via_b_in);
@@ -60,21 +59,20 @@ public:
DECLARE_READ8_MEMBER(input_r);
- DECLARE_WRITE8_MEMBER(ay_w);
DECLARE_WRITE8_MEMBER(lamp_w);
- void faceoffh(machine_config &config);
- void chexx83(machine_config &config);
- void chexx83_map(address_map &map);
- void faceoffh_map(address_map &map);
+ void chexx(machine_config &config);
+ void mem(address_map &map);
-private:
- // vars
- uint8_t m_port_a, m_port_b;
- uint8_t m_bank;
- uint32_t m_shift;
- uint8_t m_lamp;
- uint8_t m_ay_cmd, m_ay_data;
+protected:
+ enum
+ {
+ TIMER_UPDATE
+ };
+
+ void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
+
+ void update();
// digitalker
void digitalker_set_bank(uint8_t bank);
@@ -87,10 +85,42 @@ private:
required_device<cpu_device> m_maincpu;
required_device<via6522_device> m_via;
required_device<digitalker_device> m_digitalker;
- optional_device<ay8910_device> m_aysnd; // only faceoffh
output_finder<4> m_digits;
output_finder<3> m_leds;
output_finder<2> m_lamps;
+
+ required_ioport m_dsw;
+ required_ioport m_input;
+ required_ioport m_coin;
+
+ // vars
+ emu_timer *m_update_timer;
+ uint8_t m_port_a;
+ uint8_t m_port_b;
+ uint8_t m_bank;
+ uint32_t m_shift;
+ uint8_t m_lamp;
+};
+
+class faceoffh_state : public chexx_state
+{
+public:
+ faceoffh_state(const machine_config &mconfig, device_type type, const char *tag)
+ : chexx_state(mconfig, type, tag)
+ , m_aysnd(*this, "aysnd")
+ {
+ }
+
+ void faceoffh(machine_config &config);
+
+protected:
+ DECLARE_WRITE8_MEMBER(ay_w);
+
+ void mem(address_map &map);
+
+ required_device<ay8910_device> m_aysnd; // only faceoffh
+ uint8_t m_ay_cmd;
+ uint8_t m_ay_data;
};
@@ -102,6 +132,7 @@ READ8_MEMBER(chexx_state::via_a_in)
logerror("%s: VIA read A: %02X\n", machine().describe_context(), ret);
return ret;
}
+
READ8_MEMBER(chexx_state::via_b_in)
{
uint8_t ret = 0;
@@ -112,11 +143,10 @@ READ8_MEMBER(chexx_state::via_b_in)
WRITE8_MEMBER(chexx_state::via_a_out)
{
m_port_a = data; // multiplexer
-
m_digitalker->digitalker_data_w(space, 0, data, 0);
-
// logerror("%s: VIA write A = %02X\n", machine().describe_context(), data);
}
+
WRITE8_MEMBER(chexx_state::via_b_out)
{
m_port_b = data;
@@ -138,10 +168,12 @@ WRITE_LINE_MEMBER(chexx_state::via_ca2_out)
// logerror("%s: VIA write CA2 = %02X\n", machine().describe_context(), state);
}
+
WRITE_LINE_MEMBER(chexx_state::via_cb1_out)
{
// logerror("%s: VIA write CB1 = %02X\n", machine().describe_context(), state);
}
+
WRITE_LINE_MEMBER(chexx_state::via_cb2_out)
{
m_shift = ((m_shift << 1) & 0xffffff) | state;
@@ -161,6 +193,7 @@ WRITE_LINE_MEMBER(chexx_state::via_cb2_out)
// logerror("%s: VIA write CB2 = %02X\n", machine().describe_context(), state);
}
+
WRITE_LINE_MEMBER(chexx_state::via_irq_out)
{
m_maincpu->set_input_line(INPUT_LINE_IRQ0, state ? ASSERT_LINE : CLEAR_LINE);
@@ -169,11 +202,11 @@ WRITE_LINE_MEMBER(chexx_state::via_irq_out)
READ8_MEMBER(chexx_state::input_r)
{
- uint8_t ret = ioport("DSW")->read(); // bits 0-3
- uint8_t inp = ioport("INPUT")->read(); // bit 7 (multiplexed)
+ uint8_t ret = m_dsw->read(); // bits 0-3
+ uint8_t inp = m_input->read(); // bit 7 (multiplexed)
for (int i = 0; i < 8; ++i)
- if ( ((~m_port_a) & (1 << i)) && ((~inp) & (1 << i)) )
+ if (BIT(~m_port_a, i) && BIT(~inp, i))
ret &= 0x7f;
return ret;
@@ -181,7 +214,7 @@ READ8_MEMBER(chexx_state::input_r)
// Chexx Memory Map
-void chexx_state::chexx83_map(address_map &map)
+void chexx_state::mem(address_map &map)
{
map(0x0000, 0x007f).ram().mirror(0x100); // 6810 - 128 x 8 static RAM
map(0x4000, 0x400f).rw(m_via, FUNC(via6522_device::read), FUNC(via6522_device::write));
@@ -189,7 +222,15 @@ void chexx_state::chexx83_map(address_map &map)
map(0xf800, 0xffff).rom().region("maincpu", 0);
}
-// Face-Off Memory Map
+void chexx_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
+{
+ switch (id)
+ {
+ case TIMER_UPDATE:
+ update();
+ break;
+ }
+}
WRITE8_MEMBER(chexx_state::lamp_w)
{
@@ -198,7 +239,19 @@ WRITE8_MEMBER(chexx_state::lamp_w)
m_lamps[1] = BIT(m_lamp,1);
}
-WRITE8_MEMBER(chexx_state::ay_w)
+// Face-Off Memory Map
+
+void faceoffh_state::mem(address_map &map)
+{
+ map(0x0000, 0x007f).ram().mirror(0x100); // M58725P - 2KB
+ map(0x4000, 0x400f).rw(m_via, FUNC(via6522_device::read), FUNC(via6522_device::write));
+ map(0x8000, 0x8000).r(FUNC(faceoffh_state::input_r));
+ map(0xa000, 0xa001).w(FUNC(faceoffh_state::ay_w));
+ map(0xc000, 0xc000).w(FUNC(faceoffh_state::lamp_w));
+ map(0xf000, 0xffff).rom().region("maincpu", 0);
+}
+
+WRITE8_MEMBER(faceoffh_state::ay_w)
{
if (offset)
{
@@ -219,16 +272,6 @@ WRITE8_MEMBER(chexx_state::ay_w)
m_ay_cmd = data;
}
-void chexx_state::faceoffh_map(address_map &map)
-{
- map(0x0000, 0x007f).ram().mirror(0x100); // M58725P - 2KB
- map(0x4000, 0x400f).rw(m_via, FUNC(via6522_device::read), FUNC(via6522_device::write));
- map(0x8000, 0x8000).r(FUNC(chexx_state::input_r));
- map(0xa000, 0xa001).w(FUNC(chexx_state::ay_w));
- map(0xc000, 0xc000).w(FUNC(chexx_state::lamp_w));
- map(0xf000, 0xffff).rom().region("maincpu", 0);
-}
-
// Inputs
static INPUT_PORTS_START( chexx83 )
@@ -268,6 +311,8 @@ void chexx_state::machine_start()
m_digits.resolve();
m_leds.resolve();
m_lamps.resolve();
+
+ m_update_timer = timer_alloc(TIMER_UPDATE);
}
void chexx_state::digitalker_set_bank(uint8_t bank)
@@ -287,12 +332,13 @@ void chexx_state::machine_reset()
{
m_bank = -1;
digitalker_set_bank(0);
+ m_update_timer->adjust(attotime::from_hz(60), 0, attotime::from_hz(60));
}
-TIMER_DEVICE_CALLBACK_MEMBER(chexx_state::update)
+void chexx_state::update()
{
// NMI on coin-in
- uint8_t coin = (~ioport("COIN")->read()) & 0x03;
+ uint8_t coin = (~m_coin->read()) & 0x03;
m_maincpu->set_input_line(INPUT_LINE_NMI, coin ? ASSERT_LINE : CLEAR_LINE);
// VIA CA1 connected to Digitalker INTR line
@@ -329,44 +375,42 @@ TIMER_DEVICE_CALLBACK_MEMBER(chexx_state::update)
#endif
}
-MACHINE_CONFIG_START(chexx_state::chexx83)
-
- // basic machine hardware
- MCFG_DEVICE_ADD("maincpu", M6502, MAIN_CLOCK/2)
- MCFG_DEVICE_PROGRAM_MAP(chexx83_map)
- MCFG_TIMER_DRIVER_ADD_PERIODIC("update", chexx_state, update, attotime::from_hz(60))
+void chexx_state::chexx(machine_config &config)
+{
+ M6502(config, m_maincpu, MAIN_CLOCK/2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &chexx_state::mem);
// via
- MCFG_DEVICE_ADD("via6522", VIA6522, MAIN_CLOCK/4)
+ VIA6522(config, m_via, MAIN_CLOCK/4);
- MCFG_VIA6522_READPA_HANDLER(READ8(*this, chexx_state, via_a_in))
- MCFG_VIA6522_READPB_HANDLER(READ8(*this, chexx_state, via_b_in))
+ m_via->readpa_handler().set(FUNC(chexx_state::via_a_in));
+ m_via->readpb_handler().set(FUNC(chexx_state::via_b_in));
- MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(*this, chexx_state, via_a_out))
- MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(*this, chexx_state, via_b_out))
+ m_via->writepa_handler().set(FUNC(chexx_state::via_a_out));
+ m_via->writepb_handler().set(FUNC(chexx_state::via_b_out));
- MCFG_VIA6522_CA2_HANDLER(WRITELINE(*this, chexx_state, via_ca2_out))
- MCFG_VIA6522_CB1_HANDLER(WRITELINE(*this, chexx_state, via_cb1_out))
- MCFG_VIA6522_CB2_HANDLER(WRITELINE(*this, chexx_state, via_cb2_out))
- MCFG_VIA6522_IRQ_HANDLER(WRITELINE(*this, chexx_state, via_irq_out))
+ m_via->ca2_handler().set(FUNC(chexx_state::via_ca2_out));
+ m_via->cb1_handler().set(FUNC(chexx_state::via_cb1_out));
+ m_via->cb2_handler().set(FUNC(chexx_state::via_cb2_out));
+ m_via->irq_handler().set(FUNC(chexx_state::via_irq_out));
// Layout
config.set_default_layout(layout_chexx);
// sound hardware
SPEAKER(config, "mono").front_center();
- MCFG_DIGITALKER_ADD("digitalker", MAIN_CLOCK)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.16)
-MACHINE_CONFIG_END
+ DIGITALKER(config, m_digitalker, MAIN_CLOCK);
+ m_digitalker->add_route(ALL_OUTPUTS, "mono", 0.16);
+}
-MACHINE_CONFIG_START(chexx_state::faceoffh)
- chexx83(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(faceoffh_map)
+void faceoffh_state::faceoffh(machine_config &config)
+{
+ chexx(config);
+ m_maincpu->set_addrmap(AS_PROGRAM, &faceoffh_state::mem);
- MCFG_DEVICE_ADD("aysnd", AY8910, MAIN_CLOCK/2)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.30)
-MACHINE_CONFIG_END
+ AY8910(config, m_aysnd, MAIN_CLOCK/2);
+ m_aysnd->add_route(ALL_OUTPUTS, "mono", 0.30);
+}
// ROMs
@@ -437,5 +481,5 @@ ROM_START( faceoffh )
ROM_FILL( 0xe000, 0x2000, 0xff ) // unpopulated
ROM_END
-GAME( 1983, chexx83, 0, chexx83, chexx83, chexx_state, empty_init, ROT270, "ICE", "Chexx (EM Bubble Hockey, 1983 1.1)", MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_NO_SOUND )
-GAME( 1983, faceoffh, chexx83, faceoffh, chexx83, chexx_state, empty_init, ROT270, "SoftLogic (Entertainment Enterprises, Ltd. license)", "Face-Off (EM Bubble Hockey)", MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_IMPERFECT_SOUND )
+GAME( 1983, chexx83, 0, chexx, chexx83, chexx_state, empty_init, ROT270, "ICE", "Chexx (EM Bubble Hockey, 1983 1.1)", MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_NO_SOUND )
+GAME( 1983, faceoffh, chexx83, faceoffh, chexx83, faceoffh_state, empty_init, ROT270, "SoftLogic (Entertainment Enterprises, Ltd. license)", "Face-Off (EM Bubble Hockey)", MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_IMPERFECT_SOUND )