diff options
| author | 2026-05-18 22:04:45 -0400 | |
|---|---|---|
| committer | 2026-05-18 22:04:45 -0400 | |
| commit | ef50d5e77de806c6afb0f15741440d45e4919abc (patch) | |
| tree | c6eaae8d769fe2979f25512b480464648671b2e4 /src | |
| parent | fb98bbe747f1882b315262e37b3bac2b6cdf98ad (diff) | |
akai/mpc60.cpp: Updates [R. Belmont]
- Added a clone supporting the aftermarket SCSI option and 2.14 BIOS
- Fixed a few mis-routed buttons and LEDs in the layout
- Upgraded from MACHINE_NO_SOUND to MACHINE_IMPERFECT_SOUND
- Added a software list with a good chunk of the factory disks
New clones marked not working
-----------------------------
MPC60 MIDI Production Center (with SCSI) [R. Belmont, DBWBP.com]]
New working software list items
-------------------------------
mpc60_flop.xml: MPC60 Disk 1 - Studio Set, MPC60 Disk 2 - Rock Set, MPC60 Disk 3 - Dry Set, MPC60 Disk 4 - Synth Set,
MPC60 Sound Library SL601 - Samba Set, MPC60 Sound Library SL602 - Ambience Set, MPC60 Sound Library SL604 - Loft Drum,
MPC60 Sound Library SL605 - Real Drum, MPC60 Sound Library SL606 - Solid Drum, MPC60 Sound Library SL607 - Native Drum,
MPC60 Sound Library SL608 - Live Drum, MPC60 Sound Library SL609 - LA-1 Set, MPC60 Sound Library SL610 - UK-1 Set,
MPC60 Sound Library SL612 - Power Drum, MPC60 Sound Library SL613 - Metal Drum, MPC60 Sound Library SL614 - UK-2 Set,
MPC60 Sound Library SL615 - UK-3 Set, MPC60 Sound Library SL616 - UK-4 Set, MPC60 Sound Library SL617 - UK-5 Set,
MPC60 Sound Library SL618 - UK-6 Set, MPC60 Sound Library SL619 - UK-7 Set, MPC60 Sound Library SL620 - UK-8 Set [R-Massive]
MPC60 Sound Library SL101 - Percussion 1, MPC60 Sound Library SL102 - Live Kit 1, MPC60 Sound Library SL103 - Live Kit 2,
MPC60 Sound Library SL104 - Gated Kit, MPC60 Sound Library SL105 - Electronic Drums 1, MPC60 Sound Library SL106 - Percussion 2,
MPC60 Sound Library SL107 - Tuned Percussion, MPC60 Sound Library SL108 - 808 & 909 Kits, MPC60 Sound Library SL109 - Live Kit 3,
MPC60 Sound Library SL110 - Live Kit 4, MPC60 Sound Library SL111 - Live Kit 5 [soundarchive.co]
Diffstat (limited to 'src')
| -rw-r--r-- | src/mame/akai/mpc60.cpp | 121 | ||||
| -rw-r--r-- | src/mame/layout/mpc60.lay | 12 | ||||
| -rw-r--r-- | src/mame/mame.lst | 1 |
3 files changed, 118 insertions, 16 deletions
diff --git a/src/mame/akai/mpc60.cpp b/src/mame/akai/mpc60.cpp index b0b732db9f9..2e856e73dd8 100644 --- a/src/mame/akai/mpc60.cpp +++ b/src/mame/akai/mpc60.cpp @@ -2,23 +2,29 @@ // copyright-holders:AJR, R. Belmont /*************************************************************************** - mpc60.cpp - Akai / Roger Linn MPC3000 music workstation + mpc60.cpp - Akai / Roger Linn MPC60 music workstation Driver by R. Belmont and AJR + This driver includes support for the Marion Systems SCSI option board, + which gives the machine much-needed mass storage capabilities. Even + without using IRQs or DMA, the SCSI is still much faster than the DSDD + floppy drive. + Hardware: - CPU: 80186 at 10 MHz - Floppy: uPD72065 + CPU: 80186 at 10 MHz (input clock 20 MHz, internal /2) + Floppy: uPD72066 LCD: LC7981 UARTs: MB89371 (x2) Panel controller CPU: NEC uPD78C11 @ 12 MHz - (internal ROM is not dumped but the panel works fine without it) Sound DSP: L4003 + SCSI: NCR5380 ***************************************************************************/ #include "emu.h" #include "bus/midi/midi.h" +#include "bus/nscsi/devices.h" #include "cpu/i86/i186.h" #include "cpu/upd7810/upd7810.h" #include "formats/dfi_dsk.h" @@ -36,6 +42,7 @@ #include "machine/i8255.h" #include "machine/input_merger.h" #include "machine/mb89371.h" +#include "machine/ncr5380.h" #include "machine/nvram.h" #include "machine/timer.h" #include "machine/upd765.h" @@ -44,6 +51,7 @@ #include "emupal.h" #include "screen.h" +#include "softlist_dev.h" #include "speaker.h" #include "mpc60.lh" @@ -88,6 +96,10 @@ protected: virtual void machine_start() override ATTR_COLD; virtual void machine_reset() override ATTR_COLD; + void io_map(address_map &map) ATTR_COLD; + + required_device<cpu_device> m_maincpu; + private: u8 nvram_r(offs_t offset); void nvram_w(offs_t offset, u8 data); @@ -98,7 +110,6 @@ private: void mpc60_palette(palette_device &palette) const; void mem_map(address_map &map) ATTR_COLD; - void io_map(address_map &map) ATTR_COLD; void panel_map(address_map &map) ATTR_COLD; void lcd_map(address_map &map) ATTR_COLD; void dsp_map(address_map &map) ATTR_COLD; @@ -119,7 +130,6 @@ private: TIMER_DEVICE_CALLBACK_MEMBER(dial_timer_tick); - required_device<cpu_device> m_maincpu; required_device<upd7810_device> m_panelcpu; required_device<l4003_sound_device> m_dsp; required_device<upd72065_device> m_fdc; @@ -130,7 +140,7 @@ private: required_device<hc259_device> m_loled, m_hiled; required_ioport_array<8> m_keys; required_ioport_array<4> m_drums; - required_ioport m_dataentry; + required_ioport m_dataentry; std::unique_ptr<u8[]> m_nvram_data; @@ -140,6 +150,28 @@ private: uint8_t m_ppi_portc; }; +class mpc60_scsi_state: public mpc60_state +{ +public: + mpc60_scsi_state(const machine_config &mconfig, device_type type, const char *tag) + : mpc60_state(mconfig, type, tag), + m_ncr5380(*this, "ncr5380"), + m_scsibus(*this, "scsi") + { + } + + void mpc60_scsi(machine_config &config); + +private: + uint8_t scsi_dma_r(); + void scsi_dma_w(uint8_t data); + + void scsi_io_map(address_map &map) ATTR_COLD; + + required_device<ncr5380_device> m_ncr5380; + required_device<nscsi_bus_device> m_scsibus; +}; + void mpc60_state::machine_start() { m_nvram_data = make_unique_clear<u8[]>(0x800); @@ -199,6 +231,23 @@ void mpc60_state::io_map(address_map &map) map(0x0200, 0x0207).rw(m_ppi, FUNC(i8255_device::read), FUNC(i8255_device::write)).umask16(0x00ff); } +void mpc60_scsi_state::scsi_io_map(address_map &map) +{ + mpc60_state::io_map(map); + map(0x0220, 0x023f).m(m_ncr5380, FUNC(ncr5380_device::map)).umask16(0x00ff); + map(0x0230, 0x0231).rw(FUNC(mpc60_scsi_state::scsi_dma_r), FUNC(mpc60_scsi_state::scsi_dma_w)); +} + +uint8_t mpc60_scsi_state::scsi_dma_r() +{ + return m_ncr5380->dma_r(); +} + +void mpc60_scsi_state::scsi_dma_w(uint8_t data) +{ + m_ncr5380->dma_w(data); +} + void mpc60_state::panel_map(address_map &map) { map(0x4000, 0x5fff).rom().region("panel", 0); @@ -577,7 +626,7 @@ void mpc60_state::mpc60(machine_config &config) // IC8 - Rx is MIDI in 1 & 2, Tx is MIDI out 1 & 2 MB89371(config, m_sio[1], 20_MHz_XTAL / 4); m_sio[1]->rxrdy_handler<0>().set("rxrdy", FUNC(input_merger_device::in_w<1>)); - m_sio[1]->rxrdy_handler<0>().set("rxrdy", FUNC(input_merger_device::in_w<2>)); + m_sio[1]->rxrdy_handler<1>().set("rxrdy", FUNC(input_merger_device::in_w<2>)); m_sio[1]->txrdy_handler<0>().set("txrdy", FUNC(input_merger_device::in_w<2>)); m_sio[1]->txrdy_handler<1>().set("txrdy", FUNC(input_merger_device::in_w<3>)); m_sio[1]->txd_handler<0>().set("mdout1", FUNC(midi_port_device::write_txd)); @@ -642,11 +691,30 @@ void mpc60_state::mpc60(machine_config &config) m_midiclock->signal_handler().append(m_sio[1], FUNC(mb89371_device::write_txc<0>)); m_midiclock->signal_handler().append(m_sio[1], FUNC(mb89371_device::write_txc<1>)); - //L4003(config, "voicelsi", 35.84_MHz_XTAL); + SOFTWARE_LIST(config, "flop_mpc60").set_original("mpc60_flop"); config.set_default_layout(layout_mpc60); } +void mpc60_scsi_state::mpc60_scsi(machine_config &config) +{ + mpc60(config); + + m_maincpu->set_addrmap(AS_IO, &mpc60_scsi_state::scsi_io_map); + + NSCSI_BUS(config, m_scsibus); + NSCSI_CONNECTOR(config, "scsi:0", default_scsi_devices, "harddisk", false); + NSCSI_CONNECTOR(config, "scsi:1", default_scsi_devices, nullptr, false); + NSCSI_CONNECTOR(config, "scsi:2", default_scsi_devices, nullptr, false); + NSCSI_CONNECTOR(config, "scsi:3", default_scsi_devices, nullptr, false); + NSCSI_CONNECTOR(config, "scsi:4", default_scsi_devices, nullptr, false); + NSCSI_CONNECTOR(config, "scsi:5", default_scsi_devices, nullptr, false); + NSCSI_CONNECTOR(config, "scsi:6", default_scsi_devices, nullptr, false); + + NCR5380(config, m_ncr5380, 16_MHz_XTAL / 2); + m_scsibus->set_external_device(7, m_ncr5380); +} + ROM_START(mpc60) ROM_REGION16_LE(0x40000, "program", 0) ROM_SYSTEM_BIOS(0, "v212", "v2.12") // V2.12 CPU ROMs (MBM27C512-20) @@ -654,6 +722,7 @@ ROM_START(mpc60) ROMX_LOAD("mp6cpu3.ic3", 0x00001, 0x10000, CRC(f068838b) SHA1(42e815880d1c1a5b7d1c7933aad9c28410fc2627), ROM_BIOS(0) | ROM_SKIP(1)) ROMX_LOAD("mp6cpu1.ic4", 0x20000, 0x10000, CRC(1271bc73) SHA1(99fd6fa4c04e5bdf868e78072fec5b55c01350da), ROM_BIOS(0) | ROM_SKIP(1)) ROMX_LOAD("mpc6cpu4.ic5", 0x20001, 0x10000, CRC(d922a66d) SHA1(0f4bc0522b9826d617f4af72382d75853515d7f5), ROM_BIOS(0) | ROM_SKIP(1)) + ROM_SYSTEM_BIOS(1, "v112", "v1.12") ROMX_LOAD("mpc60_v1-12_2.ic2", 0x00000, 0x10000, CRC(ddf26146) SHA1(987547198dc3984ab3dfa7f133ba7dca702cc269), ROM_BIOS(1) | ROM_SKIP(1)) ROMX_LOAD("mpc60_v1-12_4.ic3", 0x00001, 0x10000, CRC(9725d193) SHA1(6efda3d6760b3951c5036108106d446f6e128c59), ROM_BIOS(1) | ROM_SKIP(1)) @@ -671,6 +740,38 @@ ROM_START(mpc60) ROM_LOAD("akai mpc60 panel eprom op v1-1 2764.ic2", 0x0000, 0x2000, CRC(f1332f47) SHA1(dd5e917d16941fce3db4bfe21d37f722d6262561)) ROM_END +ROM_START(mpc60scsi) + ROM_REGION16_LE(0x40000, "program", 0) + ROM_SYSTEM_BIOS(0, "v214", "v2.14") // V2.14 is identical to V2.12 but with SCSI support + ROMX_LOAD("mpc60_2_14_3.ic5", 0x000000, 0x010000, CRC(62a3da24) SHA1(c97c434e2fcba9097db2eb6c2b57637ffdefc085), ROM_BIOS(0) | ROM_SKIP(1)) + ROMX_LOAD("mpc60_2_14_4.ic3", 0x000001, 0x010000, CRC(63eb7c2d) SHA1(fa117d30db58a5a9c7456276bb0c65aec9a9aac2), ROM_BIOS(0) | ROM_SKIP(1)) + ROMX_LOAD("mpc60_2_14_1.ic4", 0x020000, 0x010000, CRC(6a452666) SHA1(52643a0f2799292eb69d2ea992427a402ba94da1), ROM_BIOS(0) | ROM_SKIP(1)) + ROMX_LOAD("mpc60_2_14_2.ic2", 0x020001, 0x010000, CRC(0cb5d810) SHA1(cdc6ee933d7e113055deb873ca22620b2e41a897), ROM_BIOS(0) | ROM_SKIP(1)) + + ROM_SYSTEM_BIOS(1, "v212", "v2.12") // V2.12 CPU ROMs (MBM27C512-20) + ROMX_LOAD("mp6cpu2.ic2", 0x00000, 0x10000, CRC(e71b1acb) SHA1(b56ddfff1c546fc21341b1a614e18da9726312f4), ROM_BIOS(1) | ROM_SKIP(1)) + ROMX_LOAD("mp6cpu3.ic3", 0x00001, 0x10000, CRC(f068838b) SHA1(42e815880d1c1a5b7d1c7933aad9c28410fc2627), ROM_BIOS(1) | ROM_SKIP(1)) + ROMX_LOAD("mp6cpu1.ic4", 0x20000, 0x10000, CRC(1271bc73) SHA1(99fd6fa4c04e5bdf868e78072fec5b55c01350da), ROM_BIOS(1) | ROM_SKIP(1)) + ROMX_LOAD("mpc6cpu4.ic5", 0x20001, 0x10000, CRC(d922a66d) SHA1(0f4bc0522b9826d617f4af72382d75853515d7f5), ROM_BIOS(1) | ROM_SKIP(1)) + + ROM_SYSTEM_BIOS(2, "v112", "v1.12") + ROMX_LOAD("mpc60_v1-12_2.ic2", 0x00000, 0x10000, CRC(ddf26146) SHA1(987547198dc3984ab3dfa7f133ba7dca702cc269), ROM_BIOS(2) | ROM_SKIP(1)) + ROMX_LOAD("mpc60_v1-12_4.ic3", 0x00001, 0x10000, CRC(9725d193) SHA1(6efda3d6760b3951c5036108106d446f6e128c59), ROM_BIOS(2) | ROM_SKIP(1)) + ROMX_LOAD("mpc60_v1-12_1.ic4", 0x20000, 0x10000, CRC(f202dbb1) SHA1(6fd82224a99b52b6c414b88d5c920abda32ffa32), ROM_BIOS(2) | ROM_SKIP(1)) + ROMX_LOAD("mpc60_v1-12_3.ic5", 0x20001, 0x10000, CRC(ba5a1640) SHA1(1f9f49c49a3682b9a44d614ac411a7c043df399e), ROM_BIOS(2) | ROM_SKIP(1)) + + ROM_REGION16_LE(0x10000, "waves", 0) + ROM_LOAD16_BYTE("mpc60_voice_1_v1-0.ic17", 0x00000, 0x08000, CRC(b8fdfe3e) SHA1(c2f0e1d8813d4178d2f883a3f3e461e036b56229)) // lowest nibble is unused + ROM_LOAD16_BYTE("mpc60_voice_2_v1-0.ic18", 0x00001, 0x08000, CRC(42f8e0a6) SHA1(a22dbefb9dafbb0c4095fd0bf4e63e67b5ec3b95)) + + ROM_REGION(0x1000, "panelcpu", 0) + ROM_LOAD("upd78c11g-044-36.ic1", 0x0000, 0x1000, CRC(59fee9fa) SHA1(830eea667e46437f9a65280bf59234107abe49c8)) + + ROM_REGION(0x2000, "panel", 0) + ROM_LOAD("akai mpc60 panel eprom op v1-1 2764.ic2", 0x0000, 0x2000, CRC(f1332f47) SHA1(dd5e917d16941fce3db4bfe21d37f722d6262561)) +ROM_END + } // anonymous namespace -SYST(1987, mpc60, 0, 0, mpc60, mpc60, mpc60_state, empty_init, "Akai Electric", "MPC60 MIDI Production Center", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) +SYST(1988, mpc60, 0, 0, mpc60, mpc60, mpc60_state, empty_init, "Akai Electric", "MPC60 MIDI Production Center", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_SOUND) +SYST(1988, mpc60scsi, mpc60, 0, mpc60_scsi, mpc60, mpc60_scsi_state, empty_init, "Akai Electric", "MPC60 MIDI Production Center (with SCSI)", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_SOUND) diff --git a/src/mame/layout/mpc60.lay b/src/mame/layout/mpc60.lay index 921374103d6..51fddfad9f0 100644 --- a/src/mame/layout/mpc60.lay +++ b/src/mame/layout/mpc60.lay @@ -369,22 +369,22 @@ <group name="left-buttons"> <!-- Full Level --> <element ref="button-black-outline1"><bounds x="20" y="140" width="270" height="126" /><color red="0" green="0" blue="0" /></element> - <element ref="button-white" inputtag="Y0" inputmask="0x04"> + <element ref="button-white" inputtag="Y0" inputmask="0x01"> <bounds x="35" y="155" width="240" height="96" /></element> <element ref="button-text-black-fulllevel"><bounds x="0" y="0" width="310" height="70" /><color red="0" green="0" blue="0" /></element> - <element ref="led"><bounds x="115" y="75" width="75" height="20" /><animate name="led10" /><color state="0" red="0.6" green="0" blue="0" /><color state="1" red="1.0" green="0" blue="0" /></element> + <element ref="led"><bounds x="115" y="75" width="75" height="20" /><animate name="led12" /><color state="0" red="0.6" green="0" blue="0" /><color state="1" red="1.0" green="0" blue="0" /></element> <!-- 16 Levels --> <element ref="button-black-outline1"><bounds x="20" y="465" width="270" height="126" /><color red="0" green="0" blue="0" /></element> - <element ref="button-white" inputtag="Y0" inputmask="0x01"> + <element ref="button-white" inputtag="Y0" inputmask="0x02"> <bounds x="35" y="480" width="240" height="96" /></element> <element ref="button-text-black-16levels"><bounds x="0" y="325" width="310" height="70" /><color red="0" green="0" blue="0" /></element> - <element ref="led"><bounds x="115" y="400" width="75" height="20" /><animate name="led12" /><color state="0" red="0.6" green="0" blue="0" /><color state="1" red="1.0" green="0" blue="0" /></element> + <element ref="led"><bounds x="115" y="400" width="75" height="20" /><animate name="led11" /><color state="0" red="0.6" green="0" blue="0" /><color state="1" red="1.0" green="0" blue="0" /></element> <!-- Bank 2 --> <element ref="button-black-outline1"><bounds x="20" y="790" width="270" height="126" /><color red="0" green="0" blue="0" /></element> - <element ref="button-white" inputtag="Y0" inputmask="0x02"> + <element ref="button-white" inputtag="Y0" inputmask="0x04"> <bounds x="35" y="805" width="240" height="96" /></element> <element ref="button-text-black-bank2"><bounds x="0" y="650" width="310" height="70" /><color red="0" green="0" blue="0" /></element> - <element ref="led"><bounds x="115" y="725" width="75" height="20" /><animate name="led11" /><color state="0" red="0.6" green="0" blue="0" /><color state="1" red="1.0" green="0" blue="0" /></element> + <element ref="led"><bounds x="115" y="725" width="75" height="20" /><animate name="led10" /><color state="0" red="0.6" green="0" blue="0" /><color state="1" red="1.0" green="0" blue="0" /></element> <!-- After --> <element ref="button-black-outline1"><bounds x="20" y="1115" width="270" height="126" /><color red="0" green="0" blue="0" /></element> <element ref="button-white" inputtag="Y0" inputmask="0x08"> diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 11d59d428cf..392fd6dd8fe 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -566,6 +566,7 @@ vx600 @source:akai/mpc60.cpp mpc60 +mpc60scsi @source:akai/mpc2000.cpp mpc2000xl |
