1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
|
// 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"
namespace {
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
ROM_START(pr100_201)
ROM_REGION(0x10000, "program", 0)
ROM_LOAD("pr100-201_mbm27c512-20.ic10", 0x00000, 0x10000, CRC(2f3bc01c) SHA1(114ff687ffac4d517edba77d427422c4d2a6d369))
ROM_END
} // anonymous namespace
SYST(1987, pr100, 0, 0, pr100, pr100, roland_pr100_state, empty_init, "Roland", "PR-100 Digital Sequencer (v2.02)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND)
SYST(1987, pr100_201, pr100, 0, pr100, pr100, roland_pr100_state, empty_init, "Roland", "PR-100 Digital Sequencer (v2.01)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND)
|