diff options
| author | 2025-07-12 02:16:16 +0200 | |
|---|---|---|
| committer | 2025-07-12 02:16:24 +0200 | |
| commit | 6370d086226b4f5bc0e0a46f1e58ec1a03fa2b15 (patch) | |
| tree | 065986bfe729bcc4a059de4b27cbdfcadd500d18 | |
| parent | 37e77825b1810eb8966232c088ba6381859eb37f (diff) | |
mm1display: use pwm_display_device
| -rw-r--r-- | src/mame/hegenerglaser/amsterdam.cpp | 8 | ||||
| -rw-r--r-- | src/mame/hegenerglaser/brikett.cpp | 3 | ||||
| -rw-r--r-- | src/mame/hegenerglaser/excalibur.cpp | 2 | ||||
| -rw-r--r-- | src/mame/hegenerglaser/glasgow.cpp | 4 | ||||
| -rw-r--r-- | src/mame/hegenerglaser/mm1.cpp | 7 | ||||
| -rw-r--r-- | src/mame/hegenerglaser/mm2.cpp | 7 | ||||
| -rw-r--r-- | src/mame/hegenerglaser/mmdisplay1.cpp | 50 | ||||
| -rw-r--r-- | src/mame/hegenerglaser/mmdisplay1.h | 11 | ||||
| -rw-r--r-- | src/mame/hegenerglaser/modena.cpp | 4 | ||||
| -rw-r--r-- | src/mame/hegenerglaser/roma2.cpp | 4 |
10 files changed, 57 insertions, 43 deletions
diff --git a/src/mame/hegenerglaser/amsterdam.cpp b/src/mame/hegenerglaser/amsterdam.cpp index 8896119eee3..54da14446f0 100644 --- a/src/mame/hegenerglaser/amsterdam.cpp +++ b/src/mame/hegenerglaser/amsterdam.cpp @@ -89,8 +89,8 @@ void amsterdam_state::led_w(offs_t offset, u8 data) // d0-d7: board leds m_board->led_w(data); - // a8: lcd strobe - m_display->strobe_w(BIT(offset, 7)); + // a8: lcd common + m_display->common_w(BIT(offset, 7)); } void amsterdam_state::dac_w(u8 data) @@ -101,8 +101,8 @@ void amsterdam_state::dac_w(u8 data) u8 amsterdam_state::keys_r() { - // lcd strobe is shared with keypad select - return m_keys[m_display->strobe_r()]->read(); + // lcd common is shared with keypad select + return m_keys[m_display->common_r()]->read(); } diff --git a/src/mame/hegenerglaser/brikett.cpp b/src/mame/hegenerglaser/brikett.cpp index 9b107e8305f..14d485aad73 100644 --- a/src/mame/hegenerglaser/brikett.cpp +++ b/src/mame/hegenerglaser/brikett.cpp @@ -491,7 +491,7 @@ void brikett_state::mephistoj(machine_config &config) m_maincpu->set_addrmap(AS_PROGRAM, &brikett_state::mephistoj_map); m_maincpu->set_addrmap(AS_IO, &brikett_state::mephistoj_io); m_maincpu->clear_cb().set(FUNC(brikett_state::clear_r)); - m_maincpu->q_cb().set(m_display, FUNC(mephisto_display1_device::strobe_w)).invert(); + m_maincpu->q_cb().set(m_display, FUNC(mephisto_display1_device::common_w)); const attotime irq_period = attotime::from_ticks(0x10000, 4.194304_MHz_XTAL); // through SAJ300T CLOCK(config, m_irq_clock).set_period(irq_period); @@ -567,7 +567,6 @@ void brikett_state::mephisto3(machine_config &config) // basic machine hardware m_maincpu->set_clock(6.144_MHz_XTAL); m_maincpu->set_addrmap(AS_PROGRAM, &brikett_state::mephisto3_map); - m_maincpu->q_cb().set(m_display, FUNC(mephisto_display1_device::strobe_w)); config.set_default_layout(layout_mephisto_3); } diff --git a/src/mame/hegenerglaser/excalibur.cpp b/src/mame/hegenerglaser/excalibur.cpp index f79b54b3ae5..01fe75115da 100644 --- a/src/mame/hegenerglaser/excalibur.cpp +++ b/src/mame/hegenerglaser/excalibur.cpp @@ -213,7 +213,7 @@ void excal_state::excal(machine_config &config) m_ptm->irq_callback().set_inputline(m_maincpu, M68K_IRQ_4); PIA6821(config, m_pia); - m_pia->writepa_handler().set(m_display, FUNC(mephisto_display1_device::strobe_w)).bit(0); + m_pia->writepa_handler().set(m_display, FUNC(mephisto_display1_device::common_w)).bit(0); m_pia->writepa_handler().append(m_dac, FUNC(dac_1bit_device::write)).bit(1); MEPHISTO_SENSORS_BOARD(config, m_board); diff --git a/src/mame/hegenerglaser/glasgow.cpp b/src/mame/hegenerglaser/glasgow.cpp index 4f3dad29bcc..37b3992fa7e 100644 --- a/src/mame/hegenerglaser/glasgow.cpp +++ b/src/mame/hegenerglaser/glasgow.cpp @@ -180,8 +180,8 @@ void glasgow_state::control_w(u8 data) // d0: speaker out m_dac->write(BIT(data, 0)); - // d7: lcd strobe - m_display->strobe_w(BIT(data, 7)); + // d7: lcd common + m_display->common_w(BIT(data, 7)); } u8 glasgow_state::keys_r() diff --git a/src/mame/hegenerglaser/mm1.cpp b/src/mame/hegenerglaser/mm1.cpp index e661541fed9..eea254d00d5 100644 --- a/src/mame/hegenerglaser/mm1.cpp +++ b/src/mame/hegenerglaser/mm1.cpp @@ -209,9 +209,9 @@ static INPUT_PORTS_START( mirage ) PORT_START("IN.0") PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_BACKSPACE) PORT_CODE(KEYCODE_DEL) PORT_NAME("CL") PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("A / 1") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("ENT") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("ENT") PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("B / 2 / Pawn") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_SPACE) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("STA") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("STA") PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("C / 3 / Knight") PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_NAME("LEV") PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_D) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("D / 4 / Bishop") @@ -250,7 +250,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("display", FUNC(mephisto_display1_device::strobe_w)).invert(); + m_maincpu->q_cb().set("display", FUNC(mephisto_display1_device::common_w)); m_maincpu->ef3_cb().set(FUNC(mm1_state::keypad_r<0>)); m_maincpu->ef4_cb().set(FUNC(mm1_state::keypad_r<1>)); @@ -272,7 +272,6 @@ 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("display", FUNC(mephisto_display1_device::strobe_w)); MEPHISTO_SENSORS_BOARD(config.replace(), m_board); m_board->set_delay(attotime::from_msec(200)); diff --git a/src/mame/hegenerglaser/mm2.cpp b/src/mame/hegenerglaser/mm2.cpp index 7a7b595d41b..a256714d561 100644 --- a/src/mame/hegenerglaser/mm2.cpp +++ b/src/mame/hegenerglaser/mm2.cpp @@ -193,7 +193,7 @@ void mm2_state::lcd_irqack_w(u8 data) u8 mm2_state::keys_r(offs_t offset) { - // lcd strobe is shared with keypad select + // lcd common is shared with keypad select return ~(BIT(m_keys[m_outlatch->q7_r()]->read(), offset) << 7); } @@ -331,7 +331,7 @@ void mm2_state::rebel5(machine_config &config) m_outlatch->q_out_cb<4>().set_output("led104"); m_outlatch->q_out_cb<5>().set_output("led105"); m_outlatch->q_out_cb<6>().set("dac", FUNC(dac_1bit_device::write)); - m_outlatch->q_out_cb<7>().set(m_display, FUNC(mephisto_display1_device::strobe_w)).invert(); + m_outlatch->q_out_cb<7>().set(m_display, FUNC(mephisto_display1_device::common_w)); MEPHISTO_SENSORS_BOARD(config, "board"); MEPHISTO_DISPLAY_MODULE1(config, m_display); @@ -390,8 +390,6 @@ void mm2_state::bup(machine_config &config) const attotime irq_period = attotime::from_hz(7.3728_MHz_XTAL / 2 / 0x2000); // 450Hz from 4020 Q13 m_maincpu->set_periodic_int(FUNC(mm2_state::irq0_line_assert), irq_period); - m_outlatch->q_out_cb<7>().set(m_display, FUNC(mephisto_display1_device::strobe_w)); - config.set_default_layout(layout_mephisto_bup); } @@ -412,7 +410,6 @@ void mm2_state::mm2nona(machine_config &config) { bup(config); - m_outlatch->q_out_cb<7>().set(m_display, FUNC(mephisto_display1_device::strobe_w)).invert(); config.set_default_layout(layout_mephisto_mm2); } diff --git a/src/mame/hegenerglaser/mmdisplay1.cpp b/src/mame/hegenerglaser/mmdisplay1.cpp index 147601e0422..ad7b332e2b0 100644 --- a/src/mame/hegenerglaser/mmdisplay1.cpp +++ b/src/mame/hegenerglaser/mmdisplay1.cpp @@ -20,12 +20,26 @@ DEFINE_DEVICE_TYPE(MEPHISTO_DISPLAY_MODULE1, mephisto_display1_device, "mdisplay mephisto_display1_device::mephisto_display1_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : device_t(mconfig, MEPHISTO_DISPLAY_MODULE1, tag, owner, clock), + m_lcd_pwm(*this, "lcd_pwm"), m_digits(*this, "digit%u", 0U), m_output_digit(*this) { } //------------------------------------------------- +// device_add_mconfig +//------------------------------------------------- + +void mephisto_display1_device::device_add_mconfig(machine_config &config) +{ + PWM_DISPLAY(config, m_lcd_pwm).set_size(4, 8); + m_lcd_pwm->set_segmask(0xf, 0xff); + m_lcd_pwm->set_bri_levels(0.75); + m_lcd_pwm->output_digit().set(FUNC(mephisto_display1_device::lcd_pwm_w)); +} + + +//------------------------------------------------- // device_start - device-specific startup //------------------------------------------------- @@ -35,11 +49,11 @@ void mephisto_display1_device::device_start() m_digits.resolve(); // initialize - m_strobe = 1; - m_digit_data = ~0; + m_common = 0; + m_digit_data = 0; // register for savestates - save_item(NAME(m_strobe)); + save_item(NAME(m_common)); save_item(NAME(m_digit_data)); } @@ -48,32 +62,32 @@ void mephisto_display1_device::device_start() // I/O handlers //------------------------------------------------- +void mephisto_display1_device::lcd_pwm_w(offs_t offset, u64 data) +{ + if (m_output_digit.isunset()) + m_digits[offset] = data; + else + m_output_digit(offset, data); +} + void mephisto_display1_device::update_lcd() { for (int i = 0; i < 4; i++) { - u8 digit = m_digit_data >> (i * 8) ^ (m_strobe ? 0 : 0xff); - - if (m_output_digit.isunset()) - m_digits[i] = digit; - else - m_output_digit(i, digit); + const u32 data = m_common ? ~m_digit_data : m_digit_data; + m_lcd_pwm->write_row(i, data >> (i * 8) & 0xff); } } -void mephisto_display1_device::strobe_w(int state) +void mephisto_display1_device::common_w(int state) { - state = state ? 1 : 0; - - // update lcd on any edge - if (state != m_strobe) - { - m_strobe = state; - update_lcd(); - } + m_common = state ? 1 : 0; + update_lcd(); } void mephisto_display1_device::data_w(u8 data) { + // writing data also clocks shift registers m_digit_data = (m_digit_data >> 8) | (data << 24); + update_lcd(); } diff --git a/src/mame/hegenerglaser/mmdisplay1.h b/src/mame/hegenerglaser/mmdisplay1.h index b64cf3d0833..712f14907c8 100644 --- a/src/mame/hegenerglaser/mmdisplay1.h +++ b/src/mame/hegenerglaser/mmdisplay1.h @@ -11,6 +11,8 @@ #pragma once +#include "video/pwm.h" + class mephisto_display1_device : public device_t { @@ -20,22 +22,25 @@ public: // callback is optional, it will output to digitx when not used auto output_digit() { return m_output_digit.bind(); } - void strobe_w(int state); - int strobe_r() { return m_strobe; } + void common_w(int state); + int common_r() { return m_common; } void data_w(u8 data); protected: // device-level overrides virtual void device_start() override ATTR_COLD; + virtual void device_add_mconfig(machine_config &config) override ATTR_COLD; private: + required_device<pwm_display_device> m_lcd_pwm; output_finder<4> m_digits; devcb_write8 m_output_digit; - int m_strobe; + int m_common; u32 m_digit_data; void update_lcd(); + void lcd_pwm_w(offs_t offset, u64 data); }; diff --git a/src/mame/hegenerglaser/modena.cpp b/src/mame/hegenerglaser/modena.cpp index 4d74595400c..b2e0c025aca 100644 --- a/src/mame/hegenerglaser/modena.cpp +++ b/src/mame/hegenerglaser/modena.cpp @@ -119,8 +119,8 @@ void modena_state::io_w(u8 data) m_io_ctrl = data; update_display(); - // d4: lcd strobe - m_display->strobe_w(BIT(data, 4)); + // d4: lcd common + m_display->common_w(BIT(data, 4)); // d6: speaker out m_dac->write(BIT(data, 6)); diff --git a/src/mame/hegenerglaser/roma2.cpp b/src/mame/hegenerglaser/roma2.cpp index 8bfa76fe6a1..b9a9eede067 100644 --- a/src/mame/hegenerglaser/roma2.cpp +++ b/src/mame/hegenerglaser/roma2.cpp @@ -178,8 +178,8 @@ void roma2_state::roma2(machine_config &config) m_maincpu->set_periodic_int(FUNC(roma2_state::irq5_line_hold), irq_period); HC259(config, m_outlatch); - // Q0-Q3: input mux; Q4: strobe; Q6-Q7: DAC - m_outlatch->q_out_cb<4>().set(m_display, FUNC(mephisto_display1_device::strobe_w)); + // Q0-Q3: input mux; Q4: lcd common; Q6-Q7: DAC + m_outlatch->q_out_cb<4>().set(m_display, FUNC(mephisto_display1_device::common_w)); m_outlatch->parallel_out_cb().set(m_dac, FUNC(dac_2bit_ones_complement_device::write)).rshift(6).mask(3); MEPHISTO_SENSORS_BOARD(config, m_board); |
