OXYGENHUB
◆ main openmsx / src / serial / JVCMSXMIDI.cc
1.9 KiB · C++ · last changed chore(): initial commit 1 month ago source blame history raw
1
#include "JVCMSXMIDI.hh"
2
3
#include "serialize.hh"
4
5
namespace openmsx {
6
7
// MSX interface:
8
// port R/W
9
// 0    R    DIN sync input. Bit0 stop/start, bit 1: clock pulse (NOT EMULATED)
10
// 2    W    Control Register
11
// 3    W    Transmit Data Register
12
// 2    R    Status Register
13
// 3    R    Receive Data Register
14
15
// See information provided by gflorez here:
16
// https://www.msx.org/forum/msx-talk/hardware/jvc-msx-midi-interface?page=1#comment-377145
17
18
// Some existing JVC MSX-MIDI detection routines:
19
// - Synthesix (copied from MusicModule): does INP(2), expects 0; OUT 2,3 : OUT
20
//   2,21: INP(2) and expects bit 1 to be 1 and bit 2, 3 and 7 to be 0. Then does
21
//   OUT 3,0xFE : INP(2) and expects bit 1 to be 0.
22
23
JVCMSXMIDI::JVCMSXMIDI(const DeviceConfig& config)
24
	: MSXDevice(config)
25
	, mc6850(MSXDevice::getName(), getMotherBoard(), 2000000) // 2 MHz
26
{
27
	reset(getCurrentTime());
28
}
29
30
void JVCMSXMIDI::reset(EmuTime time)
31
{
32
	mc6850.reset(time);
33
}
34
35
uint8_t JVCMSXMIDI::readIO(uint16_t port, EmuTime /*time*/)
36
{
37
	switch (port & 0x7) {
38
	case 0:
39
		return 0x00; // NOT IMPLEMENTED
40
	case 2:
41
		return mc6850.readStatusReg();
42
	case 3:
43
		return mc6850.readDataReg();
44
	}
45
	return 0xFF;
46
}
47
48
uint8_t JVCMSXMIDI::peekIO(uint16_t port, EmuTime /*time*/) const
49
{
50
	switch (port & 0x7) {
51
	case 0:
52
		return 0x00; // NOT IMPLEMENTED
53
	case 2:
54
		return mc6850.peekStatusReg();
55
	case 3:
56
		return mc6850.peekDataReg();
57
	}
58
	return 0xFF;
59
}
60
61
void JVCMSXMIDI::writeIO(uint16_t port, uint8_t value, EmuTime time)
62
{
63
	switch (port & 0x7) {
64
	case 2:
65
		mc6850.writeControlReg(value, time);
66
		break;
67
	case 3:
68
		mc6850.writeDataReg(value, time);
69
		break;
70
	}
71
}
72
73
// version 1: initial version
74
template<typename Archive>
75
void JVCMSXMIDI::serialize(Archive& ar, unsigned /*version*/)
76
{
77
	ar.template serializeBase<MSXDevice>(*this);
78
	ar.serialize("MC6850", mc6850);
79
}
80
INSTANTIATE_SERIALIZE_METHODS(JVCMSXMIDI);
81
REGISTER_MSXDEVICE(JVCMSXMIDI, "JVCMSXMIDI");
82
83
} // namespace openmsx