diff options
Diffstat (limited to 'src/mame/drivers/mephisto_mm1.cpp')
-rw-r--r-- | src/mame/drivers/mephisto_mm1.cpp | 125 |
1 files changed, 21 insertions, 104 deletions
diff --git a/src/mame/drivers/mephisto_mm1.cpp b/src/mame/drivers/mephisto_mm1.cpp index ff23d7891c9..7464f87d0c3 100644 --- a/src/mame/drivers/mephisto_mm1.cpp +++ b/src/mame/drivers/mephisto_mm1.cpp @@ -16,7 +16,9 @@ Hardware notes: - 32KB ROM (2*D27128, or HN613256P) - 4KB RAM (2*HM6116LP-3) - CDP1853CE, CD4011BE, 3*40373BP, 4556BE -- modular slot, 18-button keypad, beeper +- Mephisto modular display module +- Mephisto modular chessboard +- 18-button keypad, beeper It supports the HG 170 opening book module. LCD module is assumed to be same as MM II and others. @@ -38,12 +40,12 @@ TODO: #include "emu.h" -#include "cpu/cosmac/cosmac.h" -#include "machine/sensorboard.h" -#include "sound/dac.h" -#include "video/pwm.h" #include "bus/generic/slot.h" #include "bus/generic/carts.h" +#include "cpu/cosmac/cosmac.h" +#include "machine/mmboard.h" +#include "sound/dac.h" +#include "video/mmdisplay1.h" #include "softlist.h" #include "speaker.h" @@ -62,7 +64,6 @@ public: driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), m_board(*this, "board"), - m_display(*this, "display"), m_dac(*this, "dac"), m_inputs(*this, "IN.%u", 0) { } @@ -80,8 +81,7 @@ protected: private: // devices/pointers required_device<cdp1806_device> m_maincpu; - required_device<sensorboard_device> m_board; - required_device<pwm_display_device> m_display; + required_device<mephisto_board_device> m_board; required_device<dac_bit_interface> m_dac; required_ioport_array<8> m_inputs; @@ -94,53 +94,25 @@ private: INTERRUPT_GEN_MEMBER(interrupt); void update_display(); DECLARE_READ_LINE_MEMBER(clear_r); - DECLARE_WRITE_LINE_MEMBER(q_w); void sound_w(u8 data); void unknown_w(u8 data); - void lcd_w(u8 data); - void board_w(u8 data); - void led_w(u8 data); void keypad_w(u8 data); - u8 board_r(); template<int P> DECLARE_READ_LINE_MEMBER(keypad_r); - bool m_reset; - u8 m_lcd_mask; - u8 m_digit_idx; - u8 m_digit_data[4]; - - u8 m_kp_mux; - u8 m_cb_mux; - u8 m_led_data; + bool m_reset = false; + u8 m_kp_mux = 0; }; void mm1_state::machine_start() { - // zerofill - m_reset = false; - m_lcd_mask = 0; - m_digit_idx = 0; - memset(m_digit_data, 0, sizeof(m_digit_data)); - - m_kp_mux = 0; - m_cb_mux = 0; - m_led_data = 0; - // register for savestates save_item(NAME(m_reset)); - save_item(NAME(m_lcd_mask)); - save_item(NAME(m_digit_idx)); - save_item(NAME(m_digit_data)); - save_item(NAME(m_kp_mux)); - save_item(NAME(m_cb_mux)); - save_item(NAME(m_led_data)); } void mm1_state::machine_reset() { m_reset = true; - m_digit_idx = 0; } @@ -162,28 +134,6 @@ READ_LINE_MEMBER(mm1_state::clear_r) return ret; } -WRITE_LINE_MEMBER(mm1_state::q_w) -{ - // Q: LCD digit data mask - // also assume LCD update on rising edge - if (state && !m_lcd_mask) - { - for (int i = 0; i < 4; i++) - m_display->write_row(i, m_digit_data[i]); - m_display->update(); - } - - m_lcd_mask = state ? 0xff : 0; -} - -void mm1_state::lcd_w(u8 data) -{ - // d0-d7: write/shift LCD digit (4*CD4015) - // note: last digit "dp" is the colon in the middle - m_digit_data[m_digit_idx] = data ^ m_lcd_mask; - m_digit_idx = (m_digit_idx + 1) & 3; -} - void mm1_state::sound_w(u8 data) { // d0: speaker out @@ -195,38 +145,6 @@ void mm1_state::unknown_w(u8 data) // mmirage: unused serial device? } -void mm1_state::update_display() -{ - // 64 chessboard leds - m_display->matrix_partial(4, 8, m_cb_mux, m_led_data); -} - -void mm1_state::led_w(u8 data) -{ - // d0-d7: chessboard led data - m_led_data = data; - update_display(); -} - -void mm1_state::board_w(u8 data) -{ - // d0-d7: chessboard input/led mux - m_cb_mux = ~data; - update_display(); -} - -u8 mm1_state::board_r() -{ - u8 data = 0; - - // d0-d7: multiplexed inputs (chessboard) - for (int i = 0; i < 8; i++) - if (BIT(m_cb_mux, i)) - data |= m_board->read_rank(i); - - return ~data; -} - void mm1_state::keypad_w(u8 data) { // d0-d7: keypad input mux @@ -269,10 +187,10 @@ void mm1_state::mm1_io(address_map &map) { map(0x01, 0x01).w(FUNC(mm1_state::sound_w)); map(0x02, 0x02).w(FUNC(mm1_state::keypad_w)); - map(0x03, 0x03).r(FUNC(mm1_state::board_r)); - map(0x04, 0x04).w(FUNC(mm1_state::board_w)); - map(0x05, 0x05).w(FUNC(mm1_state::led_w)); - map(0x06, 0x06).w(FUNC(mm1_state::lcd_w)); + map(0x03, 0x03).r(m_board, FUNC(mephisto_board_device::input_r)); + map(0x04, 0x04).w(m_board, FUNC(mephisto_board_device::mux_w)); + map(0x05, 0x05).w(m_board, FUNC(mephisto_board_device::led_w)); + map(0x06, 0x06).w("display", FUNC(mephisto_display1_device::data_w)); map(0x07, 0x07).w(FUNC(mm1_state::unknown_w)); } @@ -357,7 +275,7 @@ INPUT_PORTS_END INPUT_CHANGED_MEMBER(mm1_state::mirage_switch_sensor_type) { - m_board->set_type(newval ? sensorboard_device::MAGNETS : sensorboard_device::BUTTONS); + m_board->get()->set_type(newval ? sensorboard_device::MAGNETS : sensorboard_device::BUTTONS); } @@ -373,7 +291,7 @@ void mm1_state::mirage(machine_config &config) m_maincpu->set_addrmap(AS_PROGRAM, &mm1_state::mirage_map); m_maincpu->set_addrmap(AS_IO, &mm1_state::mm1_io); m_maincpu->clear_cb().set(FUNC(mm1_state::clear_r)); - m_maincpu->q_cb().set(FUNC(mm1_state::q_w)).invert(); + m_maincpu->q_cb().set("display", FUNC(mephisto_display1_device::strobe_w)).invert(); m_maincpu->ef3_cb().set(FUNC(mm1_state::keypad_r<0>)); m_maincpu->ef4_cb().set(FUNC(mm1_state::keypad_r<1>)); @@ -381,13 +299,11 @@ void mm1_state::mirage(machine_config &config) const attotime irq_period = attotime::from_ticks(8 * 32 * 0x71, 8_MHz_XTAL); // LDC = 0x71 m_maincpu->set_periodic_int(FUNC(mm1_state::interrupt), irq_period); - SENSORBOARD(config, m_board).set_type(sensorboard_device::BUTTONS); - m_board->init_cb().set(m_board, FUNC(sensorboard_device::preset_chess)); + MEPHISTO_BUTTONS_BOARD(config, m_board); // see mirage_switch_sensor_type m_board->set_delay(attotime::from_msec(200)); /* video hardware */ - PWM_DISPLAY(config, m_display).set_size(4+8, 8); - m_display->set_segmask(0xf, 0x7f); + MEPHISTO_DISPLAY_MODULE1(config, "display"); config.set_default_layout(layout_mephisto_mirage); /* sound hardware */ @@ -401,13 +317,14 @@ void mm1_state::mm1(machine_config &config) /* basic machine hardware */ m_maincpu->set_addrmap(AS_PROGRAM, &mm1_state::mm1_map); - m_maincpu->q_cb().set(FUNC(mm1_state::q_w)); + m_maincpu->q_cb().set("display", FUNC(mephisto_display1_device::strobe_w)); // wrong! uses internal timer interrupt const attotime irq_period = attotime::from_ticks(8 * 32 * 0xfa, 8_MHz_XTAL); // LDC = 0xFA m_maincpu->set_periodic_int(FUNC(mm1_state::interrupt), irq_period); - m_board->set_type(sensorboard_device::MAGNETS); + MEPHISTO_SENSORS_BOARD(config.replace(), m_board); + m_board->set_delay(attotime::from_msec(200)); config.set_default_layout(layout_mephisto_mm1); |