From 3046353665835e1a2d4299f85c896ee88f50db93 Mon Sep 17 00:00:00 2001 From: hap Date: Sat, 15 Jun 2019 03:49:46 +0200 Subject: hh*: using pwm_display_device for some drivers (nw) --- src/devices/video/pwm.cpp | 2 +- src/mame/drivers/cking_master.cpp | 1 + src/mame/drivers/cxg_ch2001.cpp | 1 + src/mame/drivers/hh_amis2k.cpp | 13 ++-- src/mame/drivers/hh_cop400.cpp | 108 ++++++++++++++++----------- src/mame/drivers/hh_hmcs40.cpp | 152 +++++++++++++++++++++++++------------- src/mame/drivers/hh_melps4.cpp | 31 ++++---- src/mame/drivers/hh_pic16.cpp | 20 ++--- src/mame/drivers/hh_sm510.cpp | 6 +- src/mame/drivers/hh_tms1k.cpp | 46 ++++++------ src/mame/drivers/hh_ucom4.cpp | 103 ++++++++++++++++++-------- src/mame/drivers/rzone.cpp | 2 +- src/mame/drivers/tb303.cpp | 6 +- src/mame/drivers/ticalc1x.cpp | 8 +- src/mame/drivers/tispeak.cpp | 6 +- src/mame/drivers/tispellb.cpp | 2 +- src/mame/drivers/tr606.cpp | 1 + src/mame/includes/hh_sm510.h | 8 +- src/mame/includes/hh_tms1k.h | 4 +- src/mame/includes/hh_ucom4.h | 15 ++-- src/mame/layout/funrlgl.lay | 10 ++- 21 files changed, 336 insertions(+), 209 deletions(-) diff --git a/src/devices/video/pwm.cpp b/src/devices/video/pwm.cpp index c54cdbc979a..32843125ef7 100644 --- a/src/devices/video/pwm.cpp +++ b/src/devices/video/pwm.cpp @@ -10,7 +10,7 @@ implies a powered-on display element (eg, a LED, or VFD sprite). The maximum mat size is 64 by 64, simply due to uint64_t constraints. If a larger size is needed, create an array of pwm_display_device. -If display elements are directly addressable, you can use write_element or write_row +If display elements are directly addressable, you can also use write_element or write_row to set them. In this case it is required to call update() to apply the changes. Display element states are sent to output tags "y.x" where y is the matrix row number, diff --git a/src/mame/drivers/cking_master.cpp b/src/mame/drivers/cking_master.cpp index 9d2ddcb4893..3cff14b7d03 100644 --- a/src/mame/drivers/cking_master.cpp +++ b/src/mame/drivers/cking_master.cpp @@ -296,6 +296,7 @@ void master_state::master(machine_config &config) m_irq_on->set_start_delay(irq_period - attotime::from_nsec(22870)); // active for 22.87us TIMER(config, "irq_off").configure_periodic(FUNC(master_state::irq_off), irq_period); + /* video hardware */ PWM_DISPLAY(config, m_display).set_size(9, 2); config.set_default_layout(layout_ck_master); diff --git a/src/mame/drivers/cxg_ch2001.cpp b/src/mame/drivers/cxg_ch2001.cpp index 9df4c7136ff..9acf7e4db1c 100644 --- a/src/mame/drivers/cxg_ch2001.cpp +++ b/src/mame/drivers/cxg_ch2001.cpp @@ -251,6 +251,7 @@ void ch2001_state::ch2001(machine_config &config) m_irq_on->set_start_delay(irq_period - attotime::from_nsec(18300)); // active for 18.3us TIMER(config, "irq_off").configure_periodic(FUNC(ch2001_state::irq_off), irq_period); + /* video hardware */ PWM_DISPLAY(config, m_display).set_size(10, 8); config.set_default_layout(layout_cxg_ch2001); diff --git a/src/mame/drivers/hh_amis2k.cpp b/src/mame/drivers/hh_amis2k.cpp index fc98c6067b5..3481b944243 100644 --- a/src/mame/drivers/hh_amis2k.cpp +++ b/src/mame/drivers/hh_amis2k.cpp @@ -33,14 +33,14 @@ public: m_maincpu(*this, "maincpu"), m_display(*this, "display"), m_speaker(*this, "speaker"), - m_inp_matrix(*this, "IN.%u", 0) + m_inputs(*this, "IN.%u", 0) { } // devices required_device m_maincpu; optional_device m_display; optional_device m_speaker; - optional_ioport_array<4> m_inp_matrix; // max 4 + optional_ioport_array<4> m_inputs; // max 4 // misc common u16 m_a; // MCU address bus @@ -94,7 +94,7 @@ u8 hh_amis2k_state::read_inputs(int columns) // read selected input rows for (int i = 0; i < columns; i++) if (m_inp_mux >> i & 1) - ret |= m_inp_matrix[i]->read(); + ret |= m_inputs[i]->read(); return ret; } @@ -187,8 +187,6 @@ TIMER_DEVICE_CALLBACK_MEMBER(wildfire_state::speaker_decay_sim) void wildfire_state::prepare_display() { - // A0-A2 are 7segs - m_display->segmask(7, 0x7f); m_display->matrix(~m_a, m_d); } @@ -201,7 +199,8 @@ WRITE8_MEMBER(wildfire_state::write_d) WRITE16_MEMBER(wildfire_state::write_a) { - // A0-A11: digit/led select + // A0-A2: digit select + // A3-A11: led select m_a = data; prepare_display(); @@ -245,7 +244,9 @@ void wildfire_state::wildfire(machine_config &config) m_maincpu->write_a().set(FUNC(wildfire_state::write_a)); m_maincpu->write_f().set(FUNC(wildfire_state::write_f)); + /* video hardware */ PWM_DISPLAY(config, m_display).set_size(12, 8); + m_display->set_segmask(7, 0x7f); m_display->set_bri_levels(0.02, 0.1); // bumpers are dimmed config.set_default_layout(layout_wildfire); diff --git a/src/mame/drivers/hh_cop400.cpp b/src/mame/drivers/hh_cop400.cpp index e57b6762dd3..5304e79fb1a 100644 --- a/src/mame/drivers/hh_cop400.cpp +++ b/src/mame/drivers/hh_cop400.cpp @@ -17,9 +17,8 @@ ***************************************************************************/ #include "emu.h" -#include "includes/screenless.h" - #include "cpu/cop400/cop400.h" +#include "video/pwm.h" #include "machine/timer.h" #include "sound/spkrdev.h" #include "sound/dac.h" @@ -46,20 +45,22 @@ //#include "hh_cop400_test.lh" // common test-layout - use external artwork -class hh_cop400_state : public screenless_state +class hh_cop400_state : public driver_device { public: hh_cop400_state(const machine_config &mconfig, device_type type, const char *tag) : - screenless_state(mconfig, type, tag), + driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), - m_inp_matrix(*this, "IN.%u", 0), - m_speaker(*this, "speaker") + m_display(*this, "display"), + m_speaker(*this, "speaker"), + m_inputs(*this, "IN.%u", 0) { } // devices required_device m_maincpu; - optional_ioport_array<6> m_inp_matrix; // max 6 + optional_device m_display; optional_device m_speaker; + optional_ioport_array<6> m_inputs; // max 6 // misc common u8 m_l; // MCU port L write data @@ -82,8 +83,6 @@ protected: void hh_cop400_state::machine_start() { - screenless_state::machine_start(); - // zerofill m_l = 0; m_g = 0; @@ -123,7 +122,7 @@ u16 hh_cop400_state::read_inputs(int columns, u16 colmask) // read selected input rows for (int i = 0; i < columns; i++) if (~m_inp_mux >> i & 1) - ret &= m_inp_matrix[i]->read(); + ret &= m_inputs[i]->read(); return ret; } @@ -179,7 +178,7 @@ WRITE8_MEMBER(ctstein_state::write_g) WRITE8_MEMBER(ctstein_state::write_l) { // L0-L3: button lamps - display_matrix(4, 1, data & 0xf, 1); + m_display->matrix(1, data & 0xf); } READ8_MEMBER(ctstein_state::read_l) @@ -220,6 +219,8 @@ void ctstein_state::ctstein(machine_config &config) m_maincpu->write_sk().set(m_speaker, FUNC(speaker_sound_device::level_w)); m_maincpu->read_l().set(FUNC(ctstein_state::read_l)); + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(1, 4); config.set_default_layout(layout_ctstein); /* sound hardware */ @@ -293,16 +294,16 @@ WRITE8_MEMBER(h2hbaskbc_state::write_l) u16 sel = (m_g | m_d << 4 | m_g << 8 | m_d << 12) & mask; // D2+G0,G1 are 7segs - set_display_segmask(3, 0x7f); + m_display->segmask(3, 0x7f); // L0-L6: digit segments A-G, L0-L4: led data - display_matrix(7, 16, data, sel); + m_display->matrix(sel, data); } READ8_MEMBER(h2hbaskbc_state::read_in) { // IN: multiplexed inputs - return read_inputs(4, 7) | (m_inp_matrix[4]->read() & 8); + return read_inputs(4, 7) | (m_inputs[4]->read() & 8); } // config @@ -367,6 +368,8 @@ void h2hbaskbc_state::h2hbaskbc(machine_config &config) m_maincpu->read_in().set(FUNC(h2hbaskbc_state::read_in)); m_maincpu->write_so().set(m_speaker, FUNC(speaker_sound_device::level_w)); + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(16, 7); config.set_default_layout(layout_h2hbaskbc); /* sound hardware */ @@ -431,18 +434,15 @@ public: void einvaderc_state::prepare_display() { - // D0-D2 are 7segs - set_display_segmask(7, 0x7f); - - // update display u8 l = bitswap<8>(m_l,7,6,0,1,2,3,4,5); u16 grid = (m_d | m_g << 4 | m_sk << 8 | m_so << 9) ^ 0x0ff; - display_matrix(8, 10, l, grid); + + m_display->matrix(grid, l); } WRITE8_MEMBER(einvaderc_state::write_d) { - // D: led grid 0-3 + // D: led grid 0-3 (D0-D2 are 7segs) m_d = data; prepare_display(); } @@ -506,6 +506,8 @@ void einvaderc_state::einvaderc(machine_config &config) screen.set_size(913, 1080); screen.set_visarea_full(); + PWM_DISPLAY(config, m_display).set_size(10, 8); + m_display->set_segmask(7, 0x7f); config.set_default_layout(layout_einvaderc); /* sound hardware */ @@ -562,12 +564,12 @@ public: void unkeinv_state::prepare_display() { - display_matrix(8+8, 8+12, m_g << 4 | m_d, m_l, false); + m_display->matrix(m_l, m_g << 4 | m_d, false); // positional led row is on L6,L7 - u16 wand = m_display_state[7] << 8 | m_display_state[6]; - m_display_state[8 + m_inp_matrix[1]->read()] = wand; - display_update(); + u16 wand = m_display->read_row(7) << 8 | m_display->read_row(6); + m_display->write_row(8 + m_inputs[1]->read(), wand); + m_display->update(); } WRITE8_MEMBER(unkeinv_state::write_g) @@ -598,14 +600,14 @@ READ8_MEMBER(unkeinv_state::read_l) // L0-L5+G2: positional odd // L0-L5+G3: positional even - u8 pos = m_inp_matrix[1]->read(); + u8 pos = m_inputs[1]->read(); if (m_g & 4 && pos & 1) ret ^= (1 << (pos >> 1)); if (m_g & 8 && ~pos & 1) ret ^= (1 << (pos >> 1)); // L7+G3: fire button - if (m_g & 8 && m_inp_matrix[0]->read()) + if (m_g & 8 && m_inputs[0]->read()) ret ^= 0x80; return ret & ~m_l; @@ -633,6 +635,8 @@ void unkeinv_state::unkeinv(machine_config &config) m_maincpu->read_l_tristate().set_constant(0xff); m_maincpu->write_so().set(m_speaker, FUNC(speaker_sound_device::level_w)); + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(8+12, 8+8); config.set_default_layout(layout_unkeinv); /* sound hardware */ @@ -719,7 +723,7 @@ WRITE8_MEMBER(lchicken_state::write_l) // L0-L3: led data // L4-L6: led select // L7: N/C - display_matrix(4, 3, ~data & 0xf, data >> 4 & 7); + m_display->matrix(data >> 4 & 7, ~data & 0xf); } WRITE8_MEMBER(lchicken_state::write_d) @@ -795,6 +799,9 @@ void lchicken_state::lchicken(machine_config &config) m_maincpu->read_si().set(FUNC(lchicken_state::read_si)); TIMER(config, "chicken_motor").configure_periodic(FUNC(lchicken_state::motor_sim_tick), attotime::from_msec(6000/0x100)); // ~6sec for a full rotation + + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(3, 4); config.set_default_layout(layout_lchicken); /* sound hardware */ @@ -843,14 +850,14 @@ WRITE8_MEMBER(funjacks_state::write_d) // D: led grid + input mux m_inp_mux = data; m_d = ~data & 0xf; - display_matrix(2, 4, m_l, m_d); + m_display->matrix(m_d, m_l); } WRITE8_MEMBER(funjacks_state::write_l) { // L0,L1: led state m_l = data & 3; - display_matrix(2, 4, m_l, m_d); + m_display->matrix(m_d, m_l); } WRITE8_MEMBER(funjacks_state::write_g) @@ -870,7 +877,7 @@ READ8_MEMBER(funjacks_state::read_g) { // G1: speaker out state // G2,G3: inputs - return m_inp_matrix[3]->read() | (m_g & 2); + return m_inputs[3]->read() | (m_g & 2); } // config @@ -908,6 +915,9 @@ void funjacks_state::funjacks(machine_config &config) m_maincpu->read_l().set(FUNC(funjacks_state::read_l)); m_maincpu->read_g().set(FUNC(funjacks_state::read_g)); + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(4, 2); + m_display->set_bri_levels(0.15); config.set_default_layout(layout_funjacks); /* sound hardware */ @@ -957,7 +967,7 @@ WRITE8_MEMBER(funrlgl_state::write_d) { // D: led grid m_d = ~data & 0xf; - display_matrix(4, 4, m_l, m_d); + m_display->matrix(m_d, m_l); } WRITE8_MEMBER(funrlgl_state::write_l) @@ -965,7 +975,7 @@ WRITE8_MEMBER(funrlgl_state::write_l) // L0-L3: led state // L4-L7: N/C m_l = ~data & 0xf; - display_matrix(4, 4, m_l, m_d); + m_display->matrix(m_d, m_l); } WRITE8_MEMBER(funrlgl_state::write_g) @@ -1000,6 +1010,9 @@ void funrlgl_state::funrlgl(machine_config &config) m_maincpu->write_g().set(FUNC(funrlgl_state::write_g)); m_maincpu->read_g().set_ioport("IN.0"); + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(4, 4); + m_display->set_bri_levels(0.02, 0.1); // top led is brighter config.set_default_layout(layout_funrlgl); /* sound hardware */ @@ -1047,8 +1060,7 @@ public: void mdallas_state::prepare_display() { - set_display_segmask(0xff, 0xff); - display_matrix(8, 8, m_l, ~(m_d << 4 | m_g)); + m_display->matrix(~(m_d << 4 | m_g), m_l); } WRITE8_MEMBER(mdallas_state::write_l) @@ -1141,6 +1153,9 @@ void mdallas_state::mdallas(machine_config &config) m_maincpu->read_in().set(FUNC(mdallas_state::read_in)); m_maincpu->write_so().set(m_speaker, FUNC(speaker_sound_device::level_w)); + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(8, 8); + m_display->set_segmask(0xff, 0xff); config.set_default_layout(layout_mdallas); /* sound hardware */ @@ -1199,7 +1214,7 @@ WRITE8_MEMBER(plus1_state::write_l) READ8_MEMBER(plus1_state::read_l) { // L: IN.1, mask with output - return m_inp_matrix[1]->read() & m_l; + return m_inputs[1]->read() & m_l; } // config @@ -1287,7 +1302,7 @@ public: void lightfgt_state::prepare_display() { u8 grid = (m_so | m_d << 1) ^ 0x1f; - display_matrix(5, 5, m_l, grid); + m_display->matrix(grid, m_l); } WRITE_LINE_MEMBER(lightfgt_state::write_so) @@ -1364,6 +1379,8 @@ void lightfgt_state::lightfgt(machine_config &config) m_maincpu->write_sk().set(m_speaker, FUNC(speaker_sound_device::level_w)); m_maincpu->read_g().set(FUNC(lightfgt_state::read_g)); + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(5, 5); config.set_default_layout(layout_lightfgt); /* sound hardware */ @@ -1428,7 +1445,7 @@ READ8_MEMBER(bship82_state::read_in) WRITE_LINE_MEMBER(bship82_state::write_so) { // SO: led - display_matrix(1, 1, state, 1); + m_display->matrix(1, state); } // config @@ -1524,6 +1541,8 @@ void bship82_state::bship82(machine_config &config) m_maincpu->write_so().set(FUNC(bship82_state::write_so)); m_maincpu->read_si().set_ioport("IN.4"); + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(1, 1); config.set_default_layout(layout_bship82); /* sound hardware */ @@ -1575,10 +1594,7 @@ public: void qkracer_state::prepare_display() { - set_display_segmask(0xdf, 0x7f); - set_display_segmask(0x20, 0x41); // equals sign - - display_matrix(7, 9, m_l, ~(m_d | m_g << 4 | m_sk << 8)); + m_display->matrix(~(m_d | m_g << 4 | m_sk << 8), m_l); } WRITE8_MEMBER(qkracer_state::write_d) @@ -1662,6 +1678,10 @@ void qkracer_state::qkracer(machine_config &config) m_maincpu->read_in().set(FUNC(qkracer_state::read_in)); m_maincpu->write_sk().set(FUNC(qkracer_state::write_sk)); + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(9, 7); + m_display->set_segmask(0xdf, 0x7f); + m_display->set_segmask(0x20, 0x41); // equals sign config.set_default_layout(layout_qkracer); /* no sound! */ @@ -1713,8 +1733,7 @@ public: void vidchal_state::prepare_display() { - set_display_segmask(0x3f, 0xff); - display_matrix(8, 7, m_l, m_d | m_sk << 6); + m_display->matrix(m_d | m_sk << 6, m_l); } WRITE8_MEMBER(vidchal_state::write_d) @@ -1759,6 +1778,9 @@ void vidchal_state::vidchal(machine_config &config) m_maincpu->read_in().set_ioport("IN.0"); m_maincpu->write_sk().set(FUNC(vidchal_state::write_sk)); + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(6+1, 8); + m_display->set_segmask(0x3f, 0xff); config.set_default_layout(layout_vidchal); /* sound hardware */ diff --git a/src/mame/drivers/hh_hmcs40.cpp b/src/mame/drivers/hh_hmcs40.cpp index c07dc6a997a..ddc11949a53 100644 --- a/src/mame/drivers/hh_hmcs40.cpp +++ b/src/mame/drivers/hh_hmcs40.cpp @@ -79,17 +79,16 @@ upper-left power pill: mcu cycle/interrupt timing related - Though very uncommon when compared to games with LED/lamp display, some games may manipulate VFD plate brightness by strobing it longer/shorter, - eg. cgalaxn when the player ship explodes. + eg. cgalaxn when a ship explodes. - bzaxxon 3D effect is difficult to simulate - improve/redo SVGs of: bzaxxon, bpengo, bbtime ***************************************************************************/ #include "emu.h" -#include "includes/screenless.h" - #include "cpu/hmcs40/hmcs40.h" #include "cpu/cop400/cop400.h" +#include "video/pwm.h" #include "machine/gen_latch.h" #include "machine/timer.h" #include "sound/spkrdev.h" @@ -110,20 +109,22 @@ //#include "hh_hmcs40_test.lh" // common test-layout - no svg artwork(yet), use external artwork -class hh_hmcs40_state : public screenless_state +class hh_hmcs40_state : public driver_device { public: hh_hmcs40_state(const machine_config &mconfig, device_type type, const char *tag) : - screenless_state(mconfig, type, tag), + driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), - m_inp_matrix(*this, "IN.%u", 0), - m_speaker(*this, "speaker") + m_display(*this, "display"), + m_speaker(*this, "speaker"), + m_inputs(*this, "IN.%u", 0) { } // devices required_device m_maincpu; - optional_ioport_array<7> m_inp_matrix; // max 7 + optional_device m_display; optional_device m_speaker; + optional_ioport_array<7> m_inputs; // max 7 // misc common u8 m_r[8]; // MCU R ports write data (optional) @@ -149,8 +150,6 @@ protected: void hh_hmcs40_state::machine_start() { - screenless_state::machine_start(); - // zerofill memset(m_r, 0, sizeof(m_r)); memset(m_int, 0, sizeof(m_int)); @@ -190,7 +189,7 @@ u16 hh_hmcs40_state::read_inputs(int columns) // read selected input rows for (int i = 0; i < columns; i++) if (m_inp_mux >> i & 1) - ret |= m_inp_matrix[i]->read(); + ret |= m_inputs[i]->read(); return ret; } @@ -264,7 +263,7 @@ WRITE8_MEMBER(bambball_state::plate_w) // update display u16 plate = bitswap<16>(m_plate,13,8,4,12,9,10,14,1,7,0,15,11,6,3,5,2); - display_matrix(16, 9, plate, m_grid); + m_display->matrix(m_grid, plate); } WRITE16_MEMBER(bambball_state::grid_w) @@ -333,6 +332,7 @@ void bambball_state::bambball(machine_config &config) screen.set_size(1920, 478); screen.set_visarea_full(); + PWM_DISPLAY(config, m_display).set_size(9, 16); config.set_default_layout(layout_bambball); /* sound hardware */ @@ -384,7 +384,7 @@ void bmboxing_state::prepare_display() { u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,9,0,1,2,3,4,5,6,7,8); u32 plate = bitswap<16>(m_plate,15,14,13,12,1,2,0,3,11,4,10,7,5,6,9,8); - display_matrix(12, 9, plate, grid); + m_display->matrix(grid, plate); } WRITE8_MEMBER(bmboxing_state::plate_w) @@ -480,6 +480,8 @@ void bmboxing_state::bmboxing(machine_config &config) screen.set_size(1920, 529); screen.set_visarea_full(); + PWM_DISPLAY(config, m_display).set_size(9, 12); + /* sound hardware */ SPEAKER(config, "mono").front_center(); SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); @@ -531,7 +533,7 @@ void bfriskyt_state::prepare_display() { u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,9,8,0,1,2,3,4,5,6,7); u32 plate = bitswap<24>(m_plate,23,22,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21); - display_matrix(22, 8, plate, grid); + m_display->matrix(grid, plate); } WRITE8_MEMBER(bfriskyt_state::plate_w) @@ -607,6 +609,8 @@ void bfriskyt_state::bfriskyt(machine_config &config) screen.set_size(1920, 675); screen.set_visarea_full(); + PWM_DISPLAY(config, m_display).set_size(8, 22); + /* sound hardware */ SPEAKER(config, "mono").front_center(); SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); @@ -666,7 +670,7 @@ WRITE8_MEMBER(packmon_state::plate_w) // update display u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,0,1,2,3,4,5,6,7,8,9); u32 plate = bitswap<24>(m_plate,23,22,21,20,0,1,2,3,4,5,6,19,18,17,16,15,14,13,12,11,10,9,8,7); - display_matrix(20, 10, plate, grid); + m_display->matrix(grid, plate); } WRITE16_MEMBER(packmon_state::grid_w) @@ -726,6 +730,7 @@ void packmon_state::packmon(machine_config &config) screen.set_size(1920, 680); screen.set_visarea_full(); + PWM_DISPLAY(config, m_display).set_size(10, 20); config.set_default_layout(layout_packmon); /* sound hardware */ @@ -784,7 +789,7 @@ WRITE8_MEMBER(bzaxxon_state::plate_w) // update display u16 grid = bitswap<16>(m_grid,15,14,13,12,11,6,7,8,9,10,5,4,3,2,1,0); u32 plate = bitswap<24>(m_plate,23,22,21,20,5,7,0,1,2,3,4,6,19,16,17,18,15,14,13,12,10,8,9,11) | 0x800; - display_matrix(20, 11, plate, grid); + m_display->matrix(grid, plate); } WRITE16_MEMBER(bzaxxon_state::grid_w) @@ -853,6 +858,8 @@ void bzaxxon_state::bzaxxon(machine_config &config) screen.set_size(613, 1080); screen.set_visarea_full(); + PWM_DISPLAY(config, m_display).set_size(11, 20); + /* sound hardware */ SPEAKER(config, "mono").front_center(); SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); @@ -907,7 +914,7 @@ WRITE8_MEMBER(zackman_state::plate_w) // update display u8 grid = bitswap<8>(m_grid,0,1,2,3,4,5,6,7); u32 plate = bitswap<32>(m_plate,31,30,27,0,1,2,3,4,5,6,7,8,9,10,11,24,25,26,29,28,23,22,21,20,19,18,17,16,15,14,13,12); - display_matrix(29, 8, plate, grid); + m_display->matrix(grid, plate); } WRITE16_MEMBER(zackman_state::grid_w) @@ -974,6 +981,8 @@ void zackman_state::zackman(machine_config &config) screen.set_size(487, 1080); screen.set_visarea_full(); + PWM_DISPLAY(config, m_display).set_size(8, 29); + /* sound hardware */ SPEAKER(config, "mono").front_center(); SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); @@ -1025,7 +1034,7 @@ void bpengo_state::prepare_display() { u8 grid = bitswap<8>(m_grid,0,1,2,3,4,5,6,7); u32 plate = bitswap<32>(m_plate,31,30,29,28,23,22,21,16,17,18,19,20,27,26,25,24,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0); - display_matrix(25, 8, plate, grid); + m_display->matrix(grid, plate); } WRITE8_MEMBER(bpengo_state::plate_w) @@ -1105,6 +1114,8 @@ void bpengo_state::bpengo(machine_config &config) screen.set_size(1920, 759); screen.set_visarea_full(); + PWM_DISPLAY(config, m_display).set_size(8, 25); + /* sound hardware */ SPEAKER(config, "mono").front_center(); SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); @@ -1156,7 +1167,7 @@ void bbtime_state::prepare_display() { u8 grid = bitswap<8>(m_grid,7,6,0,1,2,3,4,5); u32 plate = bitswap<32>(m_plate,31,30,29,28,25,24,26,27,22,23,15,14,12,11,10,8,7,6,4,1,5,9,13,3,2,16,17,18,19,20,0,21) | 0x1; - display_matrix(28, 6, plate, grid); + m_display->matrix(grid, plate); } WRITE8_MEMBER(bbtime_state::plate_w) @@ -1232,6 +1243,8 @@ void bbtime_state::bbtime(machine_config &config) screen.set_size(379, 1080); screen.set_visarea_full(); + PWM_DISPLAY(config, m_display).set_size(6, 28); + /* sound hardware */ SPEAKER(config, "mono").front_center(); SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); @@ -1284,7 +1297,7 @@ WRITE8_MEMBER(bdoramon_state::plate_w) // update display u8 grid = bitswap<8>(m_grid,0,1,2,3,4,5,7,6); u32 plate = bitswap<24>(m_plate,23,22,21,20,11,19,18,17,16,15,14,13,12,10,9,8,7,6,5,4,3,2,1,0); - display_matrix(19, 8, plate, grid); + m_display->matrix(grid, plate); } WRITE16_MEMBER(bdoramon_state::grid_w) @@ -1339,6 +1352,8 @@ void bdoramon_state::bdoramon(machine_config &config) screen.set_size(1920, 668); screen.set_visarea_full(); + PWM_DISPLAY(config, m_display).set_size(8, 19); + /* sound hardware */ SPEAKER(config, "mono").front_center(); SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); @@ -1391,7 +1406,7 @@ WRITE8_MEMBER(bultrman_state::plate_w) // update display u8 grid = bitswap<8>(m_grid,0,1,2,3,4,5,6,7); u32 plate = bitswap<24>(m_plate,23,22,21,20,19,0,18,17,16,15,14,13,12,3,11,10,9,8,7,6,5,4,1,2); - display_matrix(18, 8, plate, grid); + m_display->matrix(grid, plate); } WRITE16_MEMBER(bultrman_state::grid_w) @@ -1438,6 +1453,8 @@ void bultrman_state::bultrman(machine_config &config) screen.set_size(1920, 673); screen.set_visarea_full(); + PWM_DISPLAY(config, m_display).set_size(8, 18); + /* sound hardware */ SPEAKER(config, "mono").front_center(); SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); @@ -1485,7 +1502,7 @@ public: void machiman_state::prepare_display() { u32 plate = bitswap<24>(m_plate,23,22,21,20,19,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18); - display_matrix(19, 5, plate, m_grid); + m_display->matrix(m_grid, plate); } WRITE8_MEMBER(machiman_state::plate_w) @@ -1536,6 +1553,8 @@ void machiman_state::machiman(machine_config &config) screen.set_size(1534, 1080); screen.set_visarea_full(); + PWM_DISPLAY(config, m_display).set_size(5, 19); + /* sound hardware */ SPEAKER(config, "mono").front_center(); SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); @@ -1599,7 +1618,7 @@ WRITE8_MEMBER(pairmtch_state::plate_w) // R2x,R3x,R6x: vfd plate int shift = (offset == hmcs40_cpu_device::PORT_R6X) ? 8 : (offset-2) * 4; m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - display_matrix(12, 6, m_plate, m_grid); + m_display->matrix(m_grid, m_plate); } WRITE16_MEMBER(pairmtch_state::grid_w) @@ -1615,7 +1634,7 @@ WRITE16_MEMBER(pairmtch_state::grid_w) // D0-D5: vfd grid m_grid = data & 0x3f; - display_matrix(12, 6, m_plate, m_grid); + m_display->matrix(m_grid, m_plate); } READ8_MEMBER(pairmtch_state::input_r) @@ -1698,6 +1717,8 @@ void pairmtch_state::pairmtch(machine_config &config) config.m_perfect_cpu_quantum = subtag("maincpu"); + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(6, 12); config.set_default_layout(layout_pairmtch); /* sound hardware */ @@ -1758,7 +1779,7 @@ WRITE8_MEMBER(alnattck_state::plate_w) // update display u32 plate = bitswap<24>(m_plate,23,22,21,20,19,18,17,16,11,9,8,10,7,2,0,1,3,4,5,6,12,13,14,15); - display_matrix(20, 10, plate, m_grid); + m_display->matrix(m_grid, plate); } WRITE16_MEMBER(alnattck_state::grid_w) @@ -1826,6 +1847,8 @@ void alnattck_state::alnattck(machine_config &config) screen.set_size(1920, 700); screen.set_visarea_full(); + PWM_DISPLAY(config, m_display).set_size(10, 20); + /* sound hardware */ SPEAKER(config, "mono").front_center(); SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); @@ -1906,7 +1929,7 @@ TIMER_DEVICE_CALLBACK_MEMBER(cdkong_state::speaker_decay_sim) void cdkong_state::prepare_display() { u32 plate = bitswap<32>(m_plate,31,30,29,24,0,16,8,1,23,17,9,2,18,10,25,27,26,3,15,27,11,11,14,22,6,13,21,5,19,12,20,4) | 0x800800; - display_matrix(29, 11, plate, m_grid); + m_display->matrix(m_grid, plate); } WRITE8_MEMBER(cdkong_state::plate_w) @@ -1968,6 +1991,8 @@ void cdkong_state::cdkong(machine_config &config) screen.set_size(605, 1080); screen.set_visarea_full(); + PWM_DISPLAY(config, m_display).set_size(11, 29); + /* sound hardware */ SPEAKER(config, "mono").front_center(); SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); @@ -2033,7 +2058,7 @@ void cgalaxn_state::prepare_display() { u16 grid = bitswap<16>(m_grid,15,14,13,12,1,2,0,11,10,9,8,7,6,5,4,3); u16 plate = bitswap<16>(m_plate,15,14,6,5,4,3,2,1,7,8,9,10,11,0,12,13); - display_matrix(15, 12, plate, grid); + m_display->matrix(grid, plate); } INPUT_CHANGED_MEMBER(cgalaxn_state::player_switch) @@ -2111,6 +2136,8 @@ void cgalaxn_state::cgalaxn(machine_config &config) screen.set_size(526, 1080); screen.set_visarea_full(); + PWM_DISPLAY(config, m_display).set_size(12, 15); + /* sound hardware */ SPEAKER(config, "mono").front_center(); SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); @@ -2176,7 +2203,7 @@ WRITE8_MEMBER(cpacman_state::plate_w) // update display u16 grid = bitswap<16>(m_grid,15,14,13,12,11,0,1,2,3,4,5,6,7,8,9,10); u32 plate = bitswap<32>(m_plate,31,30,29,28,27,0,1,2,3,8,9,10,11,16,17,18,19,25,26,23,22,21,20,24,15,14,13,12,4,5,6,7); - display_matrix(27, 11, plate, grid); + m_display->matrix(grid, plate); } WRITE16_MEMBER(cpacman_state::grid_w) @@ -2241,6 +2268,8 @@ void cpacman_state::cpacman(machine_config &config) screen.set_size(484, 1080); screen.set_visarea_full(); + PWM_DISPLAY(config, m_display).set_size(11, 27); + /* sound hardware */ SPEAKER(config, "mono").front_center(); SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); @@ -2309,8 +2338,8 @@ WRITE8_MEMBER(cmspacmn_state::plate_w) // update display u16 grid = bitswap<16>(m_grid,15,14,13,11,10,9,8,7,6,5,4,3,2,1,0,1); - u64 plate = BIT(m_plate,15)<<32 | bitswap<32>(m_plate,14,13,12,4,5,6,7,24,23,25,22,21,20,13,24,3,19,14,12,11,24,2,10,8,7,25,0,9,1,18,17,16) | 0x1004080; - display_matrix(33, 12, plate, grid); + u32 plate = bitswap<32>(m_plate,14,13,12,4,5,6,7,24,23,25,22,21,20,13,24,3,19,14,12,11,24,2,10,8,7,25,0,9,1,18,17,16) | 0x1004080; + m_display->matrix(grid, u64(BIT(m_plate,15)) << 32 | plate); } WRITE16_MEMBER(cmspacmn_state::grid_w) @@ -2375,6 +2404,8 @@ void cmspacmn_state::cmspacmn(machine_config &config) screen.set_size(481, 1080); screen.set_visarea_full(); + PWM_DISPLAY(config, m_display).set_size(12, 33); + /* sound hardware */ SPEAKER(config, "mono").front_center(); SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); @@ -2427,17 +2458,12 @@ public: void sag_state::prepare_display() { // grid 0-7 are the 'pixels' - for (int y = 0; y < 8; y++) - m_display_state[y] = (m_grid >> y & 1) ? m_plate : 0; + m_display->matrix_partial(0, 8, m_grid, m_plate, false); // grid 8-11 are 7segs - set_display_segmask(0xf00, 0x7f); + m_display->segmask(0xf00, 0x7f); u8 seg = bitswap<8>(m_plate,3,4,5,6,7,8,9,10); - for (int y = 8; y < 12; y++) - m_display_state[y] = (m_grid >> y & 1) ? seg : 0; - - set_display_size(14, 12); - display_update(); + m_display->matrix_partial(8, 4, m_grid >> 8, seg); } WRITE8_MEMBER(sag_state::plate_w) @@ -2522,6 +2548,8 @@ void sag_state::sag(machine_config &config) m_maincpu->write_d().set(FUNC(sag_state::grid_w)); m_maincpu->read_d().set(FUNC(sag_state::input_r)); + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(8+4, 14); config.set_default_layout(layout_sag); /* sound hardware */ @@ -2582,7 +2610,7 @@ void egalaxn2_state::prepare_display() { u16 grid = bitswap<16>(m_grid,15,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14); u32 plate = bitswap<24>(m_plate,23,22,21,20,15,14,13,12,7,6,5,4,3,2,1,0,19,18,17,16,11,10,9,8); - display_matrix(24, 15, plate, grid); + m_display->matrix(grid, plate); } WRITE16_MEMBER(egalaxn2_state::grid_w) @@ -2663,6 +2691,8 @@ void egalaxn2_state::egalaxn2(machine_config &config) screen.set_size(505, 1080); screen.set_visarea_full(); + PWM_DISPLAY(config, m_display).set_size(15, 24); + /* sound hardware */ SPEAKER(config, "mono").front_center(); SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); @@ -2825,7 +2855,7 @@ void eturtles_state::prepare_display() { u16 grid = bitswap<16>(m_grid,15,1,14,13,12,11,10,9,8,7,6,5,4,3,2,0); u32 plate = bitswap<32>(m_plate,31,30,11,12,18,19,16,17,22,15,20,21,27,26,23,25,24,2,3,1,0,6,4,5,10,9,2,8,7,14,1,13); - display_matrix(30, 15, plate | (grid >> 5 & 8), grid); // grid 8 also forces plate 3 high + m_display->matrix(grid, plate | (grid >> 5 & 8)); // grid 8 also forces plate 3 high } WRITE8_MEMBER(eturtles_state::plate_w) @@ -2950,6 +2980,8 @@ void eturtles_state::eturtles(machine_config &config) screen.set_size(484, 1080); screen.set_visarea_full(); + PWM_DISPLAY(config, m_display).set_size(15, 30); + /* sound hardware */ SPEAKER(config, "mono").front_center(); SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); @@ -3001,7 +3033,7 @@ void estargte_state::prepare_display() { u16 grid = bitswap<16>(m_grid,15,0,14,13,12,11,10,9,8,7,6,5,4,3,2,1); u32 plate = bitswap<32>(m_plate,31,30,29,15,17,19,21,23,25,27,26,24,3,22,20,18,16,14,12,10,8,6,4,2,0,1,3,5,7,9,11,13); - display_matrix(29, 14, plate, grid); + m_display->matrix(grid, plate); } READ8_MEMBER(estargte_state::cop_data_r) @@ -3070,6 +3102,8 @@ void estargte_state::estargte(machine_config &config) screen.set_size(1920, 854); screen.set_visarea_full(); + PWM_DISPLAY(config, m_display).set_size(14, 29); + /* sound hardware */ SPEAKER(config, "mono").front_center(); SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); @@ -3129,7 +3163,7 @@ WRITE8_MEMBER(ghalien_state::plate_w) // update display u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,0,1,2,3,4,5,6,7,8,9); u32 plate = bitswap<24>(m_plate,23,22,21,20,14,12,10,8,9,13,15,2,0,1,3,11,7,5,4,6,19,17,16,18); - display_matrix(20, 10, plate, grid); + m_display->matrix(grid, plate); } WRITE16_MEMBER(ghalien_state::grid_w) @@ -3197,6 +3231,8 @@ void ghalien_state::ghalien(machine_config &config) screen.set_size(1920, 699); screen.set_visarea_full(); + PWM_DISPLAY(config, m_display).set_size(10, 20); + /* sound hardware */ SPEAKER(config, "mono").front_center(); SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); @@ -3256,7 +3292,7 @@ WRITE8_MEMBER(gckong_state::plate_w) // update display u16 grid = bitswap<16>(m_grid,15,14,13,12,11,0,1,2,3,4,5,6,7,8,9,10); u32 plate = bitswap<32>(m_plate,31,30,29,28,27,26,25,6,7,8,12,13,14,15,16,17,18,17,16,12,11,10,9,8,7,6,5,4,3,2,1,0) | 0x8000; - display_matrix(32, 11, plate, grid); + m_display->matrix(grid, plate); } WRITE16_MEMBER(gckong_state::grid_w) @@ -3327,6 +3363,7 @@ void gckong_state::gckong(machine_config &config) screen.set_size(479, 1080); screen.set_visarea_full(); + PWM_DISPLAY(config, m_display).set_size(11, 32); config.set_default_layout(layout_gckong); /* sound hardware */ @@ -3383,7 +3420,7 @@ WRITE8_MEMBER(gdigdug_state::plate_w) // update display u32 plate = bitswap<32>(m_plate,30,31,0,1,2,3,4,5,6,7,20,21,22,27,26,25,28,29,24,23,15,14,13,12,8,9,10,11,19,18,17,16); - display_matrix(32, 9, plate, m_grid); + m_display->matrix(m_grid, plate); } WRITE16_MEMBER(gdigdug_state::grid_w) @@ -3453,6 +3490,8 @@ void gdigdug_state::gdigdug(machine_config &config) screen.set_size(476, 1080); screen.set_visarea_full(); + PWM_DISPLAY(config, m_display).set_size(9, 32); + /* sound hardware */ SPEAKER(config, "mono").front_center(); SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); @@ -3506,7 +3545,7 @@ public: void mwcbaseb_state::prepare_display() { u8 grid = bitswap<8>(m_grid,0,1,2,3,4,5,6,7); - display_matrix(16, 8, m_plate, grid); + m_display->matrix(grid, m_plate); } WRITE8_MEMBER(mwcbaseb_state::plate_w) @@ -3622,6 +3661,8 @@ void mwcbaseb_state::mwcbaseb(machine_config &config) screen.set_size(1920, 478); screen.set_visarea_full(); + PWM_DISPLAY(config, m_display).set_size(8, 16); + m_display->set_bri_levels(0.002); // cyan elements strobed very briefly? config.set_default_layout(layout_mwcbaseb); /* sound hardware */ @@ -3681,7 +3722,7 @@ void msthawk_state::prepare_display() { u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,0,1,2,3,4,5,6,7,8,9); u32 plate = bitswap<24>(m_plate,23,22,21,19,20,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0); - display_matrix(21, 10, plate, grid); + m_display->matrix(grid, plate); } WRITE8_MEMBER(msthawk_state::plate_w) @@ -3760,6 +3801,7 @@ void msthawk_state::msthawk(machine_config &config) screen.set_size(1920, 696); screen.set_visarea_full(); + PWM_DISPLAY(config, m_display).set_size(10, 21); config.set_default_layout(layout_msthawk); /* sound hardware */ @@ -3813,7 +3855,7 @@ WRITE8_MEMBER(pbqbert_state::plate_w) // update display u32 plate = bitswap<32>(m_plate,31,30,24,25,26,27,28,15,14,29,13,12,11,10,9,8,7,6,5,4,3,2,1,0,16,17,18,19,20,21,22,23) | 0x400000; - display_matrix(30, 8, plate, m_grid); + m_display->matrix(m_grid, plate); } WRITE16_MEMBER(pbqbert_state::grid_w) @@ -3859,6 +3901,8 @@ void pbqbert_state::pbqbert(machine_config &config) screen.set_size(603, 1080); screen.set_visarea_full(); + PWM_DISPLAY(config, m_display).set_size(8, 30); + /* sound hardware */ SPEAKER(config, "mono").front_center(); SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); @@ -3910,7 +3954,7 @@ void kingman_state::prepare_display() { u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,9,0,1,2,3,4,5,6,7,8); u32 plate = bitswap<24>(m_plate,23,6,7,5,4,3,2,1,0,13,12,20,19,18,17,16,10,11,9,8,14,15,13,12); - display_matrix(23, 9, plate, grid); + m_display->matrix(grid, plate); } WRITE8_MEMBER(kingman_state::plate_w) @@ -3983,6 +4027,8 @@ void kingman_state::kingman(machine_config &config) screen.set_size(374, 1080); screen.set_visarea_full(); + PWM_DISPLAY(config, m_display).set_size(9, 23); + /* sound hardware */ SPEAKER(config, "mono").front_center(); SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); @@ -4034,7 +4080,7 @@ void tmtron_state::prepare_display() { u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,1,2,3,4,5,6,7,8,9,0); u32 plate = bitswap<24>(m_plate,23,5,2,21,1,6,7,9,10,11,21,0,19,3,4,8,3,18,17,16,12,13,14,15); - display_matrix(23, 10, plate, grid); + m_display->matrix(grid, plate); } WRITE8_MEMBER(tmtron_state::plate_w) @@ -4107,6 +4153,8 @@ void tmtron_state::tmtron(machine_config &config) screen.set_size(1920, 662); screen.set_visarea_full(); + PWM_DISPLAY(config, m_display).set_size(10, 23); + /* sound hardware */ SPEAKER(config, "mono").front_center(); SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); @@ -4162,7 +4210,7 @@ WRITE8_MEMBER(vinvader_state::plate_w) // update display u16 plate = bitswap<16>(m_plate,15,11,7,3,10,6,14,2,9,5,13,1,8,4,12,0); - display_matrix(12, 9, plate, m_grid); + m_display->matrix(m_grid, plate); } WRITE16_MEMBER(vinvader_state::grid_w) @@ -4196,7 +4244,7 @@ INPUT_PORTS_END void vinvader_state::vinvader(machine_config &config) { /* basic machine hardware */ - HD38750(config, m_maincpu, 400000); // approximation + HD38750(config, m_maincpu, 300000); // approximation m_maincpu->read_r<0>().set_ioport("IN.0"); m_maincpu->write_r<1>().set(FUNC(vinvader_state::plate_w)); m_maincpu->write_r<2>().set(FUNC(vinvader_state::plate_w)); @@ -4210,6 +4258,8 @@ void vinvader_state::vinvader(machine_config &config) screen.set_size(233, 1080); screen.set_visarea_full(); + PWM_DISPLAY(config, m_display).set_size(9, 12); + /* sound hardware */ SPEAKER(config, "mono").front_center(); SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); diff --git a/src/mame/drivers/hh_melps4.cpp b/src/mame/drivers/hh_melps4.cpp index affd20bb03a..724443e481b 100644 --- a/src/mame/drivers/hh_melps4.cpp +++ b/src/mame/drivers/hh_melps4.cpp @@ -9,9 +9,8 @@ ***************************************************************************/ #include "emu.h" -#include "includes/screenless.h" - #include "cpu/melps4/m58846.h" +#include "video/pwm.h" #include "sound/spkrdev.h" #include "screen.h" @@ -20,20 +19,22 @@ //#include "hh_melps4_test.lh" // common test-layout - no svg artwork(yet), use external artwork -class hh_melps4_state : public screenless_state +class hh_melps4_state : public driver_device { public: hh_melps4_state(const machine_config &mconfig, device_type type, const char *tag) : - screenless_state(mconfig, type, tag), + driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), - m_inp_matrix(*this, "IN.%u", 0), - m_speaker(*this, "speaker") + m_display(*this, "display"), + m_speaker(*this, "speaker"), + m_inputs(*this, "IN.%u", 0) { } // devices required_device m_maincpu; - optional_ioport_array<4> m_inp_matrix; // max 4 + optional_device m_display; optional_device m_speaker; + optional_ioport_array<4> m_inputs; // max 4 // misc common u16 m_inp_mux; // multiplexed inputs mask @@ -54,8 +55,6 @@ protected: void hh_melps4_state::machine_start() { - screenless_state::machine_start(); - // zerofill m_inp_mux = 0; m_grid = 0; @@ -88,7 +87,7 @@ u8 hh_melps4_state::read_inputs(int columns) // read selected input rows for (int i = 0; i < columns; i++) if (m_inp_mux >> i & 1) - ret |= m_inp_matrix[i]->read(); + ret |= m_inputs[i]->read(); return ret; } @@ -139,7 +138,7 @@ void cfrogger_state::prepare_display() { u16 grid = bitswap<16>(m_grid,15,14,13,12,0,1,2,3,4,5,6,7,8,9,10,11); u16 plate = bitswap<16>(m_plate,12,4,13,5,14,6,15,7,3,11,2,10,1,9,0,8); - display_matrix(16, 12, plate, grid); + m_display->matrix(grid, plate); } WRITE8_MEMBER(cfrogger_state::plate_w) @@ -173,7 +172,7 @@ READ16_MEMBER(cfrogger_state::input_r) // K0,K1: multiplexed inputs // K2: N/C // K3: fixed input - return (m_inp_matrix[2]->read() & 8) | (read_inputs(2) & 3); + return (m_inputs[2]->read() & 8) | (read_inputs(2) & 3); } // config @@ -213,6 +212,8 @@ void cfrogger_state::cfrogger(machine_config &config) screen.set_size(500, 1080); screen.set_visarea_full(); + PWM_DISPLAY(config, m_display).set_size(12, 16); + /* sound hardware */ SPEAKER(config, "mono").front_center(); SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); @@ -262,7 +263,7 @@ void gjungler_state::prepare_display() { u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,9,8,7,6,5,4,3,2,0,1); u32 plate = bitswap<24>(m_plate,23,22,21,20,19,18,8,9,10,11,13,16,15,14,13,12,7,0,6,1,5,2,4,3) | 0x2000; - display_matrix(18, 12, plate, grid); + m_display->matrix(grid, plate); } WRITE8_MEMBER(gjungler_state::plate_w) @@ -295,7 +296,7 @@ READ16_MEMBER(gjungler_state::input_r) { // K0,K1: multiplexed inputs // K2,K3: fixed inputs - return (m_inp_matrix[2]->read() & 0xc) | (read_inputs(2) & 3); + return (m_inputs[2]->read() & 0xc) | (read_inputs(2) & 3); } // config @@ -337,6 +338,8 @@ void gjungler_state::gjungler(machine_config &config) screen.set_size(481, 1080); screen.set_visarea_full(); + PWM_DISPLAY(config, m_display).set_size(12, 18); + /* sound hardware */ SPEAKER(config, "mono").front_center(); SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); diff --git a/src/mame/drivers/hh_pic16.cpp b/src/mame/drivers/hh_pic16.cpp index 98eab3f15df..8058a61dd82 100644 --- a/src/mame/drivers/hh_pic16.cpp +++ b/src/mame/drivers/hh_pic16.cpp @@ -77,14 +77,14 @@ public: hh_pic16_state(const machine_config &mconfig, device_type type, const char *tag) : screenless_state(mconfig, type, tag), m_maincpu(*this, "maincpu"), - m_inp_matrix(*this, "IN.%u", 0), - m_speaker(*this, "speaker") + m_speaker(*this, "speaker"), + m_inputs(*this, "IN.%u", 0) { } // devices required_device m_maincpu; - optional_ioport_array<6> m_inp_matrix; // max 6 optional_device m_speaker; + optional_ioport_array<6> m_inputs; // max 6 // misc common u8 m_a; // MCU port A write data @@ -146,7 +146,7 @@ u16 hh_pic16_state::read_inputs(int columns, u16 colmask) // read selected input rows for (int i = 0; i < columns; i++) if (~m_inp_mux >> i & 1) - ret &= m_inp_matrix[i]->read(); + ret &= m_inputs[i]->read(); return ret; } @@ -158,7 +158,7 @@ u8 hh_pic16_state::read_rotated_inputs(int columns, u8 rowmask) // read selected input columns for (int i = 0; i < 8; i++) - if (1 << i & rowmask && ~m_inp_matrix[i]->read() & ~m_inp_mux & colmask) + if (1 << i & rowmask && ~m_inputs[i]->read() & ~m_inp_mux & colmask) ret |= 1 << i; // active low @@ -689,7 +689,7 @@ void matchme_state::set_clock() { // MCU clock is ~1.2MHz by default (R=18K, C=15pF), high speed setting adds a // 10pF cap to speed it up by about 7.5%. - m_maincpu->set_unscaled_clock((m_inp_matrix[4]->read() & 1) ? 1300000 : 1200000); + m_maincpu->set_unscaled_clock((m_inputs[4]->read() & 1) ? 1300000 : 1200000); } WRITE8_MEMBER(matchme_state::write_b) @@ -990,7 +990,7 @@ void tbaskb_state::prepare_display() READ8_MEMBER(tbaskb_state::read_a) { // A2: skill switch, A3: multiplexed inputs - return m_inp_matrix[5]->read() | read_inputs(5, 8) | 3; + return m_inputs[5]->read() | read_inputs(5, 8) | 3; } WRITE8_MEMBER(tbaskb_state::write_b) @@ -1229,7 +1229,7 @@ void hccbaskb_state::prepare_display() READ8_MEMBER(hccbaskb_state::read_a) { // A2: skill switch, A3: multiplexed inputs - return m_inp_matrix[5]->read() | read_inputs(5, 8) | 3; + return m_inputs[5]->read() | read_inputs(5, 8) | 3; } WRITE8_MEMBER(hccbaskb_state::write_b) @@ -1353,7 +1353,7 @@ void ttfball_state::prepare_display() READ8_MEMBER(ttfball_state::read_a) { // A3: multiplexed inputs, A0-A2: other inputs - return m_inp_matrix[5]->read() | read_inputs(5, 8); + return m_inputs[5]->read() | read_inputs(5, 8); } WRITE8_MEMBER(ttfball_state::write_b) @@ -1623,7 +1623,7 @@ void us2pfball_state::prepare_display() READ8_MEMBER(us2pfball_state::read_a) { // A0,A1: multiplexed inputs, A4-A7: other inputs - return read_inputs(4, 3) | (m_inp_matrix[4]->read() & 0xf0) | 0x0c; + return read_inputs(4, 3) | (m_inputs[4]->read() & 0xf0) | 0x0c; } WRITE8_MEMBER(us2pfball_state::write_a) diff --git a/src/mame/drivers/hh_sm510.cpp b/src/mame/drivers/hh_sm510.cpp index 4058c5e6674..792c8bdfd16 100644 --- a/src/mame/drivers/hh_sm510.cpp +++ b/src/mame/drivers/hh_sm510.cpp @@ -133,7 +133,7 @@ void hh_sm510_state::machine_start() // determine number of input lines (set it in the subclass constructor if different) if (m_inp_lines == 0 && m_inp_fixed < 0) { - for (; m_inp_matrix[m_inp_lines] != nullptr; m_inp_lines++) { ; } + for (; m_inputs[m_inp_lines] != nullptr; m_inp_lines++) { ; } // when last input line is fixed(GND) if (m_inp_fixed == -2) @@ -252,10 +252,10 @@ u8 hh_sm510_state::read_inputs(int columns, int fixed) // read selected input rows for (int i = 0; i < columns; i++) if (m_inp_mux >> i & 1) - ret |= m_inp_matrix[i]->read(); + ret |= m_inputs[i]->read(); if (fixed >= 0) - ret |= m_inp_matrix[fixed]->read(); + ret |= m_inputs[fixed]->read(); return ret; } diff --git a/src/mame/drivers/hh_tms1k.cpp b/src/mame/drivers/hh_tms1k.cpp index 2e3e2d03dd4..57cb0e41573 100644 --- a/src/mame/drivers/hh_tms1k.cpp +++ b/src/mame/drivers/hh_tms1k.cpp @@ -286,7 +286,7 @@ u8 hh_tms1k_state::read_inputs(int columns) // read selected input rows for (int i = 0; i < columns; i++) if (m_inp_mux >> i & 1) - ret |= m_inp_matrix[i]->read(); + ret |= m_inputs[i]->read(); return ret; } @@ -298,7 +298,7 @@ u8 hh_tms1k_state::read_rotated_inputs(int columns, u8 rowmask) // read selected input columns for (int i = 0; i < 8; i++) - if (1 << i & rowmask && m_inp_matrix[i]->read() & m_inp_mux & colmask) + if (1 << i & rowmask && m_inputs[i]->read() & m_inp_mux & colmask) ret |= 1 << i; return ret; @@ -307,7 +307,7 @@ u8 hh_tms1k_state::read_rotated_inputs(int columns, u8 rowmask) void hh_tms1k_state::switch_change(int sel, u32 mask, bool next) { // config switches (for direct control) - ioport_field *inp = m_inp_matrix[sel]->field(mask); + ioport_field *inp = m_inputs[sel]->field(mask); if (next && inp->has_next_setting()) inp->select_next_setting(); @@ -1694,7 +1694,7 @@ void h2hbaseb_state::set_clock() { // MCU clock is from an RC circuit with C=47pF, and R value is depending on // skill switch: R=51K(1) or 43K(2) - m_maincpu->set_unscaled_clock((m_inp_matrix[5]->read() & 1) ? 400000 : 350000); + m_maincpu->set_unscaled_clock((m_inputs[5]->read() & 1) ? 400000 : 350000); } void h2hbaseb_state::prepare_display() @@ -1728,7 +1728,7 @@ WRITE16_MEMBER(h2hbaseb_state::write_o) READ8_MEMBER(h2hbaseb_state::read_k) { // K: multiplexed inputs (note: K8(Vss row) is always on) - return m_inp_matrix[4]->read() | read_inputs(4); + return m_inputs[4]->read() | read_inputs(4); } // config @@ -3150,7 +3150,7 @@ WRITE16_MEMBER(ebball_state::write_o) READ8_MEMBER(ebball_state::read_k) { // K: multiplexed inputs (note: K8(Vss row) is always on) - return m_inp_matrix[5]->read() | read_inputs(5); + return m_inputs[5]->read() | read_inputs(5); } // config @@ -3416,7 +3416,7 @@ void ebball3_state::set_clock() // MCU clock is from an RC circuit(R=47K, C=33pF) oscillating by default at ~340kHz, // but on PRO, the difficulty switch adds an extra 150K resistor to Vdd to speed // it up to around ~440kHz. - m_maincpu->set_unscaled_clock((m_inp_matrix[3]->read() & 1) ? 440000 : 340000); + m_maincpu->set_unscaled_clock((m_inputs[3]->read() & 1) ? 440000 : 340000); } void ebball3_state::prepare_display() @@ -3703,7 +3703,7 @@ void einvader_state::set_clock() // MCU clock is from an RC circuit(R=47K, C=56pF) oscillating by default at ~320kHz, // but on PRO, the difficulty switch adds an extra 180K resistor to Vdd to speed // it up to around ~400kHz. - m_maincpu->set_unscaled_clock((m_inp_matrix[0]->read() & 8) ? 400000 : 320000); + m_maincpu->set_unscaled_clock((m_inputs[0]->read() & 8) ? 400000 : 320000); } void einvader_state::prepare_display() @@ -4099,7 +4099,7 @@ void raisedvl_state::set_clock() // 0: R=47K -> ~350kHz // 2,3: R=35K8 -> ~425kHz (combined) // 4: R=32K -> ~465kHz (combined) - u8 inp = m_inp_matrix[1]->read(); + u8 inp = m_inputs[1]->read(); m_maincpu->set_unscaled_clock((inp & 0x20) ? 465000 : ((inp & 0x10) ? 425000 : 350000)); } @@ -4363,7 +4363,7 @@ void f3in1_state::machine_reset() void f3in1_state::set_clock() { // MCU clock is from an RC circuit where C=47pF, R=39K(PROF) or 56K(REG) - m_maincpu->set_unscaled_clock((m_inp_matrix[4]->read() & 1) ? 400000 : 300000); + m_maincpu->set_unscaled_clock((m_inputs[4]->read() & 1) ? 400000 : 300000); } void f3in1_state::prepare_display() @@ -4811,7 +4811,7 @@ WRITE16_MEMBER(ginv_state::write_o) READ8_MEMBER(ginv_state::read_k) { // K1-K4: multiplexed inputs (K8 is fire button) - return m_inp_matrix[2]->read() | read_inputs(2); + return m_inputs[2]->read() | read_inputs(2); } // config @@ -4935,7 +4935,7 @@ WRITE16_MEMBER(ginv1000_state::write_o) READ8_MEMBER(ginv1000_state::read_k) { // K1,K2: multiplexed inputs (K8 is fire button) - return m_inp_matrix[2]->read() | read_inputs(2); + return m_inputs[2]->read() | read_inputs(2); } // config @@ -5079,7 +5079,7 @@ WRITE16_MEMBER(ginv2000_state::write_o) READ8_MEMBER(ginv2000_state::read_k) { // K1,K2: multiplexed inputs (K8 is fire button) - return m_inp_matrix[2]->read() | read_inputs(2); + return m_inputs[2]->read() | read_inputs(2); } // config @@ -5347,7 +5347,7 @@ WRITE16_MEMBER(elecdet_state::write_o) READ8_MEMBER(elecdet_state::read_k) { // K: multiplexed inputs (note: the Vss row is always on) - return m_inp_matrix[4]->read() | read_inputs(4); + return m_inputs[4]->read() | read_inputs(4); } // config @@ -6419,7 +6419,7 @@ WRITE16_MEMBER(bship_state::write_o) READ8_MEMBER(bship_state::read_k) { // K: multiplexed inputs (note: the Vss row is always on) - return m_inp_matrix[11]->read() | read_inputs(11); + return m_inputs[11]->read() | read_inputs(11); } // config @@ -6605,7 +6605,7 @@ WRITE16_MEMBER(bshipb_state::write_o) READ8_MEMBER(bshipb_state::read_k) { // K: multiplexed inputs (note: the Vss row is always on) - return m_inp_matrix[11]->read() | read_inputs(11); + return m_inputs[11]->read() | read_inputs(11); } // config @@ -6831,7 +6831,7 @@ void ssimon_state::set_clock() // 0 Simple: R=51K -> ~200kHz // 1 Normal: R=37K -> ~275kHz // 2 Super: R=22K -> ~400kHz - u8 inp = m_inp_matrix[6]->read(); + u8 inp = m_inputs[6]->read(); m_maincpu->set_unscaled_clock((inp & 2) ? 400000 : ((inp & 1) ? 275000 : 200000)); } @@ -7893,7 +7893,7 @@ WRITE16_MEMBER(stopthief_state::write_o) READ8_MEMBER(stopthief_state::read_k) { // K: multiplexed inputs (note: the Vss row is always on) - return m_inp_matrix[2]->read() | read_inputs(2); + return m_inputs[2]->read() | read_inputs(2); } // config @@ -9060,7 +9060,7 @@ WRITE16_MEMBER(speechp_state::write_o) READ8_MEMBER(speechp_state::read_k) { // K: multiplexed inputs - return m_inp_matrix[10]->read() | (read_inputs(10) & 7); + return m_inputs[10]->read() | (read_inputs(10) & 7); } // config @@ -9902,7 +9902,7 @@ void tbreakup_state::machine_reset() void tbreakup_state::set_clock() { // MCU clock is from an analog circuit with resistor of 73K, PRO2 adds 100K - m_maincpu->set_unscaled_clock((m_inp_matrix[3]->read() & 1) ? 500000 : 325000); + m_maincpu->set_unscaled_clock((m_inputs[3]->read() & 1) ? 500000 : 325000); } void tbreakup_state::prepare_display() @@ -9964,7 +9964,7 @@ READ8_MEMBER(tbreakup_state::read_k) { // K4: fixed input // K8: multiplexed inputs - return (m_inp_matrix[2]->read() & 4) | (read_inputs(2) & 8); + return (m_inputs[2]->read() & 4) | (read_inputs(2) & 8); } // config @@ -10079,7 +10079,7 @@ void phpball_state::prepare_display() { // rectangular LEDs under LEDs D,F and E,G are directly connected // to the left and right flipper buttons - output them to 10.a and 9.a - u16 in1 = m_inp_matrix[1]->read() << 7 & 0x600; + u16 in1 = m_inputs[1]->read() << 7 & 0x600; set_display_segmask(7, 0x7f); display_matrix(7, 11, m_o, (m_r & 0x1ff) | in1); @@ -10110,7 +10110,7 @@ WRITE16_MEMBER(phpball_state::write_o) READ8_MEMBER(phpball_state::read_k) { // K: multiplexed inputs (note: the Vss row is always on) - return m_inp_matrix[1]->read() | read_inputs(1); + return m_inputs[1]->read() | read_inputs(1); } // config diff --git a/src/mame/drivers/hh_ucom4.cpp b/src/mame/drivers/hh_ucom4.cpp index 10d4434981c..9565df83710 100644 --- a/src/mame/drivers/hh_ucom4.cpp +++ b/src/mame/drivers/hh_ucom4.cpp @@ -92,8 +92,6 @@ void hh_ucom4_state::machine_start() { - screenless_state::machine_start(); - // zerofill memset(m_port, 0, sizeof(m_port)); m_int = 0; @@ -131,7 +129,7 @@ u8 hh_ucom4_state::read_inputs(int columns) // read selected input rows for (int i = 0; i < columns; i++) if (m_inp_mux >> i & 1) - ret |= m_inp_matrix[i]->read(); + ret |= m_inputs[i]->read(); return ret; } @@ -210,7 +208,7 @@ void ufombs_state::prepare_display() { u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,9,3,2,1,0,4,5,6,7,8); u16 plate = bitswap<16>(m_plate,15,14,13,12,11,7,10,6,9,5,8,4,0,1,2,3); - display_matrix(10, 9, plate, grid); + m_display->matrix(grid, plate); } WRITE8_MEMBER(ufombs_state::grid_w) @@ -274,6 +272,8 @@ void ufombs_state::ufombs(machine_config &config) screen.set_size(243, 1080); screen.set_visarea_full(); + PWM_DISPLAY(config, m_display).set_size(9, 10); + /* sound hardware */ SPEAKER(config, "mono").front_center(); SPEAKER_SOUND(config, m_speaker); @@ -330,7 +330,7 @@ public: void ssfball_state::prepare_display() { u32 plate = bitswap<24>(m_plate,23,22,21,20,19,11,7,3,12,17,13,18,16,14,15,10,9,8,0,1,2,4,5,6); - display_matrix(16, 9, plate, m_grid); + m_display->matrix(m_grid, plate); } WRITE8_MEMBER(ssfball_state::grid_w) @@ -363,7 +363,7 @@ WRITE8_MEMBER(ssfball_state::plate_w) READ8_MEMBER(ssfball_state::input_b_r) { // B: input port 2, where B3 is multiplexed - return m_inp_matrix[2]->read() | read_inputs(2); + return m_inputs[2]->read() | read_inputs(2); } // config @@ -429,6 +429,8 @@ void ssfball_state::ssfball(machine_config &config) screen.set_size(1920, 482); screen.set_visarea_full(); + PWM_DISPLAY(config, m_display).set_size(9, 16); + /* sound hardware */ SPEAKER(config, "mono").front_center(); SPEAKER_SOUND(config, m_speaker); @@ -490,7 +492,7 @@ public: void bmsoccer_state::prepare_display() { u32 plate = bitswap<24>(m_plate,23,22,21,20,19,11,7,3,12,17,13,18,16,14,15,8,4,0,9,5,1,10,6,2); - display_matrix(16, 9, plate, m_grid); + m_display->matrix(m_grid, plate); } WRITE8_MEMBER(bmsoccer_state::grid_w) @@ -573,6 +575,8 @@ void bmsoccer_state::bmsoccer(machine_config &config) screen.set_size(271, 1080); screen.set_visarea_full(); + PWM_DISPLAY(config, m_display).set_size(9, 16); + /* sound hardware */ SPEAKER(config, "mono").front_center(); SPEAKER_SOUND(config, m_speaker); @@ -622,7 +626,7 @@ void bmsafari_state::prepare_display() { u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,9,0,1,2,3,4,5,6,7,8); u16 plate = bitswap<16>(m_plate,15,14,13,12,11,7,10,2,9,5,8,4,0,1,6,3); - display_matrix(10, 9, plate, grid); + m_display->matrix(grid, plate); } WRITE8_MEMBER(bmsafari_state::grid_w) @@ -688,6 +692,8 @@ void bmsafari_state::bmsafari(machine_config &config) screen.set_size(248, 1080); screen.set_visarea_full(); + PWM_DISPLAY(config, m_display).set_size(9, 10); + /* sound hardware */ SPEAKER(config, "mono").front_center(); SPEAKER_SOUND(config, m_speaker); @@ -739,7 +745,7 @@ public: void splasfgt_state::prepare_display() { u32 plate = bitswap<24>(m_plate,23,22,21,20,19,18,17,13,1,0,8,6,0,10,11,14,15,16,9,5,7,4,2,3); - display_matrix(16, 9, plate, m_grid); + m_display->matrix(m_grid, plate); } WRITE8_MEMBER(splasfgt_state::grid_w) @@ -847,6 +853,8 @@ void splasfgt_state::splasfgt(machine_config &config) screen.set_size(1920, 476); screen.set_visarea_full(); + PWM_DISPLAY(config, m_display).set_size(9, 16); + /* sound hardware */ SPEAKER(config, "mono").front_center(); SPEAKER_SOUND(config, m_speaker); @@ -900,7 +908,7 @@ void bcclimbr_state::prepare_display() { u8 grid = bitswap<8>(m_grid,7,6,0,1,2,3,4,5); u32 plate = bitswap<24>(m_plate,23,22,21,20,16,17,18,19,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0); - display_matrix(20, 6, plate, grid); + m_display->matrix(grid, plate); } WRITE8_MEMBER(bcclimbr_state::grid_w) @@ -959,6 +967,8 @@ void bcclimbr_state::bcclimbr(machine_config &config) screen.set_size(310, 1080); screen.set_visarea_full(); + PWM_DISPLAY(config, m_display).set_size(6, 20); + /* sound hardware */ SPEAKER(config, "mono").front_center(); SPEAKER_SOUND(config, m_speaker); @@ -1014,7 +1024,7 @@ WRITE8_MEMBER(tactix_state::leds_w) { // D,F: 4*4 led matrix m_port[offset] = data; - display_matrix(4, 4, m_port[NEC_UCOM4_PORTD], m_port[NEC_UCOM4_PORTF]); + m_display->matrix(m_port[NEC_UCOM4_PORTF], m_port[NEC_UCOM4_PORTD]); } WRITE8_MEMBER(tactix_state::speaker_w) @@ -1081,6 +1091,8 @@ void tactix_state::tactix(machine_config &config) m_maincpu->write_f().set(FUNC(tactix_state::leds_w)); m_maincpu->write_g().set(FUNC(tactix_state::speaker_w)); + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(4, 4); config.set_default_layout(layout_tactix); /* sound hardware */ @@ -1136,9 +1148,8 @@ void ctntune_state::prepare_display() u8 sel = m_port[NEC_UCOM4_PORTD] >> 3 & 1; // turn off display when power is off u8 lamps = m_port[NEC_UCOM4_PORTD] & 3; u8 digit = (m_port[NEC_UCOM4_PORTF] << 4 | m_port[NEC_UCOM4_PORTE]) & 0x7f; - set_display_segmask(1, 0x7f); - display_matrix(7+2, 1, lamps << 7 | digit, sel); + m_display->matrix(sel, lamps << 7 | digit); } WRITE8_MEMBER(ctntune_state::_7seg_w) @@ -1220,6 +1231,9 @@ void ctntune_state::ctntune(machine_config &config) m_maincpu->write_f().set(FUNC(ctntune_state::_7seg_w)); m_maincpu->write_g().set(FUNC(ctntune_state::speaker_w)); + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(1, 7+2); + m_display->set_segmask(1, 0x7f); config.set_default_layout(layout_ctntune); /* sound hardware */ @@ -1271,7 +1285,7 @@ void invspace_state::prepare_display() { u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,8,9,7,6,5,4,3,2,1,0); u32 plate = bitswap<24>(m_plate,23,22,21,20,19,9,14,13,8,15,11,10,7,11,3,2,6,10,1,5,9,0,4,8); - display_matrix(19, 9, plate, grid); + m_display->matrix(grid, plate); } WRITE8_MEMBER(invspace_state::grid_w) @@ -1329,6 +1343,8 @@ void invspace_state::invspace(machine_config &config) screen.set_size(289, 1080); screen.set_visarea_full(); + PWM_DISPLAY(config, m_display).set_size(9, 19); + /* sound hardware */ SPEAKER(config, "mono").front_center(); SPEAKER_SOUND(config, m_speaker); @@ -1380,7 +1396,7 @@ public: void efball_state::prepare_display() { u16 plate = bitswap<16>(m_plate,15,14,13,12,11,4,3,0,2,1,6,10,9,5,8,7); - display_matrix(11, 10, plate, m_grid); + m_display->matrix(m_grid, plate); } WRITE8_MEMBER(efball_state::grid_w) @@ -1447,6 +1463,8 @@ void efball_state::efball(machine_config &config) m_maincpu->write_h().set(FUNC(efball_state::grid_w)); m_maincpu->write_i().set(FUNC(efball_state::plate_w)); + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(10, 11); config.set_default_layout(layout_efball); /* sound hardware */ @@ -1501,7 +1519,7 @@ void galaxy2_state::prepare_display() { u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,0,1,2,3,4,5,6,7,8,9); u16 plate = bitswap<16>(m_plate,15,3,2,6,1,5,4,0,11,10,7,12,14,13,8,9); - display_matrix(15, 10, plate, grid); + m_display->matrix(grid, plate); } WRITE8_MEMBER(galaxy2_state::grid_w) @@ -1559,6 +1577,8 @@ void galaxy2_state::galaxy2(machine_config &config) screen.set_size(304, 1080); screen.set_visarea_full(); + PWM_DISPLAY(config, m_display).set_size(10, 15); + /* sound hardware */ SPEAKER(config, "mono").front_center(); SPEAKER_SOUND(config, m_speaker); @@ -1630,7 +1650,7 @@ void astrocmd_state::prepare_display() { u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,9,8,4,5,6,7,0,1,2,3); u32 plate = bitswap<24>(m_plate,23,22,21,20,19,3,2,12,13,14,15,16,17,18,0,1,4,8,5,9,7,11,6,10); - display_matrix(17, 9, plate, grid); + m_display->matrix(grid, plate); } WRITE8_MEMBER(astrocmd_state::grid_w) @@ -1695,6 +1715,8 @@ void astrocmd_state::astrocmd(machine_config &config) screen.set_size(1920, 525); screen.set_visarea_full(); + PWM_DISPLAY(config, m_display).set_size(9, 17); + /* sound hardware */ SPEAKER(config, "mono").front_center(); SPEAKER_SOUND(config, m_speaker); @@ -1748,7 +1770,7 @@ WRITE8_MEMBER(edracula_state::grid_w) // C,D: vfd grid int shift = (offset - NEC_UCOM4_PORTC) * 4; m_grid = (m_grid & ~(0xf << shift)) | (data << shift); - display_matrix(18, 8, m_plate, m_grid); + m_display->matrix(m_grid, m_plate); } WRITE8_MEMBER(edracula_state::plate_w) @@ -1760,7 +1782,7 @@ WRITE8_MEMBER(edracula_state::plate_w) // E,F,G,H,I01: vfd plate int shift = (offset - NEC_UCOM4_PORTE) * 4; m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - display_matrix(18, 8, m_plate, m_grid); + m_display->matrix(m_grid, m_plate); } // config @@ -1799,6 +1821,8 @@ void edracula_state::edracula(machine_config &config) screen.set_size(1920, 526); screen.set_visarea_full(); + PWM_DISPLAY(config, m_display).set_size(8, 18); + /* sound hardware */ SPEAKER(config, "mono").front_center(); SPEAKER_SOUND(config, m_speaker); @@ -1847,7 +1871,7 @@ public: WRITE32_MEMBER(mcompgin_state::lcd_output_w) { // uses ROW0-4, COL11-24 - display_matrix(24, 8, data, 1 << offset); + m_display->matrix(1 << offset, data); } WRITE8_MEMBER(mcompgin_state::lcd_w) @@ -1887,6 +1911,8 @@ void mcompgin_state::mcompgin(machine_config &config) HLCD0530(config, m_lcd, 500); // C=0.01uF m_lcd->write_cols().set(FUNC(mcompgin_state::lcd_output_w)); + PWM_DISPLAY(config, m_display).set_size(8, 24); + config.set_default_layout(layout_mcompgin); /* no sound! */ @@ -1932,7 +1958,7 @@ void mvbfree_state::prepare_display() { u16 grid = bitswap<16>(m_grid,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15); u16 plate = bitswap<16>(m_plate,15,14,13,12,11,10,0,1,2,3,4,5,6,7,8,9); - display_matrix(10, 14, plate, grid); + m_display->matrix(grid, plate); } WRITE8_MEMBER(mvbfree_state::grid_w) @@ -1993,6 +2019,8 @@ void mvbfree_state::mvbfree(machine_config &config) m_maincpu->write_h().set(FUNC(mvbfree_state::grid_w)); m_maincpu->write_i().set(FUNC(mvbfree_state::speaker_w)); + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(14, 10); config.set_default_layout(layout_mvbfree); /* sound hardware */ @@ -2058,7 +2086,7 @@ WRITE8_MEMBER(grobot9_state::lamps_w) // D,F,E0: lamps m_port[offset] = data; - display_matrix(9, 1, m_port[NEC_UCOM4_PORTD] | m_port[NEC_UCOM4_PORTF] << 4 | m_port[NEC_UCOM4_PORTE] << 8, 1); + m_display->matrix(1, m_port[NEC_UCOM4_PORTD] | m_port[NEC_UCOM4_PORTF] << 4 | m_port[NEC_UCOM4_PORTE] << 8); } WRITE8_MEMBER(grobot9_state::input_w) @@ -2114,6 +2142,9 @@ void grobot9_state::grobot9(machine_config &config) m_maincpu->write_e().set(FUNC(grobot9_state::lamps_w)); m_maincpu->write_f().set(FUNC(grobot9_state::lamps_w)); + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(1, 9); + m_display->set_bri_levels(0.25); config.set_default_layout(layout_grobot9); /* sound hardware */ @@ -2165,7 +2196,7 @@ void tccombat_state::prepare_display() { u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,9,8,3,2,1,0,7,6,5,4); u32 plate = bitswap<24>(m_plate,23,22,21,20,11,15,3,10,14,2,9,13,1,0,12,8,15,1,5,0,3,7,2,6); - display_matrix(20, 9, plate, grid); + m_display->matrix(grid, plate); } WRITE8_MEMBER(tccombat_state::grid_w) @@ -2219,6 +2250,8 @@ void tccombat_state::tccombat(machine_config &config) screen.set_size(300, 1080); screen.set_visarea_full(); + PWM_DISPLAY(config, m_display).set_size(9, 20); + /* sound hardware */ SPEAKER(config, "mono").front_center(); SPEAKER_SOUND(config, m_speaker); @@ -2287,7 +2320,7 @@ void tmtennis_state::set_clock() // MCU clock is from an LC circuit oscillating by default at ~360kHz, // but on PRO1, the difficulty switch puts a capacitor across the LC circuit // to slow it down to ~260kHz. - m_maincpu->set_unscaled_clock((m_inp_matrix[1]->read() & 0x100) ? 260000 : 360000); + m_maincpu->set_unscaled_clock((m_inputs[1]->read() & 0x100) ? 260000 : 360000); } WRITE8_MEMBER(tmtennis_state::grid_w) @@ -2295,7 +2328,7 @@ WRITE8_MEMBER(tmtennis_state::grid_w) // G,H,I: vfd grid int shift = (offset - NEC_UCOM4_PORTG) * 4; m_grid = (m_grid & ~(0xf << shift)) | (data << shift); - display_matrix(12, 12, m_plate, m_grid); + m_display->matrix(m_grid, m_plate); } WRITE8_MEMBER(tmtennis_state::plate_w) @@ -2303,7 +2336,7 @@ WRITE8_MEMBER(tmtennis_state::plate_w) // C,D,F: vfd plate int shift = (offset == NEC_UCOM4_PORTF) ? 8 : (offset - NEC_UCOM4_PORTC) * 4; m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - display_matrix(12, 12, m_plate, m_grid); + m_display->matrix(m_grid, m_plate); } WRITE8_MEMBER(tmtennis_state::port_e_w) @@ -2380,6 +2413,8 @@ void tmtennis_state::tmtennis(machine_config &config) screen.set_size(1920, 417); screen.set_visarea_full(); + PWM_DISPLAY(config, m_display).set_size(12, 12); + m_display->set_bri_levels(0.005); config.set_default_layout(layout_tmtennis); /* sound hardware */ @@ -2440,7 +2475,7 @@ void tmpacman_state::prepare_display() { u8 grid = bitswap<8>(m_grid,0,1,2,3,4,5,6,7); u32 plate = bitswap<24>(m_plate,23,22,21,20,19,16,17,18,11,10,9,8,0,2,3,1,4,5,6,7,12,13,14,15) | 0x100; - display_matrix(19, 8, plate, grid); + m_display->matrix(grid, plate); } WRITE8_MEMBER(tmpacman_state::grid_w) @@ -2499,6 +2534,8 @@ void tmpacman_state::tmpacman(machine_config &config) screen.set_size(1920, 508); screen.set_visarea_full(); + PWM_DISPLAY(config, m_display).set_size(8, 19); + /* sound hardware */ SPEAKER(config, "mono").front_center(); SPEAKER_SOUND(config, m_speaker); @@ -2552,7 +2589,7 @@ public: void tmscramb_state::prepare_display() { u32 plate = bitswap<24>(m_plate,23,22,21,20,19,18,17,3,15,2,14,1,13,16,0,12,8,4,9,5,10,6,11,7) | 0x400; - display_matrix(17, 10, plate, m_grid); + m_display->matrix(m_grid, plate); } WRITE8_MEMBER(tmscramb_state::grid_w) @@ -2610,6 +2647,8 @@ void tmscramb_state::tmscramb(machine_config &config) screen.set_size(1920, 556); screen.set_visarea_full(); + PWM_DISPLAY(config, m_display).set_size(10, 17); + /* sound hardware */ SPEAKER(config, "mono").front_center(); SPEAKER_SOUND(config, m_speaker); @@ -2663,7 +2702,7 @@ void tcaveman_state::prepare_display() { u8 grid = bitswap<8>(m_grid,0,1,2,3,4,5,6,7); u32 plate = bitswap<24>(m_plate,23,22,21,20,19,10,11,5,6,7,8,0,9,2,18,17,16,3,15,14,13,12,4,1) | 0x40; - display_matrix(19, 8, plate, grid); + m_display->matrix(grid, plate); } WRITE8_MEMBER(tcaveman_state::grid_w) @@ -2717,6 +2756,8 @@ void tcaveman_state::tcaveman(machine_config &config) screen.set_size(1920, 559); screen.set_visarea_full(); + PWM_DISPLAY(config, m_display).set_size(8, 19); + /* sound hardware */ SPEAKER(config, "mono").front_center(); SPEAKER_SOUND(config, m_speaker); @@ -2790,7 +2831,7 @@ WRITE8_MEMBER(alnchase_state::output_w) m_plate = ((m_plate << 2 & ~(0xf << shift)) | (data << shift)) >> 2; } - display_matrix(17, 9, m_plate, m_grid); + m_display->matrix(m_grid, m_plate); } READ8_MEMBER(alnchase_state::input_r) @@ -2858,6 +2899,8 @@ void alnchase_state::alnchase(machine_config &config) screen.set_size(365, 1080); screen.set_visarea_full(); + PWM_DISPLAY(config, m_display).set_size(9, 17); + /* sound hardware */ SPEAKER(config, "mono").front_center(); SPEAKER_SOUND(config, m_speaker); diff --git a/src/mame/drivers/rzone.cpp b/src/mame/drivers/rzone.cpp index c08021fbf26..ecc753e8a60 100644 --- a/src/mame/drivers/rzone.cpp +++ b/src/mame/drivers/rzone.cpp @@ -131,7 +131,7 @@ WRITE_LINE_MEMBER(rzone_state::sctrl_w) { // SCTRL: 74165 SH/LD: reload inputs while low if (!state || !m_sctrl) - m_inp_mux = m_inp_matrix[0]->read(); + m_inp_mux = m_inputs[0]->read(); m_sctrl = state; } diff --git a/src/mame/drivers/tb303.cpp b/src/mame/drivers/tb303.cpp index 1698197fdde..62dfdce85e5 100644 --- a/src/mame/drivers/tb303.cpp +++ b/src/mame/drivers/tb303.cpp @@ -136,7 +136,7 @@ void tb303_state::update_leds() 0.2 D208 1.2 D215 2.2 D220 3.2 D210 0.3 D209 1.3 D216 2.3 D221 3.3 D212 */ - display_matrix(4, 4, m_port[NEC_UCOM4_PORTG], m_port[NEC_UCOM4_PORTH]); + m_display->matrix(m_port[NEC_UCOM4_PORTH], m_port[NEC_UCOM4_PORTG]); // todo: battery led // todo: 4 more leds(see top-left part) @@ -160,7 +160,7 @@ READ8_MEMBER(tb303_state::input_r) if (offset == NEC_UCOM4_PORTA && m_inp_mux == 0) { // todo.. - return m_inp_matrix[4]->read(); + return m_inputs[4]->read(); } else return read_inputs(4) >> (offset*4) & 0xf; @@ -271,6 +271,8 @@ void tb303_state::tb303(machine_config &config) tp3_clock.set_start_delay(TP3_PERIOD - TP3_LOW); TIMER(config, "tp3_clear").configure_periodic(FUNC(tb303_state::tp3_clear), TP3_PERIOD); + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(4, 4); config.set_default_layout(layout_tb303); /* sound hardware */ diff --git a/src/mame/drivers/ticalc1x.cpp b/src/mame/drivers/ticalc1x.cpp index 0eae6892078..c37de839da3 100644 --- a/src/mame/drivers/ticalc1x.cpp +++ b/src/mame/drivers/ticalc1x.cpp @@ -86,8 +86,8 @@ void cmulti8_state::prepare_display() set_display_segmask(0xfffff, 0xff); // M-digit is on in memory mode, upper row is off in single mode - u32 m = (m_inp_matrix[10]->read() & 0x10) ? 0x100000 : 0; - u32 mask = (m_inp_matrix[10]->read() & 0x20) ? 0xfffff : 0xffc00; + u32 m = (m_inputs[10]->read() & 0x10) ? 0x100000 : 0; + u32 mask = (m_inputs[10]->read() & 0x20) ? 0xfffff : 0xffc00; // R10 selects display row u32 sel = (m_r & 0x400) ? (m_r & 0x3ff) : (m_r << 10 & 0xffc00); @@ -1280,7 +1280,7 @@ WRITE16_MEMBER(dataman_state::write_o) READ8_MEMBER(dataman_state::read_k) { // K: multiplexed inputs (note: the Vss row is always on) - return m_inp_matrix[5]->read() | read_inputs(5); + return m_inputs[5]->read() | read_inputs(5); } // config @@ -1497,7 +1497,7 @@ WRITE16_MEMBER(ti30_state::write_o) READ8_MEMBER(ti30_state::read_k) { // K: multiplexed inputs (note: the Vss row is always on) - return m_inp_matrix[7]->read() | read_inputs(7); + return m_inputs[7]->read() | read_inputs(7); } // config diff --git a/src/mame/drivers/tispeak.cpp b/src/mame/drivers/tispeak.cpp index f9a32b22afe..2e210f4525f 100644 --- a/src/mame/drivers/tispeak.cpp +++ b/src/mame/drivers/tispeak.cpp @@ -622,7 +622,7 @@ WRITE16_MEMBER(tispeak_state::snspell_write_o) READ8_MEMBER(tispeak_state::snspell_read_k) { // K: multiplexed inputs (note: the Vss row is always on) - return m_inp_matrix[8]->read() | read_inputs(8); + return m_inputs[8]->read() | read_inputs(8); } @@ -676,7 +676,7 @@ READ8_MEMBER(tispeak_state::snspellc_read_k) u8 k4 = m_tms5100->ctl_r(space, 0) << 2 & 4; // K: multiplexed inputs (note: the Vss row is always on) - return k4 | m_inp_matrix[9]->read() | read_inputs(9); + return k4 | m_inputs[9]->read() | read_inputs(9); } @@ -707,7 +707,7 @@ TIMER_DEVICE_CALLBACK_MEMBER(tispeak_state::tntell_get_overlay) // external module, the game continues. // pick overlay code from machine config, see comment section above for reference - m_overlay = m_inp_matrix[10]->read(); + m_overlay = m_inputs[10]->read(); // try to get it from (external) layout if (m_overlay == 0x20) diff --git a/src/mame/drivers/tispellb.cpp b/src/mame/drivers/tispellb.cpp index c6806552659..a7eaecda10f 100644 --- a/src/mame/drivers/tispellb.cpp +++ b/src/mame/drivers/tispellb.cpp @@ -177,7 +177,7 @@ WRITE16_MEMBER(tispellb_state::main_write_r) READ8_MEMBER(tispellb_state::main_read_k) { // K: multiplexed inputs (note: the Vss row is always on) - return m_inp_matrix[7]->read() | read_inputs(7); + return m_inputs[7]->read() | read_inputs(7); } diff --git a/src/mame/drivers/tr606.cpp b/src/mame/drivers/tr606.cpp index cddca7b0c8d..6721dc82159 100644 --- a/src/mame/drivers/tr606.cpp +++ b/src/mame/drivers/tr606.cpp @@ -92,6 +92,7 @@ void tr606_state::tr606(machine_config &config) tp3_clock.set_start_delay(TP3_PERIOD - TP3_LOW); TIMER(config, "tp3_clear").configure_periodic(FUNC(tr606_state::tp3_clear), TP3_PERIOD); + /* video hardware */ config.set_default_layout(layout_tr606); /* sound hardware */ diff --git a/src/mame/includes/hh_sm510.h b/src/mame/includes/hh_sm510.h index dee77543def..cb42456da1e 100644 --- a/src/mame/includes/hh_sm510.h +++ b/src/mame/includes/hh_sm510.h @@ -19,9 +19,9 @@ public: hh_sm510_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), - m_inp_matrix(*this, "IN.%u", 0), - m_out_x(*this, "%u.%u.%u", 0U, 0U, 0U), m_speaker(*this, "speaker"), + m_inputs(*this, "IN.%u", 0), + m_out_x(*this, "%u.%u.%u", 0U, 0U, 0U), m_inp_lines(0), m_inp_fixed(-1), m_display_wait(33) @@ -29,9 +29,9 @@ public: // devices required_device m_maincpu; - optional_ioport_array<8+1> m_inp_matrix; // max 8 - output_finder<16, 16, 4> m_out_x; optional_device m_speaker; + optional_ioport_array<8+1> m_inputs; // max 8 + output_finder<16, 16, 4> m_out_x; // misc common u16 m_inp_mux; // multiplexed inputs mask diff --git a/src/mame/includes/hh_tms1k.h b/src/mame/includes/hh_tms1k.h index bfb0a329ec0..76ae00850da 100644 --- a/src/mame/includes/hh_tms1k.h +++ b/src/mame/includes/hh_tms1k.h @@ -31,15 +31,15 @@ public: hh_tms1k_state(const machine_config &mconfig, device_type type, const char *tag) : screenless_state(mconfig, type, tag), m_maincpu(*this, "maincpu"), - m_inp_matrix(*this, "IN.%u", 0), m_speaker(*this, "speaker"), + m_inputs(*this, "IN.%u", 0), m_out_power(*this, "power") { } // devices required_device m_maincpu; - optional_ioport_array<18> m_inp_matrix; // max 18 optional_device m_speaker; + optional_ioport_array<18> m_inputs; // max 18 output_finder<> m_out_power; // power state, eg. led // misc common diff --git a/src/mame/includes/hh_ucom4.h b/src/mame/includes/hh_ucom4.h index 8ede7a7745a..8289c9dc309 100644 --- a/src/mame/includes/hh_ucom4.h +++ b/src/mame/includes/hh_ucom4.h @@ -9,26 +9,27 @@ #ifndef MAME_INCLUDES_HH_UCOM4_H #define MAME_INCLUDES_HH_UCOM4_H -#include "includes/screenless.h" - #include "cpu/ucom4/ucom4.h" +#include "video/pwm.h" #include "sound/spkrdev.h" -class hh_ucom4_state : public screenless_state +class hh_ucom4_state : public driver_device { public: hh_ucom4_state(const machine_config &mconfig, device_type type, const char *tag) : - screenless_state(mconfig, type, tag), + driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), - m_inp_matrix(*this, "IN.%u", 0), - m_speaker(*this, "speaker") + m_display(*this, "display"), + m_speaker(*this, "speaker"), + m_inputs(*this, "IN.%u", 0) { } // devices required_device m_maincpu; - optional_ioport_array<6> m_inp_matrix; // max 6 + optional_device m_display; optional_device m_speaker; + optional_ioport_array<6> m_inputs; // max 6 // misc common u8 m_port[9]; // MCU port A-I write data (optional) diff --git a/src/mame/layout/funrlgl.lay b/src/mame/layout/funrlgl.lay index 27141d341f9..ea7311b8429 100644 --- a/src/mame/layout/funrlgl.lay +++ b/src/mame/layout/funrlgl.lay @@ -6,12 +6,14 @@ - - + + + - - + + + -- cgit v1.2.3