OXYGENHUB
◆ main openmsx / src / input / JoyTap.cc
1.8 KiB · C++ · last changed chore(): initial commit 1 month ago source blame history raw
1
#include "JoyTap.hh"
2
3
#include "PluggingController.hh"
4
#include "serialize.hh"
5
6
#include "enumerate.hh"
7
#include "strCat.hh"
8
9
#include <array>
10
11
namespace openmsx {
12
13
JoyTap::JoyTap(PluggingController& pluggingController_, std::string name_)
14
	: pluggingController(pluggingController_)
15
	, name(std::move(name_))
16
{
17
}
18
19
void JoyTap::createPorts(std::string_view description, EmuTime time)
20
{
21
	for (auto [i, slave] : enumerate(slaves)) {
22
		slave.emplace(
23
			pluggingController,
24
			strCat(name, "_port_", char('1' + i)),
25
			strCat(description, ' ', char('1' + i)));
26
		slave->write(0, time);
27
	}
28
}
29
30
zstring_view JoyTap::getDescription() const
31
{
32
	return "MSX Joy Tap device";
33
}
34
35
zstring_view JoyTap::getName() const
36
{
37
	return name;
38
}
39
40
void JoyTap::plugHelper(Connector& /*connector*/, EmuTime time)
41
{
42
	createPorts("Joy Tap port", time);
43
}
44
45
void JoyTap::unplugHelper(EmuTime time)
46
{
47
	for (auto& s : slaves) {
48
		s->unplug(time);
49
		s.reset();
50
	}
51
}
52
53
uint8_t JoyTap::read(EmuTime time)
54
{
55
	uint8_t value = 255;
56
	for (auto& s : slaves) {
57
		value &= s->read(time);
58
	}
59
	return value;
60
}
61
62
void JoyTap::write(uint8_t value, EmuTime time)
63
{
64
	for (auto& s : slaves) {
65
		s->write(value, time);
66
	}
67
}
68
69
template<typename Archive>
70
void JoyTap::serialize(Archive& ar, unsigned /*version*/)
71
{
72
	// saving only happens when plugged in
73
	if constexpr (!Archive::IS_LOADER) assert(isPluggedIn());
74
	// restore plugged state when loading
75
	if constexpr (Archive::IS_LOADER) {
76
		plugHelper(*getConnector(), pluggingController.getCurrentTime());
77
	}
78
79
	std::array<char, 6> tag = {'p', 'o', 'r', 't', 'X', 0};
80
	for (auto [i, slave] : enumerate(slaves)) {
81
		tag[4] = char('0' + i);
82
		ar.serialize(tag.data(), *slave);
83
	}
84
}
85
INSTANTIATE_SERIALIZE_METHODS(JoyTap);
86
REGISTER_POLYMORPHIC_INITIALIZER(Pluggable, JoyTap, "JoyTap");
87
88
} // namespace openmsx