summaryrefslogtreecommitdiffstats
path: root/src/mame/drivers/poly800.cpp
blob: 1a5ecb5755f7b9f189062e01337dcf4ecf3fe414 (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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
// license:BSD-3-Clause
// copyright-holders:AJR
/****************************************************************************

    Skeleton driver for Korg Poly-800 synthesizer.

****************************************************************************/

#include "emu.h"
#include "bus/midi/midi.h"
#include "cpu/i8085/i8085.h"
#include "machine/6850acia.h"
#include "machine/i8155.h"
#include "machine/nvram.h"
//#include "sound/msm5232.h"

class poly800_state : public driver_device
{
public:
	poly800_state(const machine_config &mconfig, device_type type, const char *tag)
		: driver_device(mconfig, type, tag)
		, m_maincpu(*this, "maincpu")
	{
	}

	void poly800(machine_config &config);
	void poly800mdk(machine_config &config);

protected:
	void common_map(address_map &map);

private:
	void mem_map(address_map &map);
	void mdk_map(address_map &map);
	void io_map(address_map &map);

protected:
	required_device<i8085a_cpu_device> m_maincpu;
};

class poly800ii_state : public poly800_state
{
public:
	poly800ii_state(const machine_config &mconfig, device_type type, const char *tag)
		: poly800_state(mconfig, type, tag)
	{
	}

	void poly800ii(machine_config &config);

private:
	void mem_map(address_map &map);
};

void poly800_state::common_map(address_map &map)
{
	map(0x4000, 0x40ff).mirror(0x1f00).rw("pio", FUNC(i8155_device::memory_r), FUNC(i8155_device::memory_w));
	map(0xe000, 0xe001).mirror(0x1f7e).w("acia", FUNC(acia6850_device::write));
	map(0xe080, 0xe081).mirror(0x1f7e).r("acia", FUNC(acia6850_device::read));
}

void poly800_state::mem_map(address_map &map)
{
	map(0x0000, 0x1fff).rom().region("klm596", 0);
	map(0x2000, 0x27ff).mirror(0x1800).ram().share("nvram");
	common_map(map);
}

void poly800_state::mdk_map(address_map &map)
{
	map(0x0000, 0x2fff).rom().region("klm596", 0);
	map(0x3000, 0x37ff).mirror(0x0800).ram().share("nvram");
	common_map(map);
}

void poly800ii_state::mem_map(address_map &map)
{
	map(0x0000, 0x27ff).rom().region("klm779", 0);
	map(0x2800, 0x37ff).ram().share("nvram");
	common_map(map);
}

void poly800_state::io_map(address_map &map)
{
	map(0x40, 0x47).mirror(0x18).rw("pio", FUNC(i8155_device::io_r), FUNC(i8155_device::io_w));
}

static INPUT_PORTS_START(poly800)
INPUT_PORTS_END

void poly800_state::poly800(machine_config &config)
{
	I8085A(config, m_maincpu, 5_MHz_XTAL); // MSM80C85ARS
	m_maincpu->set_addrmap(AS_PROGRAM, &poly800_state::mem_map);
	m_maincpu->set_addrmap(AS_IO, &poly800_state::io_map);

	NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); // HM6116LP-4 + battery

	i8155_device &pio(I8155(config, "pio", 5_MHz_XTAL / 2)); // MSM81C55RS
	pio.out_to_callback().set("acia", FUNC(acia6850_device::write_rxc));
	pio.out_to_callback().append("acia", FUNC(acia6850_device::write_txc));

	acia6850_device &acia(ACIA6850(config, "acia")); // HD63B50P
	acia.txd_handler().set("midi_out", FUNC(midi_port_device::write_txd));
	acia.irq_handler().set_inputline(m_maincpu, I8085_RST65_LINE);

	//MSM5232(config, "msm"); // MSM-5232RS

	MIDI_PORT(config, "midi_in", midiin_slot, "midiin").rxd_handler().set("acia", FUNC(acia6850_device::write_rxd));
	MIDI_PORT(config, "midi_out", midiout_slot, "midiout");
}

void poly800_state::poly800mdk(machine_config &config)
{
	poly800(config);
	m_maincpu->set_addrmap(AS_PROGRAM, &poly800_state::mdk_map);
}

void poly800ii_state::poly800ii(machine_config &config)
{
	poly800(config);
	m_maincpu->set_addrmap(AS_PROGRAM, &poly800ii_state::mem_map);

	// NVRAM is uPD4464C-15 + battery with A12 tied to GND
}

ROM_START(poly800)
	ROM_REGION(0x2002, "klm596", 0)
	ROM_SYSTEM_BIOS(0, "v36", "Version 36")
	ROM_SYSTEM_BIOS(1, "v30", "Version 30")
	ROMX_LOAD("830236.ic22", 0x0000, 0x2000, CRC(16cd416d) SHA1(a1f6f5be4f70b47ea4d1dccd723179c9991f4a92), ROM_BIOS(0))
	ROMX_LOAD("830230.ic22", 0x0000, 0x2002, CRC(1ba81f55) SHA1(94a0d45680d107ab4d1b542e8378a599ded36f06), ROM_BIOS(1))
	// Where did the extra 2 bytes at the end come from?
ROM_END

ROM_START(poly800mdk)
	ROM_REGION(0x4000, "klm596", 0)
	ROM_LOAD("mdk.ic22", 0x0000, 0x4000, CRC(a25ab16a) SHA1(a9294bf90a8fa81dd825bcbf9fcd3b5014045936)) // 27C128
ROM_END

ROM_START(poly800ii)
	ROM_REGION(0x4000, "klm779", 0)
	ROM_LOAD("851005.ic24", 0x0000, 0x4000, CRC(09ae4fc5) SHA1(1e8a418919ef61334fb55aefa8aaebcaefc28ebd)) // 27C128 (last 3/8ths not addressable)
ROM_END

SYST(1984, poly800,    0, 0, poly800,    poly800, poly800_state,   empty_init, "Korg", "Poly-800 Programmable Polyphonic Synthesizer", MACHINE_IS_SKELETON)
SYST(1984, poly800mdk, 0, 0, poly800mdk, poly800, poly800_state,   empty_init, "Korg", "Poly-800 Programmable Polyphonic Synthesizer (MIDI Dump Kit)", MACHINE_IS_SKELETON)
SYST(1986, poly800ii,  0, 0, poly800ii,  poly800, poly800ii_state, empty_init, "Korg", "Poly-800II Programmable Polyphonic Synthesizer", MACHINE_IS_SKELETON)