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