summaryrefslogtreecommitdiffstats
path: root/src/mame/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers')
-rw-r--r--src/mame/drivers/emu68k.cpp243
1 files changed, 243 insertions, 0 deletions
diff --git a/src/mame/drivers/emu68k.cpp b/src/mame/drivers/emu68k.cpp
new file mode 100644
index 00000000000..2d1d92559d6
--- /dev/null
+++ b/src/mame/drivers/emu68k.cpp
@@ -0,0 +1,243 @@
+// license:BSD-3-Clause
+// copyright-holders:AJR
+/***********************************************************************************************************************************
+
+ Skeleton driver for E-mu Proteus and other MC68000-based synthesizer modules.
+
+***********************************************************************************************************************************/
+
+#include "emu.h"
+#include "cpu/m68000/m68000.h"
+#include "machine/mc68901.h"
+#include "video/hd44780.h"
+#include "emupal.h"
+#include "screen.h"
+
+class emu68k_state : public driver_device
+{
+public:
+ emu68k_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag)
+ , m_maincpu(*this, "maincpu")
+ , m_mfp(*this, "mfp")
+ {
+ }
+
+ void proteus1(machine_config &config);
+ void vintkeys(machine_config &config);
+ void phatt(machine_config &config);
+ void proteusxr(machine_config &config);
+
+protected:
+ virtual void machine_start() override;
+
+private:
+ void add_lcd(machine_config &config);
+
+ HD44780_PIXEL_UPDATE(lcd_pixel_update);
+ void palette_init(palette_device &palette);
+
+ void proteus1_map(address_map &map);
+ void proteusxr_map(address_map &map);
+ void vintkeys_map(address_map &map);
+ void phatt_map(address_map &map);
+ void fc7_map(address_map &map);
+
+ required_device<m68000_base_device> m_maincpu;
+ required_device<mc68901_device> m_mfp;
+};
+
+void emu68k_state::machine_start()
+{
+}
+
+HD44780_PIXEL_UPDATE(emu68k_state::lcd_pixel_update)
+{
+ if (x < 5 && y < 8 && line < 2 && pos < 16)
+ bitmap.pix16(line * 8 + y, pos * 6 + x) = state;
+}
+
+
+void emu68k_state::proteus1_map(address_map &map)
+{
+ map(0x000000, 0x01ffff).rom().region("program", 0);
+ map(0x600080, 0x680083).rw("lcdc", FUNC(hd44780_device::read), FUNC(hd44780_device::write)).umask16(0x00ff);
+ map(0x600100, 0x60012f).rw(m_mfp, FUNC(mc68901_device::read), FUNC(mc68901_device::write)).umask16(0x00ff);
+ map(0x800000, 0x8003ff).writeonly(); // ???
+ map(0xffc000, 0xffffff).ram();
+}
+
+void emu68k_state::proteusxr_map(address_map &map)
+{
+ map(0x000000, 0x01ffff).rom().region("program", 0);
+ map(0x400000, 0x400001).nopw(); // ???
+ map(0x700000, 0x700003).rw("lcdc", FUNC(hd44780_device::read), FUNC(hd44780_device::write)).umask16(0x00ff);
+ map(0x800000, 0x8003ff).writeonly(); // ???
+ map(0x900000, 0x90002f).rw(m_mfp, FUNC(mc68901_device::read), FUNC(mc68901_device::write)).umask16(0x00ff);
+ map(0xa00000, 0xa00001).nopr(); // watchdog?
+ map(0xb00000, 0xb00001).nopw(); // ???
+ map(0xffc000, 0xffffff).ram();
+}
+
+void emu68k_state::vintkeys_map(address_map &map)
+{
+ map(0x000000, 0x03ffff).rom().region("program", 0);
+ map(0x600080, 0x680083).rw("lcdc", FUNC(hd44780_device::read), FUNC(hd44780_device::write)).umask16(0x00ff);
+ map(0x600100, 0x60012f).rw(m_mfp, FUNC(mc68901_device::read), FUNC(mc68901_device::write)).umask16(0x00ff);
+ map(0x800000, 0x8003ff).writeonly(); // ???
+ map(0xffc000, 0xffffff).ram();
+}
+
+void emu68k_state::phatt_map(address_map &map)
+{
+ map(0x000000, 0x07ffff).rom().region("program", 0);
+ map(0x600080, 0x680083).rw("lcdc", FUNC(hd44780_device::read), FUNC(hd44780_device::write)).umask16(0x00ff);
+ map(0x600100, 0x60012f).rw(m_mfp, FUNC(mc68901_device::read), FUNC(mc68901_device::write)).umask16(0x00ff);
+ map(0x800000, 0x8003ff).writeonly(); // ???
+ map(0xffc000, 0xffffff).ram();
+}
+
+void emu68k_state::fc7_map(address_map &map)
+{
+ map(0xfffff3, 0xfffff3).r(m_mfp, FUNC(mc68901_device::get_vector));
+}
+
+
+static INPUT_PORTS_START(proteus1)
+INPUT_PORTS_END
+
+static INPUT_PORTS_START(procuss)
+INPUT_PORTS_END
+
+static INPUT_PORTS_START(vintkeys)
+INPUT_PORTS_END
+
+static INPUT_PORTS_START(orbit9090)
+INPUT_PORTS_END
+
+static INPUT_PORTS_START(phatt)
+INPUT_PORTS_END
+
+static INPUT_PORTS_START(carnaval)
+INPUT_PORTS_END
+
+void emu68k_state::palette_init(palette_device &palette)
+{
+ palette.set_pen_color(0, rgb_t(131, 136, 139));
+ palette.set_pen_color(1, rgb_t( 92, 83, 88));
+}
+
+void emu68k_state::add_lcd(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
+ screen.set_refresh_hz(60);
+ screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
+ screen.set_screen_update("lcdc", FUNC(hd44780_device::screen_update));
+ screen.set_size(6*16, 8*2);
+ screen.set_visarea_full();
+ screen.set_palette("palette");
+
+ PALETTE(config, "palette", FUNC(emu68k_state::palette_init), 2);
+
+ hd44780_device &lcdc(HD44780(config, "lcdc", 0));
+ lcdc.set_lcd_size(2, 16);
+ lcdc.set_pixel_update_cb(FUNC(emu68k_state::lcd_pixel_update));
+}
+
+void emu68k_state::proteus1(machine_config &config)
+{
+ M68000(config, m_maincpu, 10'000'000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &emu68k_state::proteus1_map);
+ m_maincpu->set_addrmap(m68000_base_device::AS_CPU_SPACE, &emu68k_state::fc7_map);
+
+ MC68901(config, m_mfp, 10'000'000);
+ m_mfp->set_timer_clock(2'500'000);
+ m_mfp->out_irq_cb().set_inputline(m_maincpu, M68K_IRQ_1); // TODO: verify level
+
+ add_lcd(config);
+}
+
+void emu68k_state::vintkeys(machine_config &config)
+{
+ proteus1(config);
+ m_maincpu->set_addrmap(AS_PROGRAM, &emu68k_state::vintkeys_map);
+}
+
+void emu68k_state::phatt(machine_config &config)
+{
+ proteus1(config);
+ m_maincpu->set_addrmap(AS_PROGRAM, &emu68k_state::phatt_map);
+}
+
+void emu68k_state::proteusxr(machine_config &config)
+{
+ M68000(config, m_maincpu, 40_MHz_XTAL / 4); // MC68000P10
+ m_maincpu->set_addrmap(AS_PROGRAM, &emu68k_state::proteusxr_map);
+ m_maincpu->set_addrmap(m68000_base_device::AS_CPU_SPACE, &emu68k_state::fc7_map);
+
+ // TODO: NVRAM = 2x CXK5864BP-12L + DS1210 + battery?
+
+ MC68901(config, m_mfp, 40_MHz_XTAL / 4);
+ m_mfp->set_timer_clock(40_MHz_XTAL / 16); // TODO: determine divider
+ m_mfp->out_irq_cb().set_inputline(m_maincpu, M68K_IRQ_1); // TODO: verify level
+
+ add_lcd(config);
+}
+
+// TODO: all of these have sample ROMs as well (none currently dumped)
+
+ROM_START(proteus1)
+ ROM_REGION16_BE(0x20000, "program", 0)
+ ROM_LOAD16_BYTE("e-mu proteus 1 msb 2.05.bin", 0x00000, 0x10000, CRC(6a84ac60) SHA1(0b0b3689678522c26087919a2387ed184391d3f4)) // 27C512
+ ROM_LOAD16_BYTE("e-mu proteus 1 lsb 2.05.bin", 0x00001, 0x10000, CRC(3ae786b4) SHA1(b9ad95a5cab86f2d316af34e6cb1b2873c58a9b5)) // 27C512
+ROM_END
+
+ROM_START(proteusxr)
+ ROM_REGION16_BE(0x20000, "program", 0)
+ ROM_LOAD16_BYTE("ip441c_emu__5089.ic38", 0x00000, 0x10000, CRC(01f11633) SHA1(a0612007b22c8e06c803ee5a5bad98e3f2bc4421)) // NMC27C512AN
+ ROM_LOAD16_BYTE("ip442c_emu__5089.ic37", 0x00001, 0x10000, CRC(e8154a65) SHA1(1ec834712dc9ea4f4f01090b2fd5e558c1f08208)) // NMC27C512AN
+ROM_END
+
+ROM_START(procuss)
+ ROM_REGION16_BE(0x20000, "program", 0) // v1.01
+ ROM_LOAD16_BYTE("ip516aemu9115.bin", 0x00000, 0x10000, CRC(8c0be608) SHA1(54d5629e4adebd72d5d5924941be3e6319d20427))
+ ROM_LOAD16_BYTE("ip517aemu9115.bin", 0x00001, 0x10000, CRC(cb2e454b) SHA1(b142285b998829ec8b3c6ce98eb94d9d4964aff6))
+ROM_END
+
+ROM_START(vintkeys)
+ ROM_REGION16_BE(0x40000, "program", 0) // v1.03
+ ROM_LOAD16_BYTE("vintage_keys_msb.bin", 0x00000, 0x20000, CRC(8ac3123f) SHA1(29180ea26c3de326af0f789a2d7a85face528d1a))
+ ROM_LOAD16_BYTE("vintage_keys_lsb.bin", 0x00001, 0x20000, CRC(032e4064) SHA1(f59841eda06e2f348f50887d5bf10aef3a027346))
+ROM_END
+
+ROM_START(orbit9090)
+ // These may or may not need to be split into separate sets
+ ROM_REGION16_BE(0x80000, "program", 0)
+ ROM_SYSTEM_BIOS(0, "v2", "v2.00") // Original chips are STMicro M27C2001-12F1
+ ROMX_LOAD("orbit-2.00-msb.bin", 0x00000, 0x40000, CRC(6bda893e) SHA1(0ff01a46ba49fd49b8d85edcc9ac141009f73ebe), ROM_BIOS(0) | ROM_SKIP(1))
+ ROMX_LOAD("orbit-2.00-lsb.bin", 0x00001, 0x40000, CRC(95ef87f6) SHA1(c0dde419e9b93aa9f4d5b48c9b9bd039a33d2413), ROM_BIOS(0) | ROM_SKIP(1))
+ ROM_SYSTEM_BIOS(1, "v1", "v1.00") // Original chips are TMS27C010A-15; "©EMU'96"
+ ROMX_LOAD("mip840a__1496.bin", 0x00000, 0x20000, CRC(f60cde2a) SHA1(6762c1e0aa5044e504799041f960d037a600cb62), ROM_BIOS(1) | ROM_SKIP(1))
+ ROMX_LOAD("lip839a__1496.bin", 0x00001, 0x20000, CRC(5f16e6db) SHA1(e820bf6ce61256f191c063d4193ed4602c500065), ROM_BIOS(1) | ROM_SKIP(1))
+ROM_END
+
+ROM_START(phatt)
+ ROM_REGION16_BE(0x80000, "program", 0)
+ ROM_LOAD16_BYTE("e-mu planet phatt msb 1.01.bin", 0x00000, 0x40000, CRC(4db960c2) SHA1(1af53bd85ca7fb06709981ce3915cb46e8785cc2)) // 27C2001
+ ROM_LOAD16_BYTE("e-mu planet phatt lsb 1.01.bin", 0x00001, 0x40000, CRC(0b2deb2b) SHA1(7715ac34f5eb9d27337eb77e62b66da8c3e80950)) // 27C2001
+ROM_END
+
+ROM_START(carnaval)
+ ROM_REGION16_BE(0x80000, "program", 0)
+ // Original chips are STMicro M27C2001-12F1
+ ROM_LOAD16_BYTE("carnaval-1.00-msb.bin", 0x00000, 0x40000, CRC(962b3d2b) SHA1(e4668306e21fef8b0b696f08bed7c6e66941c8b2))
+ ROM_LOAD16_BYTE("carnaval-1.00-lsb.bin", 0x00001, 0x40000, CRC(95506a6f) SHA1(1f6f2cce4fac36f4daa22bded1013f3dd0ca72db))
+ROM_END
+
+SYST(1989, proteus1, 0, 0, proteus1, proteus1, emu68k_state, empty_init, "E-mu Systems", "Proteus/1 16-Bit Multi-Timbral Digital Sound Module", MACHINE_IS_SKELETON)
+SYST(1989, proteusxr, 0, 0, proteusxr, proteus1, emu68k_state, empty_init, "E-mu Systems", "Proteus/1 XR 16-Bit Multi-Timbral Digital Sound Module", MACHINE_IS_SKELETON)
+SYST(1991, procuss, 0, 0, proteusxr, procuss, emu68k_state, empty_init, "E-mu Systems", "Pro/Cussion Maximum Percussion Module", MACHINE_IS_SKELETON)
+SYST(1993, vintkeys, 0, 0, vintkeys, vintkeys, emu68k_state, empty_init, "E-mu Systems", "Vintage Keys Classic Analog Keyboards", MACHINE_IS_SKELETON)
+SYST(1996, orbit9090, 0, 0, phatt, orbit9090, emu68k_state, empty_init, "E-mu Systems", "Orbit 9090 - The Dance Planet", MACHINE_IS_SKELETON)
+SYST(1997, phatt, 0, 0, phatt, phatt, emu68k_state, empty_init, "E-mu Systems", "Planet Phatt", MACHINE_IS_SKELETON)
+SYST(1997, carnaval, 0, 0, phatt, carnaval, emu68k_state, empty_init, "E-mu Systems", "Carnaval - Jugando con Fuego", MACHINE_IS_SKELETON)