OXYGENHUB
◆ main openmsx / src / memory / PanasonicRam.cc
1.5 KiB · C++ · last changed chore(): initial commit 1 month ago source blame history raw
e8555c89 Andy McCall 1
#include "PanasonicRam.hh"
2
3
#include "PanasonicMemory.hh"
4
5
#include "MSXMotherBoard.hh"
6
#include "serialize.hh"
7
8
namespace openmsx {
9
10
PanasonicRam::PanasonicRam(const DeviceConfig& config)
11
	: MSXMemoryMapperBase(config)
12
	, panasonicMemory(getMotherBoard().getPanasonicMemory())
13
{
14
	panasonicMemory.registerRam(checkedRam.getUncheckedRam());
15
}
16
17
void PanasonicRam::writeMem(uint16_t address, byte value, EmuTime /*time*/)
18
{
19
	unsigned addr = calcAddress(address);
20
	if (panasonicMemory.isWritable(addr)) {
21
		checkedRam.write(addr, value);
22
	}
23
}
24
25
byte* PanasonicRam::getWriteCacheLine(uint16_t start)
26
{
27
	unsigned addr = calcAddress(start);
28
	if (panasonicMemory.isWritable(addr)) {
29
		return checkedRam.getWriteCacheLine(addr);
30
	} else {
31
		return unmappedWrite.data();
32
	}
33
}
34
35
void PanasonicRam::writeIO(uint16_t port, byte value, EmuTime time)
36
{
37
	MSXMemoryMapperBase::writeIOImpl(port, value, time);
38
	byte page = port & 3;
39
	unsigned addr = segmentOffset(page);
40
	if (byte* data = checkedRam.getRWCacheLines(addr, 0x4000)) {
41
		const byte* rData = data;
42
		byte* wData = panasonicMemory.isWritable(addr) ? data : unmappedWrite.data();
43
		fillDeviceRWCache(page * 0x4000, 0x4000, rData, wData);
44
	} else {
45
		invalidateDeviceRWCache(page * 0x4000, 0x4000);
46
	}
47
}
48
49
template<typename Archive>
50
void PanasonicRam::serialize(Archive& ar, unsigned /*version*/)
51
{
52
	ar.template serializeBase<MSXMemoryMapperBase>(*this);
53
}
54
INSTANTIATE_SERIALIZE_METHODS(PanasonicRam);
55
REGISTER_MSXDEVICE(PanasonicRam, "PanasonicRam");
56
57
} // namespace openmsx