OXYGENHUB
◆ main openmsx / src / memory / RomNeo8.cc
1.2 KiB · C++ · last changed chore(): initial commit 1 month ago source blame history raw
1
#include "RomNeo8.hh"
2
3
#include "serialize.hh"
4
5
#include "xrange.hh"
6
7
namespace openmsx {
8
9
RomNeo8::RomNeo8(const DeviceConfig& config, Rom&& rom_)
10
	: Rom8kBBlocks(config, std::move(rom_))
11
{
12
	reset(EmuTime::dummy());
13
}
14
15
void RomNeo8::reset(EmuTime /*time*/)
16
{
17
	for (auto i : xrange(6)) {
18
		setRom(i, 0);
19
		blockReg[i] = 0;
20
	}
21
	setUnmapped(6);
22
	setUnmapped(7);
23
}
24
25
void RomNeo8::writeMem(uint16_t address, byte value, EmuTime /*time*/)
26
{
27
	unsigned bbb = (address >> 11) & 0b111;
28
	if (bbb < 2) return;
29
	unsigned region = bbb - 2;
30
	if ((address & 1) == 0) {
31
		blockReg[region] = uint16_t((blockReg[region] & 0xFF00) | value);
32
	} else {
33
		blockReg[region] = uint16_t((blockReg[region] & 0x00FF) | ((value & 0b1111) << 8));
34
	}
35
	setRom(region, blockReg[region]);
36
}
37
38
byte* RomNeo8::getWriteCacheLine(uint16_t address)
39
{
40
	unsigned bbb = (address >> 11) & 0b111;
41
	return (bbb < 2) ? unmappedWrite.data() : nullptr;
42
}
43
44
template<typename Archive>
45
void RomNeo8::serialize(Archive& ar, unsigned /*version*/)
46
{
47
	ar.template serializeBase<Rom8kBBlocks>(*this);
48
	ar.serialize("blockReg", blockReg);
49
}
50
INSTANTIATE_SERIALIZE_METHODS(RomNeo8);
51
REGISTER_MSXDEVICE(RomNeo8, "RomNeo8");
52
53
} // namespace openmsx