summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Anthony <ajxs@panoptic.online>2022-11-25 02:49:47 +1100
committer GitHub <noreply@github.com>2022-11-25 02:49:47 +1100
commit09e5a49fd8bd383da84801cfa9dac1e4a34d91ef (patch)
tree0a95181c550c078053d47027cbad6208357af874
parent04852b19cdf1d51ed14413f9255479bd45b68452 (diff)
yamaha/ymdx9.cpp: Added skeleton driver for Yamaha DX9. (#10586)
New machines marked as not working ------------------------------- Yamaha DX9 Digital Programmable Algorithm Synthesizer
-rw-r--r--src/emu/xtal.cpp1
-rw-r--r--src/mame/layout/dx9.lay590
-rw-r--r--src/mame/mame.lst3
-rw-r--r--src/mame/mess.flt1
-rw-r--r--src/mame/yamaha/ymdx9.cpp407
5 files changed, 1002 insertions, 0 deletions
diff --git a/src/emu/xtal.cpp b/src/emu/xtal.cpp
index fc606c4f7db..30d9a9d9f4c 100644
--- a/src/emu/xtal.cpp
+++ b/src/emu/xtal.cpp
@@ -163,6 +163,7 @@ const double XTAL::known_xtals[] = {
9'000'000, /* 9_MHz_XTAL Homedata PCBs */
9'216'000, /* 9.216_MHz_XTAL Univac UTS 20 */
9'400'000, /* 9.4_MHz_XTAL Yamaha MU-5 and TG-100 */
+ 9'426'500, /* 9.4265_MHz_XTAL Yamaha DX7, and DX9 */
9'600'000, /* 9.6_MHz_XTAL WD37C65 second clock (for 300 KB/sec rate) */
9'732'000, /* 9.732_MHz_XTAL CTA Invader */
9'828'000, /* 9.828_MHz_XTAL Universal PCBs */
diff --git a/src/mame/layout/dx9.lay b/src/mame/layout/dx9.lay
new file mode 100644
index 00000000000..86ba63b70c4
--- /dev/null
+++ b/src/mame/layout/dx9.lay
@@ -0,0 +1,590 @@
+<?xml version="1.0"?>
+<!--
+license:CC0
+-->
+<mamelayout version="2">
+ <element name="background">
+ <rect>
+ <color red="0.12" green="0.10" blue="0.05" />
+ </rect>
+ </element>
+
+ <element name="inset-background">
+ <rect><color red="0.05" green="0.05" blue="0.05" /></rect>
+ </element>
+
+ <element name="led" defstate="0">
+ <led7seg><color red="1.0" green="0.0" blue="0.0" /></led7seg>
+ </element>
+
+ <element name="button-text-separator-blue">
+ <rect><color red="0.13" green="0.65" blue="0.9" /></rect>
+ </element>
+
+ <element name="button-text-separator-brown">
+ <rect><color red="0.72" green="0.48" blue="0.33" /></rect>
+ </element>
+
+ <element name="button-membrane-green" defstate="0">
+ <rect state="0"><color red="0" green="0.8" blue="0.75" /></rect>
+ <rect state="1"><color red="0" green="0.7" blue="0.6" /></rect>
+ </element>
+
+ <element name="button-membrane-red" defstate="0">
+ <rect><color red="1.0" green="0" blue="0" /></rect>
+ </element>
+
+ <element name="button-membrane-blue" defstate="0">
+ <rect><color red="0.13" green="0.65" blue="0.9" /></rect>
+ </element>
+
+ <element name="button-membrane-brown" defstate="0">
+ <rect><color red="0.72" green="0.48" blue="0.33" /></rect>
+ </element>
+
+ <!-- Main Button Labels -->
+ <element name="button-text-store"><text align="1" string="STORE" /></element>
+ <element name="button-text-function"><text align="1" string="FUNCTION" /></element>
+ <element name="button-text-edit"><text align="1" string="EDIT / COMPARE" /></element>
+ <element name="button-text-memory"><text align="1" string="MEMORY SELECT" /></element>
+
+ <!-- Up/Down Yes/No Button Labels -->
+ <element name="button-text-no"><text align="1" string="NO" /></element>
+ <element name="button-text-off"><text align="1" string="OFF" /></element>
+ <element name="button-text-yes"><text align="1" string="YES" /></element>
+ <element name="button-text-on"><text align="1" string="ON" /></element>
+ <element name="button-text-plus"><text align="1" string="+1" /></element>
+ <element name="button-text-minus"><text align="1" string="-1" /></element>
+
+ <!-- Numeric Button Label Numbers -->
+ <element name="button-number-1"><text align="1" string="1" /></element>
+ <element name="button-number-2"><text align="1" string="2" /></element>
+ <element name="button-number-3"><text align="1" string="3" /></element>
+ <element name="button-number-4"><text align="1" string="4" /></element>
+ <element name="button-number-5"><text align="1" string="5" /></element>
+ <element name="button-number-6"><text align="1" string="6" /></element>
+ <element name="button-number-7"><text align="1" string="7" /></element>
+ <element name="button-number-8"><text align="1" string="8" /></element>
+ <element name="button-number-9"><text align="1" string="9" /></element>
+ <element name="button-number-10"><text align="1" string="10" /></element>
+ <element name="button-number-11"><text align="1" string="11" /></element>
+ <element name="button-number-12"><text align="1" string="12" /></element>
+ <element name="button-number-13"><text align="1" string="13" /></element>
+ <element name="button-number-14"><text align="1" string="14" /></element>
+ <element name="button-number-15"><text align="1" string="15" /></element>
+ <element name="button-number-16"><text align="1" string="16" /></element>
+ <element name="button-number-17"><text align="1" string="17" /></element>
+ <element name="button-number-18"><text align="1" string="18" /></element>
+ <element name="button-number-19"><text align="1" string="19" /></element>
+ <element name="button-number-20"><text align="1" string="20" /></element>
+
+ <!-- Button Labels Row 1 Top -->
+ <element name="button-text-operator-copy">
+ <text align="1" string="OPERATOR ON-OFF/EG COPY">
+ <color red="0.13" green="0.65" blue="0.9" />
+ </text>
+ </element>
+
+ <element name="button-text-operator-1">
+ <text align="1" string="1"><color red="0.13" green="0.65" blue="0.9" /></text>
+ </element>
+
+ <element name="button-text-operator-2">
+ <text align="1" string="2"><color red="0.13" green="0.65" blue="0.9" /></text>
+ </element>
+
+ <element name="button-text-operator-3">
+ <text align="1" string="3"><color red="0.13" green="0.65" blue="0.9" /></text>
+ </element>
+
+ <element name="button-text-operator-4">
+ <text align="1" string="4"><color red="0.13" green="0.65" blue="0.9" /></text>
+ </element>
+
+ <element name="button-text-algorithm">
+ <text align="1" string="ALGORITHM"><color red="0.13" green="0.65" blue="0.9" /></text>
+ </element>
+
+ <element name="button-text-feedback">
+ <text align="1" string="/FEEDBACK"><color red="0.13" green="0.65" blue="0.9" /></text>
+ </element>
+
+ <element name="button-text-lfo">
+ <text align="1" string="LFO"><color red="0.13" green="0.65" blue="0.9" /></text>
+ </element>
+
+ <element name="button-text-lfo-wave">
+ <text align="1" string="WAVE"><color red="0.13" green="0.65" blue="0.9" /></text>
+ </element>
+
+ <element name="button-text-lfo-speed">
+ <text align="1" string="SPEED"><color red="0.13" green="0.65" blue="0.9" /></text>
+ </element>
+
+ <element name="button-text-lfo-delay">
+ <text align="1" string="DELAY"><color red="0.13" green="0.65" blue="0.9" /></text>
+ </element>
+
+ <element name="button-text-lfo-pmd">
+ <text align="1" string="PMD/AMD"><color red="0.13" green="0.65" blue="0.9" /></text>
+ </element>
+
+ <element name="button-text-mod-sens">
+ <text align="1" string="MOD SENS"><color red="0.13" green="0.65" blue="0.9" /></text>
+ </element>
+
+ <element name="button-text-pitch-amp">
+ <text align="1" string="PITCH/AMP"><color red="0.13" green="0.65" blue="0.9" /></text>
+ </element>
+
+ <!-- Button Labels Row 1 Bottom -->
+ <element name="button-text-master">
+ <text align="1" string="MASTER"><color red="0.72" green="0.48" blue="0.33" /></text>
+ </element>
+
+ <element name="button-text-tune-adj">
+ <text align="1" string="TUNE ADJ"><color red="0.72" green="0.48" blue="0.33" /></text>
+ </element>
+
+ <element name="button-text-poly">
+ <text align="1" string="POLY/MONO"><color red="0.72" green="0.48" blue="0.33" /></text>
+ </element>
+
+ <element name="button-text-pitch-bend">
+ <text align="1" string="PITCH BEND"><color red="0.72" green="0.48" blue="0.33" /></text>
+ </element>
+
+ <element name="button-text-pitch-bend-range">
+ <text align="1" string="RANGE"><color red="0.72" green="0.48" blue="0.33" /></text>
+ </element>
+
+ <element name="button-text-portamento">
+ <text align="1" string="PORTAMENTO"><color red="0.72" green="0.48" blue="0.33" /></text>
+ </element>
+
+ <element name="button-text-portamento-mode">
+ <text align="1" string="MODE"><color red="0.72" green="0.48" blue="0.33" /></text>
+ </element>
+
+ <element name="button-text-portamento-time">
+ <text align="1" string="TIME"><color red="0.72" green="0.48" blue="0.33" /></text>
+ </element>
+
+ <element name="button-text-cassette">
+ <text align="1" string="CASSETTE"><color red="0.72" green="0.48" blue="0.33" /></text>
+ </element>
+
+ <element name="button-text-cassette-save">
+ <text align="1" string="SAVE/VERIFY"><color red="0.72" green="0.48" blue="0.33" /></text>
+ </element>
+
+ <element name="button-text-cassette-load">
+ <text align="1" string="LOAD"><color red="0.72" green="0.48" blue="0.33" /></text>
+ </element>
+
+ <element name="button-text-cassette-load-single">
+ <text align="1" string="LOAD SINGLE"><color red="0.72" green="0.48" blue="0.33" /></text>
+ </element>
+
+ <element name="button-text-cassette-remote">
+ <text align="1" string="REMOTE"><color red="0.72" green="0.48" blue="0.33" /></text>
+ </element>
+
+ <!-- Labels Row 2 Top -->
+ <element name="button-text-operator">
+ <text align="1" string="OPERATOR"><color red="0.13" green="0.65" blue="0.9" /></text>
+ </element>
+ <element name="button-text-select">
+ <text align="1" string="SELECT"><color red="0.13" green="0.65" blue="0.9" /></text>
+ </element>
+
+ <element name="button-text-oscillator">
+ <text align="1" string="OSCILLATOR"><color red="0.13" green="0.65" blue="0.9" /></text>
+ </element>
+
+ <element name="button-text-oscillator-frequency">
+ <text align="1" string="FREQUENCY"><color red="0.13" green="0.65" blue="0.9" /></text>
+ </element>
+
+ <element name="button-text-oscillator-coarse">
+ <text align="1" string="COARSE"><color red="0.13" green="0.65" blue="0.9" /></text>
+ </element>
+
+ <element name="button-text-oscillator-fine">
+ <text align="1" string="FINE"><color red="0.13" green="0.65" blue="0.9" /></text>
+ </element>
+
+ <element name="button-text-oscillator-detune">
+ <text align="1" string="DETUNE"><color red="0.13" green="0.65" blue="0.9" /></text>
+ </element>
+
+ <element name="button-text-oscillator-sync">
+ <text align="1" string="SYNC"><color red="0.13" green="0.65" blue="0.9" /></text>
+ </element>
+
+ <element name="button-text-eg">
+ <text align="1" string="EG"><color red="0.13" green="0.65" blue="0.9" /></text>
+ </element>
+
+ <element name="button-text-rate">
+ <text align="1" string="RATE"><color red="0.13" green="0.65" blue="0.9" /></text>
+ </element>
+
+ <element name="button-text-level">
+ <text align="1" string="LEVEL"><color red="0.13" green="0.65" blue="0.9" /></text>
+ </element>
+
+ <element name="button-text-scaling">
+ <text align="1" string="KEYBOARD SCALING"><color red="0.13" green="0.65" blue="0.9" /></text>
+ </element>
+
+ <element name="button-text-output">
+ <text align="1" string="OUTPUT"><color red="0.13" green="0.65" blue="0.9" /></text>
+ </element>
+
+ <element name="button-text-key">
+ <text align="1" string="KEY"><color red="0.13" green="0.65" blue="0.9" /></text>
+ </element>
+
+ <element name="button-text-transpose">
+ <text align="1" string="TRANSPOSE"><color red="0.13" green="0.65" blue="0.9" /></text>
+ </element>
+
+ <!-- Button Labels Row 2 Bottom -->
+ <element name="button-text-modulation-wheel">
+ <text align="1" string="MODULATION WHEEL"><color red="0.72" green="0.48" blue="0.33" /></text>
+ </element>
+
+ <element name="button-text-modulation-range">
+ <text align="1" string="RANGE"><color red="0.72" green="0.48" blue="0.33" /></text>
+ </element>
+
+ <element name="button-text-modulation-pitch">
+ <text align="1" string="PITCH"><color red="0.72" green="0.48" blue="0.33" /></text>
+ </element>
+
+ <element name="button-text-modulation-amplitude">
+ <text align="1" string="AMPLITUDE"><color red="0.72" green="0.48" blue="0.33" /></text>
+ </element>
+
+ <element name="button-text-modulation-bias">
+ <text align="1" string="EG BIAS"><color red="0.72" green="0.48" blue="0.33" /></text>
+ </element>
+
+ <element name="button-text-breath-control">
+ <text align="1" string="BREATH CONTROL"><color red="0.72" green="0.48" blue="0.33" /></text>
+ </element>
+
+ <element name="button-text-edit-recall">
+ <text align="1" string="EDIT RECALL"><color red="0.72" green="0.48" blue="0.33" /></text>
+ </element>
+
+ <element name="button-text-voice-init">
+ <text align="1" string="/ VOICE INIT"><color red="0.72" green="0.48" blue="0.33" /></text>
+ </element>
+
+ <element name="button-text-memory-protect">
+ <text align="1" string="MEMORY"><color red="0.72" green="0.48" blue="0.33" /></text>
+ </element>
+
+ <element name="button-text-protect">
+ <text align="1" string="PROTECT"><color red="0.72" green="0.48" blue="0.33" /></text>
+ </element>
+
+ <group name="group-screen-inset">
+ <element ref="inset-background">
+ <bounds x="0" y="0" width="400" height="80" />
+ </element>
+ <screen index="0">
+ <bounds x="172" y="20" width="160" height="40" />
+ </screen>
+ <element ref="led" name="led_0">
+ <bounds x="48" y="20" width="32" height="40" />
+ </element>
+ <element ref="led" name="led_1">
+ <bounds x="80" y="20" width="32" height="40" />
+ </element>
+ </group>
+
+ <group name="front-panel-buttons-main">
+ <!-- Main buttons -->
+ <element ref="button-text-store"><bounds x="0" y="0" width="72" height="16" /></element>
+ <element ref="button-membrane-red" inputtag="KEY_SWITCH_INPUT.0" inputmask="0x04">
+ <bounds x="0" y="16" width="72" height="32" />
+ </element>
+
+ <element ref="button-text-function"><bounds x="80" y="0" width="72" height="16" /></element>
+ <element ref="button-membrane-brown" inputtag="KEY_SWITCH_INPUT.0" inputmask="0x10">
+ <bounds x="80" y="16" width="72" height="32" />
+ </element>
+
+ <element ref="button-text-edit"><bounds x="0" y="64" width="72" height="16" /></element>
+ <element ref="button-membrane-blue" inputtag="KEY_SWITCH_INPUT.0" inputmask="0x20">
+ <bounds x="0" y="80" width="72" height="32" />
+ </element>
+
+ <element ref="button-text-memory"><bounds x="80" y="64" width="72" height="16" /></element>
+ <element ref="button-membrane-green" inputtag="KEY_SWITCH_INPUT.0" inputmask="0x40">
+ <bounds x="80" y="80" width="72" height="32" />
+ </element>
+ </group>
+
+ <group name="front-panel-buttons-up-down">
+ <element ref="button-text-no"><bounds x="0" y="0" width="72" height="16" /></element>
+ <element ref="button-membrane-green" inputtag="KEY_SWITCH_INPUT.0" inputmask="0x2">
+ <bounds x="0" y="16" width="72" height="32" />
+ </element>
+ <element ref="button-text-minus"><bounds x="4" y="22" width="18" height="18" /></element>
+ <element ref="button-text-off"><bounds x="0" y="48" width="72" height="16" /></element>
+
+ <element ref="button-text-yes"><bounds x="80" y="0" width="72" height="16" /></element>
+ <element ref="button-membrane-green" inputtag="KEY_SWITCH_INPUT.0" inputmask="0x1">
+ <bounds x="80" y="16" width="72" height="32" />
+ </element>
+ <element ref="button-text-plus"><bounds x="84" y="22" width="18" height="18" /></element>
+ <element ref="button-text-on"><bounds x="80" y="48" width="72" height="16" /></element>
+ </group>
+
+ <!-- Numeric Buttons Row 1 -->
+ <group name="front-panel-buttons-numeric-row-1">
+ <!-- Button 1 -->
+ <element ref="button-text-operator-copy"><bounds x="0" y="0" width="128" height="16" /></element>
+ <element ref="button-text-separator-blue"><bounds x="0" y="16" width="312" height="1" /></element>
+ <element ref="button-text-operator-1"><bounds x="0" y="16" width="10" height="16" /></element>
+ <element ref="button-membrane-green" inputtag="KEY_SWITCH_INPUT.1" inputmask="0x01">
+ <bounds x="0" y="32" width="72" height="32" />
+ </element>
+ <element ref="button-number-1"><bounds x="4" y="38" width="10" height="18" /></element>
+ <element ref="button-text-master"><bounds x="0" y="64" width="72" height="16" /></element>
+ <element ref="button-text-tune-adj"><bounds x="0" y="76" width="72" height="16" /></element>
+
+ <!-- Button 2 -->
+ <element ref="button-text-operator-2"><bounds x="80" y="16" width="10" height="16" /></element>
+ <element ref="button-membrane-green" inputtag="KEY_SWITCH_INPUT.1" inputmask="0x02">
+ <bounds x="80" y="32" width="72" height="32" />
+ </element>
+ <element ref="button-number-2"><bounds x="84" y="38" width="10" height="18" /></element>
+ <element ref="button-text-poly"><bounds x="80" y="64" width="72" height="16" /></element>
+
+ <!-- Button 3 -->
+ <element ref="button-text-operator-3"><bounds x="160" y="16" width="10" height="16" /></element>
+ <element ref="button-membrane-green" inputtag="KEY_SWITCH_INPUT.1" inputmask="0x04">
+ <bounds x="160" y="32" width="72" height="32" />
+ </element>
+ <element ref="button-number-3"><bounds x="164" y="38" width="10" height="18" /></element>
+ <element ref="button-text-pitch-bend"><bounds x="160" y="64" width="72" height="16" /></element>
+ <element ref="button-text-pitch-bend-range"><bounds x="160" y="76" width="72" height="16" /></element>
+
+ <!-- Button 4 -->
+ <element ref="button-text-operator-4"><bounds x="240" y="16" width="10" height="16" /></element>
+ <element ref="button-membrane-green" inputtag="KEY_SWITCH_INPUT.1" inputmask="0x08">
+ <bounds x="240" y="32" width="72" height="32" />
+ </element>
+ <element ref="button-number-4"><bounds x="244" y="38" width="10" height="18" /></element>
+ <element ref="button-text-portamento-mode"><bounds x="240" y="64" width="72" height="16" /></element>
+ <element ref="button-text-separator-brown"><bounds x="240" y="80" width="152" height="1" /></element>
+ <element ref="button-text-portamento"><bounds x="240" y="80" width="72" height="16" /></element>
+
+ <!-- Button 5 -->
+ <element ref="button-text-algorithm"><bounds x="320" y="4" width="72" height="16" /></element>
+ <element ref="button-text-feedback"><bounds x="320" y="16" width="72" height="16" /></element>
+ <element ref="button-membrane-green" inputtag="KEY_SWITCH_INPUT.1" inputmask="0x10">
+ <bounds x="320" y="32" width="72" height="32" />
+ </element>
+ <element ref="button-number-5"><bounds x="324" y="38" width="10" height="18" /></element>
+ <element ref="button-text-portamento-time"><bounds x="320" y="64" width="72" height="16" /></element>
+
+ <!-- Button 6 -->
+ <element ref="button-text-lfo"><bounds x="400" y="0" width="72" height="16" /></element>
+ <element ref="button-text-separator-blue"><bounds x="400" y="16" width="312" height="1" /></element>
+ <element ref="button-text-lfo-wave"><bounds x="400" y="16" width="72" height="16" /></element>
+ <element ref="button-membrane-green" inputtag="KEY_SWITCH_INPUT.1" inputmask="0x20">
+ <bounds x="400" y="32" width="72" height="32" />
+ </element>
+ <element ref="button-number-6"><bounds x="404" y="38" width="10" height="18" /></element>
+
+ <!-- Button 7 -->
+ <element ref="button-text-lfo-speed"><bounds x="480" y="16" width="72" height="16" /></element>
+ <element ref="button-membrane-green" inputtag="KEY_SWITCH_INPUT.1" inputmask="0x40">
+ <bounds x="480" y="32" width="72" height="32" />
+ </element>
+ <element ref="button-number-7"><bounds x="484" y="38" width="10" height="18" /></element>
+ <element ref="button-text-cassette-save"><bounds x="480" y="64" width="72" height="16" /></element>
+ <element ref="button-text-separator-brown"><bounds x="480" y="80" width="312" height="1" /></element>
+ <element ref="button-text-cassette"><bounds x="480" y="80" width="72" height="16" /></element>
+
+ <!-- Button 8 -->
+ <element ref="button-text-lfo-delay"><bounds x="560" y="16" width="72" height="16" /></element>
+ <element ref="button-membrane-green" inputtag="KEY_SWITCH_INPUT.1" inputmask="0x80">
+ <bounds x="560" y="32" width="72" height="32" />
+ </element>
+ <element ref="button-number-8"><bounds x="564" y="38" width="10" height="18" /></element>
+ <element ref="button-text-cassette-load"><bounds x="560" y="64" width="72" height="16" /></element>
+
+ <!-- Button 9 -->
+ <element ref="button-text-lfo-pmd"><bounds x="640" y="16" width="72" height="16" /></element>
+ <element ref="button-membrane-green" inputtag="KEY_SWITCH_INPUT.2" inputmask="0x1">
+ <bounds x="640" y="32" width="72" height="32" />
+ </element>
+ <element ref="button-number-9"><bounds x="644" y="38" width="10" height="18" /></element>
+ <element ref="button-text-cassette-load-single"><bounds x="640" y="64" width="72" height="16" /></element>
+
+ <!-- Button 10 -->
+ <element ref="button-text-mod-sens"><bounds x="720" y="0" width="72" height="16" /></element>
+ <element ref="button-text-separator-blue"><bounds x="720" y="16" width="72" height="1" /></element>
+ <element ref="button-text-pitch-amp"><bounds x="720" y="16" width="72" height="16" /></element>
+ <element ref="button-membrane-green" inputtag="KEY_SWITCH_INPUT.2" inputmask="0x2">
+ <bounds x="720" y="32" width="72" height="32" />
+ </element>
+ <element ref="button-number-10"><bounds x="724" y="38" width="18" height="18" /></element>
+ <element ref="button-text-cassette-remote"><bounds x="720" y="64" width="72" height="16" /></element>
+ </group>
+
+ <!-- Numeric Buttons Row 2 -->
+ <group name="front-panel-buttons-numeric-row-2">
+ <!-- Button 11 -->
+ <element ref="button-text-operator"><bounds x="0" y="0" width="72" height="16" /></element>
+ <element ref="button-text-select"><bounds x="0" y="12" width="72" height="16" /></element>
+ <element ref="button-membrane-green" inputtag="KEY_SWITCH_INPUT.2" inputmask="0x04">
+ <bounds x="0" y="48" width="72" height="32" />
+ </element>
+ <element ref="button-number-11"><bounds x="4" y="52" width="18" height="18" /></element>
+ <element ref="button-text-modulation-range"><bounds x="0" y="80" width="72" height="16" /></element>
+ <element ref="button-text-separator-brown"><bounds x="0" y="96" width="312" height="1" /></element>
+ <element ref="button-text-modulation-wheel"><bounds x="0" y="96" width="150" height="16" /></element>
+
+ <!-- Button 12 -->
+ <element ref="button-text-oscillator"><bounds x="80" y="0" width="72" height="16" /></element>
+ <element ref="button-text-separator-blue"><bounds x="80" y="16" width="230" height="1" /></element>
+ <element ref="button-text-oscillator-frequency"><bounds x="80" y="16" width="72" height="16" /></element>
+ <element ref="button-text-oscillator-coarse"><bounds x="80" y="28" width="72" height="16" /></element>
+ <element ref="button-membrane-green" inputtag="KEY_SWITCH_INPUT.2" inputmask="0x08">
+ <bounds x="80" y="48" width="72" height="32" />
+ </element>
+ <element ref="button-number-12"><bounds x="84" y="52" width="18" height="18" /></element>
+ <element ref="button-text-modulation-pitch"><bounds x="80" y="80" width="72" height="16" /></element>
+
+ <!-- Button 13 -->
+ <element ref="button-text-oscillator-frequency"><bounds x="160" y="16" width="72" height="16" /></element>
+ <element ref="button-text-oscillator-fine"><bounds x="160" y="28" width="72" height="16" /></element>
+ <element ref="button-membrane-green" inputtag="KEY_SWITCH_INPUT.2" inputmask="0x10">
+ <bounds x="160" y="48" width="72" height="32" />
+ </element>
+ <element ref="button-number-13"><bounds x="164" y="52" width="18" height="18" /></element>
+ <element ref="button-text-modulation-amplitude"><bounds x="160" y="80" width="72" height="16" /></element>
+
+ <!-- Button 14 -->
+ <element ref="button-text-oscillator-detune"><bounds x="240" y="16" width="72" height="16" /></element>
+ <element ref="button-text-oscillator-sync"><bounds x="240" y="28" width="72" height="16" /></element>
+ <element ref="button-membrane-green" inputtag="KEY_SWITCH_INPUT.2" inputmask="0x20">
+ <bounds x="240" y="48" width="72" height="32" />
+ </element>
+ <element ref="button-number-14"><bounds x="244" y="52" width="18" height="18" /></element>
+ <element ref="button-text-modulation-bias"><bounds x="240" y="80" width="72" height="16" /></element>
+
+ <!-- Button 15 -->
+ <element ref="button-text-eg"><bounds x="320" y="0" width="72" height="16" /></element>
+ <element ref="button-text-separator-blue"><bounds x="320" y="16" width="152" height="1" /></element>
+ <element ref="button-text-rate"><bounds x="320" y="28" width="72" height="16" /></element>
+ <element ref="button-membrane-green" inputtag="KEY_SWITCH_INPUT.2" inputmask="0x40">
+ <bounds x="320" y="48" width="72" height="32" />
+ </element>
+ <element ref="button-number-15"><bounds x="324" y="52" width="18" height="18" /></element>
+ <element ref="button-text-modulation-range"><bounds x="320" y="80" width="72" height="16" /></element>
+ <element ref="button-text-separator-brown"><bounds x="320" y="96" width="312" height="1" /></element>
+ <element ref="button-text-breath-control"><bounds x="320" y="96" width="150" height="16" /></element>
+
+ <!-- Button 16 -->
+ <element ref="button-text-level"><bounds x="400" y="28" width="72" height="16" /></element>
+ <element ref="button-membrane-green" inputtag="KEY_SWITCH_INPUT.2" inputmask="0x80">
+ <bounds x="400" y="48" width="72" height="32" />
+ </element>
+ <element ref="button-number-16"><bounds x="404" y="52" width="18" height="18" /></element>
+ <element ref="button-text-modulation-pitch"><bounds x="400" y="80" width="72" height="16" /></element>
+
+ <!-- Button 17 -->
+ <element ref="button-text-scaling"><bounds x="480" y="0" width="150" height="16" /></element>
+ <element ref="button-text-separator-blue"><bounds x="480" y="16" width="152" height="1" /></element>
+ <element ref="button-text-rate"><bounds x="480" y="28" width="72" height="16" /></element>
+ <element ref="button-membrane-green" inputtag="KEY_SWITCH_INPUT.3" inputmask="0x02">
+ <bounds x="480" y="48" width="72" height="32" />
+ </element>
+ <element ref="button-number-17"><bounds x="484" y="52" width="18" height="18" /></element>
+ <element ref="button-text-modulation-amplitude"><bounds x="480" y="80" width="72" height="16" /></element>
+
+ <!-- Button 18 -->
+ <element ref="button-text-level"><bounds x="560" y="28" width="72" height="16" /></element>
+ <element ref="button-membrane-green" inputtag="KEY_SWITCH_INPUT.3" inputmask="0x04">
+ <bounds x="560" y="48" width="72" height="32" />
+ </element>
+ <element ref="button-number-18"><bounds x="564" y="52" width="18" height="18" /></element>
+ <element ref="button-text-modulation-bias"><bounds x="560" y="80" width="72" height="16" /></element>
+
+ <!-- Button 19 -->
+ <element ref="button-text-operator"><bounds x="640" y="0" width="72" height="16" /></element>
+ <element ref="button-text-separator-blue"><bounds x="640" y="16" width="72" height="1" /></element>
+ <element ref="button-text-output"><bounds x="640" y="16" width="72" height="16" /></element>
+ <element ref="button-text-level"><bounds x="640" y="28" width="72" height="16" /></element>
+ <element ref="button-membrane-green" inputtag="KEY_SWITCH_INPUT.3" inputmask="0x08">
+ <bounds x="640" y="48" width="72" height="32" />
+ </element>
+ <element ref="button-number-19"><bounds x="644" y="52" width="18" height="18" /></element>
+ <element ref="button-text-edit-recall"><bounds x="640" y="80" width="72" height="16" /></element>
+ <element ref="button-text-voice-init"><bounds x="640" y="92" width="72" height="16" /></element>
+
+ <!-- Button 20 -->
+ <element ref="button-text-key"><bounds x="720" y="16" width="72" height="16" /></element>
+ <element ref="button-text-transpose"><bounds x="720" y="28" width="72" height="16" /></element>
+ <element ref="button-membrane-green" inputtag="KEY_SWITCH_INPUT.3" inputmask="0x10">
+ <bounds x="720" y="48" width="72" height="32" />
+ </element>
+ <element ref="button-number-20"><bounds x="724" y="52" width="18" height="18" /></element>
+ <element ref="button-text-memory-protect"><bounds x="720" y="80" width="72" height="16" /></element>
+ <element ref="button-text-protect"><bounds x="720" y="92" width="72" height="16" /></element>
+ </group>
+
+ <element name="logo-yamaha">
+ <text align="1" string="YAMAHA DX9" />
+ </element>
+ <element name="logo-digital">
+ <text align="1" string="DIGITAL PROGRAMMABLE ALGORITHM SYNTHESIZER" />
+ </element>
+
+ <group name="group-interface">
+ <group ref="group-screen-inset">
+ <bounds x="368" y="24" width="400" height="80" />
+ </group>
+
+ <group ref="front-panel-buttons-main">
+ <bounds x="168" y="0" width="152" height="112" />
+ </group>
+
+ <group ref="front-panel-buttons-up-down">
+ <bounds x="0" y="64" width="152" height="64" />
+ </group>
+
+ <group ref="front-panel-buttons-numeric-row-1">
+ <bounds x="0" y="192" width="792" height="96" />
+ </group>
+
+ <group ref="front-panel-buttons-numeric-row-2">
+ <bounds x="0" y="320" width="792" height="112" />
+ </group>
+ </group>
+
+ <view name="Standard">
+ <element ref="background">
+ <bounds x="0" y="0" width="824" height="520" />
+ </element>
+ <element ref="logo-yamaha">
+ <bounds x="16" y="16" width="128" height="32" />
+ </element>
+ <element ref="logo-digital">
+ <bounds x="16" y="48" width="256" height="16"/>
+ </element>
+
+ <group ref="group-interface">
+ <bounds x="16" y="72" width="792" height="432"/>
+ </group>
+ </view>
+</mamelayout>
diff --git a/src/mame/mame.lst b/src/mame/mame.lst
index 418109aabc4..ac19a319879 100644
--- a/src/mame/mame.lst
+++ b/src/mame/mame.lst
@@ -44589,6 +44589,9 @@ yiear2 // GX407 (c) 1985
@source:yamaha/yman1x.cpp
an1x //
+@source:yamaha/ymdx9.cpp
+dx9 //
+
@source:yamaha/ymdx100.cpp
dx100 //
diff --git a/src/mame/mess.flt b/src/mame/mess.flt
index 08ed0196d3c..42db8c0a14a 100644
--- a/src/mame/mess.flt
+++ b/src/mame/mess.flt
@@ -1263,6 +1263,7 @@ yamaha/fb01.cpp
yamaha/tg100.cpp
yamaha/yman1x.cpp
yamaha/ymdx100.cpp
+yamaha/ymdx9.cpp
yamaha/ymdx11.cpp
yamaha/ymmu100.cpp
yamaha/ymmu5.cpp
diff --git a/src/mame/yamaha/ymdx9.cpp b/src/mame/yamaha/ymdx9.cpp
new file mode 100644
index 00000000000..b13dd3b9448
--- /dev/null
+++ b/src/mame/yamaha/ymdx9.cpp
@@ -0,0 +1,407 @@
+// license:BSD-3-Clause
+// copyright-holders:ajxs
+/*******************************************************************************
+
+ Skeleton driver for the Yamaha DX9 FM synthesizer.
+ There is currently no MAME emulation of the OPS/EGS chips, so emulating
+ the synth's tone generation functionality is not possible.
+ The cassette interface is currently not emulated.
+ While there are rumours that an updated firmware ROM exists, this driver
+ is set up to work with the only one that is widely available.
+
+*******************************************************************************/
+
+#include "emu.h"
+
+#include "bus/midi/midi.h"
+#include "cpu/m6800/m6801.h"
+#include "machine/adc0808.h"
+#include "machine/clock.h"
+#include "machine/nvram.h"
+#include "video/hd44780.h"
+
+#include "emupal.h"
+#include "screen.h"
+
+//#define VERBOSE 1
+//#define LOG_OUTPUT_FUNC osd_printf_info
+#include "logmacro.h"
+
+#include "dx9.lh"
+
+
+namespace {
+
+class yamaha_dx9_state : public driver_device
+{
+public:
+ yamaha_dx9_state(const machine_config &mconfig, device_type type, const char *tag) :
+ driver_device(mconfig, type, tag),
+ m_maincpu(*this, "maincpu"),
+ m_adc(*this, "adc"),
+ m_leds(*this, "led_%u", 0U),
+ m_key_switch_input(*this, "KEY_SWITCH_INPUT.%u", 0)
+ {
+ }
+
+ void dx9(machine_config &config);
+
+protected:
+ virtual void machine_start() override;
+
+private:
+ required_device<hd6303r_cpu_device> m_maincpu;
+ required_device<adc0808_device> m_adc;
+ output_finder<2> m_leds;
+ // This ioport array is used to communicate with the front-panel interface in the layout.
+ // They emulate the circuits wired to the 'Key/Switch Scan Driver'.
+ required_ioport_array<16> m_key_switch_input;
+
+ /**
+ * @brief Which input line on the keyboard/switch scan driver is currently selected.
+ * This driver is used to read the analog switch values from the synth's keyboard, and
+ * front-panel switches.
+ * TODO: I'm currently not sure of the actual implementation of this circuit. This
+ * implementation is based off the *very* limited description in the service manual, and
+ * the behaviour that's shown in the firmware.
+ */
+ uint8_t m_key_switch_input_select = 0;
+
+ int m_rx_data;
+
+ /** The polarity of the cassette interface's output line. */
+ bool m_cassette_interface_output_polarity = false;
+
+ /** The polarity of the cassette interface's remote line. */
+ bool m_cassette_interface_remote_polarity = false;
+
+ /**
+ * @brief LCD pixel update function.
+ * The `HD44780_PIXEL_UPDATE` macro expands the definition to include the correct
+ * parameters for the LCD update function.
+ * Refer to: `src/devices/video/hd44780.h` for the full definition format.
+ */
+ HD44780_PIXEL_UPDATE(lcd_pixel_update);
+
+ /**
+ * @brief Handles a write to the synth's OPS chip registers.
+ * This chip is currently not emulated, however this function is useful for debugging.
+ * @param offset The offset into the memory mapped region being written.
+ * @param data The data being written.
+ */
+ void ops_w(offs_t offset, uint8_t data);
+
+ /**
+ * @brief Handles a write to the synth's EGS chip registers.
+ * This chip is currently not emulated, however this function is useful for debugging.
+ * @param offset The offset into the memory mapped region being written.
+ * @param data The data being written.
+ */
+ void egs_w(offs_t offset, uint8_t data);
+
+ /**
+ * @brief Handles a read from the keyboard/switch scan driver.
+ * This multiplexing driver circuit is used to read the states of the synth's front-panel
+ * switches, and keyboard. The driver's input is wired to the CPU's IO port 1, and the
+ * output is wired into the address map.
+ * Input line 0 covers the 'main' front-panel switches.
+ * Input line 1 covers the numeric front-panel switches 1 through 8.
+ * Input line 2 covers the numeric front-panel switches 9 though 16.
+ * Input line 3 covers the numeric front-panel switches 17 though 20, as well as the
+ * modulation pedal inputs: The Portamento, and Sustain pedals are mapped to
+ * bits 6, and 7 respectively.
+ * Note: Input lines 4-15 are used to map the keyboard, which is not implemented here.
+ * When the keyboard state is read, the default value of 0 will be returned.
+ * @param offset The offset into the memory mapped region being read.
+ * @return uint8_t The value read from the bus.
+ */
+ uint8_t key_switch_scan_driver_r(offs_t offset)
+ {
+ return m_key_switch_input[m_key_switch_input_select]->read();
+ }
+
+ /**
+ * @brief Handles a write to the 7-segment LED memory mapped region.
+ * This function is responsible for setting the two 7-segment LEDs set in the
+ * device's layout file.
+ * @param offset The offset into the memory mapped region being written.
+ * @param data The data being written.
+ */
+ void led_w(offs_t offset, uint8_t data);
+
+ void palette_init(palette_device &palette);
+
+ void mem_map(address_map &map);
+
+ WRITE_LINE_MEMBER(midi_r) { m_rx_data = state; }
+
+ WRITE_LINE_MEMBER(midiclock_w) { if (state) m_maincpu->m6801_clock_serial(); }
+
+ /**
+ * @brief Handle a write to the synth's IO Port 1.
+ * IO Port 1 is mapped as follows:
+ * Bit 0: Keyboard/Switch Scan Driver Input.
+ * Bit 1: "".
+ * Bit 2: "".
+ * Bit 3: "".
+ * Bit 4: ADC EOC Input Line.
+ * Bit 5: Cassette Interface Remote Port.
+ * Bit 6: Cassette Interface Tape Output.
+ * Bit 7: Cassette Interface Tape Input.
+ * @param offset The offset into the memory mapped region being written.
+ * @param data The data being written.
+ */
+ void p1_w(offs_t offset, uint8_t data);
+
+ /**
+ * @brief Handle a read from the synth's IO Port 1.
+ * @param offset The offset into the memory mapped region being read.
+ * @return uint8_t The value read from the port.
+ */
+ uint8_t p1_r(offs_t offset);
+};
+
+
+/**
+ * yamaha_dx9_state::machine_start
+ */
+void yamaha_dx9_state::machine_start()
+{
+ m_leds.resolve();
+ m_rx_data = ASSERT_LINE;
+}
+
+
+/**
+ * yamaha_dx9_state::lcd_pixel_update
+ */
+HD44780_PIXEL_UPDATE(yamaha_dx9_state::lcd_pixel_update)
+{
+ if (x < 5 && y < 8 && line < 2 && pos < 16)
+ bitmap.pix(line * 10 + y + 1 + ((y == 7) ? 1 : 0), pos * 6 + x + 1) = state ? 1 : 2;
+}
+
+
+/**
+ * yamaha_dx9_state::palette_init
+ */
+void yamaha_dx9_state::palette_init(palette_device &palette)
+{
+ palette.set_pen_color(0, rgb_t(0x87, 0xad, 0x34)); // background
+ palette.set_pen_color(1, rgb_t(0x0, 0x0, 0x0)); // lcd pixel on
+ palette.set_pen_color(2, rgb_t(0x7d, 0x9f, 0x32)); // lcd pixel off
+}
+
+
+/**
+ * yamaha_dx9_state::mem_map
+ */
+void yamaha_dx9_state::mem_map(address_map &map)
+{
+ // Internal CPU registers.
+ map(0x0000, 0x001f).m(m_maincpu, FUNC(hd6303r_cpu_device::m6801_io));
+
+ map(0x0020, 0x0020).r(FUNC(yamaha_dx9_state::key_switch_scan_driver_r));
+
+ map(0x0022, 0x0022).r(m_adc, FUNC(m58990_device::data_r));
+ map(0x0024, 0x0024).w(m_adc, FUNC(m58990_device::address_data_start_w));
+
+ // YM21280 OPS.
+ map(0x0026, 0x0027).w(FUNC(yamaha_dx9_state::ops_w));
+ // HD44780 LCD Controller.
+ map(0x0028, 0x0029).rw("lcdc", FUNC(hd44780_device::read), FUNC(hd44780_device::write));
+ // LED.
+ map(0x002b, 0x002c).w(FUNC(yamaha_dx9_state::led_w));
+
+ // Internal RAM.
+ map(0x0040, 0x00ff).ram();
+
+ // External RAM.
+ // 2 * 2kb RAM1 IC19 M5M118P.
+ map(0x0800, 0x0fff).ram().share("ram1");
+ map(0x1000, 0x1800).ram().share("ram2");
+
+ // YM21290 EGS
+ map(0x1800, 0x18f3).w(FUNC(yamaha_dx9_state::egs_w));
+
+ // ROM.
+ map(0xc000, 0xffff).rom().region("program", 0);
+}
+
+
+/**
+ * yamaha_dx9_state::dx9
+ */
+void yamaha_dx9_state::dx9(machine_config &config)
+{
+ // Initialise the HD63B03RP CPU.
+ // This oscillator frequency comes from the service manual.
+ HD6303R(config, m_maincpu, 9.4265_MHz_XTAL / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &yamaha_dx9_state::mem_map);
+
+ // Unlike the DX7 only IO port 1 is used.
+ // The direction flags of other ports are set, however they are never read, or written.
+ m_maincpu->in_p1_cb().set(FUNC(yamaha_dx9_state::p1_r));
+ m_maincpu->out_p1_cb().set(FUNC(yamaha_dx9_state::p1_w));
+
+ NVRAM(config, "ram1", nvram_device::DEFAULT_ALL_0);
+ NVRAM(config, "ram2", nvram_device::DEFAULT_ALL_0);
+
+ // Configure the ADC. The clock speed here is a guess.
+ M58990(config, m_adc, 500'000);
+
+ // ADC source 4 is the battery voltage. Set this input to always read 0x80.
+ // If the read value is below 0x6f, the firmware considers this a low battery voltage.
+ m_adc->in_callback<4>().set_constant(0x80);
+
+ // Configure MIDI.
+ auto &midiclock(CLOCK(config, "midiclock", 500_kHz_XTAL));
+ midiclock.signal_handler().set(FUNC(yamaha_dx9_state::midiclock_w));
+
+ MIDI_PORT(config, "mdin", midiin_slot, "midiin").rxd_handler().set(FUNC(yamaha_dx9_state::midi_r));
+
+ auto &mdout(MIDI_PORT(config, "mdout", midiout_slot, "midiout"));
+ m_maincpu->out_ser_tx_cb().set(mdout, FUNC(midi_port_device::write_txd));
+
+ // Configure the LCD screen.
+ screen_device &lcd_screen(SCREEN(config, "lcd_screen", SCREEN_TYPE_LCD));
+ lcd_screen.set_refresh_hz(60);
+ lcd_screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ lcd_screen.set_screen_update("lcdc", FUNC(hd44780_device::screen_update));
+ lcd_screen.set_size(6*16+1, 10*2+1);
+ lcd_screen.set_visarea_full();
+ lcd_screen.set_palette("palette");
+
+ PALETTE(config, "palette", FUNC(yamaha_dx9_state::palette_init), 3);
+
+ hd44780_device &lcdc(HD44780(config, "lcdc", 0));
+ lcdc.set_lcd_size(2, 16);
+ lcdc.set_pixel_update_cb(FUNC(yamaha_dx9_state::lcd_pixel_update));
+
+ config.set_default_layout(layout_dx9);
+}
+
+
+/**
+ * yamaha_dx9_state::ops_w
+ */
+void yamaha_dx9_state::ops_w(offs_t offset, uint8_t data)
+{
+ LOG("OPS: %02X=%02X\n", offset, data);
+}
+
+
+/**
+ * yamaha_dx9_state::egs_w
+ */
+void yamaha_dx9_state::egs_w(offs_t offset, uint8_t data)
+{
+ LOG("EGS: %02X=%02X\n", offset, data);
+}
+
+
+/**
+ * yamaha_dx9_state::led_w
+ */
+void yamaha_dx9_state::led_w(offs_t offset, uint8_t data)
+{
+ // Since the memory mapped region that calls this function is only two byts in
+ // size, the led number is the least-significant bit of the offset.
+ // The DX9's LEDs are wired so that a high input line disables the segment, so
+ // get the one's complement of the data.
+ m_leds[offset & 1] = (~data) & 0xff;
+}
+
+
+/**
+ * yamaha_dx9_state::p1_r
+ */
+uint8_t yamaha_dx9_state::p1_r(offs_t offset)
+{
+ // The ADC EOC line is wired to bit 4, as well as the Cassette Interface input, which
+ // is wired to bit 7. This is currently not fully implemented.
+ return m_adc->eoc_r() << 4;
+}
+
+
+/**
+ * yamaha_dx9_state::p1_w
+ */
+void yamaha_dx9_state::p1_w(offs_t offset, uint8_t data)
+{
+ // The low-nibble is written by the firmware to select the key/switch driver input line.
+ m_key_switch_input_select = data & 0xf;
+
+ // The cassette interface remote port polarity is set by bit 5.
+ m_cassette_interface_remote_polarity = BIT(data, 5);
+
+ // The cassette interface output polarity is set by bit 6.
+ m_cassette_interface_output_polarity = BIT(data, 6);
+}
+
+
+static INPUT_PORTS_START(dx9)
+ PORT_START("KEY_SWITCH_INPUT.0")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Yes/Up")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("No/Down")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Store")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Function")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Edit")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Memory")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN)
+
+ PORT_START("KEY_SWITCH_INPUT.1")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Button 1")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Button 2")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Button 3")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Button 4")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Button 5")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Button 6")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Button 7")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Button 8")
+
+ PORT_START("KEY_SWITCH_INPUT.2")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Button 9")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Button 10")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Button 11")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Button 12")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Button 13")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Button 14")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Button 15")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Button 16")
+
+ PORT_START("KEY_SWITCH_INPUT.3")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Button 17")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Button 18")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Button 19")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Button 20")
+
+ // These IO ports belong to the keyboard scan circuit.
+ // Each of these 12 ports represents an individual key within an octave.
+ // The keyboard is wired so that when each key's line is selected, reading the keyboard
+ // scan driver output will return a power of two indicating the octave the pressed key
+ // is in, from 0 to 7.
+ PORT_START("KEY_SWITCH_INPUT.4")
+ PORT_START("KEY_SWITCH_INPUT.5")
+ PORT_START("KEY_SWITCH_INPUT.6")
+ PORT_START("KEY_SWITCH_INPUT.7")
+ PORT_START("KEY_SWITCH_INPUT.8")
+ PORT_START("KEY_SWITCH_INPUT.9")
+ PORT_START("KEY_SWITCH_INPUT.10")
+ PORT_START("KEY_SWITCH_INPUT.11")
+ PORT_START("KEY_SWITCH_INPUT.12")
+ PORT_START("KEY_SWITCH_INPUT.13")
+ PORT_START("KEY_SWITCH_INPUT.14")
+ PORT_START("KEY_SWITCH_INPUT.15")
+INPUT_PORTS_END
+
+
+ROM_START(dx9)
+ ROM_REGION(0x4000, "program", 0)
+ ROM_LOAD("dx9.bin", 0x0000, 0x4000, CRC(c45e1832) SHA1(a92d7add3b89537ad06c719da0005c450d178d81))
+ROM_END
+
+} // anonymous namespace
+
+
+SYST(1983, dx9, 0, 0, dx9, dx9, yamaha_dx9_state, empty_init, "Yamaha", "DX9 Digital Programmable Algorithm Synthesizer", MACHINE_IS_SKELETON | MACHINE_CLICKABLE_ARTWORK)