From e8831b72a925fe5a65155384517d4cda28da2cf3 Mon Sep 17 00:00:00 2001 From: AJR Date: Thu, 9 Jul 2020 23:08:14 -0400 Subject: New machines marked as NOT_WORKING ---------------------------------- Proteus/1 16-Bit Multi-Timbral Digital Sound Module [DBWBP] Proteus/1 XR 16-Bit Multi-Timbral Digital Sound Module [DBWBP] Pro/Cussion Maximum Percussion Module [DBWBP] Vintage Keys Classic Analog Keyboards [DBWBP] Orbit 9090 - The Dance Planet [DBWBP] Planet Phatt [DBWBP] Carnaval - Jugando con Fuego [DBWBP] --- scripts/target/mame/mess.lua | 1 + src/mame/drivers/emu68k.cpp | 243 +++++++++++++++++++++++++++++++++++++++++++ src/mame/mame.lst | 9 ++ src/mame/mess.flt | 1 + 4 files changed, 254 insertions(+) create mode 100644 src/mame/drivers/emu68k.cpp diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua index 641676290a8..5bb226d03c0 100644 --- a/scripts/target/mame/mess.lua +++ b/scripts/target/mame/mess.lua @@ -2247,6 +2247,7 @@ createMESSProjects(_target, _subtarget, "emusys") files { MAME_DIR .. "src/mame/drivers/emu2.cpp", MAME_DIR .. "src/mame/drivers/emu3.cpp", + MAME_DIR .. "src/mame/drivers/emu68k.cpp", } createMESSProjects(_target, _subtarget, "ensoniq") 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 m_maincpu; + required_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) diff --git a/src/mame/mame.lst b/src/mame/mame.lst index dab3ad31d8b..abae54e7b40 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -13042,6 +13042,15 @@ emu2 // emax2 // emu3 // +@source:emu68k.cpp +carnaval // +orbit9090 // +phatt // +procuss // +proteus1 // +proteusxr // +vintkeys // + @source:enigma2.cpp enigma2 // (c) 1981 Game Plan (Zilec Electronics license) enigma2a // (c) 1984 Zilec Electronics (bootleg?) diff --git a/src/mame/mess.flt b/src/mame/mess.flt index da396e31736..821682f4701 100644 --- a/src/mame/mess.flt +++ b/src/mame/mess.flt @@ -257,6 +257,7 @@ emate.cpp emma2.cpp emu2.cpp emu3.cpp +emu68k.cpp enmirage.cpp ep64.cpp epic14e.cpp -- cgit v1.2.3