OXYGENHUB
◆ main openmsx / src / MSXE6Timer.cc
1.1 KiB · C++ · last changed chore(): initial commit 1 month ago source blame history raw
1
#include "MSXE6Timer.hh"
2
3
#include "serialize.hh"
4
5
namespace openmsx {
6
7
MSXE6Timer::MSXE6Timer(const DeviceConfig& config)
8
	: MSXDevice(config)
9
	, reference(getCurrentTime())
10
{
11
}
12
13
void MSXE6Timer::reset(EmuTime time)
14
{
15
	reference.reset(time);
16
}
17
18
void MSXE6Timer::writeIO(uint16_t /*port*/, byte /*value*/, EmuTime time)
19
{
20
	/*
21
	The Clock class rounds down time to its clock resolution.
22
	This is correct for the E6 timer, verified by running the following
23
	program in R800 mode:
24
		org &HC000
25
		di
26
		ld c,&HE6
27
	loop:
28
		out (&HE6),a
29
		in d,(c)
30
		jp z,loop
31
		ei
32
		ret
33
	It returns with D=1.
34
	*/
35
	reference.advance(time);
36
}
37
38
byte MSXE6Timer::readIO(uint16_t port, EmuTime time)
39
{
40
	return peekIO(port, time);
41
}
42
43
byte MSXE6Timer::peekIO(uint16_t port, EmuTime time) const
44
{
45
	auto counter = reference.getTicksTill(time);
46
	return (port & 1) ? ((counter >> 8) & 0xFF) : (counter & 0xFF);
47
}
48
49
template<typename Archive>
50
void MSXE6Timer::serialize(Archive& ar, unsigned /*version*/)
51
{
52
	ar.template serializeBase<MSXDevice>(*this);
53
	ar.serialize("reference", reference);
54
}
55
INSTANTIATE_SERIALIZE_METHODS(MSXE6Timer);
56
REGISTER_MSXDEVICE(MSXE6Timer, "E6Timer");
57
58
} // namespace openmsx