OXYGENHUB
◆ main openmsx / src / memory / RomRType.cc
1.1 KiB · C++ · last changed chore(): initial commit 1 month ago source blame history raw
1
// R-Type cartridges
2
//
3
// The address to change banks:
4
//  first  16kb: fixed at 0x0f or 0x17 (both have the same content)
5
//  second 16kb: 0x4000 - 0x7FFF (0x7000 and 0x7800 used)
6
//               bit 4 selects ROM chip,
7
//                if low  bit 3-0 select page
8
//                   high     2-0
9
// Thanks to n_n for investigating this on a real cartridge.
10
11
#include "RomRType.hh"
12
#include "serialize.hh"
13
14
namespace openmsx {
15
16
RomRType::RomRType(const DeviceConfig& config, Rom&& rom_)
17
	: Rom16kBBlocks(config, std::move(rom_))
18
{
19
	reset(EmuTime::dummy());
20
}
21
22
void RomRType::reset(EmuTime /*time*/)
23
{
24
	setUnmapped(0);
25
	setRom(1, 0x17);
26
	setRom(2, 0);
27
	setUnmapped(3);
28
}
29
30
void RomRType::writeMem(uint16_t address, byte value, EmuTime /*time*/)
31
{
32
	if ((0x4000 <= address) && (address < 0x8000)) {
33
		value &= (value & 0x10) ? 0x17 : 0x1F;
34
		setRom(2, value);
35
	}
36
}
37
38
byte* RomRType::getWriteCacheLine(uint16_t address)
39
{
40
	if ((0x4000 <= address) && (address < 0x8000)) {
41
		return nullptr;
42
	} else {
43
		return unmappedWrite.data();
44
	}
45
}
46
47
REGISTER_MSXDEVICE(RomRType, "RomRType");
48
49
} // namespace openmsx