OXYGENHUB
◆ main openmsx / src / memory / RomMSXtra.cc
1.5 KiB · C++ · last changed chore(): initial commit 1 month ago source blame history raw
1
#include "RomMSXtra.hh"
2
3
#include "serialize.hh"
4
5
#include "xrange.hh"
6
7
namespace openmsx {
8
9
RomMSXtra::RomMSXtra(const DeviceConfig& config, Rom&& rom_)
10
	: MSXRom(config, std::move(rom_))
11
	, ram(config, getName() + " RAM", "MSXtra RAM", 0x0800)
12
{
13
	for (auto i : xrange(0x800)) {
14
		ram[i] = (i & 1) ? 0x5a : 0xa5;
15
	}
16
}
17
18
byte RomMSXtra::readMem(uint16_t address, EmuTime /*time*/)
19
{
20
	if ((0x4000 <= address) && (address < 0x6000)) {
21
		return rom[address & 0x1fff];
22
	} else if ((0x6000 <= address) && (address < 0x8000)) {
23
		return ram[address & 0x07ff];
24
	} else {
25
		return 0xff;
26
	}
27
}
28
29
const byte* RomMSXtra::getReadCacheLine(uint16_t address) const
30
{
31
	if ((0x4000 <= address) && (address < 0x6000)) {
32
		return &rom[address & 0x1fff];
33
	} else if ((0x6000 <= address) && (address < 0x8000)) {
34
		return &ram[address & 0x07ff];
35
	} else {
36
		return unmappedRead.data();
37
	}
38
}
39
40
// default peekMem() implementation is OK
41
42
void RomMSXtra::writeMem(uint16_t address, byte value, EmuTime /*time*/)
43
{
44
	if ((0x6000 <= address) && (address < 0x8000)) {
45
		ram[address & 0x07ff] = value;
46
	}
47
}
48
49
byte* RomMSXtra::getWriteCacheLine(uint16_t address)
50
{
51
	if ((0x6000 <= address) && (address < 0x8000)) {
52
		return &ram[address & 0x07ff];
53
	} else {
54
		return unmappedWrite.data();
55
	}
56
}
57
58
template<typename Archive>
59
void RomMSXtra::serialize(Archive& ar, unsigned /*version*/)
60
{
61
	// skip MSXRom base class
62
	ar.template serializeBase<MSXDevice>(*this);
63
	ar.serialize("ram", ram);
64
}
65
INSTANTIATE_SERIALIZE_METHODS(RomMSXtra);
66
REGISTER_MSXDEVICE(RomMSXtra, "RomMSXtra");
67
68
} // namespace openmsx