summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/modena.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/modena.cpp')
-rw-r--r--src/mame/drivers/modena.cpp69
1 files changed, 32 insertions, 37 deletions
diff --git a/src/mame/drivers/modena.cpp b/src/mame/drivers/modena.cpp
index 2c2ccc3fb9b..276678fc042 100644
--- a/src/mame/drivers/modena.cpp
+++ b/src/mame/drivers/modena.cpp
@@ -29,20 +29,11 @@ public:
, m_dac(*this, "dac")
, m_keys(*this, "KEY")
, m_digits(*this, "digit%u", 0U)
- , m_leds1(*this, "led%u", 100U)
- , m_leds2(*this, "led%u", 0U)
- , m_leds3(*this, "led%u", 8U)
+ , m_leds(*this, "led%u.%u", 0U, 0U)
{ }
- DECLARE_READ8_MEMBER(modena_input_r);
- DECLARE_WRITE8_MEMBER(modena_digits_w);
- DECLARE_WRITE8_MEMBER(modena_io_w);
- DECLARE_WRITE8_MEMBER(modena_led_w);
- TIMER_DEVICE_CALLBACK_MEMBER(nmi_on) { m_maincpu->set_input_line(M6502_NMI_LINE, ASSERT_LINE); }
- TIMER_DEVICE_CALLBACK_MEMBER(nmi_off) { m_maincpu->set_input_line(M6502_NMI_LINE, CLEAR_LINE); }
-
void modena(machine_config &config);
- void modena_mem(address_map &map);
+
protected:
virtual void machine_reset() override;
virtual void machine_start() override;
@@ -53,15 +44,24 @@ private:
required_device<dac_bit_interface> m_dac;
required_ioport m_keys;
output_finder<4> m_digits;
- output_finder<8> m_leds1;
- output_finder<8> m_leds2;
- output_finder<8> m_leds3;
+ output_finder<3, 8> m_leds;
+
+ void modena_mem(address_map &map);
+
+ DECLARE_READ8_MEMBER(input_r);
+ DECLARE_WRITE8_MEMBER(digits_w);
+ DECLARE_WRITE8_MEMBER(io_w);
+ DECLARE_WRITE8_MEMBER(led_w);
+
+ TIMER_DEVICE_CALLBACK_MEMBER(nmi_on) { m_maincpu->set_input_line(M6502_NMI_LINE, ASSERT_LINE); }
+ TIMER_DEVICE_CALLBACK_MEMBER(nmi_off) { m_maincpu->set_input_line(M6502_NMI_LINE, CLEAR_LINE); }
+
uint8_t m_digits_idx;
uint8_t m_io_ctrl;
};
-READ8_MEMBER(mephisto_modena_state::modena_input_r)
+READ8_MEMBER(mephisto_modena_state::input_r)
{
if (m_board->mux_r(space, offset) == 0xff)
return m_keys->read();
@@ -69,31 +69,27 @@ READ8_MEMBER(mephisto_modena_state::modena_input_r)
return m_board->input_r(space, offset) ^ 0xff;
}
-WRITE8_MEMBER(mephisto_modena_state::modena_led_w)
+WRITE8_MEMBER(mephisto_modena_state::led_w)
{
m_board->mux_w(space, offset, data);
- if (m_io_ctrl & 0x0e)
+ for (int sel = 0; sel < 3; sel++)
{
- for(int i=0; i<8; i++)
+ if (BIT(m_io_ctrl, sel+1))
{
- if (BIT(m_io_ctrl, 1))
- m_leds1[i] = BIT(data, i) ? 0 : 1;
- if (BIT(m_io_ctrl, 2))
- m_leds2[i] = BIT(data, i) ? 0 : 1;
- if (BIT(m_io_ctrl, 3))
- m_leds3[i] = BIT(data, i) ? 0 : 1;
+ for (int i = 0; i < 8; i++)
+ m_leds[sel][i] = BIT(data, i) ? 0 : 1;
}
}
}
-WRITE8_MEMBER(mephisto_modena_state::modena_io_w)
+WRITE8_MEMBER(mephisto_modena_state::io_w)
{
m_io_ctrl = data;
m_dac->write(BIT(data, 6));
}
-WRITE8_MEMBER(mephisto_modena_state::modena_digits_w)
+WRITE8_MEMBER(mephisto_modena_state::digits_w)
{
m_digits[m_digits_idx] = data ^ ((m_io_ctrl & 0x10) ? 0xff : 0x00);
m_digits_idx = (m_digits_idx + 1) & 3;
@@ -102,10 +98,10 @@ WRITE8_MEMBER(mephisto_modena_state::modena_digits_w)
void mephisto_modena_state::modena_mem(address_map &map)
{
map(0x0000, 0x1fff).ram().share("nvram");
- map(0x4000, 0x4000).w(FUNC(mephisto_modena_state::modena_digits_w));
- map(0x5000, 0x5000).w(FUNC(mephisto_modena_state::modena_led_w));
- map(0x6000, 0x6000).w(FUNC(mephisto_modena_state::modena_io_w));
- map(0x7000, 0x7fff).r(FUNC(mephisto_modena_state::modena_input_r));
+ map(0x4000, 0x4000).w(FUNC(mephisto_modena_state::digits_w));
+ map(0x5000, 0x5000).w(FUNC(mephisto_modena_state::led_w));
+ map(0x6000, 0x6000).w(FUNC(mephisto_modena_state::io_w));
+ map(0x7000, 0x7fff).r(FUNC(mephisto_modena_state::input_r));
map(0x8000, 0xffff).rom().region("maincpu", 0);
}
@@ -118,17 +114,16 @@ static INPUT_PORTS_START( modena )
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("POSITION") PORT_CODE(KEYCODE_O)
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("LEVEL") PORT_CODE(KEYCODE_L)
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("FUNCTION") PORT_CODE(KEYCODE_F)
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("ENTER") PORT_CODE(KEYCODE_ENTER)
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("CLEAR") PORT_CODE(KEYCODE_BACKSPACE)
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("ENTER") PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_F1) // combine for NEW GAME
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("CLEAR") PORT_CODE(KEYCODE_BACKSPACE) PORT_CODE(KEYCODE_F1) // "
INPUT_PORTS_END
void mephisto_modena_state::machine_start()
{
m_digits.resolve();
- m_leds1.resolve();
- m_leds2.resolve();
- m_leds3.resolve();
+ m_leds.resolve();
+
save_item(NAME(m_digits_idx));
save_item(NAME(m_io_ctrl));
}
@@ -142,11 +137,11 @@ void mephisto_modena_state::machine_reset()
void mephisto_modena_state::modena(machine_config &config)
{
- M65C02(config, m_maincpu, XTAL(4'194'304)); // W65C02SP
+ M65C02(config, m_maincpu, XTAL(4'194'304)); // W65C02SP
m_maincpu->set_addrmap(AS_PROGRAM, &mephisto_modena_state::modena_mem);
timer_device &nmi_on(TIMER(config, "nmi_on"));
nmi_on.configure_periodic(FUNC(mephisto_modena_state::nmi_on), attotime::from_hz(XTAL(4'194'304) / (1 << 13)));
- nmi_on.set_start_delay(attotime::from_hz(XTAL(4'194'304) / (1 << 13)) - attotime::from_usec(975)); // active for 975us
+ nmi_on.set_start_delay(attotime::from_hz(XTAL(4'194'304) / (1 << 13)) - attotime::from_usec(975)); // active for 975us
TIMER(config, "nmi_off").configure_periodic(FUNC(mephisto_modena_state::nmi_off), attotime::from_hz(XTAL(4'194'304) / (1 << 13)));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);