summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author arbee <rb6502@users.noreply.github.com>2025-11-25 21:56:22 -0500
committer arbee <rb6502@users.noreply.github.com>2025-11-25 21:56:22 -0500
commitad43ead3647d6ba1ec80f6473a42560d6f1243ef (patch)
tree40f43b70069540450442491900fe79768276422a
parent3af9439e613b46eb31af7a3aa0696f927c0dec7f (diff)
New systems marked not working
------------------------------ Akai MPC2000 [R. Belmont] akai/mpc3000.cpp: Fixed variation slider to be read by the subcpu. [R. Belmont] akai/s3000.cpp: Added layout for s2000 [Guru]
-rw-r--r--src/mame/akai/mpc2000.cpp736
-rw-r--r--src/mame/akai/mpc3000.cpp3
-rw-r--r--src/mame/akai/s3000.cpp15
-rw-r--r--src/mame/layout/s2000.lay632
-rw-r--r--src/mame/mame.lst3
5 files changed, 1383 insertions, 6 deletions
diff --git a/src/mame/akai/mpc2000.cpp b/src/mame/akai/mpc2000.cpp
new file mode 100644
index 00000000000..d73ee12f250
--- /dev/null
+++ b/src/mame/akai/mpc2000.cpp
@@ -0,0 +1,736 @@
+// license:BSD-3-Clause
+// copyright-holders:R. Belmont
+/***************************************************************************
+
+ mpc2000.cpp - Akai MPC2000/MPC2000XL music workstation
+ Driver by R. Belmont
+
+ This is a cost-reduced MPC3000, with fewer MIDI ports, IDE alongside
+ SCSI, and a few other omissions. The actual sound generation is identical
+ to the 3000 however.
+
+ Hardware:
+ CPU: NEC V53 (32 MHz)
+ Floppy: uPD72068
+ Bus master IDE
+ SCSI: MB89352 (optional on 2000, standard on 2000XL)
+ LCD: LC7981
+ UART: MB89371A
+ Panel controller CPU: NEC uPD78C10AGQ @ 12 MHz
+ Sound DSP: L7A1045-L6028
+
+***************************************************************************/
+
+#include "emu.h"
+
+#include "bus/ata/ataintf.h"
+#include "bus/nscsi/devices.h"
+#include "bus/midi/midi.h"
+#include "cpu/nec/v5x.h"
+#include "cpu/upd7810/upd7810.h"
+#include "formats/dfi_dsk.h"
+#include "formats/hxchfe_dsk.h"
+#include "formats/hxcmfm_dsk.h"
+#include "formats/imd_dsk.h"
+#include "formats/mfi_dsk.h"
+#include "formats/td0_dsk.h"
+#include "formats/dsk_dsk.h"
+#include "formats/pc_dsk.h"
+#include "formats/ipf_dsk.h"
+#include "imagedev/floppy.h"
+#include "machine/74259.h"
+#include "machine/i8255.h"
+#include "machine/input_merger.h"
+#include "machine/mb87030.h"
+#include "machine/mb89371.h"
+#include "machine/pit8253.h"
+#include "machine/upd765.h"
+#include "sound/l7a1045_l6028_dsp_a.h"
+#include "video/hd61830.h"
+
+#include "emupal.h"
+#include "screen.h"
+#include "softlist_dev.h"
+#include "speaker.h"
+
+static constexpr uint8_t BIT4 = (1 << 4);
+static constexpr uint8_t BIT5 = (1 << 5);
+
+class mpc2000_state : public driver_device
+{
+public:
+ mpc2000_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag)
+ , m_maincpu(*this, "maincpu")
+ , m_subcpu(*this, "subcpu")
+ , m_dsp(*this, "dsp")
+ , m_screen(*this, "screen")
+ , m_fdc(*this, "fdc")
+ , m_floppy(*this, "fdc:0")
+ , m_ata(*this, "ata")
+ , m_sio(*this, "sio")
+ , m_keys(*this, "Y%u", 0)
+ , m_dataentry(*this, "DATAENTRY")
+ , m_key_scan_row(0)
+ , m_drum_scan_row(0)
+ , m_variation_slider(0)
+ , m_last_dial(0)
+ , m_count_dial(0)
+ , m_quadrature_phase(0)
+ , m_fdc_ata(0)
+ , m_fdc_irq(0)
+ , m_fdc_drq(0)
+ , m_ata_irq(0)
+ , m_ata_drq(0)
+ , m_lcdx{ 0, 0 }
+ , m_lcdy{ 0, 0 }
+ , m_lcdcmd{ 0, 0 }
+ {
+ std::fill_n(&m_vram[0], std::size(m_vram), 0);
+ }
+
+ void mpc2000(machine_config &config);
+
+ void init_mpc2000();
+
+ DECLARE_INPUT_CHANGED_MEMBER(variation_changed);
+
+private:
+ required_device<v53a_device> m_maincpu;
+ required_device<upd7810_device> m_subcpu;
+ required_device<l7a1045_sound_device> m_dsp;
+ required_device<screen_device> m_screen;
+ required_device<upd72069_device> m_fdc;
+ required_device<floppy_connector> m_floppy;
+ required_device<ata_interface_device> m_ata;
+ required_device<mb89371_device> m_sio;
+ required_ioport_array<8> m_keys;
+ required_ioport m_dataentry;
+
+ static void floppies(device_slot_interface &device);
+
+ virtual void machine_start() override ATTR_COLD;
+ virtual void machine_reset() override ATTR_COLD;
+
+ void mpc2000_map(address_map &map) ATTR_COLD;
+ void mpc2000_io_map(address_map &map) ATTR_COLD;
+ void mpc2000_sub_map(address_map &map) ATTR_COLD;
+ void dsp_map(address_map &map) ATTR_COLD;
+
+ uint8_t dma_memr_cb(offs_t offset);
+ void dma_memw_cb(offs_t offset, uint8_t data);
+ uint16_t dma_mem16r_cb(offs_t offset);
+ void dma_mem16w_cb(offs_t offset, uint16_t data);
+ void mpc2000_palette(palette_device &palette) const;
+ uint8_t lcd_csr();
+ template <int cs> void lcd_csw(offs_t offset, uint8_t data);
+ u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+
+ uint8_t subcpu_pa_r();
+ uint8_t subcpu_pb_r();
+ uint8_t subcpu_pc_r();
+ void subcpu_pb_w(uint8_t data);
+ void subcpu_pc_w(uint8_t data);
+ uint8_t an_pads_r();
+ uint8_t an4_r();
+
+ void fdc_scsi_w(int state);
+ void fdc_irq_w(int state);
+ void fdc_drq_w(int state);
+ void ata_irq_w(int state);
+ void ata_drq_w(int state);
+ void recalc_fdc_ata();
+
+ uint8_t ts_r();
+
+ TIMER_DEVICE_CALLBACK_MEMBER(dial_timer_tick);
+
+ uint8_t m_key_scan_row, m_drum_scan_row, m_variation_slider;
+ int m_last_dial, m_count_dial, m_quadrature_phase;
+ int m_fdc_ata, m_fdc_irq, m_fdc_drq, m_ata_irq, m_ata_drq;
+
+ uint16_t m_lcdx[2];
+ uint8_t m_lcdy[2], m_lcdcmd[2];
+ uint16_t m_vram[256*64];
+};
+
+void mpc2000_state::machine_start()
+{
+ save_item(NAME(m_key_scan_row));
+ save_item(NAME(m_drum_scan_row));
+}
+
+void mpc2000_state::machine_reset()
+{
+ // all CTS lines are connected to GND
+ m_sio->write_cts<0>(CLEAR_LINE);
+ m_sio->write_cts<1>(CLEAR_LINE);
+ m_fdc->ready_w(CLEAR_LINE);
+}
+
+void mpc2000_state::mpc2000_map(address_map &map)
+{
+ map(0x000000, 0x07ffff).ram(); // RAM is 2x HM5118160 (1M x 16 bit) for a total of 4MiB
+ map(0x080000, 0x0fffff).rom().region("maincpu", 0);
+ map(0x100000, 0x3fffff).ram();
+}
+
+/*
+00 = SPCSN
+20 = FDCSN
+40 = N/A
+60 = LCD1N
+80 = NSCSN
+A0 = FXCSN
+C0 = WADCSN (D2 to start sampling, 1A to stop)
+E0 = IDECS1N
+100 = LCD2N
+120 = N/A
+140 = LOLEDN
+160 = HILEDN
+180 = SIO1N
+1A0 = SIO2N
+1C0 = LTCCSN
+1E0 = IDECS0N
+*/
+void mpc2000_state::mpc2000_io_map(address_map &map)
+{
+ map(0x0000, 0x001f).m("scsi:7:spc", FUNC(mb89352_device::map)).umask16(0x00ff);
+ map(0x0020, 0x0023).m(m_fdc, FUNC(upd72069_device::map)).umask16(0x00ff);
+ map(0x0060, 0x0063).rw(FUNC(mpc2000_state::lcd_csr), FUNC(mpc2000_state::lcd_csw<0>)).umask16(0x00ff);
+ map(0x0080, 0x008f).m(m_dsp, FUNC(l7a1045_sound_device::map));
+ map(0x00a0, 0x00a3).nopw(); // silence effects writes
+ map(0x00e0, 0x00ff).rw(m_ata, FUNC(ata_interface_device::cs1_r), FUNC(ata_interface_device::cs1_w));
+
+ map(0x0100, 0x0103).rw(FUNC(mpc2000_state::lcd_csr), FUNC(mpc2000_state::lcd_csw<1>)).umask16(0x00ff);
+ map(0x0140, 0x015f).w("loledlatch", FUNC(hc259_device::write_a3)).umask16(0x00ff);
+ map(0x0160, 0x017f).w("hiledlatch", FUNC(hc259_device::write_a3)).umask16(0x00ff);
+ map(0x0180, 0x0187).m(m_sio, FUNC(mb89371_device::map<0>)).umask16(0x00ff);
+ map(0x01a0, 0x01a7).m(m_sio, FUNC(mb89371_device::map<1>)).umask16(0x00ff);
+ map(0x01e0, 0x01ff).rw(m_ata, FUNC(ata_interface_device::cs0_r), FUNC(ata_interface_device::cs0_w));
+}
+
+uint16_t mpc2000_state::dma_mem16r_cb(offs_t offset)
+{
+ return m_maincpu->space(AS_PROGRAM).read_word(offset << 1);
+}
+
+void mpc2000_state::dma_mem16w_cb(offs_t offset, uint16_t data)
+{
+ m_maincpu->space(AS_PROGRAM).write_word(offset << 1, data);
+}
+
+uint8_t mpc2000_state::dma_memr_cb(offs_t offset)
+{
+ return m_maincpu->space(AS_PROGRAM).read_byte(offset);
+}
+
+void mpc2000_state::dma_memw_cb(offs_t offset, uint8_t data)
+{
+ m_maincpu->space(AS_PROGRAM).write_byte(offset, data);
+}
+
+void mpc2000_state::mpc2000_sub_map(address_map &map)
+{
+ map(0x0000, 0x7fff).rom().region("subcpu", 0);
+}
+
+void mpc2000_state::dsp_map(address_map &map)
+{
+ map(0x0000'0000, 0x01ff'ffff).ram();
+}
+
+void mpc2000_state::mpc2000_palette(palette_device &palette) const
+{
+ palette.set_pen_color(0, rgb_t(64, 140, 250));
+ palette.set_pen_color(1, rgb_t(230, 240, 250));
+}
+
+u32 mpc2000_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+{
+ for (int y = 0; y < 60; y++)
+ {
+ uint16_t *scanline = &bitmap.pix(y);
+ const int yoffs = 256*y;
+
+ for (int x = 0; x < 248; x++)
+ {
+ *scanline++ = m_vram[yoffs + x];
+ }
+ }
+
+ return 0;
+}
+
+uint8_t mpc2000_state::lcd_csr()
+{
+ return 0;
+}
+
+template <int cs> void mpc2000_state::lcd_csw(offs_t offset, uint8_t data)
+{
+ if (!offset)
+ {
+ m_lcdcmd[cs] = data;
+ }
+ else
+ {
+ switch (m_lcdcmd[cs])
+ {
+ case 0x20:
+ if ((m_lcdx[0] < 256) && (m_lcdy[cs] < 60))
+ {
+ for (int i = 0; i < 8; i++)
+ {
+ m_vram[(m_lcdy[cs] * 256) + m_lcdx[cs] + i] = BIT(data, 7-i);
+ }
+ m_lcdy[cs]++;
+ }
+ break;
+
+ case 0x21:
+ m_lcdx[cs] = (data << 3) + (cs * 160);
+ break;
+
+ case 0x22:
+ m_lcdy[cs] = 0;
+ break;
+ }
+ }
+}
+
+template void mpc2000_state::lcd_csw<0>(offs_t offset, uint8_t data);
+template void mpc2000_state::lcd_csw<1>(offs_t offset, uint8_t data);
+
+
+INPUT_CHANGED_MEMBER(mpc2000_state::variation_changed)
+{
+ if (!oldval && newval)
+ {
+ m_variation_slider = newval;
+ }
+}
+
+TIMER_DEVICE_CALLBACK_MEMBER(mpc2000_state::dial_timer_tick)
+{
+ const int new_dial = m_dataentry->read();
+
+ if (new_dial != m_last_dial)
+ {
+ int diff = new_dial - m_last_dial;
+ if (diff > 0x80)
+ {
+ diff = 0x100 - diff;
+ }
+ if (diff < -0x80)
+ {
+ diff = -0x100 - diff;
+ }
+
+ m_count_dial += diff;
+ m_last_dial = new_dial;
+ }
+}
+
+uint8_t mpc2000_state::subcpu_pa_r()
+{
+ return m_keys[7 - m_key_scan_row]->read();
+}
+
+uint8_t mpc2000_state::subcpu_pb_r()
+{
+ return 0;
+}
+
+uint8_t mpc2000_state::subcpu_pc_r()
+{
+ uint8_t rv = 0;
+
+ if (m_count_dial)
+ {
+ const bool negative = (m_count_dial < 0);
+
+ switch (m_quadrature_phase >> 1)
+ {
+ case 0:
+ rv = negative ? BIT5 : BIT4;
+ break;
+
+ case 1:
+ rv = BIT4 | BIT5;
+ break;
+
+ case 2:
+ rv = negative ? BIT4 : BIT5;
+ break;
+
+ case 3:
+ rv = 0;
+ break;
+ }
+ m_quadrature_phase++;
+ m_quadrature_phase &= 7;
+
+ // generate a complete 4-part pulse train for each single change in the position
+ if (m_quadrature_phase == 0)
+ {
+ if (m_count_dial < 0)
+ {
+ m_count_dial++;
+ }
+ else
+ {
+ m_count_dial--;
+ }
+ }
+ }
+
+ return rv;
+}
+
+// drum pad row select, active low
+void mpc2000_state::subcpu_pb_w(uint8_t data)
+{
+ // convert to 1/2/4/8
+ m_drum_scan_row = (data & 0xf) ^ 0xf;
+ if (m_drum_scan_row != 0)
+ {
+ // get a row number 0-3
+ m_drum_scan_row = count_leading_zeros_32(m_drum_scan_row) - 28;
+ }
+}
+
+// main buttons row select (PC1-PC3)
+void mpc2000_state::subcpu_pc_w(uint8_t data)
+{
+ m_key_scan_row = ((data ^ 0xff) >> 1) & 7;
+}
+
+uint8_t mpc2000_state::an_pads_r()
+{
+ return 0xff;
+}
+
+uint8_t mpc2000_state::an4_r()
+{
+ return m_variation_slider;
+}
+
+void mpc2000_state::fdc_scsi_w(int state)
+{
+ m_fdc_ata = state;
+}
+
+void mpc2000_state::fdc_irq_w(int state)
+{
+ m_fdc_irq = state;
+ recalc_fdc_ata();
+}
+
+void mpc2000_state::fdc_drq_w(int state)
+{
+ m_fdc_drq = state;
+ recalc_fdc_ata();
+}
+
+void mpc2000_state::ata_irq_w(int state)
+{
+ m_ata_irq = state;
+ recalc_fdc_ata();
+}
+
+void mpc2000_state::ata_drq_w(int state)
+{
+ m_ata_drq = state;
+ recalc_fdc_ata();
+}
+
+void mpc2000_state::recalc_fdc_ata()
+{
+ if (m_fdc_ata)
+ {
+ m_maincpu->set_input_line(INPUT_LINE_IRQ3, m_fdc_irq);
+ m_maincpu->dreq_w<1>(m_fdc_drq);
+ }
+ else
+ {
+ m_maincpu->set_input_line(INPUT_LINE_IRQ3, m_ata_irq);
+ m_maincpu->dreq_w<1>(m_ata_drq);
+ }
+}
+
+uint8_t mpc2000_state::ts_r()
+{
+ const auto imagedev = m_floppy->get_device();
+ return imagedev->dskchg_r();
+}
+
+void mpc2000_state::floppies(device_slot_interface &device)
+{
+ device.option_add("35hd", FLOPPY_35_HD);
+}
+
+static void add_formats(format_registration &fr)
+{
+ fr.add(FLOPPY_DFI_FORMAT);
+ fr.add(FLOPPY_MFM_FORMAT);
+ fr.add(FLOPPY_TD0_FORMAT);
+ fr.add(FLOPPY_IMD_FORMAT);
+ fr.add(FLOPPY_DSK_FORMAT);
+ fr.add(FLOPPY_PC_FORMAT);
+ fr.add(FLOPPY_IPF_FORMAT);
+ fr.add(FLOPPY_HFE_FORMAT);
+}
+
+void mpc2000_state::mpc2000(machine_config &config)
+{
+ V53A(config, m_maincpu, 32_MHz_XTAL);
+ m_maincpu->set_addrmap(AS_PROGRAM, &mpc2000_state::mpc2000_map);
+ m_maincpu->set_addrmap(AS_IO, &mpc2000_state::mpc2000_io_map);
+ m_maincpu->out_hreq_cb().set(m_maincpu, FUNC(v53a_device::hack_w));
+ m_maincpu->in_memr_cb().set(FUNC(mpc2000_state::dma_memr_cb));
+ m_maincpu->out_memw_cb().set(FUNC(mpc2000_state::dma_memw_cb));
+ m_maincpu->in_mem16r_cb().set(FUNC(mpc2000_state::dma_mem16r_cb));
+ m_maincpu->out_mem16w_cb().set(FUNC(mpc2000_state::dma_mem16w_cb));
+ m_maincpu->out_eop_cb().set("tc", FUNC(input_merger_device::in_w<0>)).invert();
+ m_maincpu->in_ior_cb<0>().set("scsi:7:spc", FUNC(mb89352_device::dma_r));
+ m_maincpu->out_iow_cb<0>().set("scsi:7:spc", FUNC(mb89352_device::dma_w));
+ m_maincpu->in_ior_cb<1>().set(m_fdc, FUNC(upd72069_device::dma_r));
+ m_maincpu->out_iow_cb<1>().set(m_fdc, FUNC(upd72069_device::dma_w));
+ m_maincpu->in_io16r_cb<1>().set(m_ata, FUNC(ata_interface_device::read_dma));
+ m_maincpu->out_io16w_cb<1>().set(m_ata, FUNC(ata_interface_device::write_dma));
+ m_maincpu->in_io16r_cb<3>().set(m_dsp, FUNC(l7a1045_sound_device::dma_r16_cb));
+ m_maincpu->out_io16w_cb<3>().set(m_dsp, FUNC(l7a1045_sound_device::dma_w16_cb));
+ m_maincpu->set_tclk(4'000'000); // FIXME: DAWCK generated by DSP (also tied to V53 DSR input)
+ m_maincpu->tout_handler<0>().set_inputline(m_maincpu, INPUT_LINE_IRQ1);
+ m_maincpu->tout_handler<1>().set_inputline(m_maincpu, INPUT_LINE_IRQ5);
+ m_maincpu->rxrdy_handler_cb().set("intp4", FUNC(input_merger_device::in_w<0>));
+
+ constexpr XTAL V53_CLKOUT = 32_MHz_XTAL / 2;
+ constexpr XTAL V53_PCLKOUT = 32_MHz_XTAL / 4;
+
+ // HC02 gates
+ INPUT_MERGER_ALL_HIGH(config, "tc").output_handler().set(m_fdc, FUNC(upd72069_device::tc_line_w));
+
+ hc259_device &loledlatch(HC259(config, "loledlatch"));
+ loledlatch.q_out_cb<0>().set_output("led0").invert(); // After
+ loledlatch.q_out_cb<1>().set_output("led1").invert(); // Record
+ loledlatch.q_out_cb<2>().set_output("led2").invert(); // Undo Sq
+ loledlatch.q_out_cb<3>().set_output("led3").invert(); // Play
+ loledlatch.q_out_cb<4>().set_output("led4").invert(); // Over Dub
+ loledlatch.q_out_cb<5>().set_output("led5").invert(); // not used
+ loledlatch.q_out_cb<6>().set_output("led6").invert(); // not used
+ loledlatch.q_out_cb<7>().set_output("led7").invert(); // not used
+
+ hc259_device &hiledlatch(HC259(config, "hiledlatch"));
+ hiledlatch.q_out_cb<0>().set_output("led8").invert(); // Full Level
+ hiledlatch.q_out_cb<1>().set_output("led9").invert(); // Bank D
+ hiledlatch.q_out_cb<2>().set_output("led10").invert(); // Bank B
+ hiledlatch.q_out_cb<3>().set_output("led11").invert(); // Track Mute
+ hiledlatch.q_out_cb<4>().set_output("led12").invert(); // Next Seq
+ hiledlatch.q_out_cb<5>().set_output("led13").invert(); // Bank A
+ hiledlatch.q_out_cb<6>().set_output("led14").invert(); // Bank C
+ hiledlatch.q_out_cb<7>().set_output("led15").invert(); // 16 Levels
+
+ UPD78C10(config, m_subcpu, 12_MHz_XTAL);
+ m_subcpu->set_addrmap(AS_PROGRAM, &mpc2000_state::mpc2000_sub_map);
+ m_subcpu->txd_func().set(m_maincpu, FUNC(v53a_device::rxd_w));
+ m_subcpu->pa_in_cb().set(FUNC(mpc2000_state::subcpu_pa_r));
+ m_subcpu->pb_in_cb().set(FUNC(mpc2000_state::subcpu_pb_r));
+ m_subcpu->pc_in_cb().set(FUNC(mpc2000_state::subcpu_pc_r));
+ m_subcpu->pb_out_cb().set(FUNC(mpc2000_state::subcpu_pb_w));
+ m_subcpu->pc_out_cb().set(FUNC(mpc2000_state::subcpu_pc_w));
+ m_subcpu->an0_func().set(FUNC(mpc2000_state::an_pads_r));
+ m_subcpu->an1_func().set(FUNC(mpc2000_state::an_pads_r));
+ m_subcpu->an2_func().set(FUNC(mpc2000_state::an_pads_r));
+ m_subcpu->an3_func().set(FUNC(mpc2000_state::an_pads_r));
+ m_subcpu->an4_func().set(FUNC(mpc2000_state::an4_r));
+
+ SCREEN(config, m_screen, SCREEN_TYPE_LCD);
+ m_screen->set_refresh_hz(80);
+ m_screen->set_screen_update(FUNC(mpc2000_state::screen_update));
+ m_screen->set_size(248, 60);
+ m_screen->set_visarea(0, 248-1, 0, 60-1);
+ m_screen->set_palette("palette");
+
+ PALETTE(config, "palette", FUNC(mpc2000_state::mpc2000_palette), 2);
+
+ UPD72069(config, m_fdc, V53_CLKOUT); // actually UPD72068, which is software-identical
+ m_fdc->set_ready_line_connected(false); // uPD READY pin is grounded on schematic
+ m_fdc->set_ts_line_connected(false); // actually connected to DSKCHG (!)
+ m_fdc->intrq_wr_callback().set(FUNC(mpc2000_state::fdc_irq_w));
+ m_fdc->drq_wr_callback().set(FUNC(mpc2000_state::fdc_drq_w));
+ m_fdc->ts_rd_callback().set(FUNC(mpc2000_state::ts_r));
+
+ FLOPPY_CONNECTOR(config, m_floppy, mpc2000_state::floppies, "35hd", add_formats).enable_sound(false);
+
+ ATA_INTERFACE(config, m_ata).options(ata_devices, "hdd", nullptr, false);
+ m_ata->irq_handler().set(FUNC(mpc2000_state::ata_irq_w));
+ m_ata->dmarq_handler().set(FUNC(mpc2000_state::ata_drq_w));
+
+ INPUT_MERGER_ANY_HIGH(config, "intp4").output_handler().set_inputline(m_maincpu, INPUT_LINE_IRQ4);
+
+ // IC100: MIDI A & B
+ MB89371(config, m_sio, V53_PCLKOUT);
+ m_sio->rxrdy_handler<0>().set("intp4", FUNC(input_merger_device::in_w<1>));
+ m_sio->rxrdy_handler<1>().set("intp4", FUNC(input_merger_device::in_w<2>));
+ m_sio->txrdy_handler<0>().set_inputline(m_maincpu, INPUT_LINE_IRQ7);
+ m_sio->txrdy_handler<1>().set_inputline(m_maincpu, INPUT_LINE_IRQ6);
+ m_sio->txd_handler<0>().set("mdout1", FUNC(midi_port_device::write_txd));
+ m_sio->txd_handler<1>().set("mdout2", FUNC(midi_port_device::write_txd));
+ m_sio->dtr_handler<0>().set(FUNC(mpc2000_state::fdc_scsi_w));
+
+ MIDI_PORT(config, "mdin1", midiin_slot, "midiin").rxd_handler().set(m_sio, FUNC(mb89371_device::write_rxd<0>));
+ MIDI_PORT(config, "mdin2", midiin_slot, "midiin").rxd_handler().set(m_sio, FUNC(mb89371_device::write_rxd<1>));
+ MIDI_PORT(config, "mdout1", midiout_slot, "midiout");
+ MIDI_PORT(config, "mdout2", midiout_slot, "midiout");
+
+ NSCSI_BUS(config, "scsi");
+ NSCSI_CONNECTOR(config, "scsi:0", default_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:1", default_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:2", default_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:3", default_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:4", default_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:5", default_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:6", default_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:7").option_set("spc", MB89352).machine_config(
+ [this](device_t *device)
+ {
+ mb89352_device &spc = downcast<mb89352_device &>(*device);
+
+ spc.set_clock(32_MHz_XTAL / 4); // PCLKOUT
+ spc.out_irq_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ2);
+ spc.out_dreq_callback().set(m_maincpu, FUNC(v53a_device::dreq_w<0>));
+ });
+
+ TIMER(config, "dialtimer").configure_periodic(FUNC(mpc2000_state::dial_timer_tick), attotime::from_hz(60.0));
+
+ SPEAKER(config, "speaker", 2).front();
+ SPEAKER(config, "outputs", 8).unknown();
+
+ L7A1045(config, m_dsp, 33.8688_MHz_XTAL); // clock verified by schematic
+ m_dsp->set_addrmap(AS_DATA, &mpc2000_state::dsp_map);
+ m_dsp->drq_handler_cb().set(m_maincpu, FUNC(v53a_device::dreq_w<3>));
+ m_dsp->add_route(l7a1045_sound_device::L6028_LEFT, "speaker", 1.0, 0);
+ m_dsp->add_route(l7a1045_sound_device::L6028_RIGHT, "speaker", 1.0, 1);
+
+ m_dsp->add_route(l7a1045_sound_device::L6028_OUT0, "outputs", 1.0, 0);
+ m_dsp->add_route(l7a1045_sound_device::L6028_OUT1, "outputs", 1.0, 1);
+ m_dsp->add_route(l7a1045_sound_device::L6028_OUT2, "outputs", 1.0, 2);
+ m_dsp->add_route(l7a1045_sound_device::L6028_OUT3, "outputs", 1.0, 3);
+ m_dsp->add_route(l7a1045_sound_device::L6028_OUT4, "outputs", 1.0, 4);
+ m_dsp->add_route(l7a1045_sound_device::L6028_OUT5, "outputs", 1.0, 5);
+ m_dsp->add_route(l7a1045_sound_device::L6028_OUT6, "outputs", 1.0, 6);
+ m_dsp->add_route(l7a1045_sound_device::L6028_OUT7, "outputs", 1.0, 7);
+
+ // back compatible with MPC3000 and MPC60 disks
+ SOFTWARE_LIST(config, "flop_mpc3000").set_original("mpc3000_flop");
+}
+
+static INPUT_PORTS_START( mpc2000 )
+ PORT_START("Y0")
+ PORT_BIT(0x81, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Soft Key 1") PORT_CODE(KEYCODE_F1)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("9 / MIDI/Sync") PORT_CODE(KEYCODE_9)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("8 / Other") PORT_CODE(KEYCODE_8)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Shift") PORT_CODE(KEYCODE_LSHIFT)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Step <") PORT_CODE(KEYCODE_A)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Play") PORT_CODE(KEYCODE_V)
+
+ PORT_START("Y1")
+ PORT_BIT(0x81, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Soft Key 2") PORT_CODE(KEYCODE_F2)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_ENTER)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("2 / Misc") PORT_CODE(KEYCODE_2)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("0") PORT_CODE(KEYCODE_0)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Step >") PORT_CODE(KEYCODE_S)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("<< Bar") PORT_CODE(KEYCODE_F)
+
+ PORT_START("Y2")
+ PORT_BIT(0x81, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Soft Key 3") PORT_CODE(KEYCODE_F3)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("3 / Load") PORT_CODE(KEYCODE_3)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("1 / Song") PORT_CODE(KEYCODE_1)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("After") PORT_CODE(KEYCODE_U)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Go To") PORT_CODE(KEYCODE_D)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_DOWN) PORT_NAME("Down Arrow")
+
+ PORT_START("Y3")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Soft Key 4") PORT_CODE(KEYCODE_F4)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("6 / Program") PORT_CODE(KEYCODE_6)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("5 / Trim") PORT_CODE(KEYCODE_5)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Tap Tempo") PORT_CODE(KEYCODE_SPACE)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Record") PORT_CODE(KEYCODE_Z)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_RIGHT) PORT_NAME("Right Arrow")
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Bar >>") PORT_CODE(KEYCODE_G)
+
+ PORT_START("Y4")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Soft Key 5") PORT_CODE(KEYCODE_F5)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Main Screen") PORT_CODE(KEYCODE_Q)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("4 / Sample") PORT_CODE(KEYCODE_4)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Undo") PORT_CODE(KEYCODE_A)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Over Dub") PORT_CODE(KEYCODE_X)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LEFT) PORT_NAME("Left Arrow")
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Play Start") PORT_CODE(KEYCODE_B)
+
+ PORT_START("Y5")
+ PORT_BIT(0x81, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Soft Key 6") PORT_CODE(KEYCODE_F6)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Window") PORT_CODE(KEYCODE_W)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("7 / Mixer") PORT_CODE(KEYCODE_7)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Erase") PORT_CODE(KEYCODE_S)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Stop") PORT_CODE(KEYCODE_C)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_UP) PORT_NAME("Up Arrow")
+
+ PORT_START("Y6")
+ PORT_BIT(0xe1, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Next Seq") PORT_CODE(KEYCODE_F10)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Track Mute") PORT_CODE(KEYCODE_F11)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Bank A") PORT_CODE(KEYCODE_N)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Bank B") PORT_CODE(KEYCODE_M)
+
+ PORT_START("Y7")
+ PORT_BIT(0xe1, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("16 Levels") PORT_CODE(KEYCODE_F9)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Full Level") PORT_CODE(KEYCODE_F8)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Bank D") PORT_CODE(KEYCODE_STOP)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Bank C") PORT_CODE(KEYCODE_COMMA)
+
+ PORT_START("VARIATION")
+ PORT_ADJUSTER(100, "NOTE VARIATION") PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(mpc2000_state::variation_changed), 1)
+
+ PORT_START("DATAENTRY")
+ PORT_BIT( 0xff, 0x00, IPT_DIAL) PORT_SENSITIVITY(100) PORT_KEYDELTA(0) PORT_CODE_DEC(KEYCODE_F14) PORT_CODE_INC(KEYCODE_F15)
+INPUT_PORTS_END
+
+ROM_START( mpc2000xl )
+ ROM_REGION(0x80000, "maincpu", 0) // V53 code
+ ROM_SYSTEM_BIOS(0, "default", "ver 1.20 (February 7, 2005)")
+ ROMX_LOAD( "mpc2000xl_120.bin", 0x000000, 0x080000, CRC(c082f188) SHA1(382be688972fe3d85caeca99abff4b6c391347fb), ROM_BIOS(0) )
+
+ ROM_SYSTEM_BIOS(1, "ver114", "ver 1.14 (May 16, 2001)")
+ ROMX_LOAD( "mpc2000xl_114.bin", 0x000000, 0x080000, CRC(7b4fe8af) SHA1(f272ef2b1948730446fe260e4c0c830884832d3a), ROM_BIOS(1) )
+
+ ROM_SYSTEM_BIOS(2, "ver112", "ver 1.12 (December 15, 2000)")
+ ROMX_LOAD( "mpc2000xl_112.bin", 0x000000, 0x080000, CRC(552f660a) SHA1(91d1a1bb5aaa0b98538b4b47567c59770ba9a356), ROM_BIOS(2) )
+
+ ROM_SYSTEM_BIOS(3, "ver111", "ver 1.11 (March 23, 2000)")
+ ROMX_LOAD( "mpc2000xl_111.bin", 0x000000, 0x080000, CRC(0c232258) SHA1(3dd6481c9ced76baa8990580a23aec7c3aa9a1d1), ROM_BIOS(3) )
+
+ ROM_SYSTEM_BIOS(4, "ver110", "ver 1.10 (March 2, 2000)")
+ ROMX_LOAD( "mpc2000xl_110.bin", 0x000000, 0x080000, CRC(12700bee) SHA1(dee8833a55b065cd81f34a2bcc29df0dcf26c9f1), ROM_BIOS(4) )
+
+ ROM_SYSTEM_BIOS(5, "ver107", "ver 1.07 (November 8, 1999)")
+ ROMX_LOAD( "mpc2000xl_107.bin", 0x000000, 0x080000, CRC(3bc97b99) SHA1(2653b08245cc0d223bff24bc6da8c4817e39095c), ROM_BIOS(5) )
+
+ ROM_REGION(0x8000, "subcpu", 0) // uPD78C10 panel controller code
+ ROM_LOAD( "akai mpc2000xl op v1_0.bin", 0x000000, 0x008000, CRC(24382ade) SHA1(b02ca9b8a4ae41f4414e12d5188f638dbb99f36c) )
+ROM_END
+
+void mpc2000_state::init_mpc2000()
+{
+}
+
+CONS( 1994, mpc2000xl, 0, 0, mpc2000, mpc2000, mpc2000_state, init_mpc2000, "Akai / Roger Linn", "MPC 2000XL", MACHINE_NOT_WORKING )
diff --git a/src/mame/akai/mpc3000.cpp b/src/mame/akai/mpc3000.cpp
index dc00308f2c6..4f52bf2294e 100644
--- a/src/mame/akai/mpc3000.cpp
+++ b/src/mame/akai/mpc3000.cpp
@@ -17,7 +17,7 @@
LCD: LC7981
Quad-UART: TE7774 (3000)
Panel controller CPU: NEC uPD78C10AGQ @ 12 MHz
- Sound DSP: L7A1045-L6048
+ Sound DSP: L7A1045-L6028
DSP's wavedata bus is 16 bits wide and has 24 address bits (32 MiB total sample space)
DMA channel 0 is SCSI, 1 is floppy, 2 is IC31 (some sort of direct-audio stream?), and 3 is the L7A1045 DSP
@@ -488,6 +488,7 @@ void mpc3000_state::mpc3000(machine_config &config)
m_subcpu->an1_func().set(FUNC(mpc3000_state::an1_r));
m_subcpu->an2_func().set(FUNC(mpc3000_state::an2_r));
m_subcpu->an3_func().set(FUNC(mpc3000_state::an3_r));
+ m_subcpu->an3_func().set(FUNC(mpc3000_state::an4_r));
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
screen.set_refresh_hz(80);
diff --git a/src/mame/akai/s3000.cpp b/src/mame/akai/s3000.cpp
index 41eb0335e06..adb29aabdc1 100644
--- a/src/mame/akai/s3000.cpp
+++ b/src/mame/akai/s3000.cpp
@@ -85,6 +85,7 @@
#include "formats/td0_dsk.h"
#include "formats/pc_dsk.h"
+#include "s2000.lh"
namespace {
@@ -269,7 +270,7 @@ void s3000_state::dsp_map(address_map &map)
void s3000_state::floppy_led_cb(floppy_image_device *, int state)
{
-// m_floppy_leds[floppy] = state;
+ m_floppy_led = state;
}
// 00 = CD3000i (invalid with S3000/3200 ROM)
@@ -398,8 +399,10 @@ void s3000_state::dma_memw_cb(offs_t offset, uint8_t data)
void s3000_state::s3000_palette(palette_device &palette) const
{
- palette.set_pen_color(0, rgb_t(138, 146, 148));
- palette.set_pen_color(1, rgb_t(92, 83, 88));
+// palette.set_pen_color(0, rgb_t(138, 146, 148));
+// palette.set_pen_color(1, rgb_t(92, 83, 88));
+ palette.set_pen_color(0, rgb_t(88, 247, 0)); // bright green
+ palette.set_pen_color(1, rgb_t(3, 179, 6)); // dark green
}
void s3000_state::floppies(device_slot_interface &device)
@@ -462,7 +465,7 @@ void s3000_state::s3000(machine_config &config)
UPD72069(config, m_fdc, V53_CLKOUT);
m_fdc->set_ready_line_connected(false); // uPD READY pin is grounded on schematic
- m_fdc->set_ts_line_connected(false); // actually connected to DSKCHG (!) but this is sufficient for now
+ m_fdc->set_ts_line_connected(false); // actually connected to DSKCHG (!)
m_fdc->intrq_wr_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ3);
m_fdc->intrq_wr_callback().append(m_maincpu, FUNC(v53a_device::dsr_w));
m_fdc->drq_wr_callback().set(m_maincpu, FUNC(v53a_device::dreq_w<1>));
@@ -523,7 +526,7 @@ void s3000_state::s3000(machine_config &config)
SPEAKER(config, "speaker", 2).front();
- L7A1045(config, m_dsp, 33.8688_MHz_XTAL); // clock verified by schematic
+ L7A1045(config, m_dsp, 33.8688_MHz_XTAL);
m_dsp->set_addrmap(AS_DATA, &s3000_state::dsp_map);
m_dsp->drq_handler_cb().set(m_maincpu, FUNC(v53a_device::dreq_w<3>));
m_dsp->add_route(l7a1045_sound_device::L6028_LEFT, "speaker", 1.0, 0);
@@ -550,6 +553,8 @@ void s3000_state::s2000(machine_config &config)
m_screen->set_visarea_full();
NSCSI_CONNECTOR(config.replace(), "scsi:5", default_scsi_devices, "cdrom");
+
+ config.set_default_layout(layout_s2000);
}
void s3000_state::cd3000(machine_config &config)
diff --git a/src/mame/layout/s2000.lay b/src/mame/layout/s2000.lay
new file mode 100644
index 00000000000..1c42bb853cd
--- /dev/null
+++ b/src/mame/layout/s2000.lay
@@ -0,0 +1,632 @@
+<?xml version="1.0"?>
+<!-- license:CC0-1.0 -->
+<mamelayout version="2">
+
+<!--
+ #include "s2000.lh"
+ config.set_default_layout(layout_s2000);
+ palette.set_pen_color(0, rgb_t(88, 247, 0)); // bright green
+ palette.set_pen_color(1, rgb_t(3, 179, 6)); // dark green
+-->
+
+<!-- Layout for AKAI S2000 MIDI Stereo Digital Sampler Rack Unit
+ by Guru (https://gurudumps.otenko.com/)
+ (thanks to robcfg for real unit reference photos and infos)
+-->
+
+ <!-- TODO: Add Script
+ Text For Layout Plugin Enable Check At Boot
+ <element name="script_warning" defstate="1">
+ <text state="1" string="TO CONTROL SLIDERS/KNOBS WITH MOUSE PLEASE ENABLE LAYOUT PLUGIN">
+ <color red="1" green="0" blue="0"/></text></element>
+-->
+
+ <!-- TODO: Delete when done.
+ Guide image. All elements in this layout is positionally accurate (within 2 pixels) vs an
+ image of a real unit -->
+ <element name="background"><image file="s2000.png" /></element>
+
+ <!-- Model Logo Using Simple Lines -->
+ <element name="s2000-text">
+ <image><data><![CDATA[
+ <svg width="400" height="100" stroke-width="4" stroke="black" viewBox="0 0 400 100">
+ <g transform="scale(1.67,1)">
+ <line x1="0" y1="20" x2="20" y2="20" />
+ <line x1="0" y1="20" x2="0" y2="50" />
+ <line x1="0" y1="50" x2="20" y2="50" />
+ <line x1="20" y1="50" x2="20" y2="80" />
+ <line x1="0" y1="80" x2="20" y2="80" />
+ <line x1="30" y1="20" x2="50" y2="20" />
+ <line x1="30" y1="50" x2="50" y2="50" />
+ <line x1="30" y1="50" x2="30" y2="80" />
+ <line x1="50" y1="20" x2="50" y2="50" />
+ <line x1="30" y1="80" x2="50" y2="80" />
+ <line x1="60" y1="20" x2="80" y2="20" />
+ <line x1="80" y1="20" x2="80" y2="80" />
+ <line x1="60" y1="80" x2="80" y2="80" />
+ <line x1="60" y1="20" x2="60" y2="80" />
+ <line x1="90" y1="20" x2="110" y2="20" />
+ <line x1="110" y1="20" x2="110" y2="80" />
+ <line x1="90" y1="80" x2="110" y2="80" />
+ <line x1="90" y1="20" x2="90" y2="80" />
+ <line x1="120" y1="20" x2="140" y2="20" />
+ <line x1="140" y1="20" x2="140" y2="80" />
+ <line x1="120" y1="80" x2="140" y2="80" />
+ <line x1="120" y1="20" x2="120" y2="80" />
+ </g>
+ </svg>
+ ]]></data></image>
+ </element>
+
+<!-- AKAI Text Using Free Novo Font Then Converted To SVG -->
+ <element name="akai-novo-text">
+ <image><data><![CDATA[
+ <svg width: 300px; height: auto; >
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#E41F26" d="M13.92,0.06c0.88,0,1.76,0,2.64,0
+ c0.159,0.124,0.132,0.302,0.133,0.469c0.003,1.249,0.001,2.498,0.001,3.783c0.227-0.195,0.384-0.419,0.572-0.611
+ c1.127-1.148,2.27-2.281,3.407-3.417c0.111-0.112,0.263-0.14,0.386-0.224c1,0,2,0,3,0c0.083,0.2-0.08,0.293-0.186,0.4
+ c-0.814,0.826-1.637,1.643-2.457,2.461c-0.453,0.452-0.898,0.911-1.36,1.354c-0.182,0.175-0.187,0.306-0.03,0.505
+ c0.816,1.032,1.64,2.059,2.46,3.088c0.44,0.555,0.878,1.11,1.316,1.667c0.261,0.331,0.285,0.332,0.452-0.042
+ c0.663-1.485,1.313-2.977,1.975-4.463c0.592-1.332,1.182-2.665,1.779-3.994c0.098-0.219,0.186-0.442,0.292-0.657
+ c0.063-0.129,0.138-0.241,0.258-0.32c1.1,0,2.199,0,3.3,0c0.174,0.079,0.272,0.22,0.347,0.391
+ c0.792,1.808,1.596,3.611,2.405,5.411c0.576,1.282,1.139,2.57,1.714,3.853c0.06,0.132,0.135,0.274,0.034,0.425
+ c-0.96,0-1.92,0-2.88,0c-0.168-0.073-0.246-0.212-0.312-0.379c-0.2-0.511-0.393-1.024-0.584-1.539
+ c-0.09-0.241-0.228-0.349-0.487-0.347c-1.238,0.005-2.477,0.005-3.715,0c-0.261-0.002-0.398,0.105-0.487,0.347
+ c-0.191,0.515-0.385,1.028-0.585,1.539C27.246,9.928,27.168,10.066,27,10.14c-1.98,0-3.96,0-5.94,0
+ c-0.386-0.123-0.547-0.48-0.771-0.763c-0.812-1.024-1.614-2.055-2.42-3.083c-0.111-0.142-0.225-0.188-0.384-0.092
+ c-0.034,0.021,0.01-0.003-0.026,0.015c-0.765,0.356-0.765,0.356-0.765,1.207c0,0.769,0.001,1.538-0.001,2.307
+ c0,0.15,0.006,0.304-0.133,0.409c-0.88,0-1.76,0-2.64,0c-0.158-0.123-0.136-0.302-0.137-0.469
+ c-0.007-0.959-0.003-1.918-0.003-2.877c0-2.059-0.003-4.117,0.002-6.175C13.783,0.426,13.737,0.212,13.92,0.06z"/>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#E41F26" d="M2.94,10.14c-0.901,0-1.802,0.002-2.702-0.003
+ c-0.057-0.001-0.155,0.072-0.178-0.057c0.185-0.943,0.677-1.766,1.047-2.634C1.841,5.729,2.62,4.031,3.374,2.322
+ C3.66,1.673,3.943,1.023,4.242,0.38C4.303,0.25,4.378,0.138,4.5,0.06c1.1,0,2.2,0,3.3,0c0.174,0.079,0.272,0.22,0.348,0.391
+ c0.792,1.808,1.596,3.611,2.404,5.411c0.576,1.282,1.139,2.57,1.714,3.853c0.06,0.132,0.134,0.274,0.034,0.425
+ c-0.96,0-1.92,0-2.88,0c-0.167-0.073-0.246-0.212-0.311-0.379c-0.2-0.511-0.393-1.024-0.584-1.539
+ C8.436,7.98,8.298,7.873,8.038,7.875c-1.238,0.005-2.477,0.005-3.715,0C4.063,7.873,3.925,7.98,3.835,8.222
+ C3.644,8.736,3.451,9.25,3.251,9.761C3.186,9.928,3.108,10.066,2.94,10.14z"/>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#bdb9a6" d="M28.561,0.06c-0.145,0.517-0.408,0.985-0.619,1.474
+ c-0.608,1.409-1.237,2.81-1.863,4.212c-0.506,1.137-1.02,2.27-1.528,3.405c-0.106,0.239-0.226,0.476-0.305,0.724
+ c-0.073,0.231-0.151,0.246-0.296,0.064c-0.396-0.499-0.795-0.996-1.19-1.496c-0.517-0.652-1.028-1.309-1.546-1.96
+ c-0.488-0.614-0.979-1.226-1.475-1.833c-0.116-0.141-0.028-0.21,0.06-0.297c0.312-0.311,0.622-0.622,0.932-0.933
+ c1.046-1.046,2.093-2.091,3.138-3.138c0.068-0.069,0.129-0.148,0.193-0.222C25.561,0.06,27.061,0.06,28.561,0.06z"/>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#bdb9a6" d="M36.36,10.14c-0.524-1.189-1.046-2.381-1.573-3.57
+ c-0.358-0.808-0.729-1.61-1.088-2.418c-0.541-1.215-1.076-2.434-1.616-3.649c-0.066-0.151-0.148-0.295-0.223-0.442
+ c1.68,0,3.359,0,5.04,0c0.192,0.162,0.13,0.386,0.136,0.589c0.014,0.494,0.01,0.491,0.469,0.673
+ c0.27,0.106,0.544,0.201,0.811,0.314c0.175,0.074,0.27,0.197,0.274,0.39c0.002,0.1,0.008,0.2,0.008,0.3
+ c0.001,1.85,0.002,3.7,0,5.549c-0.001,0.573-0.009,0.577-0.533,0.791c-0.231,0.094-0.471,0.167-0.704,0.257
+ C37.13,9.011,37.045,9.16,37.035,9.4c-0.011,0.25,0.088,0.526-0.135,0.739C36.72,10.14,36.54,10.14,36.36,10.14z"/>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#bdb9a6" d="M12.3,10.14c-0.523-1.189-1.045-2.381-1.572-3.57
+ c-0.359-0.808-0.729-1.61-1.089-2.418C9.098,2.936,8.563,1.718,8.023,0.502C7.956,0.352,7.875,0.207,7.8,0.06
+ c2.04,0,4.08,0,6.12,0c0,3.36,0,6.72,0,10.08C13.38,10.14,12.84,10.14,12.3,10.14z"/>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#E41F26" d="M36.9,10.14c0-0.329,0.005-0.658-0.002-0.987
+ c-0.004-0.157,0.03-0.237,0.207-0.292c0.406-0.125,0.795-0.305,1.2-0.438c0.134-0.045,0.157-0.1,0.157-0.224
+ c-0.004-2.066-0.004-4.132,0-6.198c0-0.124-0.023-0.179-0.157-0.223c-0.404-0.133-0.794-0.313-1.2-0.438
+ c-0.177-0.054-0.211-0.134-0.207-0.291C36.905,0.719,36.9,0.39,36.9,0.06c1.861,0,3.724,0.005,5.586-0.007
+ c0.215-0.001,0.25,0.056,0.239,0.251c-0.02,0.318-0.006,0.637-0.006,0.956c-0.064,0.132-0.167,0.212-0.306,0.267
+ c-0.232,0.091-0.471,0.167-0.703,0.257c-0.382,0.147-0.41,0.187-0.412,0.591c-0.003,0.769-0.001,1.538-0.001,2.306
+ c0,1.048-0.002,2.097,0.001,3.145c0.002,0.404,0.03,0.444,0.412,0.592c0.232,0.089,0.471,0.165,0.703,0.257
+ c0.139,0.055,0.241,0.134,0.306,0.267c0,0.34-0.009,0.68,0.005,1.02c0.005,0.15-0.034,0.185-0.185,0.184
+ C40.66,10.138,38.78,10.14,36.9,10.14z"/>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#bdb9a6" d="M4.5,0.06C4.356,0.577,4.093,1.044,3.882,1.532
+ C3.275,2.94,2.646,4.339,2.022,5.74c-0.427,0.958-0.865,1.911-1.29,2.87C0.514,9.103,0.319,9.605,0.06,10.08
+ c0-3.253,0.002-6.507-0.004-9.76c0-0.2,0.021-0.271,0.253-0.268C1.706,0.067,3.103,0.06,4.5,0.06z"/>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#bdb9a6" d="M2.94,10.14c0.295-0.747,0.596-1.491,0.877-2.244
+ c0.049-0.13,0.097-0.158,0.222-0.158c1.427,0.004,2.854,0.004,4.282,0c0.125,0,0.173,0.028,0.222,0.158
+ C8.824,8.648,9.125,9.393,9.42,10.14C7.26,10.14,5.1,10.14,2.94,10.14z"/>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#bdb9a6" d="M27,10.14c0.295-0.747,0.597-1.491,0.878-2.244
+ c0.048-0.13,0.097-0.158,0.222-0.158c1.427,0.004,2.854,0.004,4.281,0c0.125,0,0.173,0.028,0.222,0.158
+ c0.281,0.753,0.583,1.497,0.878,2.244C31.32,10.14,29.16,10.14,27,10.14z"/>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#bdb9a6" d="M16.56,10.14c0-1.116,0.003-2.233-0.003-3.351
+ c-0.001-0.178,0.041-0.287,0.214-0.37c0.279-0.133,0.542-0.301,0.814-0.45c0.087-0.048,0.139-0.1,0.246,0.039
+ c0.76,0.993,1.544,1.969,2.317,2.952c0.308,0.391,0.608,0.786,0.912,1.18C19.56,10.14,18.06,10.14,16.56,10.14z"/>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#bdb9a6" d="M42.72,8.94c-0.462-0.173-0.922-0.35-1.388-0.514
+ c-0.112-0.04-0.177-0.062-0.177-0.21c0.007-2.078,0.007-4.156,0-6.234c0-0.148,0.064-0.17,0.177-0.209
+ c0.466-0.164,0.926-0.341,1.388-0.514C42.72,3.82,42.72,6.38,42.72,8.94z"/>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#bdb9a6" d="M21.06,0.06c-0.283,0.292-0.562,0.589-0.849,0.877
+ c-0.908,0.912-1.824,1.816-2.727,2.733C17.177,3.984,16.9,4.329,16.56,4.715c0-1.596,0-3.125,0-4.655
+ C18.06,0.06,19.56,0.06,21.06,0.06z"/>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#bdb9a6" d="M30.254,1.653c0.507,1.472,1.115,2.851,1.64,4.275
+ c-1.091,0-2.173,0-3.272,0C29.164,4.508,29.701,3.102,30.254,1.653z"/>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#bdb9a6" d="M6.193,1.655c0.51,1.47,1.114,2.852,1.642,4.272
+ c-1.093,0-2.175,0-3.274,0C5.104,4.505,5.642,3.099,6.193,1.655z"/>
+ </svg>
+ ]]></data></image>
+ </element>
+
+ <!-- LEDs -->
+ <element name="fddled"><rect></rect></element>
+ <element name="led"><disk></disk></element>
+
+ ]<!-- Basic Elements -->
+ <element name="line"><rect><color red="0" green="0" blue="0"/></rect></element>
+ <element name="vline"><rect><color red="0" green="0" blue="0"/></rect></element>
+ <element name="circle"><disk></disk></element>
+ <element name="box"><rect></rect></element>
+
+ <!-- Slots (with screws at different angles), so the unit doesn't fall down and break your foot ;-) -->
+ <element name="slot1">
+ <image><data><![CDATA[
+ <svg width="130" height="104" viewBox="0 0 130 104">
+ <rect x="0" y="10" width="130" height="80" rx="40" ry="40" fill="black"/>
+ <ellipse cx="65" cy="52" rx="52" ry="52" fill="#6e6e6e"/>
+ <ellipse cx="65" cy="52" rx="45" ry="45" fill="#a9a9a9"/>
+ <ellipse cx="65" cy="52" rx="37" ry="37" fill="#b8b8b8"/>
+ <g>
+ <rect x="58" y="25" width="14" height="27" fill="black"/>
+ <rect x="58" y="52" width="14" height="27" fill="black"/>
+ <rect x="39" y="45" width="27" height="14" fill="black"/>
+ <rect x="65" y="45" width="27" height="14" fill="black"/>
+ <polygon points="65,42 78,52 65,62 52,52" fill="grey" transform="rotate(45 65 52)"/>
+ </g>
+ </svg>
+ ]]></data>
+ </image>
+ </element>
+ <element name="slot2">
+ <image><data><![CDATA[
+ <svg width="130" height="104" viewBox="0 0 130 104">
+ <rect x="0" y="10" width="130" height="80" rx="40" ry="40" fill="black"/>
+ <ellipse cx="65" cy="52" rx="52" ry="52" fill="#6e6e6e"/>
+ <ellipse cx="65" cy="52" rx="45" ry="45" fill="#a9a9a9"/>
+ <ellipse cx="65" cy="52" rx="37" ry="37" fill="#b8b8b8"/>
+ <g transform="rotate(15 65 52)">
+ <rect x="58" y="25" width="14" height="27" fill="black"/>
+ <rect x="58" y="52" width="14" height="27" fill="black"/>
+ <rect x="39" y="45" width="27" height="14" fill="black"/>
+ <rect x="65" y="45" width="27" height="14" fill="black"/>
+ <polygon points="65,42 78,52 65,62 52,52" fill="grey" transform="rotate(45 65 52)"/>
+ </g>
+ </svg>
+ ]]></data>
+ </image>
+ </element>
+ <element name="slot3">
+ <image><data><![CDATA[
+ <svg width="130" height="104" viewBox="0 0 130 104">
+ <rect x="0" y="10" width="130" height="80" rx="40" ry="40" fill="black"/>
+ <ellipse cx="65" cy="52" rx="52" ry="52" fill="#6e6e6e"/>
+ <ellipse cx="65" cy="52" rx="45" ry="45" fill="#a9a9a9"/>
+ <ellipse cx="65" cy="52" rx="37" ry="37" fill="#b8b8b8"/>
+ <g transform="rotate(30 65 52)">
+ <rect x="58" y="25" width="14" height="27" fill="black"/>
+ <rect x="58" y="52" width="14" height="27" fill="black"/>
+ <rect x="39" y="45" width="27" height="14" fill="black"/>
+ <rect x="65" y="45" width="27" height="14" fill="black"/>
+ <polygon points="65,42 78,52 65,62 52,52" fill="grey" transform="rotate(45 65 52)"/>
+ </g>
+ </svg>
+ ]]></data>
+ </image>
+ </element>
+ <element name="slot4">
+ <image><data><![CDATA[
+ <svg width="130" height="104" viewBox="0 0 130 104">
+ <rect x="0" y="10" width="130" height="80" rx="40" ry="40" fill="black"/>
+ <ellipse cx="65" cy="52" rx="52" ry="52" fill="#6e6e6e"/>
+ <ellipse cx="65" cy="52" rx="45" ry="45" fill="#a9a9a9"/>
+ <ellipse cx="65" cy="52" rx="37" ry="37" fill="#b8b8b8"/>
+ <g transform="rotate(45 65 52)">
+ <rect x="58" y="25" width="14" height="27" fill="black"/>
+ <rect x="58" y="52" width="14" height="27" fill="black"/>
+ <rect x="39" y="45" width="27" height="14" fill="black"/>
+ <rect x="65" y="45" width="27" height="14" fill="black"/>
+ <polygon points="65,42 78,52 65,62 52,52" fill="grey" transform="rotate(45 65 52)"/>
+ </g>
+ </svg>
+ ]]></data>
+ </image>
+ </element>
+
+ <!-- Off-white buttons with rounded corners -->
+ <element name="rectbutton-owhite" defstate="0">
+ <image state="0"><data><![CDATA[
+ <svg width="140" height="56" viewBox="0 0 140 56">
+ <rect x="0" y="0" width="140" height="56" rx="10" ry="10" fill="rgb(192,181,137)" stroke="rgb(192,181,137)" stroke-width="0.6"/>
+ <line x1="0" y1="30" x2="140" y2="30" stroke="#e8ddb1" stroke-width="6" />
+ <line x1="5" y1="53" x2="130" y2="53" stroke="#e8ddb1" stroke-width="6" />
+ </svg>
+ ]]></data>
+ </image>
+ <image state="1"><data><![CDATA[
+ <svg width="140" height="56" viewBox="0 0 140 56">
+ <rect x="0" y="0" width="140" height="56" rx="10" ry="10" fill="rgb(202,191,147)" stroke="rgb(202,191,147)" stroke-width="0.6"/>
+ <line x1="0" y1="30" x2="140" y2="30" stroke="#e8ddb1" stroke-width="6" />
+ <line x1="5" y1="53" x2="130" y2="53" stroke="#e8ddb1" stroke-width="6" />
+ </svg>
+ ]]></data>
+ </image>
+ </element>
+ <element name="rectbutton-black">
+ <image><data><![CDATA[
+ <svg width="145" height="76">
+ <rect x="0" y="0" width="145" height="76" rx="14" ry="14" fill="black" stroke="black" stroke-width="0.6"/>
+ </svg>
+ ]]></data>
+ </image>
+ </element>
+
+ <!-- Square buttons with rounded corners -->
+ <element name="squarebutton-owhite" defstate="0">
+ <image state="0"><data><![CDATA[
+ <svg width="140" height="112">
+ <rect x="0" y="0" width="140" height="112" rx="10" ry="10" fill="rgb(192,181,137)" stroke="rgb(192,181,137)" stroke-width="0.6"/>
+ <ellipse cx="70" cy="53" rx="43" ry="33" fill="rgb(150,134,96)"/>
+ <ellipse cx="70" cy="57" rx="41" ry="29" fill="rgb(184,168,126)"/>
+ <ellipse cx="70" cy="66" rx="26" ry="11" fill="rgb(248,236,204)" fill-opacity="0.5"/>
+ <line x1="5" y1="106" x2="130" y2="106" stroke="rgb(224,216,184)" stroke-width="11" />
+ </svg>
+ ]]></data>
+ </image>
+ <image state="1"><data><![CDATA[
+ <svg width="140" height="112">
+ <rect x="0" y="0" width="140" height="112" rx="10" ry="10" fill="rgb(202,191,147)" stroke="rgb(202,191,147)" stroke-width="0.6"/>
+ <ellipse cx="70" cy="53" rx="43" ry="33" fill="rgb(160,144,106)"/>
+ <ellipse cx="70" cy="57" rx="41" ry="29" fill="rgb(194,178,136)"/>
+ <ellipse cx="70" cy="66" rx="26" ry="11" fill="rgb(258,246,214)" fill-opacity="0.5"/>
+ <line x1="5" y1="106" x2="130" y2="106" stroke="rgb(234,226,194)" stroke-width="11" />
+ </svg>
+ ]]></data>
+ </image>
+ </element>
+ <element name="squarebutton-black">
+ <image><data><![CDATA[
+ <svg width="145" height="152">
+ <rect x="0" y="0" width="145" height="152" rx="14" ry="14" fill="black" stroke="black" stroke-width="0.6"/>
+ </svg>
+ ]]></data>
+ </image>
+ </element>
+
+ <element name="indicator">
+ <image state="0"><data><![CDATA[
+ <svg width="100" height="100" viewBox="0 -30 100 100" stroke-width="7" stroke="black" >
+ <line x1="49" y1="-30" x2="49" y2="5" />
+ <ellipse cx="50" cy="35" rx="12" ry="12" fill="black"/>
+ <line x1="49" y1="50" x2="49" y2="78" />
+ <svg width="100" height="100">
+ <path d="M 25,60 A 35,35 0 1 1 75,60"
+ fill="none" stroke="black" stroke-width="6"/>
+ </svg>
+ ]]></data>
+ </image>
+ </element>
+
+ <!-- All Texts -->
+ <element name="knob-volume-text"><text align="0" string="MAIN VOLUME" /></element>
+ <element name="knob-gain-text"><text align="0" string="REC GAIN" /></element>
+ <element name="knob-min-text"><text align="0" string="MIN" /></element>
+ <element name="knob-max-text"><text align="0" string="MAX" /></element>
+ <element name="lmono-text"><text align="0" string="L/MONO" /></element>
+ <element name="r-text"><text align="0" string="R" /></element>
+ <element name="phones-text"><text align="0" string="PHONES" /></element>
+ <element name="select-text"><text align="0" string="SELECT" /></element>
+ <element name="data-text"><text align="0" string="DATA" /></element>
+ <element name="group-text"><text align="0" string="GROUP" /></element>
+ <element name="play-text"><text align="0" string="PLAY" /></element>
+ <element name="page-text"><text align="0" string="PAGE" /></element>
+ <element name="effects-text"><text align="0" string="EFFECTS" /></element>
+ <element name="load-text"><text align="0" string="LOAD" /></element>
+ <element name="sample-text"><text align="0" string="SAMPLE" /></element>
+ <element name="save-text"><text align="0" string="SAVE" /></element>
+ <element name="multi-text"><text align="0" string="MULTI" /></element>
+ <element name="global-text"><text align="0" string="GLOBAL" /></element>
+ <element name="single-text"><text align="0" string="SINGLE" /></element>
+ <element name="edit-text"><text align="0" string="EDIT" /></element>
+ <element name="f1-text"><text align="0" string="F1" /></element>
+ <element name="f2-text"><text align="0" string="F2" /></element>
+ <element name="cursor-text"><text align="0" string="CURSOR" /></element>
+ <element name="power-text"><text align="0" string="POWER" /></element>
+ <element name="professional-text"><text align="2" string="professional" /></element>
+ <element name="msds"><text align="1" string="MIDI STEREO DIGITAL SAMPLER" /></element>
+
+ <!-- Arrows -->
+ <element name="cursor-down-arrow">
+ <image>
+ <bounds xc="7.5" yc="5" width="20" height="10" />
+ <data><![CDATA[
+ <svg>
+ <path d="M 2,2 L 5,8 L 8,2" fill="none" stroke="black" stroke-width="0.6" />
+ </svg>
+ ]]></data>
+ </image>
+ </element>
+ <element name="cursor-up-arrow">
+ <image>
+ <bounds xc="7.5" yc="5" width="20" height="10" />
+ <data><![CDATA[
+ <svg>
+ <path d="M 2,8 L 5,2 L 8,8" fill="none" stroke="black" stroke-width="0.6" />
+ </svg>
+ ]]></data>
+ </image>
+ </element>
+ <element name="cursor-left-arrow">
+ <image>
+ <bounds xc="7.5" yc="5" width="10" height="20" />
+ <data><![CDATA[
+ <svg>
+ <path d="M 8,8 L 2,5 L 8,2" fill="none" stroke="black" stroke-width="0.6" />
+ </svg>
+ ]]></data>
+ </image>
+ </element>
+ <element name="cursor-right-arrow">
+ <image>
+ <bounds xc="7.5" yc="5" width="10" height="20" />
+ <data><![CDATA[
+ <svg>
+ <path d="M 2,8 L 8,5 L 2,2" fill="none" stroke="black" stroke-width="0.6" />
+ </svg>
+ ]]></data>
+ </image>
+ </element>
+
+ <!-- TODO: Replace with correct knobs. Selective tick marks around the volume and record knobs every 30 degrees (some missing by design) -->
+ <element name="knob-ticks">
+ <image><data><![CDATA[
+ <svg width="500" height="500" viewBox="0 0 500 500">
+ <g stroke="#000000" stroke-width="5" transform="translate(250, 250)>
+ <line x1="0" y1="0" x2="200" y2="0"/>
+ <line transform="rotate(30)" x1="0" y1="0" x2="200" y2="0"/>
+ <line transform="rotate(60)" x1="0" y1="0" x2="200" y2="0"/>
+ <line transform="rotate(120)" x1="0" y1="0" x2="200" y2="0"/>
+ <line transform="rotate(150)" x1="0" y1="0" x2="200" y2="0"/>
+ <line transform="rotate(180)" x1="0" y1="0" x2="200" y2="0"/>
+ <line transform="rotate(210)" x1="0" y1="0" x2="200" y2="0"/>
+ <line transform="rotate(240)" x1="0" y1="0" x2="200" y2="0"/>
+ <line transform="rotate(270)" x1="0" y1="0" x2="200" y2="0"/>
+ <line transform="rotate(300)" x1="0" y1="0" x2="200" y2="0"/>
+ <line transform="rotate(330)" x1="0" y1="0" x2="200" y2="0"/>
+ </g>
+ </svg>
+ ]]></data></image>
+ </element>
+
+ <!-- Bezel / Panel Elements -->
+ <element name="bezel"><rect><bounds x="0" y="0" width="72" height="208" /></rect></element>
+ <element name="panel"><rect></rect></element>
+ <element name="bezel-highlightbr">
+ <image><data><![CDATA[
+ <svg width="126" height="88" viewBox="0 0 128 90">
+ <path d="M 0,0 L 123,86 Z" fill="#595b4c" stroke="#595b4c" stroke-width="5"/>
+ </svg>
+ ]]></data>
+ </image>
+ </element>
+ <element name="bezel-highlightbl">
+ <image><data><![CDATA[
+ <svg width="126" height="88" viewBox="0 0 128 90">
+ <path d="M119,0 L 0,86 Z" fill="#595b4c" stroke="#595b4c" stroke-width="5"/>
+ </svg>
+ ]]></data>
+ </image>
+ </element>
+ <element name="bezel-highlighttl">
+ <image><data><![CDATA[
+ <svg width="126" height="35" viewBox="0 0 128 37">
+ <path d="M 0,0 L 123,35 Z" fill="#595b4c" stroke="#595b4c" stroke-width="5"/>
+ </svg>
+ ]]></data>
+ </image>
+ </element>
+ <element name="bezel-highlighttr">
+ <image><data><![CDATA[
+ <svg width="126" height="35" viewBox="0 0 128 37">
+ <path d="M119,0 L 0,35 Z" fill="#595b4c" stroke="#595b4c" stroke-width="5"/>
+ </svg>
+ ]]></data>
+ </image>
+ </element>
+
+ <!-- Screen Assembly -->
+ <group name="group-screen">
+ <bounds x="0" y="0" width="940" height="300" />
+ <element ref="bezel"><bounds x="0" y="0" width="940" height="300" /><color red="0" green="0" blue="0" /></element>
+ <element ref="bezel"><bounds x="10" y="10" width="920" height="265" /><color red="0.317" green="0.321" blue="0.294" /></element>
+ <element ref="bezel"><bounds x="20" y="20" width="900" height="245" /><color red="0" green="0" blue="0" alpha="0.25" /></element>
+ <element ref="bezel-highlighttl"><bounds x="15" y="15" width="124" height="30" /></element>
+ <element ref="bezel-highlighttr"><bounds x="812" y="15" width="124" height="30" /></element>
+ <element ref="bezel-highlightbl"><bounds x="15" y="184" width="124" height="88" /></element>
+ <element ref="bezel-highlightbr"><bounds x="812" y="184" width="124" height="88" /></element>
+ <screen index="0"><bounds x="110" y="37" width="720" height="160" /></screen>
+ </group>
+
+ <!-- Knob Elements -->
+ <element name="knob"><disk></disk></element>
+ <element name="knob-position"><rect></rect></element>
+
+ <!-- Data Entry Pieces -->
+ <element name="dataentry_bottom"><disk><color red="0" green="0" blue="0"/></disk></element>
+ <element name="dataentry_top"><disk><color red="0.741" green="0.678" blue="0.513"/></disk></element>
+ <element name="dataentry_outer"><disk><color red="0.772" green="0.725" blue="0.603"/></disk></element>
+ <element name="outer_ring"><disk><color red="0.741" green="0.678" blue="0.513"/></disk></element>
+ <element name="outer_ring_top"><disk><color red="0.870" green="0.823" blue="0.674"/></disk></element>
+<!--<element name="dataentry_knob">
+ <simplecounter maxstate="100" digits="1"><color red="0.505" green="0.458" blue="0.337"/></simplecounter>
+ </element>
+-->
+
+ <!-- Volume Knob (non-functional) TODO: replace with visually-correct knob -->
+ <group name="volumeknob"><bounds x="0" y="0" width="500" height="500"/>
+ <element ref="knob-ticks"><bounds x="0" y="30" width="500" height="500"/></element>
+ <element ref="knob"><bounds x="92" y="115" width="330" height="330" /><color red="0.827" green="0.827" blue="0.827" /></element>
+ <element ref="knob"><bounds x="112" y="135" width="290" height="290" /><color red="0.0" green="0.0" blue="0.0" /></element>
+ <element ref="knob"><bounds x="127" y="150" width="260" height="260" /><color red="0.7" green="0.7" blue="0.7" /></element>
+ <element ref="knob"><bounds x="161" y="185" width="196" height="196" /><color red="0.5" green="0.5" blue="0.5" /></element>
+ <element ref="knob"><bounds x="167" y="190" width="180" height="180" /><color red="0.88" green="0.9" blue="0.778" /></element>
+ <element ref="knob-position"><bounds x="232" y="110" width="40" height="180" /><color red="0.5" green="0.5" blue="0.5" /></element>
+ <element ref="knob-position"><bounds x="240" y="115" width="30" height="190" /><color red="0.78" green="0.8" blue="0.678" /></element>
+ </group>
+
+ <!-- Record Knob (non-functional) TODO: replace with visually-correct knob -->
+ <group name="recordknob">
+ <bounds x="0" y="0" width="500" height="500"/>
+ <element ref="knob-ticks"><bounds x="0" y="30" width="500" height="500"/></element>
+ <element ref="knob"><bounds x="92" y="115" width="330" height="330" /><color red="0.745" green="0.729" blue="0.654" /></element>
+ <element ref="knob"><bounds x="112" y="135" width="290" height="290" /><color red="0.0" green="0.0" blue="0.0" /></element>
+ <element ref="knob"><bounds x="127" y="150" width="260" height="260" /><color red="0.7" green="0.7" blue="0.7" /></element>
+ <element ref="knob"><bounds x="161" y="185" width="196" height="196" /><color red="0.5" green="0.5" blue="0.5" /></element>
+ <element ref="knob"><bounds x="167" y="190" width="180" height="180" /><color red="0.764" green="0.376" blue="0.302" /></element>
+ <element ref="knob-position"><bounds x="232" y="110" width="40" height="180" /><color red="0.5" green="0.5" blue="0.5" /></element>
+ <element ref="knob-position"><bounds x="240" y="115" width="30" height="190" /><color red="0.664" green="0.276" blue="0.202" /></element>
+ </group>
+
+ <!-- Data Entry Knob
+ TODO: Missing in MAME driver:
+ 360 degrees Encoder (center wheel)
+ Outer ring; rotates +- 90 degrees and springs back to center
+ -->
+ <group name="outerknob">
+ <bounds x="0" y="0" width="580" height="580" />
+ <element ref="outer_ring" ><bounds x="0" y="0" width="580" height="580"/></element>
+ <element ref="outer_ring_top" ><bounds x="50" y="50" width="480" height="480"/></element>
+ <element ref="vline"><bounds x="285" y="0" width="10" height="30" /></element>
+ </group>
+
+ <group name="select_data_knob">
+ <bounds x="0" y="0" width="590" height="590" />
+ <element ref="dataentry_bottom" ><bounds x="0" y="0" width="590" height="590"/></element>
+ <group ref="outerknob" ><bounds x="15" y="15" width="560" height="560"/></group>
+ <element ref="dataentry_bottom" ><bounds x="80" y="80" width="430" height="430"/></element>
+ <element ref="dataentry_outer" ><bounds x="90" y="90" width="410" height="410"/></element>
+ <element ref="dataentry_top" ><bounds x="105" y="105" width="380" height="380"/></element>
+ </group>
+
+ <!-- 1/4" Jacks -->
+ <element name="jack">
+ <disk><bounds x="0" y="0" width="140" height="140" /><color red="0" green="0" blue="0" /></disk>
+ <disk><bounds x="7" y="7" width="126" height="126" /><color red="0.709" green="0.674" blue="0.611" /></disk>
+ <disk><bounds x="12.5" y="12.5" width="115" height="115" /><color red="0" green="0" blue="0" /></disk>
+ <disk><bounds x="15" y="15" width="110" height="110" /><color red="0.317" green="0.290" blue="0.227" /></disk>
+ <disk><bounds x="27.5" y="27.5" width="85" height="85" /><color red="0" green="0" blue="0" /></disk>
+ </element>
+
+ <!-- Show Everything -->
+ <view name="Default Layout">
+
+ <!-- TODO: Add Script. Check Layout Plugin Is Turned On
+ <collection name="script warning">
+ <element ref="script_warning" id="warning"><bounds x="200" y="50" width="1200" height="30"/></element>
+ </collection>
+-->
+
+ <!-- TODO: Delete when done. Guide .png image when editing layout -->
+<!-- <element ref="background"><bounds x="0" y="0" width="6000" height="1112" /></element>
+-->
+ <!-- Screen and Panel -->
+ <element ref="panel"><bounds x="0" y="0" width="6000" height="1112" /><color red="0.745" green="0.729" blue="0.654" /></element>
+ <group ref="group-screen"><bounds x="2248" y="175" width="940" height="300" /></group>
+ <element ref="slot1"><bounds x="35" y="22" width="130" height="104" /></element>
+ <element ref="slot2"><bounds x="35" y="997" width="130" height="104" /></element>
+ <element ref="slot3"><bounds x="5830" y="22" width="130" height="104" /></element>
+ <element ref="slot4"><bounds x="5830" y="997" width="130" height="104" /></element>
+ <element ref="vline"><bounds x="315" y="0" width="10" height="1112" /></element>
+ <element ref="vline"><bounds x="5670" y="0" width="10" height="1112" /></element>
+ <element ref="cursor-left-arrow"><bounds x="2560" y="550" width="37" height="45" /></element>
+ <element ref="cursor-right-arrow"><bounds x="2840" y="550" width="37" height="45" /></element>
+ <element ref="cursor-up-arrow"><bounds x="3352" y="150" width="50" height="28" /></element>
+ <element ref="cursor-up-arrow"><bounds x="3687" y="150" width="50" height="28" /></element>
+ <element ref="cursor-down-arrow"><bounds x="3352" y="493" width="50" height="28" /></element>
+ <element ref="cursor-down-arrow"><bounds x="3687" y="493" width="50" height="28" /></element>
+ <element ref="jack"><bounds x="4880" y="575" width="150" height="150" /></element>
+ <element ref="jack"><bounds x="4880" y="815" width="150" height="150" /></element>
+ <element ref="jack"><bounds x="5290" y="815" width="150" height="150" /></element>
+ <group ref="recordknob"><bounds x="4765" y="70" width="375" height="375" /></group>
+ <group ref="volumeknob"><bounds x="5185" y="70" width="375" height="375" /></group>
+ <group ref="select_data_knob"><bounds x="3915" y="220" width="680" height="680" /></group>
+ <element ref="indicator"><bounds x="4234" y="100" width="50" height="50" /></element>
+ <element ref="akai-novo-text"><bounds x="445" y="130" width="325" height="90" /></element>
+ <element ref="professional-text"><bounds x="785" y="178" width="230" height="50" /><color red="0.902" green="0.117" blue="0.149" /></element>
+ <element ref="msds"><bounds x="1085" y="180" width="650" height="51.50" /><color red="0" green="0" blue="0" /></element>
+ <element ref="s2000-text"><bounds x="1738" y="146" width="710" height="90" /></element>
+ <element ref="knob-volume-text"><bounds x="5220" y="65" width="300" height="45" /><color red="0" green="0" blue="0" /></element>
+ <element ref="knob-gain-text"><bounds x="4835" y="65" width="250" height="45" /><color red="0" green="0" blue="0" /></element>
+ <element ref="knob-min-text"><bounds x="4745" y="430" width="200" height="35" /><color red="0" green="0" blue="0" /></element>
+ <element ref="knob-max-text"><bounds x="4970" y="430" width="200" height="35" /><color red="0" green="0" blue="0" /></element>
+ <element ref="knob-min-text"><bounds x="5160" y="430" width="200" height="35" /><color red="0" green="0" blue="0" /></element>
+ <element ref="knob-max-text"><bounds x="5383" y="430" width="200" height="35" /><color red="0" green="0" blue="0" /></element>
+ <element ref="lmono-text"><bounds x="4855" y="510" width="200" height="45" /><color red="0" green="0" blue="0" /></element>
+ <element ref="r-text"><bounds x="4855" y="755" width="200" height="45" /><color red="0" green="0" blue="0" /></element>
+ <element ref="phones-text"><bounds x="5270" y="755" width="200" height="45" /><color red="0" green="0" blue="0" /></element>
+ <element ref="select-text"><bounds x="4165" y="50" width="200" height="45" /><color red="0" green="0" blue="0" /></element>
+ <element ref="data-text"><bounds x="4160" y="150" width="200" height="45" /><color red="0" green="0" blue="0" /></element>
+ <element ref="page-text"><bounds x="3280" y="310" width="200" height="45" /><color red="0" green="0" blue="0" /></element>
+ <element ref="group-text"><bounds x="3615" y="310" width="200" height="45" /><color red="0" green="0" blue="0" /></element>
+ <element ref="play-text"><bounds x="3610" y="838" width="200" height="45" /><color red="0" green="0" blue="0" /></element>
+ <element ref="sample-text"><bounds x="2930" y="647" width="250" height="45" /><color red="0" green="0" blue="0" /></element>
+ <element ref="effects-text"><bounds x="3260" y="647" width="250" height="45" /><color red="0" green="0" blue="0" /></element>
+ <element ref="load-text"><bounds x="3280" y="838" width="200" height="45" /><color red="0" green="0" blue="0" /></element>
+ <element ref="save-text"><bounds x="2950" y="838" width="200" height="45" /><color red="0" green="0" blue="0" /></element>
+ <element ref="multi-text"><bounds x="2625" y="647" width="200" height="45" /><color red="0" green="0" blue="0" /></element>
+ <element ref="global-text"><bounds x="2625" y="838" width="200" height="45" /><color red="0" green="0" blue="0" /></element>
+ <element ref="single-text"><bounds x="2290" y="647" width="200" height="45" /><color red="0" green="0" blue="0" /></element>
+ <element ref="edit-text"><bounds x="2290" y="838" width="200" height="45" /><color red="0" green="0" blue="0" /></element>
+ <element ref="f1-text"><bounds x="2240" y="542" width="200" height="45" /><color red="0" green="0" blue="0" /></element>
+ <element ref="cursor-text"><bounds x="2600" y="542" width="250" height="45" /><color red="0" green="0" blue="0" /></element>
+ <element ref="f2-text"><bounds x="3002" y="542" width="200" height="45" /><color red="0" green="0" blue="0" /></element>
+ <element ref="power-text"><bounds x="480" y="750" width="250" height="45" /><color red="0" green="0" blue="0" /></element>
+ <element ref="led"><bounds x="3243" y="937" width="25" height="25" /><animate name="led0" /><color state="0" red="0.4" green="0" blue="0" /><color state="1" red="1" green="0" blue="0" /></element>
+ <element ref="led"><bounds x="3243" y="745" width="25" height="25" /><animate name="led1" /><color state="0" red="0.4" green="0" blue="0" /><color state="1" red="1" green="0" blue="0" /></element>
+ <element ref="led"><bounds x="2912" y="937" width="25" height="25" /><animate name="led2" /><color state="0" red="0.4" green="0" blue="0" /><color state="1" red="1" green="0" blue="0" /></element>
+ <element ref="led"><bounds x="2912" y="745" width="25" height="25" /><animate name="led3" /><color state="0" red="0.4" green="0" blue="0" /><color state="1" red="1" green="0" blue="0" /></element>
+ <element ref="led"><bounds x="2581" y="937" width="25" height="25" /><animate name="led4" /><color state="0" red="0.4" green="0" blue="0" /><color state="1" red="1" green="0" blue="0" /></element>
+ <element ref="led"><bounds x="2581" y="745" width="25" height="25" /><animate name="led5" /><color state="0" red="0.4" green="0" blue="0" /><color state="1" red="1" green="0" blue="0" /></element>
+ <element ref="led"><bounds x="2250" y="937" width="25" height="25" /><animate name="led6" /><color state="0" red="0.4" green="0" blue="0" /><color state="1" red="1" green="0" blue="0" /></element>
+ <element ref="led"><bounds x="2250" y="745" width="25" height="25" /><animate name="led7" /><color state="0" red="0.4" green="0" blue="0" /><color state="1" red="1" green="0" blue="0" /></element>
+
+ <!-- Floppy Drive TODO -->
+ <element ref="box"><bounds x="845" y="607" width="1278" height="341" /><color red="0" green="0" blue="0" /></element>
+ <element ref="fddled"><bounds x="1110" y="845" width="70" height="25" /><animate name="drive_led" /><color state="0" red="0.0" green="0.4" blue="0" /><color state="1" red="0" green="1" blue="0" /></element>
+
+
+ <!-- Buttons -->
+ <!-- F1 -->
+ <element ref="rectbutton-black"><bounds x="2375" y="535" width="145" height="76" /></element>
+ <element ref="rectbutton-owhite" inputtag="C5" inputmask="0x02"><bounds x="2380" y="545" width="130" height="56" /></element>
+ <!-- F2 -->
+ <element ref="rectbutton-black"><bounds x="2916" y="535" width="145" height="76" /></element>
+ <element ref="rectbutton-owhite" inputtag="C2" inputmask="0x02"><bounds x="2921" y="545" width="130" height="56" /></element>
+ <!-- Page Up -->
+ <element ref="rectbutton-black"><bounds x="3305" y="203" width="145" height="76" /></element>
+ <element ref="rectbutton-owhite" inputtag="C6" inputmask="0x01"><bounds x="3312" y="213" width="130" height="56" /></element>
+ <!-- Page Down -->
+ <element ref="rectbutton-black"><bounds x="3305" y="393" width="145" height="76" /></element>
+ <element ref="rectbutton-owhite" inputtag="C7" inputmask="0x01"><bounds x="3312" y="403" width="130" height="56" /></element>
+ <!-- Group Up -->
+ <element ref="rectbutton-black"><bounds x="3640" y="203" width="145" height="76" /></element>
+ <element ref="rectbutton-owhite" inputtag="C2" inputmask="0x01"><bounds x="3647" y="213" width="130" height="56" /></element>
+ <!-- Group Up -->
+ <element ref="rectbutton-black"><bounds x="3640" y="393" width="145" height="76" /></element>
+ <element ref="rectbutton-owhite" inputtag="C3" inputmask="0x01"><bounds x="3647" y="403" width="130" height="56" /></element>
+ <!-- Single -->
+ <element ref="squarebutton-black"><bounds x="2315" y="708" width="145" height="107" /></element>
+ <element ref="squarebutton-owhite" inputtag="C6" inputmask="0x02"><bounds x="2322" y="718" width="130" height="87" /></element>
+ <!-- Edit -->
+ <element ref="squarebutton-black"><bounds x="2315" y="900" width="145" height="107" /></element>
+ <element ref="squarebutton-owhite" inputtag="C7" inputmask="0x02"><bounds x="2322" y="910" width="130" height="87" /></element>
+ <!-- Multi -->
+ <element ref="squarebutton-black"><bounds x="2646" y="708" width="145" height="107" /></element>
+ <element ref="squarebutton-owhite" inputtag="C3" inputmask="0x02"><bounds x="2653" y="718" width="130" height="87" /></element>
+ <!-- Global -->
+ <element ref="squarebutton-black"><bounds x="2646" y="900" width="145" height="107" /></element>
+ <element ref="squarebutton-owhite" inputtag="C4" inputmask="0x02"><bounds x="2653" y="910" width="130" height="87" /></element>
+ <!-- Sample -->
+ <element ref="squarebutton-black"><bounds x="2977" y="708" width="145" height="107" /></element>
+ <element ref="squarebutton-owhite" inputtag="C0" inputmask="0x02"><bounds x="2984" y="718" width="130" height="87" /></element>
+ <!-- Save -->
+ <element ref="squarebutton-black"><bounds x="2977" y="900" width="145" height="107" /></element>
+ <element ref="squarebutton-owhite" inputtag="C1" inputmask="0x02"><bounds x="2984" y="910" width="130" height="87" /></element>
+ <!-- Effects -->
+ <element ref="squarebutton-black"><bounds x="3308" y="708" width="145" height="107" /></element>
+ <element ref="squarebutton-owhite" inputtag="C4" inputmask="0x01"><bounds x="3315" y="718" width="130" height="87" /></element>
+ <!-- Load -->
+ <element ref="squarebutton-black"><bounds x="3308" y="900" width="145" height="107" /></element>
+ <element ref="squarebutton-owhite" inputtag="C5" inputmask="0x01"><bounds x="3315" y="910" width="130" height="87" /></element>
+ <!-- Play -->
+ <element ref="squarebutton-black"><bounds x="3639" y="900" width="145" height="107" /></element>
+ <element ref="squarebutton-owhite" inputtag="C1" inputmask="0x01"><bounds x="3646" y="910" width="130" height="87" /></element>
+
+
+ </view>
+
+</mamelayout>
diff --git a/src/mame/mame.lst b/src/mame/mame.lst
index 4d00e4bf9b4..5263fc24325 100644
--- a/src/mame/mame.lst
+++ b/src/mame/mame.lst
@@ -520,6 +520,9 @@ vx600
@source:akai/mpc60.cpp
mpc60
+@source:akai/mpc2000.cpp
+mpc2000xl
+
@source:akai/mpc3000.cpp
mpc3000