OXYGENHUB
◆ main openmsx / src / MSXHiResTimer.cc
1.3 KiB · C++ · last changed chore(): initial commit 1 month ago source blame history raw
1
#include "MSXHiResTimer.hh"
2
3
#include "serialize.hh"
4
5
#include "narrow.hh"
6
7
namespace openmsx {
8
9
MSXHiResTimer::MSXHiResTimer(const DeviceConfig& config)
10
	: MSXDevice(config)
11
	, reference(getCurrentTime())
12
{
13
	reset(getCurrentTime());
14
}
15
16
void MSXHiResTimer::reset(EmuTime time)
17
{
18
	reference.reset(time);
19
	latchedValue = 0;
20
}
21
22
void MSXHiResTimer::writeIO(uint16_t /*port*/, byte /*value*/, EmuTime time)
23
{
24
	// write to any port will reset the counter
25
	reference.advance(time);
26
}
27
28
byte MSXHiResTimer::readIO(uint16_t port, EmuTime time)
29
{
30
	if ((port & 3) == 0) {
31
		// reading port 0 will latch the current counter value
32
		latchedValue = reference.getTicksTill(time);
33
	}
34
	// reading port {0, 1, 2, 3} will read bits {0-7, 8-15, 16-23, 24-32}
35
	// of the counter
36
	return narrow_cast<byte>(latchedValue >> (8 * (port & 3)));
37
}
38
39
byte MSXHiResTimer::peekIO(uint16_t port, EmuTime time) const
40
{
41
	unsigned tmp = (port & 3) ? latchedValue : reference.getTicksTill(time);
42
	return narrow_cast<byte>(tmp >> (8 * (port & 3)));
43
}
44
45
template<typename Archive>
46
void MSXHiResTimer::serialize(Archive& ar, unsigned /*version*/)
47
{
48
	ar.template serializeBase<MSXDevice>(*this);
49
	ar.serialize("reference",    reference,
50
	             "latchedValue", latchedValue);
51
}
52
INSTANTIATE_SERIALIZE_METHODS(MSXHiResTimer);
53
REGISTER_MSXDEVICE(MSXHiResTimer, "HiResTimer");
54
55
} // namespace openmsx