OXYGENHUB
◆ main openmsx / src / memory / RomKonamiKeyboardMaster.cc
1.7 KiB · C++ · last changed chore(): initial commit 1 month ago source blame history raw
e8555c89 Andy McCall 1
#include "RomKonamiKeyboardMaster.hh"
2
3
#include "MSXCPUInterface.hh"
4
#include "serialize.hh"
5
6
#include "unreachable.hh"
7
8
namespace openmsx {
9
10
RomKonamiKeyboardMaster::RomKonamiKeyboardMaster(
11
		DeviceConfig& config, Rom&& rom_)
12
	: Rom16kBBlocks(config, std::move(rom_))
13
	, vlm5030("VLM5030", "Konami Keyboard Master's VLM5030",
14
	          rom.getFilename(), config)
15
{
16
	setUnmapped(0);
17
	setRom(1, 0);
18
	setUnmapped(2);
19
	setUnmapped(3);
20
21
	reset(EmuTime::dummy());
22
23
	auto& cpuInterface = getCPUInterface();
24
	cpuInterface.register_IO_InOut(0x00, this);
25
	cpuInterface.register_IO_InOut(0x20, this);
26
}
27
28
RomKonamiKeyboardMaster::~RomKonamiKeyboardMaster()
29
{
30
	auto& cpuInterface = getCPUInterface();
31
	cpuInterface.unregister_IO_InOut(0x00, this);
32
	cpuInterface.unregister_IO_InOut(0x20, this);
33
}
34
35
void RomKonamiKeyboardMaster::reset(EmuTime /*time*/)
36
{
37
	vlm5030.reset();
38
}
39
40
void RomKonamiKeyboardMaster::writeIO(uint16_t port, byte value, EmuTime time)
41
{
42
	switch (port & 0xFF) {
43
	case 0x00:
44
		vlm5030.writeData(value);
45
		break;
46
	case 0x20:
47
		vlm5030.writeControl(value, time);
48
		break;
49
	default:
50
		UNREACHABLE;
51
	}
52
}
53
54
byte RomKonamiKeyboardMaster::readIO(uint16_t port, EmuTime time)
55
{
56
	return RomKonamiKeyboardMaster::peekIO(port, time);
57
}
58
59
byte RomKonamiKeyboardMaster::peekIO(uint16_t port, EmuTime time) const
60
{
61
	switch (port & 0xFF) {
62
	case 0x00:
63
		return vlm5030.getBSY(time) ? 0x10 : 0x00;
64
	case 0x20:
65
		return 0xFF;
66
	default:
67
		UNREACHABLE;
68
	}
69
}
70
71
template<typename Archive>
72
void RomKonamiKeyboardMaster::serialize(Archive& ar, unsigned /*version*/)
73
{
74
	ar.template serializeBase<Rom16kBBlocks>(*this);
75
	ar.serialize("VLM5030", vlm5030);
76
}
77
INSTANTIATE_SERIALIZE_METHODS(RomKonamiKeyboardMaster);
78
REGISTER_MSXDEVICE(RomKonamiKeyboardMaster, "RomKonamiKeyboardMaster");
79
80
} // namespace openmsx