summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author arbee <rb6502@users.noreply.github.com>2025-11-22 08:19:05 -0500
committer arbee <rb6502@users.noreply.github.com>2025-11-22 08:19:05 -0500
commit0135f8d2883bc0c0f07b5817c6f32db2edc44b82 (patch)
tree094193f395254cb591d5da49263acebe239b1db6
parente1452bc296c27e72b889f03830ecbf80243bb82c (diff)
New systems marked not working
------------------------------ Akai S2000 [R. Belmont] Akai S3000 [R. Belmont] Akai S3000XL [R. Belmont] Akai CD3000i [R. Belmont] Akai CD3000XL [R. Belmont] akai/s3000.cpp: New preliminary driver for Akai S2000, S3000(XL), and CD3000(XL). [R. Belmont] machine/upd765.cpp: Allow invalid auxcommand sent by S3000, which works on hardware. [R. Belmont]
-rw-r--r--src/devices/machine/upd765.cpp1
-rw-r--r--src/mame/akai/s3000.cpp618
-rw-r--r--src/mame/mame.lst7
3 files changed, 626 insertions, 0 deletions
diff --git a/src/devices/machine/upd765.cpp b/src/devices/machine/upd765.cpp
index 8607ff35a1f..46be1653b28 100644
--- a/src/devices/machine/upd765.cpp
+++ b/src/devices/machine/upd765.cpp
@@ -3364,6 +3364,7 @@ void upd72069_device::auxcmd_w(uint8_t data)
case 0x47: // start clock
case 0x34: // reset standby
case 0x33: // enable external mode
+ case 0x80: // Not a valid auxcmd, but the Akai S3000 sends it and expects an ACK.
main_phase = PHASE_RESULT;
result[0] = ST0_UNK;
result_pos = 1;
diff --git a/src/mame/akai/s3000.cpp b/src/mame/akai/s3000.cpp
new file mode 100644
index 00000000000..cd77be8719d
--- /dev/null
+++ b/src/mame/akai/s3000.cpp
@@ -0,0 +1,618 @@
+// license:BSD-3-Clause
+// copyright-holders:R. Belmont
+/***************************************************************************
+
+ s3000.cpp - Akai S2000, S2800, S3000, CD3000i, S3200, S3000XL,
+ S3200XL, and CD3000XL rackmount 16-bit samplers.
+ Driver by R. Belmont
+
+ These rackmount samplers are all built on variants of what became the
+ MPC3000 hardware. The major difference is the lack of the 7810/7811
+ sub-CPU to manage the panel, since without drum pads there's no need
+ for ultra-low-latency response from the panel.
+
+ The S2000 is the lowest end model, with a slightly slower CPU, no SCSI, a smaller
+ LCD, and fewer controls. The S2800 has the same LCD and front panel as the S3000
+ but again is bare-bones on features.
+
+ "XL" models have double the ROM space for a more advanced OS and come with
+ things that were optional expansions on the base models built in.
+
+ Hardware:
+ CPU: NEC V53 (32 MHz on 3x00, 31.94 MHz on 2000)
+ Floppy: uPD72069
+ SCSI: MB89352
+ LCD: LC7981 (3x00 and 2800) or HD44780 (2000)
+ Sound DSP: L7A1045-L6048
+ Filter (XL models and S3200 only): L7A0906-L6029 DFL
+ Effects DSP (XL models only): L7A1414-L6038 DFX
+
+ TODOs:
+ - Floppy hookup is close but doesn't work.
+ - S3000 and CD3000i don't find any sample RAM. The XL models and S2000
+ both use the MPC3000 approach of actually testing the memory and find
+ all 32 megs fine. This appears to be related to the other bits in the
+ ID register.
+ - XL models don't read the key matrix properly, and it's unclear why
+ at the moment. The scanning pattern looks identical to the non-XLs.
+
+***************************************************************************/
+
+#include "emu.h"
+
+#include "bus/midi/midi.h"
+#include "bus/nscsi/devices.h"
+#include "cpu/nec/v5x.h"
+#include "imagedev/floppy.h"
+#include "formats/dfi_dsk.h"
+#include "formats/dsk_dsk.h"
+#include "formats/hxchfe_dsk.h"
+#include "formats/hxcmfm_dsk.h"
+#include "formats/imd_dsk.h"
+#include "formats/ipf_dsk.h"
+#include "formats/mfi_dsk.h"
+#include "formats/td0_dsk.h"
+#include "formats/pc_dsk.h"
+#include "machine/74259.h"
+#include "machine/i8255.h"
+#include "machine/input_merger.h"
+#include "machine/mb87030.h"
+#include "machine/output_latch.h"
+#include "machine/pit8253.h"
+#include "machine/upd765.h"
+#include "sound/l7a1045_l6028_dsp_a.h"
+#include "video/hd44780.h"
+#include "video/hd61830.h"
+
+#include "emupal.h"
+#include "screen.h"
+#include "softlist_dev.h"
+#include "speaker.h"
+
+class s3000_state : public driver_device
+{
+public:
+ s3000_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag)
+ , m_maincpu(*this, "maincpu")
+ , m_screen(*this, "screen")
+ , m_lcdc(*this, "lcdc")
+ , m_s2klcd(*this, "s2klcd")
+ , m_dsp(*this, "dsp")
+ , m_mdout(*this, "mdout")
+ , m_fdc(*this, "fdc")
+ , m_floppy(*this, "fdc:0")
+ , m_klcs(*this, "klcs")
+ , m_ledlatch(*this, "ledlatch")
+ , m_keys(*this, "C%u", 0)
+ , m_key_scan_row(0)
+ { }
+
+ void s2000(machine_config &config);
+ void s3000(machine_config &config);
+ void s3000xl(machine_config &config);
+ void cd3000(machine_config &config);
+ void cd3000xl(machine_config &config);
+
+private:
+ required_device<v53a_device> m_maincpu;
+ required_device<screen_device> m_screen;
+ optional_device<hd61830_device> m_lcdc;
+ optional_device<hd44780_device> m_s2klcd;
+ required_device<l7a1045_sound_device> m_dsp;
+ required_device<midi_port_device> m_mdout;
+ required_device<upd72069_device> m_fdc;
+ required_device<floppy_connector> m_floppy;
+ required_device<i8255_device> m_klcs;
+ required_device<output_latch_device> m_ledlatch;
+ required_ioport_array<8> m_keys;
+
+ static void floppies(device_slot_interface &device);
+
+ virtual void machine_start() override ATTR_COLD;
+ virtual void machine_reset() override ATTR_COLD;
+
+ void s2000_map(address_map &map) ATTR_COLD;
+ void s3000_map(address_map &map) ATTR_COLD;
+ void s3000xl_map(address_map &map) ATTR_COLD;
+ void s2000_io_map(address_map &map) ATTR_COLD;
+ void s3000_io_map(address_map &map) ATTR_COLD;
+ void s3000xl_io_map(address_map &map) ATTR_COLD;
+ void cd3000_io_map(address_map &map) ATTR_COLD;
+ void cd3000xl_io_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 s3000_palette(palette_device &palette) const;
+
+ uint8_t id_r();
+ uint8_t cd_id_r();
+
+ uint8_t klcs_porta_r();
+ void klcs_portb_w(uint8_t data);
+
+ HD44780_PIXEL_UPDATE(lcd_pixel_update);
+
+ uint8_t m_key_scan_row;
+};
+
+void s3000_state::machine_start()
+{
+}
+
+void s3000_state::machine_reset()
+{
+ m_maincpu->cts_w(CLEAR_LINE); // grounded on schematic
+ m_fdc->ready_w(ASSERT_LINE);
+}
+
+void s3000_state::s2000_map(address_map &map)
+{
+ map(0x000000, 0x07ffff).ram(); // 2x HM514260 256kx16 = 512K
+ map(0x0f8000, 0x0fffff).rom().region("maincpu", 0);
+ map(0x180000, 0x19ffff).ram();
+}
+
+void s3000_state::s3000_map(address_map &map)
+{
+ map(0x000000, 0x0bffff).ram(); // 2x HM514260 256kx16 = 512K
+ map(0x0c0000, 0x0fffff).rom().region("maincpu", 0);
+}
+
+void s3000_state::s3000xl_map(address_map &map)
+{
+ map(0x000000, 0x07ffff).ram();
+ map(0x080000, 0x0fffff).rom().region("maincpu", 0);
+ map(0x180000, 0x1fffff).ram();
+}
+
+// 0 = SPCS (SCSI)
+// 2 = FDCS (FDC)
+// 4 = KLCS (keyboard/LEDs/controls)
+// 6 = LCDCS (LCD controller)
+// 8 = NSCS (DSP)
+// a = FXCS (effects DSP - XL models only)
+// c = WADCS (A/D converter - XL models only)
+// e = FILCS (filter control - XL models only)
+void s3000_state::s2000_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(0x0050, 0x0057).rw(m_klcs, FUNC(i8255_device::read), FUNC(i8255_device::write)).umask16(0x00ff);
+ map(0x0060, 0x0060).rw(m_s2klcd, FUNC(hd44780_device::data_r), FUNC(hd44780_device::data_w)).umask16(0x00ff);
+ map(0x0062, 0x0062).rw(m_s2klcd, FUNC(hd44780_device::control_r), FUNC(hd44780_device::control_w)).umask16(0x00ff);
+ map(0x0080, 0x008f).m(m_dsp, FUNC(l7a1045_sound_device::map));
+ map(0x00a0, 0x00a5).nopw(); // quiet writes to the effects DSP
+}
+
+void s3000_state::s3000_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(0x0048, 0x0048).rw(m_lcdc, FUNC(hd61830_device::data_r), FUNC(hd61830_device::data_w)).umask16(0x00ff);
+ map(0x004a, 0x004a).rw(m_lcdc, FUNC(hd61830_device::status_r), FUNC(hd61830_device::control_w)).umask16(0x00ff);
+ map(0x0050, 0x0057).rw(m_klcs, FUNC(i8255_device::read), FUNC(i8255_device::write)).umask16(0x00ff);
+ map(0x0060, 0x0061).r(FUNC(s3000_state::id_r)).umask16(0x00ff);
+ map(0x0080, 0x008f).m(m_dsp, FUNC(l7a1045_sound_device::map));
+ map(0x00a0, 0x00a5).nopw(); // quiet writes to the effects DSP
+}
+
+void s3000_state::cd3000_io_map(address_map &map)
+{
+ s3000_io_map(map);
+ map(0x0060, 0x0061).r(FUNC(s3000_state::cd_id_r)).umask16(0x00ff);
+}
+
+void s3000_state::s3000xl_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(0x0050, 0x0057).rw(m_klcs, FUNC(i8255_device::read), FUNC(i8255_device::write)).umask16(0x00ff);
+ map(0x0060, 0x0060).rw(m_lcdc, FUNC(hd61830_device::data_r), FUNC(hd61830_device::data_w)).umask16(0x00ff);
+ map(0x0062, 0x0062).rw(m_lcdc, FUNC(hd61830_device::status_r), FUNC(hd61830_device::control_w)).umask16(0x00ff);
+ map(0x0080, 0x008f).m(m_dsp, FUNC(l7a1045_sound_device::map));
+ map(0x00a0, 0x00a5).nopw(); // quiet writes to the effects DSP
+}
+
+void s3000_state::cd3000xl_io_map(address_map &map)
+{
+ s3000xl_io_map(map);
+ map(0x0060, 0x0061).r(FUNC(s3000_state::cd_id_r)).umask16(0x00ff);
+}
+
+// stock wave memory is 4x HM514400 1Mx4 = 2 MiB
+void s3000_state::dsp_map(address_map &map)
+{
+ map(0x0000'0000, 0x01ff'ffff).ram();
+}
+
+// 00 = CD3000i (invalid with S3000/3200 ROM)
+// 40 = S3200?
+// 80 = S3000?
+// C0 = S3000XL?
+// other bits involved in SIMM detection
+uint8_t s3000_state::id_r()
+{
+ return 0x80;
+}
+
+uint8_t s3000_state::cd_id_r()
+{
+ return 0x00;
+}
+
+uint8_t s3000_state::klcs_porta_r()
+{
+ return m_keys[m_key_scan_row]->read();
+}
+
+void s3000_state::klcs_portb_w(uint8_t data)
+{
+ m_key_scan_row = data ^ 0xff;
+ if (m_key_scan_row != 0)
+ {
+ m_key_scan_row = count_leading_zeros_32(m_key_scan_row) - 24;
+ }
+}
+
+HD44780_PIXEL_UPDATE(s3000_state::lcd_pixel_update)
+{
+ if (x < 5 && y < 8 && line < 2 && pos < 16)
+ {
+ bitmap.pix(line * 8 + y, pos * 6 + x) = state;
+ }
+}
+
+uint16_t s3000_state::dma_mem16r_cb(offs_t offset)
+{
+ return m_maincpu->space(AS_PROGRAM).read_word(offset << 1);
+}
+
+void s3000_state::dma_mem16w_cb(offs_t offset, uint16_t data)
+{
+ m_maincpu->space(AS_PROGRAM).write_word(offset << 1, data);
+}
+
+uint8_t s3000_state::dma_memr_cb(offs_t offset)
+{
+ return m_maincpu->space(AS_PROGRAM).read_byte(offset);
+}
+
+void s3000_state::dma_memw_cb(offs_t offset, uint8_t data)
+{
+ m_maincpu->space(AS_PROGRAM).write_byte(offset, 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));
+}
+
+void s3000_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 s3000_state::s3000(machine_config &config)
+{
+ V53A(config, m_maincpu, 32_MHz_XTAL);
+ m_maincpu->set_addrmap(AS_PROGRAM, &s3000_state::s3000_map);
+ m_maincpu->set_addrmap(AS_IO, &s3000_state::s3000_io_map);
+ m_maincpu->out_hreq_cb().set(m_maincpu, FUNC(v53a_device::hack_w));
+ m_maincpu->in_memr_cb().set(FUNC(s3000_state::dma_memr_cb));
+ m_maincpu->out_memw_cb().set(FUNC(s3000_state::dma_memw_cb));
+ m_maincpu->in_mem16r_cb().set(FUNC(s3000_state::dma_mem16r_cb));
+ m_maincpu->out_mem16w_cb().set(FUNC(s3000_state::dma_mem16w_cb));
+ m_maincpu->out_eop_cb().set("tc", FUNC(input_merger_device::in_w<0>));
+ m_maincpu->out_dack_cb<1>().set("tc", FUNC(input_merger_device::in_w<1>));
+ m_maincpu->sint_handler_cb().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
+ m_maincpu->txrdy_handler_cb().set_inputline(m_maincpu, INPUT_LINE_IRQ4);
+
+ 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<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);
+ m_maincpu->v53_tout_handler<0>().set_inputline(m_maincpu, INPUT_LINE_IRQ1);
+ m_maincpu->v53_tout_handler<1>().set_inputline(m_maincpu, INPUT_LINE_IRQ6);
+ // timer 2 is the clock for the LCD controller
+
+ constexpr XTAL V53_CLKOUT = 32_MHz_XTAL / 2;
+// constexpr XTAL V53_PCLKOUT = 32_MHz_XTAL / 4;
+
+ INPUT_MERGER_ALL_HIGH(config, "tc").output_handler().set(m_fdc, FUNC(upd72069_device::tc_line_w));
+
+ SCREEN(config, m_screen, SCREEN_TYPE_LCD);
+ m_screen->set_refresh_hz(80);
+ m_screen->set_screen_update("lcdc", FUNC(hd61830_device::screen_update));
+ m_screen->set_size(240, 64); //6x20, 8x8
+ m_screen->set_visarea(0, 240-1, 0, 64-1);
+ m_screen->set_palette("palette");
+
+ PALETTE(config, "palette", FUNC(s3000_state::s3000_palette), 2);
+
+ UPD72069(config, m_fdc, V53_CLKOUT);
+ m_fdc->set_ready_line_connected(false); // uPD READY pin is grounded on schematic
+ m_fdc->intrq_wr_callback().set(m_maincpu, FUNC(v53a_device::dsr_w));
+ m_fdc->drq_wr_callback().set(m_maincpu, FUNC(v53a_device::dreq_w<1>));
+
+ FLOPPY_CONNECTOR(config, m_floppy, s3000_state::floppies, "35hd", add_formats).enable_sound(true);
+
+ HD61830(config, m_lcdc, 4.9152_MHz_XTAL / 2 / 2); // LC7981
+
+ midiout_slot(MIDI_PORT(config, "mdout"));
+
+ 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>));
+ });
+
+ // led0 - Select Program
+ // led1 - Edit Sample
+ // led2 - Edit Program
+ // led3 - MIDI
+ // led4 - Disk
+ // led5 - Tune Level
+ // led6 - Utility
+ // led7 - Help
+ OUTPUT_LATCH(config, m_ledlatch);
+ m_ledlatch->bit_handler<0>().set_output("led0").invert();
+ m_ledlatch->bit_handler<1>().set_output("led1").invert();
+ m_ledlatch->bit_handler<2>().set_output("led2").invert();
+ m_ledlatch->bit_handler<3>().set_output("led3").invert();
+ m_ledlatch->bit_handler<4>().set_output("led4").invert();
+ m_ledlatch->bit_handler<5>().set_output("led5").invert();
+ m_ledlatch->bit_handler<6>().set_output("led6").invert();
+ m_ledlatch->bit_handler<7>().set_output("led7").invert();
+
+ I8255(config, m_klcs); // MB89255B
+ m_klcs->in_pa_callback().set(FUNC(s3000_state::klcs_porta_r));
+ m_klcs->out_pb_callback().set(FUNC(s3000_state::klcs_portb_w));
+ m_klcs->out_pc_callback().set(m_ledlatch, FUNC(output_latch_device::write));
+
+ SPEAKER(config, "speaker", 2).front();
+
+ L7A1045(config, m_dsp, 33.8688_MHz_XTAL); // clock verified by schematic
+ 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);
+ m_dsp->add_route(l7a1045_sound_device::L6028_RIGHT, "speaker", 1.0, 1);
+}
+
+void s3000_state::s2000(machine_config &config)
+{
+ s3000(config);
+ m_maincpu->set_clock(31.9488_MHz_XTAL);
+ m_maincpu->set_addrmap(AS_PROGRAM, &s3000_state::s2000_map);
+ m_maincpu->set_addrmap(AS_IO, &s3000_state::s2000_io_map);
+
+ config.device_remove("lcdc");
+
+ HD44780(config, m_s2klcd, 4.9152_MHz_XTAL / 4); // HD44780
+ m_s2klcd->set_lcd_size(2, 16);
+ m_s2klcd->set_pixel_update_cb(FUNC(s3000_state::lcd_pixel_update));
+
+ m_screen->set_screen_update(m_s2klcd, FUNC(hd44780_device::screen_update));
+ m_screen->set_size(6 * 16, 8 * 2);
+ m_screen->set_visarea_full();
+}
+
+void s3000_state::cd3000(machine_config &config)
+{
+ s3000(config);
+ m_maincpu->set_addrmap(AS_IO, &s3000_state::cd3000_io_map);
+}
+
+void s3000_state::s3000xl(machine_config &config)
+{
+ s3000(config);
+ m_maincpu->set_addrmap(AS_PROGRAM, &s3000_state::s3000xl_map);
+ m_maincpu->set_addrmap(AS_IO, &s3000_state::s3000xl_io_map);
+}
+
+void s3000_state::cd3000xl(machine_config &config)
+{
+ s3000(config);
+ m_maincpu->set_addrmap(AS_PROGRAM, &s3000_state::s3000xl_map);
+ m_maincpu->set_addrmap(AS_IO, &s3000_state::cd3000xl_io_map);
+}
+
+// KC = port A, KR = port B, KD = port C
+// 0 1 2 3 4
+// 0 HELP F8 1/W 0/Z
+// 1 UTILITIES F7 2/X +/< RIGHT
+// 2 TUNE/LEVEL F6 MARK/# JUMP/. UP
+// 3 DISK/E F5 9/S 6/R
+// 4 MIDI/D F4 8/V 5/U
+// 5 EDIT P/C F3 7/Q 4/T
+// 6 EDIT S/B F2 NAME ENT/PLAY DOWN
+// 7 SELECT P/A F1 3/Y -/> LEFT
+static INPUT_PORTS_START(s3000)
+ PORT_START("C0")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Help") PORT_CODE(KEYCODE_Q)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F8") PORT_CODE(KEYCODE_F8)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("1 / W") PORT_CODE(KEYCODE_1)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("0 / Z") PORT_CODE(KEYCODE_0)
+ PORT_BIT(0xf0, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_START("C1")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Utilities") PORT_CODE(KEYCODE_W)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F7") PORT_CODE(KEYCODE_F7)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("2 / X") PORT_CODE(KEYCODE_2)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("+ / <") PORT_CODE(KEYCODE_EQUALS)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_RIGHT) PORT_NAME("Right Arrow")
+ PORT_BIT(0xe0, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_START("C2")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Tune / Level") PORT_CODE(KEYCODE_E)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F6") PORT_CODE(KEYCODE_F6)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Mark / #") PORT_CODE(KEYCODE_A)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Jump / .") PORT_CODE(KEYCODE_S)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_UP) PORT_NAME("Up Arrow")
+ PORT_BIT(0xe0, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_START("C3")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Disk / E") PORT_CODE(KEYCODE_R)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F5") PORT_CODE(KEYCODE_F5)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("9 / S") PORT_CODE(KEYCODE_9)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("6 / R") PORT_CODE(KEYCODE_6)
+ PORT_BIT(0xf0, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_START("C4")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("MIDI / D") PORT_CODE(KEYCODE_T)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F4") PORT_CODE(KEYCODE_F4)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("8 / V") PORT_CODE(KEYCODE_8)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("5 / U") PORT_CODE(KEYCODE_5)
+ PORT_BIT(0xf0, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_START("C5")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Edit Prog / K") PORT_CODE(KEYCODE_Y)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F3") PORT_CODE(KEYCODE_F3)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("7 / Q") PORT_CODE(KEYCODE_7)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("4 / T") PORT_CODE(KEYCODE_4)
+ PORT_BIT(0xf0, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_START("C6")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Edit Sample / J") PORT_CODE(KEYCODE_Y)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F2 / B") PORT_CODE(KEYCODE_F2)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Name") PORT_CODE(KEYCODE_D)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Enter/Play") PORT_CODE(KEYCODE_ENTER)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_DOWN) PORT_NAME("Down Arrow")
+ PORT_BIT(0xe0, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_START("C7")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Select Prog / I") PORT_CODE(KEYCODE_U)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F1 / A") PORT_CODE(KEYCODE_F1)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("3 / Y") PORT_CODE(KEYCODE_3)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("- / >") PORT_CODE(KEYCODE_MINUS)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LEFT) PORT_NAME("Left Arrow")
+ PORT_BIT(0xe0, IP_ACTIVE_LOW, IPT_UNUSED)
+INPUT_PORTS_END
+
+static INPUT_PORTS_START(s2000)
+ PORT_START("C0")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Page Down") PORT_CODE(KEYCODE_H)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Edit") PORT_CODE(KEYCODE_A)
+ PORT_BIT(0xfc, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_START("C1")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Page Up") PORT_CODE(KEYCODE_Y)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Single") PORT_CODE(KEYCODE_Q)
+ PORT_BIT(0xfc, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_START("C2")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Load") PORT_CODE(KEYCODE_F)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F1") PORT_CODE(KEYCODE_F1)
+ PORT_BIT(0xfc, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_START("C3")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Effects") PORT_CODE(KEYCODE_R)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Global") PORT_CODE(KEYCODE_S)
+ PORT_BIT(0xfc, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_START("C4")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Group Down") PORT_CODE(KEYCODE_K)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Multi") PORT_CODE(KEYCODE_W)
+ PORT_BIT(0xfc, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_START("C5")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Group Up") PORT_CODE(KEYCODE_I)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F2") PORT_CODE(KEYCODE_F2)
+ PORT_BIT(0xfc, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_START("C6")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Play") PORT_CODE(KEYCODE_G)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Save") PORT_CODE(KEYCODE_D)
+ PORT_BIT(0xfc, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_START("C7")
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Sample") PORT_CODE(KEYCODE_E)
+ PORT_BIT(0xfd, IP_ACTIVE_LOW, IPT_UNUSED)
+INPUT_PORTS_END
+
+ROM_START( s2000 )
+ ROM_REGION(0x8000, "maincpu", 0) // V53 code
+ ROM_SYSTEM_BIOS(0, "default", "ver 1.5")
+ ROMX_LOAD( "akai s2000 1.5.bin", 0x000000, 0x008000, CRC(c65de1f8) SHA1(a0f823be95d10c019e997ecfa3eeaa9c88420263), ROM_BIOS(0) )
+
+ ROM_SYSTEM_BIOS(1, "v10", "ver 1.0")
+ ROMX_LOAD( "akai s2000 version 1.0.bin", 0x000000, 0x008000, CRC(316bba63) SHA1(c794311ca0c249beda4b36833719d92cc7e45ac5), ROM_BIOS(1) )
+ROM_END
+
+ROM_START( s3000 )
+ ROM_REGION(0x40000, "maincpu", 0) // V53 code
+ ROM_SYSTEM_BIOS(0, "default", "ver 2.0")
+ ROMX_LOAD("akai s3x00 v2.0 low.bin", 0x000000, 0x020000, CRC(12a657c9) SHA1(ba77af24b647a2edcd1ff67c5b16e3103efb8039), ROM_SKIP(1) | ROM_BIOS(0))
+ ROMX_LOAD("akai s3x00 v2.0 high.bin", 0x000001, 0x020000, CRC(1763a18d) SHA1(95042987ef6f6e63dae1b4771f4841d605af5695), ROM_SKIP(1) | ROM_BIOS(0))
+
+ ROM_SYSTEM_BIOS(1, "ver15", "ver 1.50")
+ ROMX_LOAD( "akai s3000 1.50 lsb.bin", 0x000000, 0x020000, CRC(071b614c) SHA1(f349ddebf8d7e0b2bb2a63302f668aa0283c2805), ROM_SKIP(1) | ROM_BIOS(1) )
+ ROMX_LOAD( "akai s3000 1.50 msb.bin", 0x000001, 0x020000, CRC(a951216b) SHA1(98e1887a07221cc556aa315db4cba1a176a323be), ROM_SKIP(1) | ROM_BIOS(1) )
+ROM_END
+
+ROM_START( cd3000i )
+ ROM_REGION(0x40000, "maincpu", 0) // V53 code
+ ROM_SYSTEM_BIOS(0, "default", "ver 2.00")
+ ROMX_LOAD( "cd3000_v2_0_lo.bin", 0x000000, 0x020000, CRC(6e59a979) SHA1(153e8186aa2b56a73abc112b0a6f13bffceb7c6b), ROM_SKIP(1) | ROM_BIOS(0))
+ ROMX_LOAD( "cd3000_v2_0_hi.bin", 0x000001, 0x020000, CRC(da737625) SHA1(eb1c73400f476086c489700d27f6f8ab8f514a0d), ROM_SKIP(1) | ROM_BIOS(0))
+
+ ROM_SYSTEM_BIOS(1, "ver16", "ver 1.60")
+ ROMX_LOAD("akai_cd3000i_ls_v1.60.bin", 0x000000, 0x020000, CRC(378af711) SHA1(53fd853e2d5dcd757952ba9a68cdaedae65e0fbb), ROM_SKIP(1) | ROM_BIOS(1))
+ ROMX_LOAD("akai_cd3000i_ms_v1.60.bin", 0x000001, 0x020000, CRC(5a4f5cf4) SHA1(f3400f2938d803c76690bbf00c9e4d50099acb7e), ROM_SKIP(1) | ROM_BIOS(1))
+ROM_END
+
+ROM_START( s3000xl )
+ ROM_REGION(0x80000, "maincpu", 0) // V53 code
+
+ ROM_SYSTEM_BIOS(0, "default", "ver 2.00")
+ ROMX_LOAD( "s3000xl_v2_0.bin", 0x000000, 0x080000, CRC(26a00ddd) SHA1(ace009953aeccff4dfbee0ccfa091a0fea39a386), ROM_BIOS(0) )
+
+ ROM_SYSTEM_BIOS(1, "ver15", "ver 1.50")
+ ROMX_LOAD( "akai s3000xl v1-50.bin", 0x000000, 0x080000, CRC(01a195ce) SHA1(24160094fa4acb6d6c4d097b7f63b309ed0945cc), ROM_BIOS(1) )
+
+ ROM_SYSTEM_BIOS(2, "ver106", "ver 1.06")
+ ROMX_LOAD( "akai s3000xl v1-06.bin", 0x000000, 0x080000, CRC(f251faf8) SHA1(b8e3a26ac42fa4a5c7bd1a3a87a866934b0d7a6b), ROM_BIOS(2) )
+ROM_END
+
+ROM_START( cd3000xl )
+ ROM_REGION(0x80000, "maincpu", 0) // V53 code
+ ROM_LOAD( "akai - cd3000xl - osv2.00.bin", 0x000000, 0x080000, CRC(6d4cc4ff) SHA1(89ee642e8e18e0ce218bb4766b620690323c26cc) )
+ROM_END
+
+CONS( 1993, s2000, 0, 0, s2000, s2000, s3000_state, empty_init, "Akai", "S2000", MACHINE_NOT_WORKING )
+CONS( 1993, s3000, 0, 0, s3000, s3000, s3000_state, empty_init, "Akai", "S3000", MACHINE_NOT_WORKING )
+CONS( 1993, cd3000i, 0, 0, cd3000, s3000, s3000_state, empty_init, "Akai", "CD3000i", MACHINE_NOT_WORKING)
+CONS( 1994, s3000xl, 0, 0, s3000xl, s3000, s3000_state, empty_init, "Akai", "S3000XL", MACHINE_NOT_WORKING)
+CONS( 1994, cd3000xl, 0, 0, cd3000xl, s3000, s3000_state, empty_init, "Akai", "CD3000XL", MACHINE_NOT_WORKING)
diff --git a/src/mame/mame.lst b/src/mame/mame.lst
index ba57ed4e4ab..9b563680bdf 100644
--- a/src/mame/mame.lst
+++ b/src/mame/mame.lst
@@ -523,6 +523,13 @@ mpc60
@source:akai/mpc3000.cpp
mpc3000
+@source:akai/s3000.cpp
+s2000
+s3000
+s3000xl
+cd3000i
+cd3000xl
+
@source:alesis/alesis.cpp
hr16
hr16b