diff options
Diffstat (limited to 'src/mame/drivers/modena.cpp')
-rw-r--r-- | src/mame/drivers/modena.cpp | 69 |
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); |