summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/mpc60.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/mpc60.cpp')
-rw-r--r--src/mame/drivers/mpc60.cpp183
1 files changed, 183 insertions, 0 deletions
diff --git a/src/mame/drivers/mpc60.cpp b/src/mame/drivers/mpc60.cpp
new file mode 100644
index 00000000000..45b53782cf4
--- /dev/null
+++ b/src/mame/drivers/mpc60.cpp
@@ -0,0 +1,183 @@
+// license:BSD-3-Clause
+// copyright-holders:AJR
+/***************************************************************************
+
+ Skeleton driver for Akai MPC60 MIDI Production Center.
+
+***************************************************************************/
+
+#include "emu.h"
+//#include "bus/midi/midi.h"
+#include "cpu/i86/i186.h"
+#include "cpu/upd7810/upd7811.h"
+#include "machine/i8255.h"
+#include "machine/nvram.h"
+#include "machine/upd765.h"
+#include "video/hd61830.h"
+#include "emupal.h"
+#include "screen.h"
+
+namespace {
+
+class mpc60_state : public driver_device
+{
+public:
+ mpc60_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag)
+ , m_maincpu(*this, "maincpu")
+ , m_panelcpu(*this, "panelcpu")
+ , m_fdc(*this, "fdc")
+ {
+ }
+
+ void mpc60(machine_config &config);
+
+protected:
+ virtual void machine_start() override;
+
+private:
+ u8 nvram_r(offs_t offset);
+ void nvram_w(offs_t offset, u8 data);
+ void fdc_tc_w(u8 data);
+
+ void mem_map(address_map &map);
+ void io_map(address_map &map);
+ void panel_map(address_map &map);
+ void lcd_map(address_map &map);
+
+ required_device<cpu_device> m_maincpu;
+ required_device<upd7810_device> m_panelcpu;
+ required_device<upd72065_device> m_fdc;
+
+ std::unique_ptr<u8[]> m_nvram_data;
+};
+
+void mpc60_state::machine_start()
+{
+ m_nvram_data = make_unique_clear<u8[]>(0x800);
+ subdevice<nvram_device>("nvram")->set_base(&m_nvram_data[0], 0x800);
+
+ save_pointer(NAME(m_nvram_data), 0x800);
+}
+
+u8 mpc60_state::nvram_r(offs_t offset)
+{
+ return m_nvram_data[offset];
+}
+
+void mpc60_state::nvram_w(offs_t offset, u8 data)
+{
+ m_nvram_data[offset] = data;
+}
+
+void mpc60_state::fdc_tc_w(u8 data)
+{
+ m_fdc->tc_w(0);
+ m_fdc->tc_w(1);
+}
+
+void mpc60_state::mem_map(address_map &map)
+{
+ map(0x00000, 0x7ffff).ram();
+ map(0xbf000, 0xbffff).rw(FUNC(mpc60_state::nvram_r), FUNC(mpc60_state::nvram_w)).umask16(0x00ff);
+ map(0xc0000, 0xfffff).rom().region("program", 0);
+}
+
+void mpc60_state::io_map(address_map &map)
+{
+ map(0x0080, 0x0083).m(m_fdc, FUNC(upd72065_device::map)).umask16(0x00ff);
+ map(0x0090, 0x0090).w(FUNC(mpc60_state::fdc_tc_w));
+ map(0x00a0, 0x00a0).rw(m_fdc, FUNC(upd72065_device::dma_r), FUNC(upd72065_device::dma_w));
+ map(0x00b0, 0x00b0).r("lcdc", FUNC(hd61830_device::status_r));
+ map(0x00b2, 0x00b2).r("lcdc", FUNC(hd61830_device::data_r));
+ map(0x00b4, 0x00b4).w("lcdc", FUNC(hd61830_device::control_w));
+ map(0x00b6, 0x00b6).w("lcdc", FUNC(hd61830_device::data_w));
+ map(0x0200, 0x0207).rw("ppi", FUNC(i8255_device::read), FUNC(i8255_device::write)).umask16(0x00ff);
+}
+
+void mpc60_state::panel_map(address_map &map)
+{
+ map(0x4000, 0x5fff).rom().region("panel", 0);
+}
+
+void mpc60_state::lcd_map(address_map &map)
+{
+ map.global_mask(0x07ff);
+ map(0x0000, 0x07ff).ram();
+}
+
+
+static INPUT_PORTS_START(mpc60)
+INPUT_PORTS_END
+
+void mpc60_state::mpc60(machine_config &config)
+{
+ I80186(config, m_maincpu, 20_MHz_XTAL); // MBL80186-10
+ m_maincpu->set_addrmap(AS_PROGRAM, &mpc60_state::mem_map);
+ m_maincpu->set_addrmap(AS_IO, &mpc60_state::io_map);
+
+ NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); // CXK5816PN-15L + CL2020 battery
+
+ UPD78C11(config, m_panelcpu, 12_MHz_XTAL);
+ m_panelcpu->set_addrmap(AS_PROGRAM, &mpc60_state::panel_map);
+
+ //MB89371(config, "sio01", 20_MHz_XTAL / 4);
+ //MB89371(config, "sio23", 20_MHz_XTAL / 4);
+
+ I8255(config, "ppi"); // MB89255A-P-C
+
+ UPD72065(config, m_fdc, 16_MHz_XTAL / 4); // μPD72066C (clocked by SED9420CAC)
+
+ hd61830_device &lcdc(HD61830(config, "lcdc", 0)); // LC7981
+ lcdc.set_addrmap(0, &mpc60_state::lcd_map);
+ lcdc.set_screen("screen");
+
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
+ screen.set_refresh_hz(80);
+ screen.set_screen_update("lcdc", FUNC(hd61830_device::screen_update));
+ screen.set_size(240, 64);
+ screen.set_visarea(0, 240-1, 0, 64-1);
+ screen.set_palette("palette");
+
+ PALETTE(config, "palette", palette_device::MONOCHROME_INVERTED);
+}
+
+ROM_START(mpc60)
+ ROM_REGION16_LE(0x40000, "program", 0) // V2.12 CPU ROMs (MBM27C512-20)
+ ROM_LOAD16_BYTE("mp6cpu2.ic2", 0x00000, 0x10000, CRC(e71b1acb) SHA1(b56ddfff1c546fc21341b1a614e18da9726312f4))
+ ROM_LOAD16_BYTE("mp6cpu3.ic3", 0x00001, 0x10000, CRC(f068838b) SHA1(42e815880d1c1a5b7d1c7933aad9c28410fc2627))
+ ROM_LOAD16_BYTE("mp6cpu1.ic4", 0x20000, 0x10000, CRC(1271bc73) SHA1(99fd6fa4c04e5bdf868e78072fec5b55c01350da))
+ ROM_LOAD16_BYTE("mpc6cpu4.ic5", 0x20001, 0x10000, CRC(d922a66d) SHA1(0f4bc0522b9826d617f4af72382d75853515d7f5))
+
+ ROM_REGION16_LE(0x10000, "waves", 0)
+ ROM_LOAD16_BYTE("ic17", 0x00000, 0x08000, NO_DUMP)
+ ROM_LOAD16_BYTE("ic18", 0x00001, 0x08000, NO_DUMP)
+
+ ROM_REGION(0x1000, "panelcpu", 0)
+ ROM_LOAD("upd78c11g-044-36.ic1", 0x0000, 0x1000, NO_DUMP)
+ ROM_FILL(0x0000, 1, 0x54) // dummy reset vector
+ ROM_FILL(0x0001, 1, 0x00)
+ ROM_FILL(0x0002, 1, 0x40)
+ ROM_FILL(0x0018, 1, 0x54) // dummy interrupt vector
+ ROM_FILL(0x0019, 1, 0x18)
+ ROM_FILL(0x001a, 1, 0x40)
+ ROM_FILL(0x0090, 1, 0xca) // dummy CALT vectors
+ ROM_FILL(0x0091, 1, 0x41)
+ ROM_FILL(0x0092, 1, 0xca)
+ ROM_FILL(0x0093, 1, 0x41)
+ ROM_FILL(0x0094, 1, 0xca)
+ ROM_FILL(0x0095, 1, 0x41)
+ ROM_FILL(0x0096, 1, 0xca)
+ ROM_FILL(0x0097, 1, 0x41)
+ ROM_FILL(0x0098, 1, 0xca)
+ ROM_FILL(0x0099, 1, 0x41)
+ ROM_FILL(0x009a, 1, 0xca)
+ ROM_FILL(0x009b, 1, 0x41)
+
+ 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_IS_SKELETON)