From 82a7adad6b9fdf216230d0217ef1b6f93f24f575 Mon Sep 17 00:00:00 2001 From: AJR Date: Wed, 18 Aug 2021 16:43:12 -0400 Subject: New machines marked as NOT_WORKING ---------------------------------- Hammond GM-1000 GM Sound Module [DBWBP] Yamaha PSR-16 [DBWBP] Yamaha PSR-36 [DBWBP] Yamaha PSR-40 [DBWBP] Yamaha PSS-680 [DBWBP] --- scripts/target/mame/mess.lua | 3 + src/devices/video/hd44780.cpp | 3 +- src/devices/video/hd44780.h | 2 + src/mame/drivers/gm1000.cpp | 123 ++++++++++++++++++++++++++++++++++++ src/mame/drivers/ympsr16.cpp | 143 ++++++++++++++++++++++++++++++++++++++++++ src/mame/drivers/ympsr40.cpp | 64 +++++++++++++++++++ src/mame/mame.lst | 11 ++++ src/mame/mess.flt | 3 + 8 files changed, 351 insertions(+), 1 deletion(-) create mode 100644 src/mame/drivers/gm1000.cpp create mode 100644 src/mame/drivers/ympsr16.cpp create mode 100644 src/mame/drivers/ympsr40.cpp diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua index 345ca85fc79..66617814749 100644 --- a/scripts/target/mame/mess.lua +++ b/scripts/target/mame/mess.lua @@ -4426,6 +4426,8 @@ files { MAME_DIR .. "src/mame/drivers/ymmu50.cpp", MAME_DIR .. "src/mame/drivers/ymmu80.cpp", MAME_DIR .. "src/mame/drivers/ymmu100.cpp", + MAME_DIR .. "src/mame/drivers/ympsr16.cpp", + MAME_DIR .. "src/mame/drivers/ympsr40.cpp", MAME_DIR .. "src/mame/drivers/ympsr60.cpp", MAME_DIR .. "src/mame/drivers/ympsr340.cpp", MAME_DIR .. "src/mame/drivers/ymsy35.cpp", @@ -4563,6 +4565,7 @@ files { MAME_DIR .. "src/mame/drivers/gem_rp.cpp", MAME_DIR .. "src/mame/drivers/gigatron.cpp", MAME_DIR .. "src/mame/drivers/gimix.cpp", + MAME_DIR .. "src/mame/drivers/gm1000.cpp", MAME_DIR .. "src/mame/drivers/gnat10.cpp", MAME_DIR .. "src/mame/drivers/goupil.cpp", MAME_DIR .. "src/mame/drivers/grfd2301.cpp", diff --git a/src/devices/video/hd44780.cpp b/src/devices/video/hd44780.cpp index 8d6db247ba7..a2fdb2d3032 100644 --- a/src/devices/video/hd44780.cpp +++ b/src/devices/video/hd44780.cpp @@ -70,6 +70,7 @@ hd44780_device::hd44780_device(const machine_config &mconfig, device_type type, , m_rw_input(0) , m_db_input(0) , m_enabled(false) + , m_function_set_at_any_time(false) { } @@ -487,7 +488,7 @@ void hd44780_device::control_write(u8 data) else if (BIT(m_ir, 5)) { // function set - if (!m_first_cmd && m_data_len == (BIT(m_ir, 4) ? 8 : 4) && (m_char_size != (BIT(m_ir, 2) ? 10 : 8) || m_num_line != (BIT(m_ir, 3) + 1))) + if (!m_function_set_at_any_time && !m_first_cmd && m_data_len == (BIT(m_ir, 4) ? 8 : 4) && (m_char_size != (BIT(m_ir, 2) ? 10 : 8) || m_num_line != (BIT(m_ir, 3) + 1))) { logerror("HD44780: function set cannot be executed after other instructions unless the interface data length is changed\n"); return; diff --git a/src/devices/video/hd44780.h b/src/devices/video/hd44780.h index b8d79236955..a69e816db21 100644 --- a/src/devices/video/hd44780.h +++ b/src/devices/video/hd44780.h @@ -33,6 +33,7 @@ public: void set_lcd_size(int lines, int chars) { m_lines = lines; m_chars = chars; } template void set_pixel_update_cb(T &&... args) { m_pixel_update_cb.set(std::forward(args)...); } void set_busy_factor(float f) { m_busy_factor = f; } // it's a workaround for inaccurate busy flag emulation + void set_function_set_at_any_time(bool v = true) { m_function_set_at_any_time = v; } // device interface void write(offs_t offset, u8 data); @@ -135,6 +136,7 @@ private: bool m_nibble; int m_charset_type; u8 m_render_buf[80 * 16]; + bool m_function_set_at_any_time; enum { DDRAM, CGRAM }; }; diff --git a/src/mame/drivers/gm1000.cpp b/src/mame/drivers/gm1000.cpp new file mode 100644 index 00000000000..a7fa3a80860 --- /dev/null +++ b/src/mame/drivers/gm1000.cpp @@ -0,0 +1,123 @@ +// license:BSD-3-Clause +// copyright-holders:AJR +/******************************************************************************* + + Skeleton driver for Suzuki BH-1000/Hammond GM-1000 sound module. + +*******************************************************************************/ + +#include "emu.h" +//#include "bus/midi/midi.h" +#include "cpu/m37710/m37710.h" +#include "machine/nvram.h" +#include "video/hd44780.h" +#include "emupal.h" +#include "screen.h" + +namespace { + +class gm1000_state : public driver_device +{ +public: + gm1000_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) + , m_maincpu(*this, "maincpu") + , m_nvram(*this, "nvram", 0x800, ENDIANNESS_LITTLE) + { + } + + void gm1000(machine_config &config); + +private: + HD44780_PIXEL_UPDATE(lcd_pixel_update); + + void mem_map(address_map &map); + + required_device m_maincpu; + memory_share_creator m_nvram; +}; + +HD44780_PIXEL_UPDATE(gm1000_state::lcd_pixel_update) +{ + if (x < 5 && y < 8 && line < 2 && pos < 24) + bitmap.pix(line * 8 + y, pos * 6 + x) = state; +} + + +void gm1000_state::mem_map(address_map &map) +{ + map(0x000400, 0x000403).rw("lcdc", FUNC(hd44780_device::read), FUNC(hd44780_device::write)).umask16(0x00ff); + map(0x004000, 0x007fff).ram(); + map(0x008000, 0x03ffff).rom().region("program", 0x8000); + map(0x040000, 0x04ffff).rom().region("program", 0); + map(0x050000, 0x050fff).lrw8( + [this](offs_t offset) { return m_nvram[offset]; }, "nvram_r", + [this](offs_t offset, u8 data) { m_nvram[offset] = data; }, "nvram_w").umask16(0x00ff); + map(0x064000, 0x06efff).ram(); + map(0x070002, 0x070005).nopr(); +} + + +static INPUT_PORTS_START(gm1000) + // Keycode assignments are rather arbitrary and do not at all reflect the panel layout + PORT_START("P4") + PORT_BIT(0x0f, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_LEFT) PORT_NAME("Parameter " UTF8_LEFT) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_RIGHT) PORT_NAME("Parameter " UTF8_RIGHT) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_DOWN) PORT_NAME("Data " UTF8_LEFT) + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_UP) PORT_NAME("Data " UTF8_RIGHT) + + PORT_START("P6") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("All Mute") + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_BACKSLASH) PORT_NAME("P. Mute") + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_RSHIFT) PORT_NAME("P. Monitor") + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_ENTER) PORT_NAME("Display") + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_COMMA) PORT_NAME("Part " UTF8_LEFT) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_STOP) PORT_NAME("Part " UTF8_RIGHT) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_OPENBRACE) PORT_NAME("Instrument " UTF8_LEFT) + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_NAME("Instrument " UTF8_RIGHT) +INPUT_PORTS_END + +void gm1000_state::gm1000(machine_config &config) +{ + M37702S1(config, m_maincpu, 4'000'000); // unknown clock; type guessed + m_maincpu->set_addrmap(AS_PROGRAM, &gm1000_state::mem_map); + m_maincpu->p4_in_cb().set_ioport("P4"); + m_maincpu->p6_in_cb().set_ioport("P6"); + m_maincpu->an0_cb().set_constant(0xc0); // battery voltage + m_maincpu->an2_cb().set_constant(0x80); // ? + + NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); + + 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*24, 8*2); + screen.set_visarea_full(); + screen.set_palette("palette"); + screen.set_color(rgb_t::green()); + + PALETTE(config, "palette", palette_device::MONOCHROME_INVERTED); + + hd44780_device &lcdc(HD44780(config, "lcdc", 0)); + lcdc.set_lcd_size(2, 24); + lcdc.set_pixel_update_cb(FUNC(gm1000_state::lcd_pixel_update)); + lcdc.set_function_set_at_any_time(true); +} + +ROM_START(gm1000) + ROM_REGION16_LE(0x40000, "program", 0) + ROM_LOAD16_BYTE("bh1_mgs71a__u6_sysl__v2.1_bf66.u6", 0x00000, 0x20000, CRC(d003880c) SHA1(5cf727c42dd1b903c0048f147b461676e8c35faf)) // MX27C1000-90 + ROM_LOAD16_BYTE("bh1_mgs71a__u7_sysh__v2.1_2fac.u7", 0x00001, 0x20000, CRC(989417a1) SHA1(3de4f10a2e7cde5eb93f04bd75db36e194b1d991)) // MX27C1000-90 + + ROM_REGION(0x800000, "waves", 0) // DIP42 mask ROMs "© SUZUKI 1993" + ROM_LOAD("319-35006_wd06__m531602c-53.u13", 0x000000, 0x200000, NO_DUMP) + ROM_LOAD("319-35007_wd07__m531602c-52.u14", 0x200000, 0x200000, NO_DUMP) + ROM_LOAD("319-35008_wd08__m531602c-54.u15", 0x200000, 0x200000, NO_DUMP) + ROM_LOAD("319-35009_wd09__m531602c-55.u16", 0x200000, 0x200000, NO_DUMP) +ROM_END + +} // anonymous namespace + +SYST(1994, gm1000, 0, 0, gm1000, gm1000, gm1000_state, empty_init, "Suzuki (Hammond license)", "GM-1000 GM Sound Module", MACHINE_IS_SKELETON) diff --git a/src/mame/drivers/ympsr16.cpp b/src/mame/drivers/ympsr16.cpp new file mode 100644 index 00000000000..8ca257be9cc --- /dev/null +++ b/src/mame/drivers/ympsr16.cpp @@ -0,0 +1,143 @@ +// license:BSD-3-Clause +// copyright-holders:AJR +/******************************************************************************* + + Skeleton driver for Yamaha PSR-16 & related keyboards. + + These are based on the YM3420AD or YM3420BF "CPU and FM Tone Generator", + a 65C02-based SoC which includes 256 bytes of internal RAM, 16 KB of + internal ROM (enabled only on PSR-36?), a MIDI UART and a DAC. + +*******************************************************************************/ + +#include "emu.h" +//#include "bus/midi/midi.h" +#include "cpu/m6502/m65c02.h" + +namespace { + +class yamaha_psr16_state : public driver_device +{ +public: + yamaha_psr16_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) + , m_maincpu(*this, "maincpu") + { + } + + void psr16(machine_config &config); + void psr36(machine_config &config); + void pss680(machine_config &config); + +private: + u8 busy_r(); + + void common_map(address_map &map); + void psr16_map(address_map &map); + void psr36_map(address_map &map); + void pss680_map(address_map &map); + + required_device m_maincpu; +}; + + +u8 yamaha_psr16_state::busy_r() +{ + // Code waits for bit 7 of $0200 to go low before writing to $02XX + return 0; +} + +void yamaha_psr16_state::common_map(address_map &map) +{ + map(0x0000, 0x00ff).mirror(0x100).ram(); + map(0x0200, 0x0200).r(FUNC(yamaha_psr16_state::busy_r)); + map(0x0310, 0x0312).nopw(); + map(0x0318, 0x0318).nopr(); + map(0x0319, 0x031a).nopw(); + map(0x031b, 0x031b).nopr(); + map(0x0327, 0x0327).nopw(); +} + +void yamaha_psr16_state::psr16_map(address_map &map) +{ + common_map(map); + map(0xc000, 0xffff).rom().region("program", 0); +} + +void yamaha_psr16_state::psr36_map(address_map &map) +{ + common_map(map); + map(0x2000, 0x27ff).ram(); + map(0x4000, 0x7fff).rom().region("program", 0x4000); + map(0x8000, 0xbfff).rom().region("program", 0); + map(0xc000, 0xffff).rom().region("maincpu", 0); +} + +void yamaha_psr16_state::pss680_map(address_map &map) +{ + common_map(map); + map(0x1800, 0x1802).nopw(); + map(0x1810, 0x1811).nopr(); + map(0x2000, 0x3fff).ram(); + map(0x4000, 0x7fff).rom().region("program", 0x8000); + map(0x8000, 0xffff).rom().region("program", 0); +} + + + +static INPUT_PORTS_START(psr16) +INPUT_PORTS_END + +void yamaha_psr16_state::psr16(machine_config &config) +{ + M65C02(config, m_maincpu, 2'000'000); + m_maincpu->set_addrmap(AS_PROGRAM, &yamaha_psr16_state::psr16_map); +} + +void yamaha_psr16_state::psr36(machine_config &config) +{ + psr16(config); + m_maincpu->set_addrmap(AS_PROGRAM, &yamaha_psr16_state::psr36_map); +} + +void yamaha_psr16_state::pss680(machine_config &config) +{ + psr16(config); + m_maincpu->set_addrmap(AS_PROGRAM, &yamaha_psr16_state::pss680_map); +} + +ROM_START(psr16) + ROM_REGION(0x4000, "program", 0) + ROM_LOAD("yamaha_xe988a0_7247-h001.bin", 0x0000, 0x4000, CRC(20c5c0b2) SHA1(d7a066b680b7d4cfded62d4d50808c21784774d0)) // 28-pin mask ROM +ROM_END + +ROM_START(psr36) + ROM_REGION(0x4000, "maincpu", 0) + ROM_LOAD("ym3420bf_internal.bin", 0x0000, 0x4000, NO_DUMP) + ROM_FILL(0x3ffa, 1, 0x07) + ROM_FILL(0x3ffb, 1, 0x40) + ROM_FILL(0x3ffc, 1, 0x00) + ROM_FILL(0x3ffd, 1, 0x40) + ROM_FILL(0x3ffe, 1, 0x04) + ROM_FILL(0x3fff, 1, 0x40) + + ROM_REGION(0x20000, "program", 0) + ROM_LOAD("yamaha_xe137c0_7247-h005.bin", 0x00000, 0x20000, CRC(b9566cd5) SHA1(e35979299de2442d62e039d45b54bf77e9571f49)) // 28-pin mask ROM (second 32K is copy of first 32K; last half is all zero fill) + + ROM_REGION(0x20000, "waves", 0) + ROM_LOAD("yamaha_xe137b0_4881-7554.bin", 0x00000, 0x20000, CRC(6fe1382e) SHA1(82320d0a6c14825d790c0d67263786f767b7c318)) // 28-pin mask ROM (drum samples) +ROM_END + +ROM_START(pss680) + ROM_REGION(0x40000, "program", 0) + ROM_LOAD("yamaha_xe416d0-093.bin", 0x00000, 0x40000, CRC(150d1392) SHA1(d578324cfae73cd5f6c628eb3044be07684bc5d0)) // 32-pin mask ROM + + ROM_REGION(0x40000, "waves", 0) + ROM_LOAD("yamaha_xe405b0-070.bin", 0x00000, 0x40000, CRC(53336c52) SHA1(6bcad44fc93cfa5cd603cf24adfd736a911d3509)) // 32-pin mask ROM +ROM_END + +} // anonymous namespace + +SYST(1988, psr16, 0, 0, psr16, psr16, yamaha_psr16_state, empty_init, "Yamaha", "PSR-16", MACHINE_IS_SKELETON) +SYST(1988, psr36, 0, 0, psr36, psr16, yamaha_psr16_state, empty_init, "Yamaha", "PSR-36", MACHINE_IS_SKELETON) +SYST(1988, pss680, 0, 0, pss680, psr16, yamaha_psr16_state, empty_init, "Yamaha", "PSS-680", MACHINE_IS_SKELETON) diff --git a/src/mame/drivers/ympsr40.cpp b/src/mame/drivers/ympsr40.cpp new file mode 100644 index 00000000000..3b14fb7cbc0 --- /dev/null +++ b/src/mame/drivers/ympsr40.cpp @@ -0,0 +1,64 @@ +// license:BSD-3-Clause +// copyright-holders:AJR +/******************************************************************************* + + Skeleton driver for Yamaha PSR-40 PortaSound keyboard. + +*******************************************************************************/ + +#include "emu.h" +#include "cpu/z80/z80.h" +#include "machine/i8255.h" +#include "machine/nvram.h" + +namespace { + +class yamaha_psr40_state : public driver_device +{ +public: + yamaha_psr40_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) + , m_maincpu(*this, "maincpu") + { + } + + void psr40(machine_config &config); + +private: + void mem_map(address_map &map); + + required_device m_maincpu; +}; + + +void yamaha_psr40_state::mem_map(address_map &map) +{ + map(0x0000, 0x7fff).rom().region("program", 0); + map(0x8000, 0x87ff).mirror(0x1800).ram().share("nvram"); + //map(0xa000, 0xa01f).mirror(0x1fe0).rw("ge7", FUNC(ig10771_device::read), FUNC(ig10771_device::write)); + map(0xa01e, 0xa01f).nopr(); + map(0xc000, 0xc003).mirror(0x1ffc).rw("ppi", FUNC(i8255_device::read), FUNC(i8255_device::write)); +} + + +static INPUT_PORTS_START(psr40) +INPUT_PORTS_END + +void yamaha_psr40_state::psr40(machine_config &config) +{ + Z80(config, m_maincpu, 4'000'000); // unknown clock + m_maincpu->set_addrmap(AS_PROGRAM, &yamaha_psr40_state::mem_map); + + NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); // TC5517APL + battery? + + I8255(config, "ppi"); +} + +ROM_START(psr40) + ROM_REGION(0x8000, "program", 0) + ROM_LOAD("yamaha_xa004a0_6133-7836.ic4", 0x0000, 0x8000, CRC(7ac4a729) SHA1(e792aabe816d8c46bcc683f0e9220ca50c0faaac)) // 28-pin custom-marked ROM +ROM_END + +} // anonymous namespace + +SYST(1985, psr40, 0, 0, psr40, psr40, yamaha_psr40_state, empty_init, "Yamaha", "PSR-40", MACHINE_IS_SKELETON) diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 43978a23b09..593e12931ee 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -15325,6 +15325,9 @@ nfsug // Need For Speed: Underground Install (2 Discs) @source:gluck2.cpp gluck2 // 1992 Yung Yu / CYE +@source:gm1000.cpp +gm1000 // + @source:gmaster.cpp gmaster // Hartung Gamemaster @@ -43448,6 +43451,14 @@ mu100 // 1997 MU-100 mu100r // 1997 MU-100 Rackable version mu100b // 1998 MU-100B +@source:ympsr16.cpp +psr16 // 1988 PSR-16 +psr36 // 1988 PSR-36 +pss680 // 1988 PSS-680 + +@source:ympsr40.cpp +psr40 // 1985 PSR-40 + @source:ympsr60.cpp psr60 // 1985 PSR-60 psr70 // 1985 PSR-70 diff --git a/src/mame/mess.flt b/src/mame/mess.flt index 7fb74ae0944..392158760b4 100644 --- a/src/mame/mess.flt +++ b/src/mame/mess.flt @@ -371,6 +371,7 @@ gimix.cpp gizmondo.cpp gkidabc.cpp glcx.cpp +gm1000.cpp gmaster.cpp gnat10.cpp goupil.cpp @@ -1194,6 +1195,8 @@ ymmu100.cpp ymmu5.cpp ymmu50.cpp ymmu80.cpp +ympsr16.cpp +ympsr40.cpp ympsr60.cpp ympsr340.cpp ymsy35.cpp -- cgit v1.2.3