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 m_maincpu; + required_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 m_maincpu; required_device m_io; - required_device m_usart; required_device m_lcdc; required_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 + 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(config, "qddia", 6.5_MHz_XTAL); + 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