From f6d42406263dbc53745a7d5f4841247913bd1d19 Mon Sep 17 00:00:00 2001 From: hap Date: Mon, 19 Feb 2024 13:44:27 +0100 Subject: lc7582: correct com/seg positions on 1/2 duty, scprof: add lcd outputs --- src/devices/video/lc7582.cpp | 46 ++++++++++++++++++++++++++++--------- src/devices/video/lc7582.h | 17 ++++++++++---- src/mame/cxg/dominator.cpp | 48 ++++++++++++++++++++++----------------- src/mame/cxg/professor.cpp | 37 ++++++++++++++++++++++++++++-- src/mame/layout/cxg_commander.lay | 8 +++---- src/mame/layout/cxg_dominator.lay | 8 +++---- src/mame/layout/cxg_galaxy.lay | 8 +++---- 7 files changed, 122 insertions(+), 50 deletions(-) diff --git a/src/devices/video/lc7582.cpp b/src/devices/video/lc7582.cpp index b8f5b87c7ba..221c7450c1c 100644 --- a/src/devices/video/lc7582.cpp +++ b/src/devices/video/lc7582.cpp @@ -2,11 +2,12 @@ // copyright-holders:hap /* -Sanyo LC7582 LCD Driver +Sanyo LC7580 LCD Driver -53 outputs (static), or 106 outputs (1/2 duty) +53 outputs (static), or 104 outputs (1/2 duty) TODO: +- any difference between LC7580 and LC7582? - OSC pin (input is R/C) - AD/DSP function @@ -16,23 +17,32 @@ TODO: #include "video/lc7582.h" +DEFINE_DEVICE_TYPE(LC7580, lc7580_device, "lc7580", "Sanyo LC7580 LCD Driver") DEFINE_DEVICE_TYPE(LC7582, lc7582_device, "lc7582", "Sanyo LC7582 LCD Driver") //------------------------------------------------- // constructor //------------------------------------------------- -lc7582_device::lc7582_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : - device_t(mconfig, LC7582, tag, owner, clock), +lc7580_device::lc7580_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock) : + device_t(mconfig, type, tag, owner, clock), m_write_segs(*this) { } +lc7580_device::lc7580_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : + lc7580_device(mconfig, LC7580, tag, owner, clock) +{ } + +lc7582_device::lc7582_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : + lc7580_device(mconfig, LC7582, tag, owner, clock) +{ } + //------------------------------------------------- // device_start - device-specific startup //------------------------------------------------- -void lc7582_device::device_start() +void lc7580_device::device_start() { // zerofill m_data = 0; @@ -60,13 +70,27 @@ void lc7582_device::device_start() // handlers //------------------------------------------------- -void lc7582_device::refresh_output() +void lc7580_device::refresh_output() { - m_write_segs(0, m_blank ? 0 : m_latch[0]); - m_write_segs(1, (m_blank || !m_duty) ? 0 : m_latch[1]); + if (m_duty) + { + u64 segs[2] = { 0, 0 }; + + // COM1 on even bits, COM2 on uneven bits + for (int i = 0; i < 104; i++) + segs[i & 1] |= BIT(m_latch[i / 52], i % 52) << (i >> 1); + + for (int i = 0; i < 2; i++) + m_write_segs(i, m_blank ? 0 : segs[i]); + } + else + { + m_write_segs(0, m_blank ? 0 : m_latch[0]); + m_write_segs(1, 0); + } } -void lc7582_device::clk_w(int state) +void lc7580_device::clk_w(int state) { state = (state) ? 1 : 0; @@ -77,7 +101,7 @@ void lc7582_device::clk_w(int state) m_clk = state; } -void lc7582_device::ce_w(int state) +void lc7580_device::ce_w(int state) { state = (state) ? 1 : 0; @@ -86,7 +110,7 @@ void lc7582_device::ce_w(int state) { // d53: DP (drive mode select, aka duty) // d54: DQ (AD/DSP function) - // d55: commons + // d55: latch select if (!BIT(m_shift, 55)) { m_duty = BIT(m_shift, 53); diff --git a/src/devices/video/lc7582.h b/src/devices/video/lc7582.h index 25299c3dbaf..668dc4f021d 100644 --- a/src/devices/video/lc7582.h +++ b/src/devices/video/lc7582.h @@ -2,7 +2,7 @@ // copyright-holders:hap /* - Sanyo LC7582 LCD Driver + Sanyo LC7580 LCD Driver */ @@ -31,10 +31,10 @@ pin desc */ -class lc7582_device : public device_t +class lc7580_device : public device_t { public: - lc7582_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); + lc7580_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); // configuration helpers auto write_segs() { return m_write_segs.bind(); } // S pins, COM1/COM2 in offset @@ -45,7 +45,9 @@ public: void inh_w(int state) { m_blank = bool(state); refresh_output(); } protected: - // device-level overrides + lc7580_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock); + + // device_t implementation virtual void device_start() override; private: @@ -65,7 +67,14 @@ private: devcb_write64 m_write_segs; }; +class lc7582_device : public lc7580_device +{ +public: + lc7582_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); +}; + +DECLARE_DEVICE_TYPE(LC7580, lc7580_device) DECLARE_DEVICE_TYPE(LC7582, lc7582_device) #endif // MAME_VIDEO_LC7582_H diff --git a/src/mame/cxg/dominator.cpp b/src/mame/cxg/dominator.cpp index 83621d9519c..70d233ff661 100644 --- a/src/mame/cxg/dominator.cpp +++ b/src/mame/cxg/dominator.cpp @@ -12,7 +12,7 @@ This engine was also used in the newer Mephisto Modena. Hardware notes: - R65C02P4 @ 4MHz - 32KB ROM, 8KB RAM battery-backed -- Sanyo LC7582, 2 LCD panels (each 4-digit) +- Sanyo LC7582, 2 LCD panels (each 4-digit, some unused segments) - TTL, piezo, 8*8+8 LEDs, button sensors Sphinx Commander also uses the Dominator program, and is on similar hardware, @@ -27,8 +27,8 @@ Sphinx Galaxy is on similar hardware too, with less leds. #include "machine/nvram.h" #include "machine/sensorboard.h" #include "sound/dac.h" -#include "video/pwm.h" #include "video/lc7582.h" +#include "video/pwm.h" #include "speaker.h" @@ -46,13 +46,13 @@ public: dominator_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), + m_board(*this, "board"), m_lcd(*this, "lcd"), m_display(*this, "display"), - m_board(*this, "board"), m_dac(*this, "dac"), m_inputs(*this, "IN.%u", 0), m_out_digit(*this, "digit%u", 0U), - m_out_lcd(*this, "lcd%u.%u", 0U, 0U) + m_out_lcd(*this, "s%u.%u", 0U, 0U) { } // machine configs @@ -66,13 +66,13 @@ protected: private: // devices/pointers required_device m_maincpu; + required_device m_board; required_device m_lcd; required_device m_display; - required_device m_board; required_device m_dac; required_ioport_array<2> m_inputs; output_finder<8> m_out_digit; - output_finder<2, 53> m_out_lcd; + output_finder<2, 52> m_out_lcd; // address maps void dominator_map(address_map &map); @@ -101,23 +101,29 @@ void dominator_state::machine_start() void dominator_state::lcd_s_w(offs_t offset, u64 data) { - u8 d[4]; - - // 1st digit: S1-S9, unused middle vertical segments - // 2nd digit: S10-S18, unused bottom-right diagonal segment, colon at S17 - // 3rd digit: S21-S27 - // 4th digit: S28-S34 - d[0] = bitswap<9>(data >> 0 & 0x1ff, 2,7,5,4,3,1,0,8,6) & 0x7f; - d[1] = bitswap<9>(data >> 9 & 0x1ff, 7,6,4,2,0,8,5,3,1) & 0x7f; - d[2] = bitswap<7>(data >> 20 & 0x7f, 3,5,1,0,2,6,4); - d[3] = bitswap<7>(data >> 27 & 0x7f, 4,2,0,6,5,3,1); - - for (int i = 0; i < 4; i++) - m_out_digit[offset * 4 + i] = d[i]; - // output individual segments - for (int i = 0; i < 53; i++) + for (int i = 0; i < 52; i++) m_out_lcd[offset][i] = BIT(data, i); + + // unscramble digit 7segs + static u8 seg2digit[4*7] = + { + 0x03, 0x04, 0x00, 0x40, 0x41, 0x02, 0x42, + 0x05, 0x06, 0x07, 0x48, 0x44, 0x45, 0x46, + 0x0c, 0x0d, 0x0b, 0x0a, 0x4a, 0x4c, 0x4b, + 0x0e, 0x0f, 0x10, 0x50, 0x4d, 0x4e, 0x4f + }; + + for (int i = 0; i < 8; i++) + { + u8 digit = 0; + for (int seg = 0; seg < 7; seg++) + { + u8 bit = seg2digit[7 * (i & 3) + seg] + 26 * (i >> 2); + digit |= m_out_lcd[BIT(bit, 6)][bit & 0x3f] << seg; + } + m_out_digit[i] = digit; + } } diff --git a/src/mame/cxg/professor.cpp b/src/mame/cxg/professor.cpp index d87c1866a17..d18329d5561 100644 --- a/src/mame/cxg/professor.cpp +++ b/src/mame/cxg/professor.cpp @@ -18,7 +18,6 @@ Hardware notes: - 8*8 chessboard buttons, 16 LEDs, piezo TODO: -- add lcd - internal artwork *******************************************************************************/ @@ -28,8 +27,10 @@ TODO: #include "cpu/m6800/m6801.h" #include "machine/sensorboard.h" #include "sound/dac.h" +#include "video/lc7582.h" #include "video/pwm.h" +#include "screen.h" #include "speaker.h" // internal artwork @@ -45,9 +46,11 @@ public: driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), m_board(*this, "board"), + m_lcd(*this, "lcd"), m_display(*this, "display"), m_dac(*this, "dac"), - m_inputs(*this, "IN.%u", 0) + m_inputs(*this, "IN.%u", 0), + m_out_lcd(*this, "s%u.%u", 0U, 0U) { } void professor(machine_config &config); @@ -61,13 +64,16 @@ private: // devices/pointers required_device m_maincpu; required_device m_board; + required_device m_lcd; required_device m_display; required_device m_dac; required_ioport_array<3> m_inputs; + output_finder<2, 52> m_out_lcd; u16 m_inp_mux = 0; // I/O handlers + void lcd_s_w(offs_t offset, u64 data); template void leds_w(u8 data); void control_w(u8 data); u8 input_r(); @@ -76,6 +82,9 @@ private: void professor_state::machine_start() { + m_out_lcd.resolve(); + + // register for savestates save_item(NAME(m_inp_mux)); } @@ -92,6 +101,12 @@ INPUT_CHANGED_MEMBER(professor_state::on_button) m_maincpu->pulse_input_line(INPUT_LINE_RESET, attotime::zero); } +void professor_state::lcd_s_w(offs_t offset, u64 data) +{ + for (int i = 0; i < 52; i++) + m_out_lcd[offset][i] = BIT(data, i); +} + template void professor_state::leds_w(u8 data) { @@ -106,6 +121,13 @@ void professor_state::control_w(u8 data) // P23: speaker out m_dac->write(BIT(data, 3)); + + // P24: LC7580 DATA + // P25: LC7580 CLK + // P26: LC7580 CE + m_lcd->data_w(BIT(data, 4)); + m_lcd->clk_w(BIT(data, 5)); + m_lcd->ce_w(BIT(data, 6)); } u8 professor_state::input_r() @@ -192,6 +214,14 @@ void professor_state::professor(machine_config &config) //m_board->set_nvram_enable(true); // video hardware + LC7580(config, m_lcd, 0); + m_lcd->write_segs().set(FUNC(professor_state::lcd_s_w)); + + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(1920/4, 977/4); + screen.set_visarea_full(); + PWM_DISPLAY(config, m_display).set_size(2, 8); //config.set_default_layout(layout_cxg_professor); @@ -209,6 +239,9 @@ void professor_state::professor(machine_config &config) ROM_START( scprof ) ROM_REGION( 0x4000, "maincpu", 0 ) ROM_LOAD("1988_107_newcrest_hd6301y0j76p", 0x0000, 0x4000, CRC(681456c7) SHA1(99f8ab7369dbc2c93335affc38838295a8a2c5f3) ) + + ROM_REGION( 100000, "screen", 0 ) + ROM_LOAD("scprof.svg", 0, 100000, NO_DUMP ) ROM_END } // anonymous namespace diff --git a/src/mame/layout/cxg_commander.lay b/src/mame/layout/cxg_commander.lay index ecba3cd6dc3..7319ecf89e7 100644 --- a/src/mame/layout/cxg_commander.lay +++ b/src/mame/layout/cxg_commander.lay @@ -325,8 +325,8 @@ authors:hap - - + + @@ -337,8 +337,8 @@ authors:hap - - + + diff --git a/src/mame/layout/cxg_dominator.lay b/src/mame/layout/cxg_dominator.lay index 6e2c60c3964..e4c4bdc97f0 100644 --- a/src/mame/layout/cxg_dominator.lay +++ b/src/mame/layout/cxg_dominator.lay @@ -377,8 +377,8 @@ authors:hap - - + + @@ -389,8 +389,8 @@ authors:hap - - + + diff --git a/src/mame/layout/cxg_galaxy.lay b/src/mame/layout/cxg_galaxy.lay index c6a1299885c..03de0d773cb 100644 --- a/src/mame/layout/cxg_galaxy.lay +++ b/src/mame/layout/cxg_galaxy.lay @@ -365,8 +365,8 @@ authors:hap - - + + @@ -377,8 +377,8 @@ authors:hap - - + + -- cgit v1.2.3