yamaha/ympsr150.cpp: Added DD-9. (#11348)

sound/gew.cpp: Implemented reverse flag.

New working machine
----------
Yamaha DD-9 Digital Percussion [BCM, Devin Acker]
This commit is contained in:
Devin Acker 2023-06-18 13:26:51 -04:00 committed by GitHub
parent 63c125589c
commit eac5622f92
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 260 additions and 1 deletions

View File

@ -434,6 +434,7 @@ void gew_pcm_device::device_start()
save_pointer(STRUCT_MEMBER(m_slots, m_octave), m_voices);
save_pointer(STRUCT_MEMBER(m_slots, m_pitch), m_voices);
save_pointer(STRUCT_MEMBER(m_slots, m_step), m_voices);
save_pointer(STRUCT_MEMBER(m_slots, m_reverse), m_voices);
save_pointer(STRUCT_MEMBER(m_slots, m_pan), m_voices);
save_pointer(STRUCT_MEMBER(m_slots, m_total_level), m_voices);
save_pointer(STRUCT_MEMBER(m_slots, m_dest_total_level), m_voices);
@ -559,6 +560,11 @@ void gew_pcm_device::sound_stream_update(sound_stream &stream, std::vector<read_
int32_t csample = 0;
int32_t fpart = slot.m_offset & ((1 << TL_SHIFT) - 1);
if (slot.m_reverse)
{
spos = slot.m_sample.m_end - spos - 1;
}
if (slot.m_sample.m_format & 4) // 12-bit linear
{
offs_t adr = slot.m_sample.m_start + (spos >> 1) * 3;
@ -590,6 +596,8 @@ void gew_pcm_device::sound_stream_update(sound_stream &stream, std::vector<read_
if (slot.m_offset >= (slot.m_sample.m_end << TL_SHIFT))
{
slot.m_offset -= (slot.m_sample.m_end - slot.m_sample.m_loop) << TL_SHIFT;
// DD-9 expects the looped silence at the end of some samples to be the same whether reversed or not
slot.m_reverse = false;
}
if (spos ^ (slot.m_offset >> TL_SHIFT))

View File

@ -89,6 +89,7 @@ protected:
uint8_t m_octave = 0;
uint16_t m_pitch = 0;
uint32_t m_step = 0;
bool m_reverse = false;
uint32_t m_pan = 0;
uint32_t m_total_level = 0;
uint32_t m_dest_total_level = 0;

View File

@ -198,6 +198,7 @@ void gew7_pcm_device::write_hi(offs_t offset, uint8_t data)
case 3:
slot.m_vibrato = data & 7;
slot.m_tremolo = (data >> 3) & 7;
slot.m_reverse = data >> 7;
lfo_compute_step(slot.m_pitch_lfo, slot.m_lfo_frequency, slot.m_vibrato, 0);
lfo_compute_step(slot.m_amplitude_lfo, slot.m_lfo_frequency, slot.m_tremolo, 1);
break;

161
src/mame/layout/dd9.lay Normal file
View File

@ -0,0 +1,161 @@
<?xml version="1.0"?>
<!--
license:CC0-1.0
-->
<mamelayout version="2">
<!-- general grey backdrop -->
<element name="greyback">
<rect>
<color red="0.1" green="0.1" blue="0.1" />
</rect>
</element>
<element name="border">
<rect>
<color red="0.05" green="0.05" blue="0.05" />
</rect>
</element>
<element name="black">
<rect>
<color red="0" green="0" blue="0" />
</rect>
</element>
<element name="white">
<rect />
</element>
<!-- text elements -->
<element name="volume"><text string="VOLUME" /></element>
<element name="minus"><text string="-" /></element>
<element name="plus"><text string="+" /></element>
<element name="style"><text string="STYLE" /></element>
<element name="perc"><text string="PERC." /></element>
<element name="set"><text string="SET" /></element>
<element name="tempo"><text string="TEMPO" /></element>
<element name="demo"><text string="DEMO" /></element>
<element name="tap"><text string="TAP" /></element>
<element name="tap_start"><text string="START" /></element>
<element name="pad_assign"><text string="PAD ASSIGN" /></element>
<element name="pointer_l"><text string="&#x25c4;" /></element>
<element name="pointer_r"><text string="&#x25ba;" /></element>
<element name="se"><text string="SE" /></element>
<element name="select"><text string="SELECT" /></element>
<element name="start"><text string="START/" /></element>
<element name="stop"><text string="STOP" /></element>
<element name="auto"><text string="AUTO" /></element>
<element name="auto_roll"><text string="ROLL" /></element>
<element name="off"><text string="OFF" align="1" /></element>
<element name="echo"><text string="ECHO" align="1" /></element>
<element name="flam"><text string="FLAM" align="1" /></element>
<element name="roll"><text string="ROLL" align="1" /></element>
<element name="se_pads"><text string="SOUND EFFECT PADS" /></element>
<!-- button primitives -->
<element name="button-circ" defstate="0">
<disk><bounds x="0" y="0" width="40" height="40" /><color red="0.0" green="0.0" blue="0.0" /></disk>
<disk state="0"><bounds x="2" y="2" width="36" height="36" /><color red="0.5" green="0.5" blue="0.5" /></disk>
<disk state="1"><bounds x="2" y="2" width="36" height="36" /><color red="0.3" green="0.3" blue="0.3" /></disk>
</element>
<element name="button-demo" defstate="0">
<disk><bounds x="0" y="0" width="40" height="40" /><color red="0.0" green="0.0" blue="0.0" /></disk>
<disk state="0"><bounds x="2" y="2" width="36" height="36" /><color red="1.0" green="0.82" blue="0.0" /></disk>
<disk state="1"><bounds x="2" y="2" width="36" height="36" /><color red="0.9" green="0.75" blue="0.0" /></disk>
</element>
<element name="button-start-stop" defstate="0">
<disk><bounds x="0" y="0" width="40" height="40" /><color red="0.0" green="0.0" blue="0.0" /></disk>
<disk state="0"><bounds x="2" y="2" width="36" height="36" /><color red="1.0" green="0.14" blue="0.14" /></disk>
<disk state="1"><bounds x="2" y="2" width="36" height="36" /><color red="0.8" green="0.11" blue="0.11" /></disk>
</element>
<element name="button-rect" defstate="0">
<rect><bounds x="0" y="0" width="40" height="40" /><color red="0.0" green="0.0" blue="0.0" /></rect>
<rect state="0"><bounds x="2" y="2" width="36" height="36" /><color red="0.5" green="0.5" blue="0.5" /></rect>
<rect state="1"><bounds x="2" y="2" width="36" height="36" /><color red="0.3" green="0.3" blue="0.3" /></rect>
</element>
<element name="button-drumpad" defstate="0">
<disk><bounds x="0" y="0" width="40" height="40" /><color red="0.2" green="0.2" blue="0.2" /></disk>
<disk state="0"><bounds x="2" y="2" width="36" height="36" /><color red="0.02" green="0.02" blue="0.02" /></disk>
<disk state="1"><bounds x="2" y="2" width="36" height="36" /><color red="0.0" green="0.0" blue="0.0" /></disk>
</element>
<!-- LED primitive -->
<element name="digit" defstate="0">
<led7seg><color red="1.0" green="0.1" blue="0.1" /></led7seg>
</element>
<view name="Drum Kit">
<!-- overall background -->
<element ref="greyback"><bounds x="0" y="-40" width="1430" height="790" /></element>
<element ref="button-drumpad" inputtag="PF" inputmask="0x01"><bounds x="0" y="180" width="330" height="330" /></element>
<element ref="button-drumpad" inputtag="PF" inputmask="0x02"><bounds x="350" y="-40" width="330" height="330" /></element>
<element ref="button-drumpad" inputtag="PF" inputmask="0x04"><bounds x="750" y="-40" width="330" height="330" /></element>
<element ref="button-drumpad" inputtag="PF" inputmask="0x08"><bounds x="1100" y="180" width="330" height="330" /></element>
<element ref="volume"><bounds xc="375" yc="570" width="100" height="15" /></element>
<element ref="button-rect" inputtag="KEY2" inputmask="0x02"><bounds xc="350" yc="600" width="30" height="30" /></element>
<element ref="minus"><bounds xc="350" yc="630" width="100" height="20" /></element>
<element ref="button-rect" inputtag="KEY2" inputmask="0x01"><bounds xc="400" yc="600" width="30" height="30" /></element>
<element ref="plus"><bounds xc="400" yc="630" width="100" height="20" /></element>
<element ref="style"><bounds xc="640" yc="522" width="100" height="15" /></element>
<element ref="button-circ" inputtag="KEY0" inputmask="0x01"><bounds xc="640" yc="560" width="25" height="25" /></element>
<element ref="perc"><bounds xc="690" yc="522" width="100" height="15" /></element>
<element ref="set"><bounds xc="690" yc="537" width="100" height="15" /></element>
<element ref="button-circ" inputtag="KEY0" inputmask="0x02"><bounds xc="690" yc="560" width="25" height="25" /></element>
<element ref="tempo"><bounds xc="740" yc="522" width="100" height="15" /></element>
<element ref="button-circ" inputtag="KEY0" inputmask="0x04"><bounds xc="740" yc="560" width="25" height="25" /></element>
<element ref="demo"><bounds xc="790" yc="522" width="100" height="15" /></element>
<element ref="button-demo" inputtag="KEY1" inputmask="0x01"><bounds xc="790" yc="560" width="25" height="25" /></element>
<element ref="tap"><bounds xc="640" yc="582" width="100" height="15" /></element>
<element ref="tap_start"><bounds xc="640" yc="597" width="100" height="15" /></element>
<element ref="button-circ" inputtag="KEY1" inputmask="0x02"><bounds xc="640" yc="620" width="25" height="25" /></element>
<element ref="pad_assign"><bounds xc="715" yc="582" width="100" height="15" /></element>
<element ref="pointer_l"><bounds xc="690" yc="597" width="100" height="15" /></element>
<element ref="pointer_r"><bounds xc="740" yc="597" width="100" height="15" /></element>
<element ref="button-circ" inputtag="KEY2" inputmask="0x08"><bounds xc="690" yc="620" width="25" height="25" /></element>
<element ref="button-circ" inputtag="KEY2" inputmask="0x04"><bounds xc="740" yc="620" width="25" height="25" /></element>
<element ref="se"><bounds xc="790" yc="582" width="100" height="15" /></element>
<element ref="select"><bounds xc="790" yc="597" width="100" height="15" /></element>
<element ref="white"><bounds x="790" yc="620" width="35" height="3" /></element>
<element ref="white"><bounds x="825" yc="620" width="3" height="120" /></element>
<element ref="white"><bounds x="825" yc="560" width="15" height="3" /></element>
<element ref="white"><bounds x="825" yc="680" width="15" height="3" /></element>
<element ref="button-circ" inputtag="KEY1" inputmask="0x04"><bounds xc="790" yc="620" width="25" height="25" /></element>
<element ref="start"><bounds xc="640" yc="642" width="100" height="15" /></element>
<element ref="stop"><bounds xc="640" yc="657" width="100" height="15" /></element>
<element ref="button-start-stop" inputtag="KEY0" inputmask="0x08"><bounds xc="640" yc="680" width="25" height="25" /></element>
<element ref="auto"><bounds xc="690" yc="642" width="100" height="15" /></element>
<element ref="auto_roll"><bounds xc="690" yc="657" width="100" height="15" /></element>
<element ref="button-circ" inputtag="KEY1" inputmask="0x08"><bounds xc="690" yc="680" width="25" height="25" /></element>
<element ref="off"><bounds x="725" yc="650" width="200" height="15" /></element>
<element ref="echo"><bounds x="725" yc="665" width="200" height="15" /></element>
<element ref="flam"><bounds x="725" yc="680" width="200" height="15" /></element>
<element ref="roll"><bounds x="725" yc="695" width="200" height="15" /></element>
<element ref="white"><bounds x="712" y="650" width="1" height="45" /></element>
<element ref="white"><bounds x="712" y="650" width="8" height="1" /></element>
<element ref="white"><bounds x="712" y="665" width="8" height="1" /></element>
<element ref="white"><bounds x="712" y="680" width="8" height="1" /></element>
<element ref="white"><bounds x="712" y="695" width="8" height="1" /></element>
<element ref="se_pads"><bounds xc="970" yc="502" width="200" height="15" /></element>
<element ref="button-circ" inputtag="KEY3" inputmask="0x01"><bounds xc="880" yc="560" width="65" height="65" /></element>
<element ref="button-circ" inputtag="KEY3" inputmask="0x02"><bounds xc="940" yc="680" width="65" height="65" /></element>
<element ref="button-circ" inputtag="KEY3" inputmask="0x04"><bounds xc="1000" yc="560" width="65" height="65" /></element>
<element ref="button-circ" inputtag="KEY3" inputmask="0x08"><bounds xc="1060" yc="680" width="65" height="65" /></element>
<repeat count="10">
<param name="y" start="310" increment="18" />
<element ref="border"><bounds xc="715" y="~y~" width="680" height="8" /></element>
</repeat>
<element ref="greyback"><bounds xc="715" y="364" width="150" height="100" /></element>
<element ref="black"><bounds xc="715" y="370" width="120" height="90" /></element>
<element ref="digit" name="digit0"><bounds x="670" y="390" width="40" height="50" /><orientation rotate="180" /></element>
<element ref="digit" name="digit1"><bounds x="720" y="390" width="40" height="50" /><orientation rotate="180" /></element>
</view>
</mamelayout>

View File

@ -45470,6 +45470,7 @@ psr60 // 1985 PSR-60
psr70 // 1985 PSR-70
@source:yamaha/ympsr150.cpp
dd9 // 1994
psr110 // 1993
psr150 // 1992
psr180 // 1994

View File

@ -25,12 +25,13 @@
- PSS-12: 32 mini keys, mono, 2Mbit ROM
- PSS-6: 32 "ultra mini" keys, mono, 1Mbit ROM, some tone differences
- DD-9 Digital Percussion (1994), later released as DD-20 (2003)
- LCD with large icons, metronome, volume display (1996)
- PSR-190: 61 keys, stereo
- PSR-78: 49 keys, mono
Other known undumped models:
- DD-9 Digital Percussion (1994, later released as DD-20)
- PSR-130 (1997, 61 keys, two dials for tone & rhythm selection)
*/
@ -44,6 +45,7 @@
#include "screen.h"
#include "speaker.h"
#include "dd9.lh"
#include "psr110.lh"
#include "psr150.lh"
#include "psr180.lh"
@ -67,9 +69,11 @@ public:
, m_lcdc(*this, "lcdc")
, m_port(*this, "P%c", 'A')
, m_keys(*this, "KEY%u", 0U)
, m_dial(*this, "DIAL")
, m_outputs(*this, "%02x.%d.%d", 0U, 0U, 0U)
, m_switch(*this, "switch_pos")
, m_led(*this, "led%u", 0U)
, m_digit(*this, "digit%u", 0U)
{ }
void psr150(machine_config &config);
@ -78,6 +82,7 @@ public:
void pss31(machine_config &config);
void psr75(machine_config &config);
void pss11(machine_config &config);
void dd9(machine_config &config);
void psr180_base(machine_config &config);
void psr180(machine_config &config);
void psr76(machine_config &config);
@ -97,6 +102,8 @@ public:
template <unsigned StartBit>
DECLARE_CUSTOM_INPUT_MEMBER(keys_r);
DECLARE_CUSTOM_INPUT_MEMBER(dial_r);
DECLARE_INPUT_CHANGED_MEMBER(switch_w);
DECLARE_CUSTOM_INPUT_MEMBER(switch_r) { return m_switch; }
@ -110,6 +117,9 @@ public:
template <unsigned Bit>
void pwm_col_w(int state);
template <unsigned Num>
void digit_w(u8 state) { m_digit[Num] = state ^ 0xff; }
DECLARE_CUSTOM_INPUT_MEMBER(lcd_r) { return m_lcdc->db_r() >> 4; }
void lcd_w(int state) { m_lcdc->db_w(state << 4); }
@ -124,9 +134,11 @@ private:
optional_ioport_array<6> m_port;
optional_ioport_array<19> m_keys;
optional_ioport m_dial;
output_finder<64, 8, 5> m_outputs;
output_finder<> m_switch;
output_finder<4> m_led;
output_finder<2> m_digit;
ioport_value m_key_sel{};
ioport_value m_pwm_col{};
@ -160,6 +172,13 @@ CUSTOM_INPUT_MEMBER(psr150_state::keys_r)
return result >> StartBit;
}
CUSTOM_INPUT_MEMBER(psr150_state::dial_r)
{
// return the dial position as a 2-bit gray code
const u8 val = m_dial->read();
return (val >> 6) ^ (val >> 7);
}
INPUT_CHANGED_MEMBER(psr150_state::switch_w)
{
if (!oldval && newval)
@ -202,6 +221,7 @@ void psr150_state::driver_start()
{
m_outputs.resolve();
m_led.resolve();
m_digit.resolve();
m_switch.resolve();
m_switch = 0x2; // "Voice Play" mode
@ -301,6 +321,23 @@ void psr150_state::pss11(machine_config &config)
config.set_default_layout(layout_pss11);
}
void psr150_state::dd9(machine_config &config)
{
GEW7(config, m_maincpu, 8'000'000);
m_maincpu->port_out_cb<0>().set_ioport("PA");
m_maincpu->port_out_cb<1>().set(FUNC(psr150_state::digit_w<0>));
m_maincpu->port_out_cb<2>().set(FUNC(psr150_state::digit_w<1>));
m_maincpu->port_in_cb<5>().set_ioport("PF");
m_maincpu->add_route(1, "speaker", 1.0);
// TODO: there is also a RLC lowpass with R=150, L=3.3mH, C=0.33uF
// (AC filter not really needed since this doesn't output a "dummy" DC offset sample, unlike the keyboards)
SPEAKER(config, "speaker").front_center();
config.set_default_layout(layout_dd9);
}
void psr150_state::psr180_base(machine_config &config)
{
GEW7(config, m_maincpu, 8'000'000);
@ -1007,6 +1044,50 @@ INPUT_PORTS_START(pss11)
PORT_BIT( 0x400, IP_ACTIVE_HIGH, IPT_UNUSED )
INPUT_PORTS_END
INPUT_PORTS_START( dd9 )
PORT_START("PA")
PORT_BIT( 0x1f, IP_ACTIVE_LOW, IPT_OUTPUT ) PORT_WRITE_LINE_MEMBER(psr150_state, KEY_OUT_BITS(0, 5))
PORT_BIT( 0xe0, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_START("PF")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Drum Pad 1")
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Drum Pad 2")
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("Drum Pad 3")
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("Drum Pad 4")
PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(psr150_state, keys_r<0>)
PORT_START("KEY0")
PORT_BIT( 0x1, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_NAME("Style")
PORT_BIT( 0x2, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_NAME("Perc. Set")
PORT_BIT( 0x4, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_NAME("Tempo")
PORT_BIT( 0x8, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_NAME("Start/Stop")
PORT_START("KEY1")
PORT_BIT( 0x1, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_NAME("Demo")
PORT_BIT( 0x2, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_NAME("Tap Start")
PORT_BIT( 0x4, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_NAME("SE Select")
PORT_BIT( 0x8, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_NAME("Auto Roll")
PORT_START("KEY2")
PORT_BIT( 0x1, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_UP) PORT_NAME("Volume Up")
PORT_BIT( 0x2, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DOWN) PORT_NAME("Volume Down")
PORT_BIT( 0x4, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_NAME("Pad Assign +")
PORT_BIT( 0x8, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_NAME("Pad Assign -")
PORT_START("KEY3")
PORT_BIT( 0x1, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("SE Pad 1")
PORT_BIT( 0x2, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("SE Pad 2")
PORT_BIT( 0x4, IP_ACTIVE_HIGH, IPT_BUTTON7 ) PORT_NAME("SE Pad 3")
PORT_BIT( 0x8, IP_ACTIVE_HIGH, IPT_BUTTON8 ) PORT_NAME("SE Pad 4")
PORT_START("KEY4")
PORT_BIT( 0x3, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(psr150_state, dial_r)
PORT_BIT( 0xc, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_START("DIAL")
PORT_BIT( 0xff, 0x00, IPT_DIAL ) PORT_SENSITIVITY(50) PORT_KEYDELTA(75)
INPUT_PORTS_END
INPUT_PORTS_START( pss12 )
PORT_START("PA")
PORT_BIT( 0x3f, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(psr150_state, keys_r<0>)
@ -1682,6 +1763,11 @@ ROM_END
#define rom_pss21 rom_psr75
#define rom_pss31 rom_psr75
ROM_START( dd9 )
ROM_REGION( 0x40000, "maincpu", 0 )
ROM_LOAD( "xp170b00.ic2", 0x00000, 0x40000, CRC(66f09612) SHA1(7b106dc3717992c5b1a96bd5b27417bd98b38f7f))
ROM_END
ROM_START( psr180 )
ROM_REGION( 0x80000, "maincpu", 0 )
ROM_LOAD( "xp687a00.ic6", 0x00000, 0x80000, CRC(df3a568d) SHA1(ddc260d55d874987950817817117df141668f1f2))
@ -1727,6 +1813,7 @@ SYST( 1992, psr75, psr150, 0, psr75, psr75, psr150_state, empty_init,
SYST( 1992, pss11, psr150, 0, pss11, pss11, psr150_state, empty_init, "Yamaha", "PSS-11", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
SYST( 1992, pss21, psr150, 0, pss21, pss21, psr150_state, empty_init, "Yamaha", "PSS-21", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
SYST( 1992, pss31, psr150, 0, pss31, pss31, psr150_state, empty_init, "Yamaha", "PSS-31", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
SYST( 1994, dd9, 0, 0, dd9, dd9, psr150_state, empty_init, "Yamaha", "DD-9 Digital Percussion", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
SYST( 1994, psr180, 0, 0, psr180, psr180, psr150_state, empty_init, "Yamaha", "PSR-180", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
SYST( 1994, psr76, psr180, 0, psr76, psr76, psr150_state, empty_init, "Yamaha", "PSR-76", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
SYST( 1994, pss12, 0, 0, pss12, pss12, psr150_state, empty_init, "Yamaha", "PSS-12", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )