New machines marked as NOT_WORKING

----------------------------------
Roland PR-100 Digital Sequencer [AJR, Valley Bell]
This commit is contained in:
AJR 2021-04-18 14:05:21 -04:00
parent 1da36f8ce5
commit daa6c94699
7 changed files with 382 additions and 22 deletions

View File

@ -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",
}

View File

@ -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)

View File

@ -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
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);

View File

@ -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)
{
}

View File

@ -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

View File

@ -35913,6 +35913,9 @@ mc50mk2 //
cm32l //
mt32 //
@source:roland_pr100.cpp
pr100 //
@source:roland_r8.cpp
r8 //
r8m //

View File

@ -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