summaryrefslogtreecommitdiffstats
path: root/src/mame/drivers/roland_pr100.cpp
blob: 72aeebfec33ad6299481075c2e429d92653baad8 (plain) (blame)
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)