summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author AJR <ajrhacker@users.noreply.github.com>2021-04-18 14:05:21 -0400
committer AJR <ajrhacker@users.noreply.github.com>2021-04-18 14:05:21 -0400
commitdaa6c9469987eb60e4713cb924ec48207047cb47 (patch)
treef7ed7378a065d446453d0629a61cc5e09b42fc6a
parent1da36f8ce520c63fae756ca9ce5785067f5332ba (diff)
New machines marked as NOT_WORKING
---------------------------------- Roland PR-100 Digital Sequencer [AJR, Valley Bell]
-rw-r--r--scripts/target/mame/mess.lua3
-rw-r--r--src/mame/drivers/roland_pr100.cpp121
-rw-r--r--src/mame/drivers/roland_s10.cpp38
-rw-r--r--src/mame/machine/mb87013.cpp150
-rw-r--r--src/mame/machine/mb87013.h90
-rw-r--r--src/mame/mame.lst3
-rw-r--r--src/mame/mess.flt1
7 files changed, 383 insertions, 23 deletions
diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua
index 71aba1aeca5..ebb81497aff 100644
--- a/scripts/target/mame/mess.lua
+++ b/scripts/target/mame/mess.lua
@@ -3436,6 +3436,7 @@ files {
MAME_DIR .. "src/mame/drivers/roland_jx8p.cpp",
MAME_DIR .. "src/mame/drivers/roland_mc50.cpp",
MAME_DIR .. "src/mame/drivers/roland_mt32.cpp",
+ MAME_DIR .. "src/mame/drivers/roland_pr100.cpp",
MAME_DIR .. "src/mame/drivers/roland_r8.cpp",
MAME_DIR .. "src/mame/drivers/roland_ra30.cpp",
MAME_DIR .. "src/mame/drivers/roland_s10.cpp",
@@ -3460,6 +3461,8 @@ files {
MAME_DIR .. "src/mame/machine/mb62h195.h",
MAME_DIR .. "src/mame/machine/mb63h149.cpp",
MAME_DIR .. "src/mame/machine/mb63h149.h",
+ MAME_DIR .. "src/mame/machine/mb87013.cpp",
+ MAME_DIR .. "src/mame/machine/mb87013.h",
MAME_DIR .. "src/mame/machine/pg200.cpp",
MAME_DIR .. "src/mame/machine/pg200.h",
}
diff --git a/src/mame/drivers/roland_pr100.cpp b/src/mame/drivers/roland_pr100.cpp
new file mode 100644
index 00000000000..18f89171cc7
--- /dev/null
+++ b/src/mame/drivers/roland_pr100.cpp
@@ -0,0 +1,121 @@
+// license:BSD-3-Clause
+// copyright-holders:AJR
+/*************************************************************************************************
+
+ Skeleton driver for Roland PR-100 MIDI sequencer.
+
+ There are two custom gate arrays: M60012-0105SP on the main board and M6003A-0117SP on the
+ panel board. The main board gate array multiplexes addresses for the four MB81464 DRAMs and
+ decodes all CPU I/O space accesses. It also generates a "metronome" signal which is this
+ device's only audio output. The panel board's gate array is almost entirely controlled by
+ the main gate array, with only the reset and power signals generated independently.
+
+ The LCD unit is a DM0815.
+
+*************************************************************************************************/
+
+#include "emu.h"
+//#include "bus/midi/midi.h"
+#include "cpu/z180/z180.h"
+#include "machine/eepromser.h"
+#include "machine/input_merger.h"
+#include "machine/i8251.h"
+#include "machine/mb87013.h"
+
+class roland_pr100_state : public driver_device
+{
+public:
+ roland_pr100_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag)
+ , m_maincpu(*this, "maincpu")
+ , m_eeprom(*this, "eeprom")
+ , m_port9x(0)
+ {
+ }
+
+ void pr100(machine_config &config);
+
+protected:
+ virtual void machine_start() override;
+
+private:
+ u8 port9x_r(offs_t offset);
+ void port9x_w(offs_t offset, u8 data);
+
+ void mem_map(address_map &map);
+ void io_map(address_map &map);
+
+ required_device<z180_device> m_maincpu;
+ required_device<eeprom_serial_93cxx_device> m_eeprom;
+
+ u8 m_port9x;
+};
+
+void roland_pr100_state::machine_start()
+{
+ save_item(NAME(m_port9x));
+}
+
+u8 roland_pr100_state::port9x_r(offs_t offset)
+{
+ return m_port9x;
+}
+
+void roland_pr100_state::port9x_w(offs_t offset, u8 data)
+{
+ logerror("port%02X = %02X\n", offset + 0x90, data);
+ m_port9x = data;
+}
+
+
+void roland_pr100_state::mem_map(address_map &map)
+{
+ map.global_mask(0x3ffff); // A18 not connected
+ map(0x00000, 0x0ffff).mirror(0x10000).rom().region("program", 0); // CE = A17
+ map(0x20000, 0x3ffff).ram();
+}
+
+void roland_pr100_state::io_map(address_map &map)
+{
+ map(0x0000, 0x003f).noprw(); // internal
+ map(0x0090, 0x0093).mirror(0xff00).rw(FUNC(roland_pr100_state::port9x_r), FUNC(roland_pr100_state::port9x_w)); // EEPROM I/O?
+ map(0x00a0, 0x00a3).rw("qdc", FUNC(mb87013_device::read), FUNC(mb87013_device::write));
+}
+
+
+static INPUT_PORTS_START(pr100)
+INPUT_PORTS_END
+
+void roland_pr100_state::pr100(machine_config &config)
+{
+ HD64180RP(config, m_maincpu, 10_MHz_XTAL); // HD64B180R0P
+ m_maincpu->set_addrmap(AS_PROGRAM, &roland_pr100_state::mem_map);
+ m_maincpu->set_addrmap(AS_IO, &roland_pr100_state::io_map);
+
+ mb87013_device &qdc(MB87013(config, "qdc", 6.5_MHz_XTAL));
+ qdc.sio_rd_callback().set("sio", FUNC(i8251_device::read));
+ qdc.sio_wr_callback().set("sio", FUNC(i8251_device::write));
+ qdc.txc_callback().set("sio", FUNC(i8251_device::write_txc));
+ qdc.rxc_callback().set("sio", FUNC(i8251_device::write_rxc));
+ qdc.rxd_callback().set("sio", FUNC(i8251_device::write_rxd));
+ qdc.dsr_callback().set("sio", FUNC(i8251_device::write_dsr));
+ qdc.op4_callback().set("qdc", FUNC(mb87013_device::rts_w));
+
+ i8251_device &sio(I8251(config, "sio", 6.5_MHz_XTAL)); // MB89251
+ sio.dtr_handler().set("qdc", FUNC(mb87013_device::dtr_w));
+ sio.txd_handler().set("qdc", FUNC(mb87013_device::txd_w));
+ sio.rxrdy_handler().set("siodrq", FUNC(input_merger_device::in_w<0>));
+ sio.txrdy_handler().set("siodrq", FUNC(input_merger_device::in_w<0>));
+ sio.write_cts(0);
+
+ INPUT_MERGER_ANY_HIGH(config, "siodrq").output_handler().set_inputline(m_maincpu, Z180_INPUT_LINE_DREQ1); // 74ALS08
+
+ EEPROM_93C46_16BIT(config, m_eeprom); // HY93C46
+}
+
+ROM_START(pr100)
+ ROM_REGION(0x10000, "program", 0)
+ ROM_LOAD("roland_mbm27c512-20.ic10", 0x00000, 0x10000, CRC(41160b69) SHA1(11e5fb001dd004a5625d9a75fb1acac4ade614c8))
+ROM_END
+
+SYST(1987, pr100, 0, 0, pr100, pr100, roland_pr100_state, empty_init, "Roland", "PR-100 Digital Sequencer", MACHINE_NOT_WORKING | MACHINE_NO_SOUND)
diff --git a/src/mame/drivers/roland_s10.cpp b/src/mame/drivers/roland_s10.cpp
index 072aef20fa6..b5eb0493c19 100644
--- a/src/mame/drivers/roland_s10.cpp
+++ b/src/mame/drivers/roland_s10.cpp
@@ -18,6 +18,7 @@
#include "machine/i8251.h"
#include "machine/mb62h195.h"
#include "machine/mb63h149.h"
+#include "machine/mb87013.h"
#include "machine/nvram.h"
#include "machine/rescap.h"
#include "machine/upd7001.h"
@@ -32,7 +33,6 @@ public:
: driver_device(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
, m_io(*this, "io")
- , m_usart(*this, "usart")
, m_lcdc(*this, "lcdc")
, m_sampler(*this, "sampler")
{
@@ -44,8 +44,6 @@ public:
protected:
HD44780_PIXEL_UPDATE(lcd_pixel_update);
- u8 qdd_r(offs_t offset);
- void qdd_w(offs_t offset, u8 data);
void lcd_data_w(offs_t offset, u8 data);
void led_data_w(offs_t offset, u8 data);
u8 sw_scan_r(offs_t offset);
@@ -60,7 +58,6 @@ protected:
required_device<mcs51_cpu_device> m_maincpu;
required_device<mb62h195_device> m_io;
- required_device<i8251_device> m_usart;
required_device<hd44780_device> m_lcdc;
required_device<sa16_base_device> m_sampler;
};
@@ -102,20 +99,6 @@ HD44780_PIXEL_UPDATE(roland_s220_state::lcd_pixel_update)
bitmap.pix(line * 8 + y, pos * 6 + x) = state;
}
-u8 roland_s10_state::qdd_r(offs_t offset)
-{
- if (!BIT(offset, 1))
- return m_usart->read(offset);
-
- return 0;
-}
-
-void roland_s10_state::qdd_w(offs_t offset, u8 data)
-{
- if (!BIT(offset, 1))
- m_usart->write(offset, data);
-}
-
void roland_s10_state::lcd_data_w(offs_t offset, u8 data)
{
if (offset == 0)
@@ -165,7 +148,7 @@ void roland_s10_state::prog_map(address_map &map)
void roland_s10_state::mks100_ext_map(address_map &map)
{
- map(0x4000, 0x4003).mirror(0xffc).rw(FUNC(roland_s10_state::qdd_r), FUNC(roland_s10_state::qdd_w));
+ map(0x4000, 0x4003).mirror(0xffc).rw("qddia", FUNC(mb87013_device::read), FUNC(mb87013_device::write));
map(0x6000, 0x7fff).ram().share("nvram");
map(0x8000, 0x80ff).mirror(0xf00).w(FUNC(roland_s10_state::lcd_data_w));
map(0x9000, 0x90ff).mirror(0xf00).w(FUNC(roland_s10_state::led_data_w));
@@ -184,7 +167,7 @@ void roland_s10_state::s10_ext_map(address_map &map)
void roland_s220_state::s220_ext_map(address_map &map)
{
map(0x0000, 0x000f).mirror(0x3ff0).w(FUNC(roland_s220_state::output_control_w));
- map(0x4000, 0x4003).mirror(0xffc).rw(FUNC(roland_s220_state::qdd_r), FUNC(roland_s220_state::qdd_w));
+ map(0x4000, 0x4003).mirror(0xffc).rw("qddia", FUNC(mb87013_device::read), FUNC(mb87013_device::write));
map(0x5000, 0x5000).mirror(0xfff).w(FUNC(roland_s220_state::led_latch1_w));
map(0x6000, 0x7fff).ram().share("nvram");
map(0x8000, 0x80ff).mirror(0xf00).w(FUNC(roland_s220_state::lcd_data_w));
@@ -225,9 +208,18 @@ void roland_s10_state::s10(machine_config &config)
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); // TC5564PL-20 + battery
- I8251(config, m_usart, 6.5_MHz_XTAL / 2); // MB89251A
-
- //MB87013(config, "qddia", 6.5_MHz_XTAL);
+ i8251_device &usart(I8251(config, "usart", 6.5_MHz_XTAL)); // MB89251A
+ usart.dtr_handler().set("qddia", FUNC(mb87013_device::dtr_w));
+ usart.txd_handler().set("qddia", FUNC(mb87013_device::txd_w));
+
+ mb87013_device &qddia(MB87013(config, "qddia", 6.5_MHz_XTAL));
+ qddia.sio_rd_callback().set("usart", FUNC(i8251_device::read));
+ qddia.sio_wr_callback().set("usart", FUNC(i8251_device::write));
+ qddia.txc_callback().set("usart", FUNC(i8251_device::write_txc));
+ qddia.rxc_callback().set("usart", FUNC(i8251_device::write_rxc));
+ qddia.rxd_callback().set("usart", FUNC(i8251_device::write_rxd));
+ qddia.dsr_callback().set("usart", FUNC(i8251_device::write_dsr));
+ qddia.op4_callback().set("qddia", FUNC(mb87013_device::rts_w));
mb63h149_device &keyscan(MB63H149(config, "keyscan", 12_MHz_XTAL));
keyscan.int_callback().set_inputline(m_maincpu, MCS51_T1_LINE);
diff --git a/src/mame/machine/mb87013.cpp b/src/mame/machine/mb87013.cpp
new file mode 100644
index 00000000000..2ba29e35fe3
--- /dev/null
+++ b/src/mame/machine/mb87013.cpp
@@ -0,0 +1,150 @@
+// license:BSD-3-Clause
+// copyright-holders:AJR
+/***************************************************************************
+
+ Roland MB87013 QD (Quick Disk) Drive Interface Adapter
+
+ This device uses a MB89251 (Intel 8251 compatible USART) to serialize
+ and deserialize the disk data. The two ICs appear to be clocked at the
+ same 6.5 MHz rate, and they have address, data, RD and WR signals in
+ common.
+
+ The OP4 and RTS pins are usually bridged.
+
+***************************************************************************/
+
+#include "emu.h"
+#include "mb87013.h"
+
+//**************************************************************************
+// GLOBAL VARIABLES
+//**************************************************************************
+
+// device type definition
+DEFINE_DEVICE_TYPE(MB87013, mb87013_device, "mb87013", "Roland MB87013 QDC")
+
+
+//**************************************************************************
+// DEVICE IMPLEMENTATION
+//**************************************************************************
+
+//-------------------------------------------------
+// mb87013_device - constructor
+//-------------------------------------------------
+
+mb87013_device::mb87013_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : device_t(mconfig, MB87013, tag, owner, clock)
+ , m_sio_rd_callback(*this)
+ , m_sio_wr_callback(*this)
+ , m_txc_callback(*this)
+ , m_rxc_callback(*this)
+ , m_rxd_callback(*this)
+ , m_dsr_callback(*this)
+ , m_op4_callback(*this)
+{
+}
+
+
+//-------------------------------------------------
+// device_resolve_objects - resolve objects that
+// may be needed for other devices to set
+// initial conditions at start time
+//-------------------------------------------------
+
+void mb87013_device::device_resolve_objects()
+{
+ m_sio_rd_callback.resolve_safe(0);
+ m_sio_wr_callback.resolve_safe();
+ m_txc_callback.resolve_safe();
+ m_rxc_callback.resolve_safe();
+ m_rxd_callback.resolve_safe();
+ m_dsr_callback.resolve_safe();
+ m_op4_callback.resolve_safe();
+}
+
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void mb87013_device::device_start()
+{
+}
+
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void mb87013_device::device_reset()
+{
+}
+
+
+//-------------------------------------------------
+// read - CPU read from QDC/SIO
+//-------------------------------------------------
+
+u8 mb87013_device::read(offs_t offset)
+{
+ if (!BIT(offset, 1))
+ return m_sio_rd_callback(offset);
+
+ // TODO
+ if (BIT(offset, 0))
+ logerror("%s: Reading data from control register or CRC register (LSB)\n", machine().describe_context());
+ else
+ logerror("%s: Reading data from CRC register (MSB)\n", machine().describe_context());
+ return 0;
+}
+
+
+//-------------------------------------------------
+// write - CPU write to QDC/SIO
+//-------------------------------------------------
+
+void mb87013_device::write(offs_t offset, u8 data)
+{
+ if (!BIT(offset, 1))
+ {
+ // TODO: A1 = 0 & A0 = 0 writes data to both devices
+ m_sio_wr_callback(offset, data);
+ return;
+ }
+
+ // TODO
+ if (BIT(offset, 0))
+ logerror("%s: Writing %02X to control register\n", machine().describe_context(), data);
+ else
+ logerror("%s: Writing %02X to data register\n", machine().describe_context(), data);
+}
+
+
+//-------------------------------------------------
+// dtr_w - SIO control line write to enable
+// MFM modulator
+//-------------------------------------------------
+
+WRITE_LINE_MEMBER(mb87013_device::dtr_w)
+{
+}
+
+
+//-------------------------------------------------
+// txd_w - SIO line write of data to be MFM
+// modulated by QDC
+//-------------------------------------------------
+
+WRITE_LINE_MEMBER(mb87013_device::txd_w)
+{
+}
+
+
+//-------------------------------------------------
+// rts_w - line write to enable transfer of
+// data through RxC and RxD
+//-------------------------------------------------
+
+WRITE_LINE_MEMBER(mb87013_device::rts_w)
+{
+}
diff --git a/src/mame/machine/mb87013.h b/src/mame/machine/mb87013.h
new file mode 100644
index 00000000000..065efeec909
--- /dev/null
+++ b/src/mame/machine/mb87013.h
@@ -0,0 +1,90 @@
+// license:BSD-3-Clause
+// copyright-holders:AJR
+/***************************************************************************
+
+ Roland MB87013 QD (Quick Disk) Drive Interface Adapter
+
+****************************************************************************
+ _____ _____
+ D2 1 |* \_/ | 40 D1
+ D3 2 | | 39 D0
+ D4 3 | | 38 N. C.
+ D5 4 | | 37 RXDA
+ D6 5 | | 36 RXCA
+ D7 6 | | 35 N. C.
+ N. C. 7 | | 34 TXCA
+ A0 8 | | 33 TXDA
+ A1 9 | | 32 INIB
+ Vss 10 | | 31 TST
+ ISCB 11 | MB87013 | 30 VDD
+ RSTB 12 | | 29 OCSB
+ RDB 13 | | 28 INIT
+ WRB 14 | | 27 IP0
+ DTRB 15 | | 26 WRDT
+ RTSB 16 | | 25 WRGA
+ OP4 17 | | 24 RDT
+ OP3 18 | | 23 IP1
+ N. C. 19 | | 22 IP2
+ XTAL 20 |_____________| 21 EXTAL
+
+***************************************************************************/
+
+#ifndef MAME_MACHINE_MB87013_H
+#define MAME_MACHINE_MB87013_H
+
+#pragma once
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> mb87013_device
+
+class mb87013_device : public device_t
+{
+public:
+ // device type constructor
+ mb87013_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+ static constexpr feature_type unemulated_features() { return feature::DISK; }
+
+ // configuration
+ auto sio_rd_callback() { return m_sio_rd_callback.bind(); }
+ auto sio_wr_callback() { return m_sio_wr_callback.bind(); }
+ auto txc_callback() { return m_txc_callback.bind(); }
+ auto rxc_callback() { return m_rxc_callback.bind(); }
+ auto rxd_callback() { return m_rxd_callback.bind(); }
+ auto dsr_callback() { return m_dsr_callback.bind(); }
+ auto op4_callback() { return m_op4_callback.bind(); }
+
+ // CPU read/write handlers
+ u8 read(offs_t offset);
+ void write(offs_t offset, u8 data);
+
+ // line write handlers
+ DECLARE_WRITE_LINE_MEMBER(dtr_w);
+ DECLARE_WRITE_LINE_MEMBER(txd_w);
+ DECLARE_WRITE_LINE_MEMBER(rts_w);
+
+protected:
+ // device-specific overrides
+ virtual void device_resolve_objects() override;
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+private:
+ // callback objects
+ devcb_read8 m_sio_rd_callback;
+ devcb_write8 m_sio_wr_callback;
+ devcb_write_line m_txc_callback;
+ devcb_write_line m_rxc_callback;
+ devcb_write_line m_rxd_callback;
+ devcb_write_line m_dsr_callback;
+ devcb_write_line m_op4_callback;
+};
+
+
+// device type declaration
+DECLARE_DEVICE_TYPE(MB87013, mb87013_device)
+
+#endif // MAME_MACHINE_MB87013_H
diff --git a/src/mame/mame.lst b/src/mame/mame.lst
index 8a63c9b35dd..df782ac5afd 100644
--- a/src/mame/mame.lst
+++ b/src/mame/mame.lst
@@ -35913,6 +35913,9 @@ mc50mk2 //
cm32l //
mt32 //
+@source:roland_pr100.cpp
+pr100 //
+
@source:roland_r8.cpp
r8 //
r8m //
diff --git a/src/mame/mess.flt b/src/mame/mess.flt
index 9deebc4bc22..a1700920666 100644
--- a/src/mame/mess.flt
+++ b/src/mame/mess.flt
@@ -858,6 +858,7 @@ roland_jx3p.cpp
roland_jx8p.cpp
roland_mc50.cpp
roland_mt32.cpp
+roland_pr100.cpp
roland_r8.cpp
roland_ra30.cpp
roland_s10.cpp