OXYGENHUB
◆ main openmsx / src / serial / MSXFacMidiInterface.cc
3.4 KiB · C++ · last changed chore(): initial commit 1 month ago source blame history raw
1
#include "MSXFacMidiInterface.hh"
2
3
#include "MidiInDevice.hh"
4
5
#include "serialize.hh"
6
7
#include "outer.hh"
8
9
namespace openmsx {
10
11
MSXFacMidiInterface::MSXFacMidiInterface(const DeviceConfig& config)
12
	: MSXDevice(config)
13
	, MidiInConnector(MSXDevice::getPluggingController(), MSXDevice::getName() + "-in")
14
	, outConnector   (MSXDevice::getPluggingController(), MSXDevice::getName() + "-out")
15
	, i8251(getScheduler(), interface, getCurrentTime())
16
{
17
	EmuTime time = getCurrentTime();
18
	static constexpr auto period = EmuDuration::hz(500000); // 500 kHz
19
	i8251.getClockPin().setPeriodicState(period, period / 2, time);
20
	reset(time);
21
}
22
23
void MSXFacMidiInterface::reset(EmuTime time)
24
{
25
	i8251.reset(time);
26
}
27
28
uint8_t MSXFacMidiInterface::readIO(uint16_t port, EmuTime time)
29
{
30
	// 0 -> UART data   register
31
	// 1 -> UART status register
32
	return i8251.readIO(port & 1, time);
33
}
34
35
uint8_t MSXFacMidiInterface::peekIO(uint16_t port, EmuTime time) const
36
{
37
	return i8251.peekIO(port & 1, time);
38
}
39
40
void MSXFacMidiInterface::writeIO(uint16_t port, uint8_t value, EmuTime time)
41
{
42
	// 0 -> UART data    register
43
	// 1 -> UART command register
44
	i8251.writeIO(port & 1, value, time);
45
}
46
47
// I8251Interface  (pass calls from I8251 to outConnector)
48
49
void MSXFacMidiInterface::Interface::setRxRDY(bool /*status*/, EmuTime /*time*/)
50
{
51
}
52
53
void MSXFacMidiInterface::Interface::setDTR(bool /*status*/, EmuTime /*time*/)
54
{
55
}
56
57
void MSXFacMidiInterface::Interface::setRTS(bool /*status*/, EmuTime /*time*/)
58
{
59
}
60
61
bool MSXFacMidiInterface::Interface::getDSR(EmuTime /*time*/)
62
{
63
	return true;
64
}
65
66
bool MSXFacMidiInterface::Interface::getCTS(EmuTime /*time*/)
67
{
68
	return true;
69
}
70
71
void MSXFacMidiInterface::Interface::setDataBits(DataBits bits)
72
{
73
	auto& midi = OUTER(MSXFacMidiInterface, interface);
74
	midi.outConnector.setDataBits(bits);
75
}
76
77
void MSXFacMidiInterface::Interface::setStopBits(StopBits bits)
78
{
79
	auto& midi = OUTER(MSXFacMidiInterface, interface);
80
	midi.outConnector.setStopBits(bits);
81
}
82
83
void MSXFacMidiInterface::Interface::setParityBit(bool enable, Parity parity)
84
{
85
	auto& midi = OUTER(MSXFacMidiInterface, interface);
86
	midi.outConnector.setParityBit(enable, parity);
87
}
88
89
void MSXFacMidiInterface::Interface::recvByte(uint8_t value, EmuTime time)
90
{
91
	auto& midi = OUTER(MSXFacMidiInterface, interface);
92
	midi.outConnector.recvByte(value, time);
93
}
94
95
void MSXFacMidiInterface::Interface::signal(EmuTime time)
96
{
97
	const auto& midi = OUTER(MSXFacMidiInterface, interface);
98
	midi.getPluggedMidiInDev().signal(time);
99
}
100
101
102
// MidiInConnector
103
104
bool MSXFacMidiInterface::ready()
105
{
106
	return i8251.isRecvReady();
107
}
108
109
bool MSXFacMidiInterface::acceptsData()
110
{
111
	return i8251.isRecvEnabled();
112
}
113
114
void MSXFacMidiInterface::setDataBits(DataBits bits)
115
{
116
	i8251.setDataBits(bits);
117
}
118
119
void MSXFacMidiInterface::setStopBits(StopBits bits)
120
{
121
	i8251.setStopBits(bits);
122
}
123
124
void MSXFacMidiInterface::setParityBit(bool enable, Parity parity)
125
{
126
	i8251.setParityBit(enable, parity);
127
}
128
129
void MSXFacMidiInterface::recvByte(uint8_t value, EmuTime time)
130
{
131
	i8251.recvByte(value, time);
132
}
133
134
135
template<typename Archive>
136
void MSXFacMidiInterface::serialize(Archive& ar, unsigned /*version*/)
137
{
138
	ar.template serializeBase<MSXDevice>(*this);
139
	ar.template serializeBase<MidiInConnector>(*this);
140
	ar.serialize("outConnector", outConnector,
141
	             "I8251",        i8251);
142
}
143
INSTANTIATE_SERIALIZE_METHODS(MSXFacMidiInterface);
144
REGISTER_MSXDEVICE(MSXFacMidiInterface, "MSXFacMidiInterface");
145
146
} // namespace openmsx