hh*: using pwm_display_device for some drivers (nw)

This commit is contained in:
hap 2019-06-15 03:49:46 +02:00
parent 84150ccc0e
commit 3046353665
21 changed files with 336 additions and 209 deletions

View File

@ -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, size is 64 by 64, simply due to uint64_t constraints. If a larger size is needed,
create an array of pwm_display_device. 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. 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, Display element states are sent to output tags "y.x" where y is the matrix row number,

View File

@ -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 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<INPUT_LINE_IRQ0>), irq_period); TIMER(config, "irq_off").configure_periodic(FUNC(master_state::irq_off<INPUT_LINE_IRQ0>), irq_period);
/* video hardware */
PWM_DISPLAY(config, m_display).set_size(9, 2); PWM_DISPLAY(config, m_display).set_size(9, 2);
config.set_default_layout(layout_ck_master); config.set_default_layout(layout_ck_master);

View File

@ -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 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<INPUT_LINE_IRQ0>), irq_period); TIMER(config, "irq_off").configure_periodic(FUNC(ch2001_state::irq_off<INPUT_LINE_IRQ0>), irq_period);
/* video hardware */
PWM_DISPLAY(config, m_display).set_size(10, 8); PWM_DISPLAY(config, m_display).set_size(10, 8);
config.set_default_layout(layout_cxg_ch2001); config.set_default_layout(layout_cxg_ch2001);

View File

@ -33,14 +33,14 @@ public:
m_maincpu(*this, "maincpu"), m_maincpu(*this, "maincpu"),
m_display(*this, "display"), m_display(*this, "display"),
m_speaker(*this, "speaker"), m_speaker(*this, "speaker"),
m_inp_matrix(*this, "IN.%u", 0) m_inputs(*this, "IN.%u", 0)
{ } { }
// devices // devices
required_device<amis2000_base_device> m_maincpu; required_device<amis2000_base_device> m_maincpu;
optional_device<pwm_display_device> m_display; optional_device<pwm_display_device> m_display;
optional_device<speaker_sound_device> m_speaker; optional_device<speaker_sound_device> m_speaker;
optional_ioport_array<4> m_inp_matrix; // max 4 optional_ioport_array<4> m_inputs; // max 4
// misc common // misc common
u16 m_a; // MCU address bus u16 m_a; // MCU address bus
@ -94,7 +94,7 @@ u8 hh_amis2k_state::read_inputs(int columns)
// read selected input rows // read selected input rows
for (int i = 0; i < columns; i++) for (int i = 0; i < columns; i++)
if (m_inp_mux >> i & 1) if (m_inp_mux >> i & 1)
ret |= m_inp_matrix[i]->read(); ret |= m_inputs[i]->read();
return ret; return ret;
} }
@ -187,8 +187,6 @@ TIMER_DEVICE_CALLBACK_MEMBER(wildfire_state::speaker_decay_sim)
void wildfire_state::prepare_display() void wildfire_state::prepare_display()
{ {
// A0-A2 are 7segs
m_display->segmask(7, 0x7f);
m_display->matrix(~m_a, m_d); m_display->matrix(~m_a, m_d);
} }
@ -201,7 +199,8 @@ WRITE8_MEMBER(wildfire_state::write_d)
WRITE16_MEMBER(wildfire_state::write_a) WRITE16_MEMBER(wildfire_state::write_a)
{ {
// A0-A11: digit/led select // A0-A2: digit select
// A3-A11: led select
m_a = data; m_a = data;
prepare_display(); 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_a().set(FUNC(wildfire_state::write_a));
m_maincpu->write_f().set(FUNC(wildfire_state::write_f)); m_maincpu->write_f().set(FUNC(wildfire_state::write_f));
/* video hardware */
PWM_DISPLAY(config, m_display).set_size(12, 8); 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 m_display->set_bri_levels(0.02, 0.1); // bumpers are dimmed
config.set_default_layout(layout_wildfire); config.set_default_layout(layout_wildfire);

View File

@ -17,9 +17,8 @@
***************************************************************************/ ***************************************************************************/
#include "emu.h" #include "emu.h"
#include "includes/screenless.h"
#include "cpu/cop400/cop400.h" #include "cpu/cop400/cop400.h"
#include "video/pwm.h"
#include "machine/timer.h" #include "machine/timer.h"
#include "sound/spkrdev.h" #include "sound/spkrdev.h"
#include "sound/dac.h" #include "sound/dac.h"
@ -46,20 +45,22 @@
//#include "hh_cop400_test.lh" // common test-layout - use external artwork //#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: public:
hh_cop400_state(const machine_config &mconfig, device_type type, const char *tag) : 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_maincpu(*this, "maincpu"),
m_inp_matrix(*this, "IN.%u", 0), m_display(*this, "display"),
m_speaker(*this, "speaker") m_speaker(*this, "speaker"),
m_inputs(*this, "IN.%u", 0)
{ } { }
// devices // devices
required_device<cop400_cpu_device> m_maincpu; required_device<cop400_cpu_device> m_maincpu;
optional_ioport_array<6> m_inp_matrix; // max 6 optional_device<pwm_display_device> m_display;
optional_device<speaker_sound_device> m_speaker; optional_device<speaker_sound_device> m_speaker;
optional_ioport_array<6> m_inputs; // max 6
// misc common // misc common
u8 m_l; // MCU port L write data u8 m_l; // MCU port L write data
@ -82,8 +83,6 @@ protected:
void hh_cop400_state::machine_start() void hh_cop400_state::machine_start()
{ {
screenless_state::machine_start();
// zerofill // zerofill
m_l = 0; m_l = 0;
m_g = 0; m_g = 0;
@ -123,7 +122,7 @@ u16 hh_cop400_state::read_inputs(int columns, u16 colmask)
// read selected input rows // read selected input rows
for (int i = 0; i < columns; i++) for (int i = 0; i < columns; i++)
if (~m_inp_mux >> i & 1) if (~m_inp_mux >> i & 1)
ret &= m_inp_matrix[i]->read(); ret &= m_inputs[i]->read();
return ret; return ret;
} }
@ -179,7 +178,7 @@ WRITE8_MEMBER(ctstein_state::write_g)
WRITE8_MEMBER(ctstein_state::write_l) WRITE8_MEMBER(ctstein_state::write_l)
{ {
// L0-L3: button lamps // L0-L3: button lamps
display_matrix(4, 1, data & 0xf, 1); m_display->matrix(1, data & 0xf);
} }
READ8_MEMBER(ctstein_state::read_l) 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->write_sk().set(m_speaker, FUNC(speaker_sound_device::level_w));
m_maincpu->read_l().set(FUNC(ctstein_state::read_l)); 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); config.set_default_layout(layout_ctstein);
/* sound hardware */ /* 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; u16 sel = (m_g | m_d << 4 | m_g << 8 | m_d << 12) & mask;
// D2+G0,G1 are 7segs // 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 // 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) READ8_MEMBER(h2hbaskbc_state::read_in)
{ {
// IN: multiplexed inputs // 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 // config
@ -367,6 +368,8 @@ void h2hbaskbc_state::h2hbaskbc(machine_config &config)
m_maincpu->read_in().set(FUNC(h2hbaskbc_state::read_in)); m_maincpu->read_in().set(FUNC(h2hbaskbc_state::read_in));
m_maincpu->write_so().set(m_speaker, FUNC(speaker_sound_device::level_w)); 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); config.set_default_layout(layout_h2hbaskbc);
/* sound hardware */ /* sound hardware */
@ -431,18 +434,15 @@ public:
void einvaderc_state::prepare_display() 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); 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; 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) WRITE8_MEMBER(einvaderc_state::write_d)
{ {
// D: led grid 0-3 // D: led grid 0-3 (D0-D2 are 7segs)
m_d = data; m_d = data;
prepare_display(); prepare_display();
} }
@ -506,6 +506,8 @@ void einvaderc_state::einvaderc(machine_config &config)
screen.set_size(913, 1080); screen.set_size(913, 1080);
screen.set_visarea_full(); 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); config.set_default_layout(layout_einvaderc);
/* sound hardware */ /* sound hardware */
@ -562,12 +564,12 @@ public:
void unkeinv_state::prepare_display() 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 // positional led row is on L6,L7
u16 wand = m_display_state[7] << 8 | m_display_state[6]; u16 wand = m_display->read_row(7) << 8 | m_display->read_row(6);
m_display_state[8 + m_inp_matrix[1]->read()] = wand; m_display->write_row(8 + m_inputs[1]->read(), wand);
display_update(); m_display->update();
} }
WRITE8_MEMBER(unkeinv_state::write_g) WRITE8_MEMBER(unkeinv_state::write_g)
@ -598,14 +600,14 @@ READ8_MEMBER(unkeinv_state::read_l)
// L0-L5+G2: positional odd // L0-L5+G2: positional odd
// L0-L5+G3: positional even // L0-L5+G3: positional even
u8 pos = m_inp_matrix[1]->read(); u8 pos = m_inputs[1]->read();
if (m_g & 4 && pos & 1) if (m_g & 4 && pos & 1)
ret ^= (1 << (pos >> 1)); ret ^= (1 << (pos >> 1));
if (m_g & 8 && ~pos & 1) if (m_g & 8 && ~pos & 1)
ret ^= (1 << (pos >> 1)); ret ^= (1 << (pos >> 1));
// L7+G3: fire button // L7+G3: fire button
if (m_g & 8 && m_inp_matrix[0]->read()) if (m_g & 8 && m_inputs[0]->read())
ret ^= 0x80; ret ^= 0x80;
return ret & ~m_l; 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->read_l_tristate().set_constant(0xff);
m_maincpu->write_so().set(m_speaker, FUNC(speaker_sound_device::level_w)); 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); config.set_default_layout(layout_unkeinv);
/* sound hardware */ /* sound hardware */
@ -719,7 +723,7 @@ WRITE8_MEMBER(lchicken_state::write_l)
// L0-L3: led data // L0-L3: led data
// L4-L6: led select // L4-L6: led select
// L7: N/C // 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) 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)); 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 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); config.set_default_layout(layout_lchicken);
/* sound hardware */ /* sound hardware */
@ -843,14 +850,14 @@ WRITE8_MEMBER(funjacks_state::write_d)
// D: led grid + input mux // D: led grid + input mux
m_inp_mux = data; m_inp_mux = data;
m_d = ~data & 0xf; 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) WRITE8_MEMBER(funjacks_state::write_l)
{ {
// L0,L1: led state // L0,L1: led state
m_l = data & 3; 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) WRITE8_MEMBER(funjacks_state::write_g)
@ -870,7 +877,7 @@ READ8_MEMBER(funjacks_state::read_g)
{ {
// G1: speaker out state // G1: speaker out state
// G2,G3: inputs // G2,G3: inputs
return m_inp_matrix[3]->read() | (m_g & 2); return m_inputs[3]->read() | (m_g & 2);
} }
// config // 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_l().set(FUNC(funjacks_state::read_l));
m_maincpu->read_g().set(FUNC(funjacks_state::read_g)); 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); config.set_default_layout(layout_funjacks);
/* sound hardware */ /* sound hardware */
@ -957,7 +967,7 @@ WRITE8_MEMBER(funrlgl_state::write_d)
{ {
// D: led grid // D: led grid
m_d = ~data & 0xf; 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) WRITE8_MEMBER(funrlgl_state::write_l)
@ -965,7 +975,7 @@ WRITE8_MEMBER(funrlgl_state::write_l)
// L0-L3: led state // L0-L3: led state
// L4-L7: N/C // L4-L7: N/C
m_l = ~data & 0xf; 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) 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->write_g().set(FUNC(funrlgl_state::write_g));
m_maincpu->read_g().set_ioport("IN.0"); 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); config.set_default_layout(layout_funrlgl);
/* sound hardware */ /* sound hardware */
@ -1047,8 +1060,7 @@ public:
void mdallas_state::prepare_display() void mdallas_state::prepare_display()
{ {
set_display_segmask(0xff, 0xff); m_display->matrix(~(m_d << 4 | m_g), m_l);
display_matrix(8, 8, m_l, ~(m_d << 4 | m_g));
} }
WRITE8_MEMBER(mdallas_state::write_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->read_in().set(FUNC(mdallas_state::read_in));
m_maincpu->write_so().set(m_speaker, FUNC(speaker_sound_device::level_w)); 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); config.set_default_layout(layout_mdallas);
/* sound hardware */ /* sound hardware */
@ -1199,7 +1214,7 @@ WRITE8_MEMBER(plus1_state::write_l)
READ8_MEMBER(plus1_state::read_l) READ8_MEMBER(plus1_state::read_l)
{ {
// L: IN.1, mask with output // L: IN.1, mask with output
return m_inp_matrix[1]->read() & m_l; return m_inputs[1]->read() & m_l;
} }
// config // config
@ -1287,7 +1302,7 @@ public:
void lightfgt_state::prepare_display() void lightfgt_state::prepare_display()
{ {
u8 grid = (m_so | m_d << 1) ^ 0x1f; 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) 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->write_sk().set(m_speaker, FUNC(speaker_sound_device::level_w));
m_maincpu->read_g().set(FUNC(lightfgt_state::read_g)); 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); config.set_default_layout(layout_lightfgt);
/* sound hardware */ /* sound hardware */
@ -1428,7 +1445,7 @@ READ8_MEMBER(bship82_state::read_in)
WRITE_LINE_MEMBER(bship82_state::write_so) WRITE_LINE_MEMBER(bship82_state::write_so)
{ {
// SO: led // SO: led
display_matrix(1, 1, state, 1); m_display->matrix(1, state);
} }
// config // config
@ -1524,6 +1541,8 @@ void bship82_state::bship82(machine_config &config)
m_maincpu->write_so().set(FUNC(bship82_state::write_so)); m_maincpu->write_so().set(FUNC(bship82_state::write_so));
m_maincpu->read_si().set_ioport("IN.4"); 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); config.set_default_layout(layout_bship82);
/* sound hardware */ /* sound hardware */
@ -1575,10 +1594,7 @@ public:
void qkracer_state::prepare_display() void qkracer_state::prepare_display()
{ {
set_display_segmask(0xdf, 0x7f); m_display->matrix(~(m_d | m_g << 4 | m_sk << 8), m_l);
set_display_segmask(0x20, 0x41); // equals sign
display_matrix(7, 9, m_l, ~(m_d | m_g << 4 | m_sk << 8));
} }
WRITE8_MEMBER(qkracer_state::write_d) 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->read_in().set(FUNC(qkracer_state::read_in));
m_maincpu->write_sk().set(FUNC(qkracer_state::write_sk)); 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); config.set_default_layout(layout_qkracer);
/* no sound! */ /* no sound! */
@ -1713,8 +1733,7 @@ public:
void vidchal_state::prepare_display() void vidchal_state::prepare_display()
{ {
set_display_segmask(0x3f, 0xff); m_display->matrix(m_d | m_sk << 6, m_l);
display_matrix(8, 7, m_l, m_d | m_sk << 6);
} }
WRITE8_MEMBER(vidchal_state::write_d) 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->read_in().set_ioport("IN.0");
m_maincpu->write_sk().set(FUNC(vidchal_state::write_sk)); 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); config.set_default_layout(layout_vidchal);
/* sound hardware */ /* sound hardware */

View File

@ -79,17 +79,16 @@
upper-left power pill: mcu cycle/interrupt timing related upper-left power pill: mcu cycle/interrupt timing related
- Though very uncommon when compared to games with LED/lamp display, some - Though very uncommon when compared to games with LED/lamp display, some
games may manipulate VFD plate brightness by strobing it longer/shorter, 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 - bzaxxon 3D effect is difficult to simulate
- improve/redo SVGs of: bzaxxon, bpengo, bbtime - improve/redo SVGs of: bzaxxon, bpengo, bbtime
***************************************************************************/ ***************************************************************************/
#include "emu.h" #include "emu.h"
#include "includes/screenless.h"
#include "cpu/hmcs40/hmcs40.h" #include "cpu/hmcs40/hmcs40.h"
#include "cpu/cop400/cop400.h" #include "cpu/cop400/cop400.h"
#include "video/pwm.h"
#include "machine/gen_latch.h" #include "machine/gen_latch.h"
#include "machine/timer.h" #include "machine/timer.h"
#include "sound/spkrdev.h" #include "sound/spkrdev.h"
@ -110,20 +109,22 @@
//#include "hh_hmcs40_test.lh" // common test-layout - no svg artwork(yet), use external artwork //#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: public:
hh_hmcs40_state(const machine_config &mconfig, device_type type, const char *tag) : 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_maincpu(*this, "maincpu"),
m_inp_matrix(*this, "IN.%u", 0), m_display(*this, "display"),
m_speaker(*this, "speaker") m_speaker(*this, "speaker"),
m_inputs(*this, "IN.%u", 0)
{ } { }
// devices // devices
required_device<hmcs40_cpu_device> m_maincpu; required_device<hmcs40_cpu_device> m_maincpu;
optional_ioport_array<7> m_inp_matrix; // max 7 optional_device<pwm_display_device> m_display;
optional_device<speaker_sound_device> m_speaker; optional_device<speaker_sound_device> m_speaker;
optional_ioport_array<7> m_inputs; // max 7
// misc common // misc common
u8 m_r[8]; // MCU R ports write data (optional) u8 m_r[8]; // MCU R ports write data (optional)
@ -149,8 +150,6 @@ protected:
void hh_hmcs40_state::machine_start() void hh_hmcs40_state::machine_start()
{ {
screenless_state::machine_start();
// zerofill // zerofill
memset(m_r, 0, sizeof(m_r)); memset(m_r, 0, sizeof(m_r));
memset(m_int, 0, sizeof(m_int)); memset(m_int, 0, sizeof(m_int));
@ -190,7 +189,7 @@ u16 hh_hmcs40_state::read_inputs(int columns)
// read selected input rows // read selected input rows
for (int i = 0; i < columns; i++) for (int i = 0; i < columns; i++)
if (m_inp_mux >> i & 1) if (m_inp_mux >> i & 1)
ret |= m_inp_matrix[i]->read(); ret |= m_inputs[i]->read();
return ret; return ret;
} }
@ -264,7 +263,7 @@ WRITE8_MEMBER(bambball_state::plate_w)
// update display // update display
u16 plate = bitswap<16>(m_plate,13,8,4,12,9,10,14,1,7,0,15,11,6,3,5,2); 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) WRITE16_MEMBER(bambball_state::grid_w)
@ -333,6 +332,7 @@ void bambball_state::bambball(machine_config &config)
screen.set_size(1920, 478); screen.set_size(1920, 478);
screen.set_visarea_full(); screen.set_visarea_full();
PWM_DISPLAY(config, m_display).set_size(9, 16);
config.set_default_layout(layout_bambball); config.set_default_layout(layout_bambball);
/* sound hardware */ /* 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); 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); 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) WRITE8_MEMBER(bmboxing_state::plate_w)
@ -480,6 +480,8 @@ void bmboxing_state::bmboxing(machine_config &config)
screen.set_size(1920, 529); screen.set_size(1920, 529);
screen.set_visarea_full(); screen.set_visarea_full();
PWM_DISPLAY(config, m_display).set_size(9, 12);
/* sound hardware */ /* sound hardware */
SPEAKER(config, "mono").front_center(); SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); 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); 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); 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) WRITE8_MEMBER(bfriskyt_state::plate_w)
@ -607,6 +609,8 @@ void bfriskyt_state::bfriskyt(machine_config &config)
screen.set_size(1920, 675); screen.set_size(1920, 675);
screen.set_visarea_full(); screen.set_visarea_full();
PWM_DISPLAY(config, m_display).set_size(8, 22);
/* sound hardware */ /* sound hardware */
SPEAKER(config, "mono").front_center(); SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
@ -666,7 +670,7 @@ WRITE8_MEMBER(packmon_state::plate_w)
// update display // update display
u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,0,1,2,3,4,5,6,7,8,9); 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); 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) WRITE16_MEMBER(packmon_state::grid_w)
@ -726,6 +730,7 @@ void packmon_state::packmon(machine_config &config)
screen.set_size(1920, 680); screen.set_size(1920, 680);
screen.set_visarea_full(); screen.set_visarea_full();
PWM_DISPLAY(config, m_display).set_size(10, 20);
config.set_default_layout(layout_packmon); config.set_default_layout(layout_packmon);
/* sound hardware */ /* sound hardware */
@ -784,7 +789,7 @@ WRITE8_MEMBER(bzaxxon_state::plate_w)
// update display // update display
u16 grid = bitswap<16>(m_grid,15,14,13,12,11,6,7,8,9,10,5,4,3,2,1,0); 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; 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) WRITE16_MEMBER(bzaxxon_state::grid_w)
@ -853,6 +858,8 @@ void bzaxxon_state::bzaxxon(machine_config &config)
screen.set_size(613, 1080); screen.set_size(613, 1080);
screen.set_visarea_full(); screen.set_visarea_full();
PWM_DISPLAY(config, m_display).set_size(11, 20);
/* sound hardware */ /* sound hardware */
SPEAKER(config, "mono").front_center(); SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
@ -907,7 +914,7 @@ WRITE8_MEMBER(zackman_state::plate_w)
// update display // update display
u8 grid = bitswap<8>(m_grid,0,1,2,3,4,5,6,7); 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); 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) WRITE16_MEMBER(zackman_state::grid_w)
@ -974,6 +981,8 @@ void zackman_state::zackman(machine_config &config)
screen.set_size(487, 1080); screen.set_size(487, 1080);
screen.set_visarea_full(); screen.set_visarea_full();
PWM_DISPLAY(config, m_display).set_size(8, 29);
/* sound hardware */ /* sound hardware */
SPEAKER(config, "mono").front_center(); SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); 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); 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); 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) WRITE8_MEMBER(bpengo_state::plate_w)
@ -1105,6 +1114,8 @@ void bpengo_state::bpengo(machine_config &config)
screen.set_size(1920, 759); screen.set_size(1920, 759);
screen.set_visarea_full(); screen.set_visarea_full();
PWM_DISPLAY(config, m_display).set_size(8, 25);
/* sound hardware */ /* sound hardware */
SPEAKER(config, "mono").front_center(); SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); 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); 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; 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) WRITE8_MEMBER(bbtime_state::plate_w)
@ -1232,6 +1243,8 @@ void bbtime_state::bbtime(machine_config &config)
screen.set_size(379, 1080); screen.set_size(379, 1080);
screen.set_visarea_full(); screen.set_visarea_full();
PWM_DISPLAY(config, m_display).set_size(6, 28);
/* sound hardware */ /* sound hardware */
SPEAKER(config, "mono").front_center(); SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
@ -1284,7 +1297,7 @@ WRITE8_MEMBER(bdoramon_state::plate_w)
// update display // update display
u8 grid = bitswap<8>(m_grid,0,1,2,3,4,5,7,6); 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); 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) WRITE16_MEMBER(bdoramon_state::grid_w)
@ -1339,6 +1352,8 @@ void bdoramon_state::bdoramon(machine_config &config)
screen.set_size(1920, 668); screen.set_size(1920, 668);
screen.set_visarea_full(); screen.set_visarea_full();
PWM_DISPLAY(config, m_display).set_size(8, 19);
/* sound hardware */ /* sound hardware */
SPEAKER(config, "mono").front_center(); SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
@ -1391,7 +1406,7 @@ WRITE8_MEMBER(bultrman_state::plate_w)
// update display // update display
u8 grid = bitswap<8>(m_grid,0,1,2,3,4,5,6,7); 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); 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) WRITE16_MEMBER(bultrman_state::grid_w)
@ -1438,6 +1453,8 @@ void bultrman_state::bultrman(machine_config &config)
screen.set_size(1920, 673); screen.set_size(1920, 673);
screen.set_visarea_full(); screen.set_visarea_full();
PWM_DISPLAY(config, m_display).set_size(8, 18);
/* sound hardware */ /* sound hardware */
SPEAKER(config, "mono").front_center(); SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
@ -1485,7 +1502,7 @@ public:
void machiman_state::prepare_display() 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); 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) WRITE8_MEMBER(machiman_state::plate_w)
@ -1536,6 +1553,8 @@ void machiman_state::machiman(machine_config &config)
screen.set_size(1534, 1080); screen.set_size(1534, 1080);
screen.set_visarea_full(); screen.set_visarea_full();
PWM_DISPLAY(config, m_display).set_size(5, 19);
/* sound hardware */ /* sound hardware */
SPEAKER(config, "mono").front_center(); SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); 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 // R2x,R3x,R6x: vfd plate
int shift = (offset == hmcs40_cpu_device::PORT_R6X) ? 8 : (offset-2) * 4; int shift = (offset == hmcs40_cpu_device::PORT_R6X) ? 8 : (offset-2) * 4;
m_plate = (m_plate & ~(0xf << shift)) | (data << shift); 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) WRITE16_MEMBER(pairmtch_state::grid_w)
@ -1615,7 +1634,7 @@ WRITE16_MEMBER(pairmtch_state::grid_w)
// D0-D5: vfd grid // D0-D5: vfd grid
m_grid = data & 0x3f; 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) READ8_MEMBER(pairmtch_state::input_r)
@ -1698,6 +1717,8 @@ void pairmtch_state::pairmtch(machine_config &config)
config.m_perfect_cpu_quantum = subtag("maincpu"); config.m_perfect_cpu_quantum = subtag("maincpu");
/* video hardware */
PWM_DISPLAY(config, m_display).set_size(6, 12);
config.set_default_layout(layout_pairmtch); config.set_default_layout(layout_pairmtch);
/* sound hardware */ /* sound hardware */
@ -1758,7 +1779,7 @@ WRITE8_MEMBER(alnattck_state::plate_w)
// update display // 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); 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) WRITE16_MEMBER(alnattck_state::grid_w)
@ -1826,6 +1847,8 @@ void alnattck_state::alnattck(machine_config &config)
screen.set_size(1920, 700); screen.set_size(1920, 700);
screen.set_visarea_full(); screen.set_visarea_full();
PWM_DISPLAY(config, m_display).set_size(10, 20);
/* sound hardware */ /* sound hardware */
SPEAKER(config, "mono").front_center(); SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); 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() 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; 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) WRITE8_MEMBER(cdkong_state::plate_w)
@ -1968,6 +1991,8 @@ void cdkong_state::cdkong(machine_config &config)
screen.set_size(605, 1080); screen.set_size(605, 1080);
screen.set_visarea_full(); screen.set_visarea_full();
PWM_DISPLAY(config, m_display).set_size(11, 29);
/* sound hardware */ /* sound hardware */
SPEAKER(config, "mono").front_center(); SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); 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 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); 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) 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_size(526, 1080);
screen.set_visarea_full(); screen.set_visarea_full();
PWM_DISPLAY(config, m_display).set_size(12, 15);
/* sound hardware */ /* sound hardware */
SPEAKER(config, "mono").front_center(); SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
@ -2176,7 +2203,7 @@ WRITE8_MEMBER(cpacman_state::plate_w)
// update display // update display
u16 grid = bitswap<16>(m_grid,15,14,13,12,11,0,1,2,3,4,5,6,7,8,9,10); 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); 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) WRITE16_MEMBER(cpacman_state::grid_w)
@ -2241,6 +2268,8 @@ void cpacman_state::cpacman(machine_config &config)
screen.set_size(484, 1080); screen.set_size(484, 1080);
screen.set_visarea_full(); screen.set_visarea_full();
PWM_DISPLAY(config, m_display).set_size(11, 27);
/* sound hardware */ /* sound hardware */
SPEAKER(config, "mono").front_center(); SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
@ -2309,8 +2338,8 @@ WRITE8_MEMBER(cmspacmn_state::plate_w)
// update display // update display
u16 grid = bitswap<16>(m_grid,15,14,13,11,10,9,8,7,6,5,4,3,2,1,0,1); 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; 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;
display_matrix(33, 12, plate, grid); m_display->matrix(grid, u64(BIT(m_plate,15)) << 32 | plate);
} }
WRITE16_MEMBER(cmspacmn_state::grid_w) WRITE16_MEMBER(cmspacmn_state::grid_w)
@ -2375,6 +2404,8 @@ void cmspacmn_state::cmspacmn(machine_config &config)
screen.set_size(481, 1080); screen.set_size(481, 1080);
screen.set_visarea_full(); screen.set_visarea_full();
PWM_DISPLAY(config, m_display).set_size(12, 33);
/* sound hardware */ /* sound hardware */
SPEAKER(config, "mono").front_center(); SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
@ -2427,17 +2458,12 @@ public:
void sag_state::prepare_display() void sag_state::prepare_display()
{ {
// grid 0-7 are the 'pixels' // grid 0-7 are the 'pixels'
for (int y = 0; y < 8; y++) m_display->matrix_partial(0, 8, m_grid, m_plate, false);
m_display_state[y] = (m_grid >> y & 1) ? m_plate : 0;
// grid 8-11 are 7segs // 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); u8 seg = bitswap<8>(m_plate,3,4,5,6,7,8,9,10);
for (int y = 8; y < 12; y++) m_display->matrix_partial(8, 4, m_grid >> 8, seg);
m_display_state[y] = (m_grid >> y & 1) ? seg : 0;
set_display_size(14, 12);
display_update();
} }
WRITE8_MEMBER(sag_state::plate_w) 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->write_d().set(FUNC(sag_state::grid_w));
m_maincpu->read_d().set(FUNC(sag_state::input_r)); 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); config.set_default_layout(layout_sag);
/* sound hardware */ /* 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); 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); 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) WRITE16_MEMBER(egalaxn2_state::grid_w)
@ -2663,6 +2691,8 @@ void egalaxn2_state::egalaxn2(machine_config &config)
screen.set_size(505, 1080); screen.set_size(505, 1080);
screen.set_visarea_full(); screen.set_visarea_full();
PWM_DISPLAY(config, m_display).set_size(15, 24);
/* sound hardware */ /* sound hardware */
SPEAKER(config, "mono").front_center(); SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); 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); 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); 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) WRITE8_MEMBER(eturtles_state::plate_w)
@ -2950,6 +2980,8 @@ void eturtles_state::eturtles(machine_config &config)
screen.set_size(484, 1080); screen.set_size(484, 1080);
screen.set_visarea_full(); screen.set_visarea_full();
PWM_DISPLAY(config, m_display).set_size(15, 30);
/* sound hardware */ /* sound hardware */
SPEAKER(config, "mono").front_center(); SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); 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); 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); 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) 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_size(1920, 854);
screen.set_visarea_full(); screen.set_visarea_full();
PWM_DISPLAY(config, m_display).set_size(14, 29);
/* sound hardware */ /* sound hardware */
SPEAKER(config, "mono").front_center(); SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
@ -3129,7 +3163,7 @@ WRITE8_MEMBER(ghalien_state::plate_w)
// update display // update display
u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,0,1,2,3,4,5,6,7,8,9); 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); 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) WRITE16_MEMBER(ghalien_state::grid_w)
@ -3197,6 +3231,8 @@ void ghalien_state::ghalien(machine_config &config)
screen.set_size(1920, 699); screen.set_size(1920, 699);
screen.set_visarea_full(); screen.set_visarea_full();
PWM_DISPLAY(config, m_display).set_size(10, 20);
/* sound hardware */ /* sound hardware */
SPEAKER(config, "mono").front_center(); SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
@ -3256,7 +3292,7 @@ WRITE8_MEMBER(gckong_state::plate_w)
// update display // update display
u16 grid = bitswap<16>(m_grid,15,14,13,12,11,0,1,2,3,4,5,6,7,8,9,10); 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; 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) WRITE16_MEMBER(gckong_state::grid_w)
@ -3327,6 +3363,7 @@ void gckong_state::gckong(machine_config &config)
screen.set_size(479, 1080); screen.set_size(479, 1080);
screen.set_visarea_full(); screen.set_visarea_full();
PWM_DISPLAY(config, m_display).set_size(11, 32);
config.set_default_layout(layout_gckong); config.set_default_layout(layout_gckong);
/* sound hardware */ /* sound hardware */
@ -3383,7 +3420,7 @@ WRITE8_MEMBER(gdigdug_state::plate_w)
// update display // 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); 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) WRITE16_MEMBER(gdigdug_state::grid_w)
@ -3453,6 +3490,8 @@ void gdigdug_state::gdigdug(machine_config &config)
screen.set_size(476, 1080); screen.set_size(476, 1080);
screen.set_visarea_full(); screen.set_visarea_full();
PWM_DISPLAY(config, m_display).set_size(9, 32);
/* sound hardware */ /* sound hardware */
SPEAKER(config, "mono").front_center(); SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
@ -3506,7 +3545,7 @@ public:
void mwcbaseb_state::prepare_display() void mwcbaseb_state::prepare_display()
{ {
u8 grid = bitswap<8>(m_grid,0,1,2,3,4,5,6,7); 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) WRITE8_MEMBER(mwcbaseb_state::plate_w)
@ -3622,6 +3661,8 @@ void mwcbaseb_state::mwcbaseb(machine_config &config)
screen.set_size(1920, 478); screen.set_size(1920, 478);
screen.set_visarea_full(); 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); config.set_default_layout(layout_mwcbaseb);
/* sound hardware */ /* 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); 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); 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) WRITE8_MEMBER(msthawk_state::plate_w)
@ -3760,6 +3801,7 @@ void msthawk_state::msthawk(machine_config &config)
screen.set_size(1920, 696); screen.set_size(1920, 696);
screen.set_visarea_full(); screen.set_visarea_full();
PWM_DISPLAY(config, m_display).set_size(10, 21);
config.set_default_layout(layout_msthawk); config.set_default_layout(layout_msthawk);
/* sound hardware */ /* sound hardware */
@ -3813,7 +3855,7 @@ WRITE8_MEMBER(pbqbert_state::plate_w)
// update display // 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; 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) WRITE16_MEMBER(pbqbert_state::grid_w)
@ -3859,6 +3901,8 @@ void pbqbert_state::pbqbert(machine_config &config)
screen.set_size(603, 1080); screen.set_size(603, 1080);
screen.set_visarea_full(); screen.set_visarea_full();
PWM_DISPLAY(config, m_display).set_size(8, 30);
/* sound hardware */ /* sound hardware */
SPEAKER(config, "mono").front_center(); SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); 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); 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); 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) WRITE8_MEMBER(kingman_state::plate_w)
@ -3983,6 +4027,8 @@ void kingman_state::kingman(machine_config &config)
screen.set_size(374, 1080); screen.set_size(374, 1080);
screen.set_visarea_full(); screen.set_visarea_full();
PWM_DISPLAY(config, m_display).set_size(9, 23);
/* sound hardware */ /* sound hardware */
SPEAKER(config, "mono").front_center(); SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); 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); 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); 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) WRITE8_MEMBER(tmtron_state::plate_w)
@ -4107,6 +4153,8 @@ void tmtron_state::tmtron(machine_config &config)
screen.set_size(1920, 662); screen.set_size(1920, 662);
screen.set_visarea_full(); screen.set_visarea_full();
PWM_DISPLAY(config, m_display).set_size(10, 23);
/* sound hardware */ /* sound hardware */
SPEAKER(config, "mono").front_center(); SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
@ -4162,7 +4210,7 @@ WRITE8_MEMBER(vinvader_state::plate_w)
// update display // update display
u16 plate = bitswap<16>(m_plate,15,11,7,3,10,6,14,2,9,5,13,1,8,4,12,0); 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) WRITE16_MEMBER(vinvader_state::grid_w)
@ -4196,7 +4244,7 @@ INPUT_PORTS_END
void vinvader_state::vinvader(machine_config &config) void vinvader_state::vinvader(machine_config &config)
{ {
/* basic machine hardware */ /* 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->read_r<0>().set_ioport("IN.0");
m_maincpu->write_r<1>().set(FUNC(vinvader_state::plate_w)); m_maincpu->write_r<1>().set(FUNC(vinvader_state::plate_w));
m_maincpu->write_r<2>().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_size(233, 1080);
screen.set_visarea_full(); screen.set_visarea_full();
PWM_DISPLAY(config, m_display).set_size(9, 12);
/* sound hardware */ /* sound hardware */
SPEAKER(config, "mono").front_center(); SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);

View File

@ -9,9 +9,8 @@
***************************************************************************/ ***************************************************************************/
#include "emu.h" #include "emu.h"
#include "includes/screenless.h"
#include "cpu/melps4/m58846.h" #include "cpu/melps4/m58846.h"
#include "video/pwm.h"
#include "sound/spkrdev.h" #include "sound/spkrdev.h"
#include "screen.h" #include "screen.h"
@ -20,20 +19,22 @@
//#include "hh_melps4_test.lh" // common test-layout - no svg artwork(yet), use external artwork //#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: public:
hh_melps4_state(const machine_config &mconfig, device_type type, const char *tag) : 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_maincpu(*this, "maincpu"),
m_inp_matrix(*this, "IN.%u", 0), m_display(*this, "display"),
m_speaker(*this, "speaker") m_speaker(*this, "speaker"),
m_inputs(*this, "IN.%u", 0)
{ } { }
// devices // devices
required_device<m58846_device> m_maincpu; required_device<m58846_device> m_maincpu;
optional_ioport_array<4> m_inp_matrix; // max 4 optional_device<pwm_display_device> m_display;
optional_device<speaker_sound_device> m_speaker; optional_device<speaker_sound_device> m_speaker;
optional_ioport_array<4> m_inputs; // max 4
// misc common // misc common
u16 m_inp_mux; // multiplexed inputs mask u16 m_inp_mux; // multiplexed inputs mask
@ -54,8 +55,6 @@ protected:
void hh_melps4_state::machine_start() void hh_melps4_state::machine_start()
{ {
screenless_state::machine_start();
// zerofill // zerofill
m_inp_mux = 0; m_inp_mux = 0;
m_grid = 0; m_grid = 0;
@ -88,7 +87,7 @@ u8 hh_melps4_state::read_inputs(int columns)
// read selected input rows // read selected input rows
for (int i = 0; i < columns; i++) for (int i = 0; i < columns; i++)
if (m_inp_mux >> i & 1) if (m_inp_mux >> i & 1)
ret |= m_inp_matrix[i]->read(); ret |= m_inputs[i]->read();
return ret; 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 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); 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) WRITE8_MEMBER(cfrogger_state::plate_w)
@ -173,7 +172,7 @@ READ16_MEMBER(cfrogger_state::input_r)
// K0,K1: multiplexed inputs // K0,K1: multiplexed inputs
// K2: N/C // K2: N/C
// K3: fixed input // 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 // config
@ -213,6 +212,8 @@ void cfrogger_state::cfrogger(machine_config &config)
screen.set_size(500, 1080); screen.set_size(500, 1080);
screen.set_visarea_full(); screen.set_visarea_full();
PWM_DISPLAY(config, m_display).set_size(12, 16);
/* sound hardware */ /* sound hardware */
SPEAKER(config, "mono").front_center(); SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); 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); 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; 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) WRITE8_MEMBER(gjungler_state::plate_w)
@ -295,7 +296,7 @@ READ16_MEMBER(gjungler_state::input_r)
{ {
// K0,K1: multiplexed inputs // K0,K1: multiplexed inputs
// K2,K3: fixed 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 // config
@ -337,6 +338,8 @@ void gjungler_state::gjungler(machine_config &config)
screen.set_size(481, 1080); screen.set_size(481, 1080);
screen.set_visarea_full(); screen.set_visarea_full();
PWM_DISPLAY(config, m_display).set_size(12, 18);
/* sound hardware */ /* sound hardware */
SPEAKER(config, "mono").front_center(); SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);

View File

@ -77,14 +77,14 @@ public:
hh_pic16_state(const machine_config &mconfig, device_type type, const char *tag) : hh_pic16_state(const machine_config &mconfig, device_type type, const char *tag) :
screenless_state(mconfig, type, tag), screenless_state(mconfig, type, tag),
m_maincpu(*this, "maincpu"), 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 // devices
required_device<pic16c5x_device> m_maincpu; required_device<pic16c5x_device> m_maincpu;
optional_ioport_array<6> m_inp_matrix; // max 6
optional_device<speaker_sound_device> m_speaker; optional_device<speaker_sound_device> m_speaker;
optional_ioport_array<6> m_inputs; // max 6
// misc common // misc common
u8 m_a; // MCU port A write data 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 // read selected input rows
for (int i = 0; i < columns; i++) for (int i = 0; i < columns; i++)
if (~m_inp_mux >> i & 1) if (~m_inp_mux >> i & 1)
ret &= m_inp_matrix[i]->read(); ret &= m_inputs[i]->read();
return ret; return ret;
} }
@ -158,7 +158,7 @@ u8 hh_pic16_state::read_rotated_inputs(int columns, u8 rowmask)
// read selected input columns // read selected input columns
for (int i = 0; i < 8; i++) 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; ret |= 1 << i;
// active low // 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 // 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%. // 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) WRITE8_MEMBER(matchme_state::write_b)
@ -990,7 +990,7 @@ void tbaskb_state::prepare_display()
READ8_MEMBER(tbaskb_state::read_a) READ8_MEMBER(tbaskb_state::read_a)
{ {
// A2: skill switch, A3: multiplexed inputs // 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) WRITE8_MEMBER(tbaskb_state::write_b)
@ -1229,7 +1229,7 @@ void hccbaskb_state::prepare_display()
READ8_MEMBER(hccbaskb_state::read_a) READ8_MEMBER(hccbaskb_state::read_a)
{ {
// A2: skill switch, A3: multiplexed inputs // 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) WRITE8_MEMBER(hccbaskb_state::write_b)
@ -1353,7 +1353,7 @@ void ttfball_state::prepare_display()
READ8_MEMBER(ttfball_state::read_a) READ8_MEMBER(ttfball_state::read_a)
{ {
// A3: multiplexed inputs, A0-A2: other inputs // 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) WRITE8_MEMBER(ttfball_state::write_b)
@ -1623,7 +1623,7 @@ void us2pfball_state::prepare_display()
READ8_MEMBER(us2pfball_state::read_a) READ8_MEMBER(us2pfball_state::read_a)
{ {
// A0,A1: multiplexed inputs, A4-A7: other inputs // 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) WRITE8_MEMBER(us2pfball_state::write_a)

View File

@ -133,7 +133,7 @@ void hh_sm510_state::machine_start()
// determine number of input lines (set it in the subclass constructor if different) // determine number of input lines (set it in the subclass constructor if different)
if (m_inp_lines == 0 && m_inp_fixed < 0) 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) // when last input line is fixed(GND)
if (m_inp_fixed == -2) if (m_inp_fixed == -2)
@ -252,10 +252,10 @@ u8 hh_sm510_state::read_inputs(int columns, int fixed)
// read selected input rows // read selected input rows
for (int i = 0; i < columns; i++) for (int i = 0; i < columns; i++)
if (m_inp_mux >> i & 1) if (m_inp_mux >> i & 1)
ret |= m_inp_matrix[i]->read(); ret |= m_inputs[i]->read();
if (fixed >= 0) if (fixed >= 0)
ret |= m_inp_matrix[fixed]->read(); ret |= m_inputs[fixed]->read();
return ret; return ret;
} }

View File

@ -286,7 +286,7 @@ u8 hh_tms1k_state::read_inputs(int columns)
// read selected input rows // read selected input rows
for (int i = 0; i < columns; i++) for (int i = 0; i < columns; i++)
if (m_inp_mux >> i & 1) if (m_inp_mux >> i & 1)
ret |= m_inp_matrix[i]->read(); ret |= m_inputs[i]->read();
return ret; return ret;
} }
@ -298,7 +298,7 @@ u8 hh_tms1k_state::read_rotated_inputs(int columns, u8 rowmask)
// read selected input columns // read selected input columns
for (int i = 0; i < 8; i++) 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; ret |= 1 << i;
return ret; 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) void hh_tms1k_state::switch_change(int sel, u32 mask, bool next)
{ {
// config switches (for direct control) // 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()) if (next && inp->has_next_setting())
inp->select_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 // MCU clock is from an RC circuit with C=47pF, and R value is depending on
// skill switch: R=51K(1) or 43K(2) // 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() void h2hbaseb_state::prepare_display()
@ -1728,7 +1728,7 @@ WRITE16_MEMBER(h2hbaseb_state::write_o)
READ8_MEMBER(h2hbaseb_state::read_k) READ8_MEMBER(h2hbaseb_state::read_k)
{ {
// K: multiplexed inputs (note: K8(Vss row) is always on) // 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 // config
@ -3150,7 +3150,7 @@ WRITE16_MEMBER(ebball_state::write_o)
READ8_MEMBER(ebball_state::read_k) READ8_MEMBER(ebball_state::read_k)
{ {
// K: multiplexed inputs (note: K8(Vss row) is always on) // 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 // 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, // 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 // but on PRO, the difficulty switch adds an extra 150K resistor to Vdd to speed
// it up to around ~440kHz. // 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() 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, // 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 // but on PRO, the difficulty switch adds an extra 180K resistor to Vdd to speed
// it up to around ~400kHz. // 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() void einvader_state::prepare_display()
@ -4099,7 +4099,7 @@ void raisedvl_state::set_clock()
// 0: R=47K -> ~350kHz // 0: R=47K -> ~350kHz
// 2,3: R=35K8 -> ~425kHz (combined) // 2,3: R=35K8 -> ~425kHz (combined)
// 4: R=32K -> ~465kHz (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)); 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() void f3in1_state::set_clock()
{ {
// MCU clock is from an RC circuit where C=47pF, R=39K(PROF) or 56K(REG) // 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() void f3in1_state::prepare_display()
@ -4811,7 +4811,7 @@ WRITE16_MEMBER(ginv_state::write_o)
READ8_MEMBER(ginv_state::read_k) READ8_MEMBER(ginv_state::read_k)
{ {
// K1-K4: multiplexed inputs (K8 is fire button) // 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 // config
@ -4935,7 +4935,7 @@ WRITE16_MEMBER(ginv1000_state::write_o)
READ8_MEMBER(ginv1000_state::read_k) READ8_MEMBER(ginv1000_state::read_k)
{ {
// K1,K2: multiplexed inputs (K8 is fire button) // 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 // config
@ -5079,7 +5079,7 @@ WRITE16_MEMBER(ginv2000_state::write_o)
READ8_MEMBER(ginv2000_state::read_k) READ8_MEMBER(ginv2000_state::read_k)
{ {
// K1,K2: multiplexed inputs (K8 is fire button) // 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 // config
@ -5347,7 +5347,7 @@ WRITE16_MEMBER(elecdet_state::write_o)
READ8_MEMBER(elecdet_state::read_k) READ8_MEMBER(elecdet_state::read_k)
{ {
// K: multiplexed inputs (note: the Vss row is always on) // 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 // config
@ -6419,7 +6419,7 @@ WRITE16_MEMBER(bship_state::write_o)
READ8_MEMBER(bship_state::read_k) READ8_MEMBER(bship_state::read_k)
{ {
// K: multiplexed inputs (note: the Vss row is always on) // 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 // config
@ -6605,7 +6605,7 @@ WRITE16_MEMBER(bshipb_state::write_o)
READ8_MEMBER(bshipb_state::read_k) READ8_MEMBER(bshipb_state::read_k)
{ {
// K: multiplexed inputs (note: the Vss row is always on) // 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 // config
@ -6831,7 +6831,7 @@ void ssimon_state::set_clock()
// 0 Simple: R=51K -> ~200kHz // 0 Simple: R=51K -> ~200kHz
// 1 Normal: R=37K -> ~275kHz // 1 Normal: R=37K -> ~275kHz
// 2 Super: R=22K -> ~400kHz // 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)); 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) READ8_MEMBER(stopthief_state::read_k)
{ {
// K: multiplexed inputs (note: the Vss row is always on) // 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 // config
@ -9060,7 +9060,7 @@ WRITE16_MEMBER(speechp_state::write_o)
READ8_MEMBER(speechp_state::read_k) READ8_MEMBER(speechp_state::read_k)
{ {
// K: multiplexed inputs // K: multiplexed inputs
return m_inp_matrix[10]->read() | (read_inputs(10) & 7); return m_inputs[10]->read() | (read_inputs(10) & 7);
} }
// config // config
@ -9902,7 +9902,7 @@ void tbreakup_state::machine_reset()
void tbreakup_state::set_clock() void tbreakup_state::set_clock()
{ {
// MCU clock is from an analog circuit with resistor of 73K, PRO2 adds 100K // 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() void tbreakup_state::prepare_display()
@ -9964,7 +9964,7 @@ READ8_MEMBER(tbreakup_state::read_k)
{ {
// K4: fixed input // K4: fixed input
// K8: multiplexed inputs // 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 // config
@ -10079,7 +10079,7 @@ void phpball_state::prepare_display()
{ {
// rectangular LEDs under LEDs D,F and E,G are directly connected // 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 // 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); set_display_segmask(7, 0x7f);
display_matrix(7, 11, m_o, (m_r & 0x1ff) | in1); 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) READ8_MEMBER(phpball_state::read_k)
{ {
// K: multiplexed inputs (note: the Vss row is always on) // 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 // config

View File

@ -92,8 +92,6 @@
void hh_ucom4_state::machine_start() void hh_ucom4_state::machine_start()
{ {
screenless_state::machine_start();
// zerofill // zerofill
memset(m_port, 0, sizeof(m_port)); memset(m_port, 0, sizeof(m_port));
m_int = 0; m_int = 0;
@ -131,7 +129,7 @@ u8 hh_ucom4_state::read_inputs(int columns)
// read selected input rows // read selected input rows
for (int i = 0; i < columns; i++) for (int i = 0; i < columns; i++)
if (m_inp_mux >> i & 1) if (m_inp_mux >> i & 1)
ret |= m_inp_matrix[i]->read(); ret |= m_inputs[i]->read();
return ret; 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 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); 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) WRITE8_MEMBER(ufombs_state::grid_w)
@ -274,6 +272,8 @@ void ufombs_state::ufombs(machine_config &config)
screen.set_size(243, 1080); screen.set_size(243, 1080);
screen.set_visarea_full(); screen.set_visarea_full();
PWM_DISPLAY(config, m_display).set_size(9, 10);
/* sound hardware */ /* sound hardware */
SPEAKER(config, "mono").front_center(); SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, m_speaker); SPEAKER_SOUND(config, m_speaker);
@ -330,7 +330,7 @@ public:
void ssfball_state::prepare_display() 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); 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) WRITE8_MEMBER(ssfball_state::grid_w)
@ -363,7 +363,7 @@ WRITE8_MEMBER(ssfball_state::plate_w)
READ8_MEMBER(ssfball_state::input_b_r) READ8_MEMBER(ssfball_state::input_b_r)
{ {
// B: input port 2, where B3 is multiplexed // 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 // config
@ -429,6 +429,8 @@ void ssfball_state::ssfball(machine_config &config)
screen.set_size(1920, 482); screen.set_size(1920, 482);
screen.set_visarea_full(); screen.set_visarea_full();
PWM_DISPLAY(config, m_display).set_size(9, 16);
/* sound hardware */ /* sound hardware */
SPEAKER(config, "mono").front_center(); SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, m_speaker); SPEAKER_SOUND(config, m_speaker);
@ -490,7 +492,7 @@ public:
void bmsoccer_state::prepare_display() 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); 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) WRITE8_MEMBER(bmsoccer_state::grid_w)
@ -573,6 +575,8 @@ void bmsoccer_state::bmsoccer(machine_config &config)
screen.set_size(271, 1080); screen.set_size(271, 1080);
screen.set_visarea_full(); screen.set_visarea_full();
PWM_DISPLAY(config, m_display).set_size(9, 16);
/* sound hardware */ /* sound hardware */
SPEAKER(config, "mono").front_center(); SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, m_speaker); 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 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); 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) WRITE8_MEMBER(bmsafari_state::grid_w)
@ -688,6 +692,8 @@ void bmsafari_state::bmsafari(machine_config &config)
screen.set_size(248, 1080); screen.set_size(248, 1080);
screen.set_visarea_full(); screen.set_visarea_full();
PWM_DISPLAY(config, m_display).set_size(9, 10);
/* sound hardware */ /* sound hardware */
SPEAKER(config, "mono").front_center(); SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, m_speaker); SPEAKER_SOUND(config, m_speaker);
@ -739,7 +745,7 @@ public:
void splasfgt_state::prepare_display() 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); 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) WRITE8_MEMBER(splasfgt_state::grid_w)
@ -847,6 +853,8 @@ void splasfgt_state::splasfgt(machine_config &config)
screen.set_size(1920, 476); screen.set_size(1920, 476);
screen.set_visarea_full(); screen.set_visarea_full();
PWM_DISPLAY(config, m_display).set_size(9, 16);
/* sound hardware */ /* sound hardware */
SPEAKER(config, "mono").front_center(); SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, m_speaker); 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); 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); 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) WRITE8_MEMBER(bcclimbr_state::grid_w)
@ -959,6 +967,8 @@ void bcclimbr_state::bcclimbr(machine_config &config)
screen.set_size(310, 1080); screen.set_size(310, 1080);
screen.set_visarea_full(); screen.set_visarea_full();
PWM_DISPLAY(config, m_display).set_size(6, 20);
/* sound hardware */ /* sound hardware */
SPEAKER(config, "mono").front_center(); SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, m_speaker); SPEAKER_SOUND(config, m_speaker);
@ -1014,7 +1024,7 @@ WRITE8_MEMBER(tactix_state::leds_w)
{ {
// D,F: 4*4 led matrix // D,F: 4*4 led matrix
m_port[offset] = data; 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) 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_f().set(FUNC(tactix_state::leds_w));
m_maincpu->write_g().set(FUNC(tactix_state::speaker_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); config.set_default_layout(layout_tactix);
/* sound hardware */ /* 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 sel = m_port[NEC_UCOM4_PORTD] >> 3 & 1; // turn off display when power is off
u8 lamps = m_port[NEC_UCOM4_PORTD] & 3; u8 lamps = m_port[NEC_UCOM4_PORTD] & 3;
u8 digit = (m_port[NEC_UCOM4_PORTF] << 4 | m_port[NEC_UCOM4_PORTE]) & 0x7f; 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) 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_f().set(FUNC(ctntune_state::_7seg_w));
m_maincpu->write_g().set(FUNC(ctntune_state::speaker_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); config.set_default_layout(layout_ctntune);
/* sound hardware */ /* 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); 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); 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) WRITE8_MEMBER(invspace_state::grid_w)
@ -1329,6 +1343,8 @@ void invspace_state::invspace(machine_config &config)
screen.set_size(289, 1080); screen.set_size(289, 1080);
screen.set_visarea_full(); screen.set_visarea_full();
PWM_DISPLAY(config, m_display).set_size(9, 19);
/* sound hardware */ /* sound hardware */
SPEAKER(config, "mono").front_center(); SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, m_speaker); SPEAKER_SOUND(config, m_speaker);
@ -1380,7 +1396,7 @@ public:
void efball_state::prepare_display() 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); 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) 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_h().set(FUNC(efball_state::grid_w));
m_maincpu->write_i().set(FUNC(efball_state::plate_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); config.set_default_layout(layout_efball);
/* sound hardware */ /* 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 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); 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) WRITE8_MEMBER(galaxy2_state::grid_w)
@ -1559,6 +1577,8 @@ void galaxy2_state::galaxy2(machine_config &config)
screen.set_size(304, 1080); screen.set_size(304, 1080);
screen.set_visarea_full(); screen.set_visarea_full();
PWM_DISPLAY(config, m_display).set_size(10, 15);
/* sound hardware */ /* sound hardware */
SPEAKER(config, "mono").front_center(); SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, m_speaker); 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); 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); 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) WRITE8_MEMBER(astrocmd_state::grid_w)
@ -1695,6 +1715,8 @@ void astrocmd_state::astrocmd(machine_config &config)
screen.set_size(1920, 525); screen.set_size(1920, 525);
screen.set_visarea_full(); screen.set_visarea_full();
PWM_DISPLAY(config, m_display).set_size(9, 17);
/* sound hardware */ /* sound hardware */
SPEAKER(config, "mono").front_center(); SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, m_speaker); SPEAKER_SOUND(config, m_speaker);
@ -1748,7 +1770,7 @@ WRITE8_MEMBER(edracula_state::grid_w)
// C,D: vfd grid // C,D: vfd grid
int shift = (offset - NEC_UCOM4_PORTC) * 4; int shift = (offset - NEC_UCOM4_PORTC) * 4;
m_grid = (m_grid & ~(0xf << shift)) | (data << shift); 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) WRITE8_MEMBER(edracula_state::plate_w)
@ -1760,7 +1782,7 @@ WRITE8_MEMBER(edracula_state::plate_w)
// E,F,G,H,I01: vfd plate // E,F,G,H,I01: vfd plate
int shift = (offset - NEC_UCOM4_PORTE) * 4; int shift = (offset - NEC_UCOM4_PORTE) * 4;
m_plate = (m_plate & ~(0xf << shift)) | (data << shift); m_plate = (m_plate & ~(0xf << shift)) | (data << shift);
display_matrix(18, 8, m_plate, m_grid); m_display->matrix(m_grid, m_plate);
} }
// config // config
@ -1799,6 +1821,8 @@ void edracula_state::edracula(machine_config &config)
screen.set_size(1920, 526); screen.set_size(1920, 526);
screen.set_visarea_full(); screen.set_visarea_full();
PWM_DISPLAY(config, m_display).set_size(8, 18);
/* sound hardware */ /* sound hardware */
SPEAKER(config, "mono").front_center(); SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, m_speaker); SPEAKER_SOUND(config, m_speaker);
@ -1847,7 +1871,7 @@ public:
WRITE32_MEMBER(mcompgin_state::lcd_output_w) WRITE32_MEMBER(mcompgin_state::lcd_output_w)
{ {
// uses ROW0-4, COL11-24 // uses ROW0-4, COL11-24
display_matrix(24, 8, data, 1 << offset); m_display->matrix(1 << offset, data);
} }
WRITE8_MEMBER(mcompgin_state::lcd_w) 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 HLCD0530(config, m_lcd, 500); // C=0.01uF
m_lcd->write_cols().set(FUNC(mcompgin_state::lcd_output_w)); 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); config.set_default_layout(layout_mcompgin);
/* no sound! */ /* 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 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); 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) 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_h().set(FUNC(mvbfree_state::grid_w));
m_maincpu->write_i().set(FUNC(mvbfree_state::speaker_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); config.set_default_layout(layout_mvbfree);
/* sound hardware */ /* sound hardware */
@ -2058,7 +2086,7 @@ WRITE8_MEMBER(grobot9_state::lamps_w)
// D,F,E0: lamps // D,F,E0: lamps
m_port[offset] = data; 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) 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_e().set(FUNC(grobot9_state::lamps_w));
m_maincpu->write_f().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); config.set_default_layout(layout_grobot9);
/* sound hardware */ /* 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); 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); 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) WRITE8_MEMBER(tccombat_state::grid_w)
@ -2219,6 +2250,8 @@ void tccombat_state::tccombat(machine_config &config)
screen.set_size(300, 1080); screen.set_size(300, 1080);
screen.set_visarea_full(); screen.set_visarea_full();
PWM_DISPLAY(config, m_display).set_size(9, 20);
/* sound hardware */ /* sound hardware */
SPEAKER(config, "mono").front_center(); SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, m_speaker); 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, // 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 // but on PRO1, the difficulty switch puts a capacitor across the LC circuit
// to slow it down to ~260kHz. // 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) WRITE8_MEMBER(tmtennis_state::grid_w)
@ -2295,7 +2328,7 @@ WRITE8_MEMBER(tmtennis_state::grid_w)
// G,H,I: vfd grid // G,H,I: vfd grid
int shift = (offset - NEC_UCOM4_PORTG) * 4; int shift = (offset - NEC_UCOM4_PORTG) * 4;
m_grid = (m_grid & ~(0xf << shift)) | (data << shift); 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) WRITE8_MEMBER(tmtennis_state::plate_w)
@ -2303,7 +2336,7 @@ WRITE8_MEMBER(tmtennis_state::plate_w)
// C,D,F: vfd plate // C,D,F: vfd plate
int shift = (offset == NEC_UCOM4_PORTF) ? 8 : (offset - NEC_UCOM4_PORTC) * 4; int shift = (offset == NEC_UCOM4_PORTF) ? 8 : (offset - NEC_UCOM4_PORTC) * 4;
m_plate = (m_plate & ~(0xf << shift)) | (data << shift); 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) 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_size(1920, 417);
screen.set_visarea_full(); 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); config.set_default_layout(layout_tmtennis);
/* sound hardware */ /* 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); 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; 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) WRITE8_MEMBER(tmpacman_state::grid_w)
@ -2499,6 +2534,8 @@ void tmpacman_state::tmpacman(machine_config &config)
screen.set_size(1920, 508); screen.set_size(1920, 508);
screen.set_visarea_full(); screen.set_visarea_full();
PWM_DISPLAY(config, m_display).set_size(8, 19);
/* sound hardware */ /* sound hardware */
SPEAKER(config, "mono").front_center(); SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, m_speaker); SPEAKER_SOUND(config, m_speaker);
@ -2552,7 +2589,7 @@ public:
void tmscramb_state::prepare_display() 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; 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) WRITE8_MEMBER(tmscramb_state::grid_w)
@ -2610,6 +2647,8 @@ void tmscramb_state::tmscramb(machine_config &config)
screen.set_size(1920, 556); screen.set_size(1920, 556);
screen.set_visarea_full(); screen.set_visarea_full();
PWM_DISPLAY(config, m_display).set_size(10, 17);
/* sound hardware */ /* sound hardware */
SPEAKER(config, "mono").front_center(); SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, m_speaker); 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); 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; 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) WRITE8_MEMBER(tcaveman_state::grid_w)
@ -2717,6 +2756,8 @@ void tcaveman_state::tcaveman(machine_config &config)
screen.set_size(1920, 559); screen.set_size(1920, 559);
screen.set_visarea_full(); screen.set_visarea_full();
PWM_DISPLAY(config, m_display).set_size(8, 19);
/* sound hardware */ /* sound hardware */
SPEAKER(config, "mono").front_center(); SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, m_speaker); 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; 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) READ8_MEMBER(alnchase_state::input_r)
@ -2858,6 +2899,8 @@ void alnchase_state::alnchase(machine_config &config)
screen.set_size(365, 1080); screen.set_size(365, 1080);
screen.set_visarea_full(); screen.set_visarea_full();
PWM_DISPLAY(config, m_display).set_size(9, 17);
/* sound hardware */ /* sound hardware */
SPEAKER(config, "mono").front_center(); SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, m_speaker); SPEAKER_SOUND(config, m_speaker);

View File

@ -131,7 +131,7 @@ WRITE_LINE_MEMBER(rzone_state::sctrl_w)
{ {
// SCTRL: 74165 SH/LD: reload inputs while low // SCTRL: 74165 SH/LD: reload inputs while low
if (!state || !m_sctrl) if (!state || !m_sctrl)
m_inp_mux = m_inp_matrix[0]->read(); m_inp_mux = m_inputs[0]->read();
m_sctrl = state; m_sctrl = state;
} }

View File

@ -136,7 +136,7 @@ void tb303_state::update_leds()
0.2 D208 1.2 D215 2.2 D220 3.2 D210 0.2 D208 1.2 D215 2.2 D220 3.2 D210
0.3 D209 1.3 D216 2.3 D221 3.3 D212 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: battery led
// todo: 4 more leds(see top-left part) // 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) if (offset == NEC_UCOM4_PORTA && m_inp_mux == 0)
{ {
// todo.. // todo..
return m_inp_matrix[4]->read(); return m_inputs[4]->read();
} }
else else
return read_inputs(4) >> (offset*4) & 0xf; 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); tp3_clock.set_start_delay(TP3_PERIOD - TP3_LOW);
TIMER(config, "tp3_clear").configure_periodic(FUNC(tb303_state::tp3_clear), TP3_PERIOD); 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); config.set_default_layout(layout_tb303);
/* sound hardware */ /* sound hardware */

View File

@ -86,8 +86,8 @@ void cmulti8_state::prepare_display()
set_display_segmask(0xfffff, 0xff); set_display_segmask(0xfffff, 0xff);
// M-digit is on in memory mode, upper row is off in single mode // 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 m = (m_inputs[10]->read() & 0x10) ? 0x100000 : 0;
u32 mask = (m_inp_matrix[10]->read() & 0x20) ? 0xfffff : 0xffc00; u32 mask = (m_inputs[10]->read() & 0x20) ? 0xfffff : 0xffc00;
// R10 selects display row // R10 selects display row
u32 sel = (m_r & 0x400) ? (m_r & 0x3ff) : (m_r << 10 & 0xffc00); 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) READ8_MEMBER(dataman_state::read_k)
{ {
// K: multiplexed inputs (note: the Vss row is always on) // 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 // config
@ -1497,7 +1497,7 @@ WRITE16_MEMBER(ti30_state::write_o)
READ8_MEMBER(ti30_state::read_k) READ8_MEMBER(ti30_state::read_k)
{ {
// K: multiplexed inputs (note: the Vss row is always on) // 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 // config

View File

@ -622,7 +622,7 @@ WRITE16_MEMBER(tispeak_state::snspell_write_o)
READ8_MEMBER(tispeak_state::snspell_read_k) READ8_MEMBER(tispeak_state::snspell_read_k)
{ {
// K: multiplexed inputs (note: the Vss row is always on) // 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; u8 k4 = m_tms5100->ctl_r(space, 0) << 2 & 4;
// K: multiplexed inputs (note: the Vss row is always on) // 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. // external module, the game continues.
// pick overlay code from machine config, see comment section above for reference // 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 // try to get it from (external) layout
if (m_overlay == 0x20) if (m_overlay == 0x20)

View File

@ -177,7 +177,7 @@ WRITE16_MEMBER(tispellb_state::main_write_r)
READ8_MEMBER(tispellb_state::main_read_k) READ8_MEMBER(tispellb_state::main_read_k)
{ {
// K: multiplexed inputs (note: the Vss row is always on) // 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);
} }

View File

@ -92,6 +92,7 @@ void tr606_state::tr606(machine_config &config)
tp3_clock.set_start_delay(TP3_PERIOD - TP3_LOW); tp3_clock.set_start_delay(TP3_PERIOD - TP3_LOW);
TIMER(config, "tp3_clear").configure_periodic(FUNC(tr606_state::tp3_clear), TP3_PERIOD); TIMER(config, "tp3_clear").configure_periodic(FUNC(tr606_state::tp3_clear), TP3_PERIOD);
/* video hardware */
config.set_default_layout(layout_tr606); config.set_default_layout(layout_tr606);
/* sound hardware */ /* sound hardware */

View File

@ -19,9 +19,9 @@ public:
hh_sm510_state(const machine_config &mconfig, device_type type, const char *tag) : hh_sm510_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag), driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"), 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_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_lines(0),
m_inp_fixed(-1), m_inp_fixed(-1),
m_display_wait(33) m_display_wait(33)
@ -29,9 +29,9 @@ public:
// devices // devices
required_device<sm510_base_device> m_maincpu; required_device<sm510_base_device> m_maincpu;
optional_ioport_array<8+1> m_inp_matrix; // max 8
output_finder<16, 16, 4> m_out_x;
optional_device<speaker_sound_device> m_speaker; optional_device<speaker_sound_device> m_speaker;
optional_ioport_array<8+1> m_inputs; // max 8
output_finder<16, 16, 4> m_out_x;
// misc common // misc common
u16 m_inp_mux; // multiplexed inputs mask u16 m_inp_mux; // multiplexed inputs mask

View File

@ -31,15 +31,15 @@ public:
hh_tms1k_state(const machine_config &mconfig, device_type type, const char *tag) : hh_tms1k_state(const machine_config &mconfig, device_type type, const char *tag) :
screenless_state(mconfig, type, tag), screenless_state(mconfig, type, tag),
m_maincpu(*this, "maincpu"), 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),
m_out_power(*this, "power") m_out_power(*this, "power")
{ } { }
// devices // devices
required_device<tms1k_base_device> m_maincpu; required_device<tms1k_base_device> m_maincpu;
optional_ioport_array<18> m_inp_matrix; // max 18
optional_device<speaker_sound_device> m_speaker; optional_device<speaker_sound_device> m_speaker;
optional_ioport_array<18> m_inputs; // max 18
output_finder<> m_out_power; // power state, eg. led output_finder<> m_out_power; // power state, eg. led
// misc common // misc common

View File

@ -9,26 +9,27 @@
#ifndef MAME_INCLUDES_HH_UCOM4_H #ifndef MAME_INCLUDES_HH_UCOM4_H
#define MAME_INCLUDES_HH_UCOM4_H #define MAME_INCLUDES_HH_UCOM4_H
#include "includes/screenless.h"
#include "cpu/ucom4/ucom4.h" #include "cpu/ucom4/ucom4.h"
#include "video/pwm.h"
#include "sound/spkrdev.h" #include "sound/spkrdev.h"
class hh_ucom4_state : public screenless_state class hh_ucom4_state : public driver_device
{ {
public: public:
hh_ucom4_state(const machine_config &mconfig, device_type type, const char *tag) : 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_maincpu(*this, "maincpu"),
m_inp_matrix(*this, "IN.%u", 0), m_display(*this, "display"),
m_speaker(*this, "speaker") m_speaker(*this, "speaker"),
m_inputs(*this, "IN.%u", 0)
{ } { }
// devices // devices
required_device<ucom4_cpu_device> m_maincpu; required_device<ucom4_cpu_device> m_maincpu;
optional_ioport_array<6> m_inp_matrix; // max 6 optional_device<pwm_display_device> m_display;
optional_device<speaker_sound_device> m_speaker; optional_device<speaker_sound_device> m_speaker;
optional_ioport_array<6> m_inputs; // max 6
// misc common // misc common
u8 m_port[9]; // MCU port A-I write data (optional) u8 m_port[9]; // MCU port A-I write data (optional)

View File

@ -6,12 +6,14 @@
<element name="static_black"><rect><color red="0.0" green="0.0" blue="0.0" /></rect></element> <element name="static_black"><rect><color red="0.0" green="0.0" blue="0.0" /></rect></element>
<element name="ledr" defstate="0"> <element name="ledr" defstate="0">
<disk state="0"><color red="0.2" green="0.05" blue="0.06" /></disk> <disk state="0"><color red="0.14" green="0.02" blue="0.03" /></disk>
<disk state="1"><color red="1.0" green="0.2" blue="0.23" /></disk> <disk state="1"><color red="0.5" green="0.1" blue="0.11" /></disk>
<disk state="2"><color red="1.0" green="0.20" blue="0.22" /></disk>
</element> </element>
<element name="ledg" defstate="0"> <element name="ledg" defstate="0">
<disk state="0"><color red="0.05" green="0.2" blue="0.06" /></disk> <disk state="0"><color red="0.02" green="0.14" blue="0.03" /></disk>
<disk state="1"><color red="0.23" green="1.0" blue="0.2" /></disk> <disk state="1"><color red="0.1" green="0.5" blue="0.11" /></disk>
<disk state="2"><color red="0.2" green="1.0" blue="0.22" /></disk>
</element> </element>