diff options
| author | 2025-11-25 21:56:22 -0500 | |
|---|---|---|
| committer | 2025-11-25 21:56:22 -0500 | |
| commit | ad43ead3647d6ba1ec80f6473a42560d6f1243ef (patch) | |
| tree | 40f43b70069540450442491900fe79768276422a | |
| parent | 3af9439e613b46eb31af7a3aa0696f927c0dec7f (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.cpp | 736 | ||||
| -rw-r--r-- | src/mame/akai/mpc3000.cpp | 3 | ||||
| -rw-r--r-- | src/mame/akai/s3000.cpp | 15 | ||||
| -rw-r--r-- | src/mame/layout/s2000.lay | 632 | ||||
| -rw-r--r-- | src/mame/mame.lst | 3 |
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 |
