summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/kawai/r100.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/kawai/r100.cpp')
-rw-r--r--src/mame/kawai/r100.cpp156
1 files changed, 156 insertions, 0 deletions
diff --git a/src/mame/kawai/r100.cpp b/src/mame/kawai/r100.cpp
new file mode 100644
index 00000000000..5c328569a7e
--- /dev/null
+++ b/src/mame/kawai/r100.cpp
@@ -0,0 +1,156 @@
+// license:BSD-3-Clause
+// copyright-holders:AJR
+/***************************************************************************
+
+ Skeleton driver for Kawai R-100 drum machine.
+
+***************************************************************************/
+
+#include "emu.h"
+#include "mb63h158.h"
+#include "cpu/m6502/m50734.h"
+#include "machine/nvram.h"
+#include "video/hd44780.h"
+#include "emupal.h"
+#include "screen.h"
+
+
+namespace {
+
+class kawai_r100_state : public driver_device
+{
+public:
+ kawai_r100_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag)
+ , m_maincpu(*this, "maincpu")
+ , m_lcdc(*this, "lcdc")
+ {
+ }
+
+ void r100(machine_config &config);
+
+protected:
+ virtual void machine_start() override ATTR_COLD;
+
+private:
+ HD44780_PIXEL_UPDATE(pixel_update);
+
+ void p0_w(u8 data);
+ void p1_w(u8 data);
+ void p2_w(u8 data);
+ void p3_w(u8 data);
+ void buffer_w(u8 data);
+
+ void main_map(address_map &map) ATTR_COLD;
+ void data_map(address_map &map) ATTR_COLD;
+
+ required_device<m50734_device> m_maincpu;
+ required_device<hd44780_device> m_lcdc;
+};
+
+
+void kawai_r100_state::machine_start()
+{
+ m_lcdc->rw_w(0); // write only
+}
+
+HD44780_PIXEL_UPDATE(kawai_r100_state::pixel_update)
+{
+ if (x < 5 && y < 8 && line < 2 && pos < 16)
+ bitmap.pix(line * 8 + y, pos * 6 + x) = state;
+}
+
+void kawai_r100_state::p0_w(u8 data)
+{
+ m_lcdc->rs_w(BIT(data, 3));
+ m_lcdc->e_w(BIT(data, 4));
+}
+
+void kawai_r100_state::p1_w(u8 data)
+{
+}
+
+void kawai_r100_state::p2_w(u8 data)
+{
+}
+
+void kawai_r100_state::p3_w(u8 data)
+{
+}
+
+void kawai_r100_state::buffer_w(u8 data)
+{
+}
+
+void kawai_r100_state::main_map(address_map &map)
+{
+ map(0x0000, 0x1fff).ram().share("nvram1");
+ map(0x2000, 0x3fff).ram().share("nvram2");
+ map(0x4100, 0x41ff).r("sensor", FUNC(mb63h158_device::read));
+ map(0x4200, 0x4200).mirror(0xff).w(m_lcdc, FUNC(hd44780_device::db_w));
+ map(0x4300, 0x4300).mirror(0xff).w(FUNC(kawai_r100_state::buffer_w));
+ map(0x4400, 0xffff).rom().region("program", 0x4400);
+}
+
+void kawai_r100_state::data_map(address_map &map)
+{
+ // TODO: 0x0000-0x1fff and 0x2000-0x3fff mapped to cartridge slot
+}
+
+
+static INPUT_PORTS_START(r100)
+INPUT_PORTS_END
+
+void kawai_r100_state::r100(machine_config &config)
+{
+ M50734(config, m_maincpu, 16_MHz_XTAL / 2); // M50734SP
+ m_maincpu->set_addrmap(AS_PROGRAM, &kawai_r100_state::main_map);
+ m_maincpu->set_addrmap(AS_DATA, &kawai_r100_state::data_map);
+ m_maincpu->set_p0_3state(0x20);
+ m_maincpu->set_p3_3state(0x02);
+ m_maincpu->p0_out_cb().set(FUNC(kawai_r100_state::p0_w));
+ m_maincpu->p1_out_cb().set(FUNC(kawai_r100_state::p1_w));
+ m_maincpu->p2_out_cb().set(FUNC(kawai_r100_state::p2_w));
+ m_maincpu->p3_out_cb().set(FUNC(kawai_r100_state::p3_w));
+ m_maincpu->p4_in_cb().set_constant(0x0f);
+
+ NVRAM(config, "nvram1", nvram_device::DEFAULT_ALL_0); // MB8464-15LL-SK + battery
+ NVRAM(config, "nvram2", nvram_device::DEFAULT_ALL_0); // MB8464-15LL-SK + battery
+
+ MB63H158(config, "sensor", 16_MHz_XTAL / 4);
+
+ //M60009_AGU_DGU(config, "pcm", 5_MHz_XTAL);
+
+ // LCD unit
+ 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", palette_device::MONOCHROME_INVERTED);
+
+ HD44780(config, m_lcdc, 270'000); // TODO: clock not measured, datasheet typical clock used
+ m_lcdc->set_lcd_size(2, 16);
+ m_lcdc->set_pixel_update_cb(FUNC(kawai_r100_state::pixel_update));
+}
+
+ROM_START(r100)
+ ROM_REGION(0x10000, "program", 0)
+ ROM_SYSTEM_BIOS(0, "c", "Revision C")
+ ROMX_LOAD("kawai_6p13c.u18", 0x00000, 0x08000, CRC(3d7ed644) SHA1(d47d6c866d19390d781287ae7a69962c4503ce8e), ROM_BIOS(0))
+ ROMX_LOAD("kawai_6p14c.u16", 0x08000, 0x08000, CRC(61757eca) SHA1(24331ed8d5842d65ad1b2a472fb708e8c5a140c7), ROM_BIOS(0))
+ ROM_SYSTEM_BIOS(1, "b", "Revision B")
+ ROMX_LOAD("kawai_6p13b.u18", 0x00000, 0x08000, CRC(53d288a0) SHA1(25d5bcaf4b5146d13c9d75313d3110776dd4e237), ROM_BIOS(1)) // D27C256AD-20
+ ROMX_LOAD("kawai_6p14b.u16", 0x08000, 0x08000, CRC(777889bb) SHA1(30fb93afcc2e8738bcc6f991081f269953e49b15), ROM_BIOS(1)) // D27C256AD-20
+
+ ROM_REGION(0x80000, "pcm", 0)
+ ROM_LOAD("kawai_mn234001kaa.u20", 0x00000, 0x80000, CRC(aaf1805e) SHA1(5894b4cb03e17a5aa8c2b0c9b1b3d9285009a1c3))
+ROM_END
+
+} // anonymous namespace
+
+
+SYST(1987, r100, 0, 0, r100, r100, kawai_r100_state, empty_init, "Kawai Musical Instrument Manufacturing", "R-100 Digital Drum Machine", MACHINE_NO_SOUND | MACHINE_NOT_WORKING)