summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author hap <happppp@users.noreply.github.com>2025-07-12 02:16:16 +0200
committer hap <happppp@users.noreply.github.com>2025-07-12 02:16:24 +0200
commit6370d086226b4f5bc0e0a46f1e58ec1a03fa2b15 (patch)
tree065986bfe729bcc4a059de4b27cbdfcadd500d18
parent37e77825b1810eb8966232c088ba6381859eb37f (diff)
mm1display: use pwm_display_device
-rw-r--r--src/mame/hegenerglaser/amsterdam.cpp8
-rw-r--r--src/mame/hegenerglaser/brikett.cpp3
-rw-r--r--src/mame/hegenerglaser/excalibur.cpp2
-rw-r--r--src/mame/hegenerglaser/glasgow.cpp4
-rw-r--r--src/mame/hegenerglaser/mm1.cpp7
-rw-r--r--src/mame/hegenerglaser/mm2.cpp7
-rw-r--r--src/mame/hegenerglaser/mmdisplay1.cpp50
-rw-r--r--src/mame/hegenerglaser/mmdisplay1.h11
-rw-r--r--src/mame/hegenerglaser/modena.cpp4
-rw-r--r--src/mame/hegenerglaser/roma2.cpp4
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);