15[[nodiscard]]
static byte calcReadBackMask(MSXMotherBoard& motherBoard)
17 std::string_view type = motherBoard.getMachineConfig()->getConfig().getChildData(
18 "MapperReadBackBits",
"largest");
19 if (type ==
"largest") {
22 auto bits = StringOp::stringTo<int>(type);
24 throw FatalError(
"Unknown mapper type: \"", type,
"\".");
26 if (*bits < 0 || *bits > 8) {
27 throw FatalError(
"MapperReadBackBits out of range: \"", type,
"\".");
29 return byte(~(
unsigned(-1) << *bits));
34 , debuggable(getMotherBoard(), getName())
35 , mask(calcReadBackMask(getMotherBoard()))
37 reset(EmuTime::dummy());
44 baseValue = baseValue_;
49 mappers.push_back(mapper);
62 for (
auto* mapper : mappers) {
63 result &= mapper->readIO(port, time);
67 return registers[port & 3];
70 return (value & mask) | (baseValue & ~mask);
78 for (
auto* mapper : mappers) {
79 result &= mapper->peekIO(port, time);
83 return registers[port & 3];
86 return (value & mask) | (baseValue & ~mask);
91 registers[port & 3] = value;
95 for (
auto* mapper : mappers) {
96 mapper->writeIO(port, value, time);
106 const std::string& name_)
111byte MSXMapperIO::Debuggable::read(
unsigned address)
115 return mapperIO.registers[address & 3];
118void MSXMapperIO::Debuggable::write(
unsigned address,
byte value,
122 mapperIO.writeIO(narrow_cast<word>(address), value, time);
126template<
typename Archive>
129 if (ar.versionBelow(version, 2)) {
132 assert(Archive::IS_LOADER);
133 ar.serialize(
"registers", registers);
134 for (
auto [page, reg] :
enumerate(registers)) {
138 if (ar.versionAtLeast(version, 3)) {
145 ar.serialize(
"registers", registers);
An MSXDevice is an emulated hardware component connected to the bus of the emulated MSX.
virtual void reset(EmuTime::param time)
This method is called on reset.
byte peekIO(word port, EmuTime::param time) const override
Read a byte from a given IO port.
void registerMapper(MSXMemoryMapperInterface *mapper)
MSXMapperIO(const DeviceConfig &config)
void serialize(Archive &ar, unsigned version)
void unregisterMapper(MSXMemoryMapperInterface *mapper)
void writeIO(word port, byte value, EmuTime::param time) override
Write a byte to a given IO port at a certain time to this device.
byte readIO(word port, EmuTime::param time) override
Read a byte from an IO port at a certain time from this device.
void setMode(Mode mode, byte mask, byte baseValue)
constexpr auto enumerate(Iterable &&iterable)
Heavily inspired by Nathan Reed's blog post: Python-Like enumerate() In C++17 http://reedbeta....
This file implemented 3 utility functions:
uint8_t byte
8 bit unsigned integer
uint16_t word
16 bit unsigned integer
#define OUTER(type, member)
#define INSTANTIATE_SERIALIZE_METHODS(CLASS)
auto rfind_unguarded(RANGE &range, const VAL &val, Proj proj={})
Similar to the find(_if)_unguarded functions above, but searches from the back to front.