86 , biosRam(config,
getName() +
" BIOS RAM",
"Chakkari Copy BIOS RAM", 0x4000)
87 , workRam(config,
getName() +
" work RAM",
"Chakkari Copy work RAM", 0x0800)
88 , rom(
getName() +
" ROM",
"rom", config)
89 , pauseButtonPressedSetting(getCommandController(),
90 getName() +
" PAUSE button pressed",
91 "controls the PAUSE button state", false,
Setting::DONT_SAVE)
92 , copyButtonPressedSetting(getCommandController(),
93 getName() +
" COPY button pressed",
94 "controls the COPY button state", false,
Setting::DONT_SAVE)
95 , modeSetting(getCommandController(),
getName() +
" mode",
96 "Sets mode of the cartridge: in COPY mode you can hardcopy MSX1 screens, "
97 "in RAM mode you just have a 16kB RAM expansion",
ChakkariCopy::COPY,
101 reset(getCurrentTime());
102 modeSetting.attach(*
this);
105ChakkariCopy::~ChakkariCopy()
107 modeSetting.detach(*
this);
110void ChakkariCopy::reset(EmuTime::param time)
112 writeIO(0, 0xFF, time);
115void ChakkariCopy::writeIO(
word ,
byte value, EmuTime::param )
117 byte diff = reg ^ value;
121 getCliComm().printInfo(
getName(),
" COPY LED ",
122 (((value & 1) == 0x01) ?
"OFF" :
"ON"));
125 getCliComm().printInfo(
getName(),
" PAUSE LED ",
126 (((value & 2) == 0x02) ?
"OFF" :
"ON"));
129 if (modeSetting.getEnum() == COPY) {
131 invalidateDeviceRWCache(0x0000, 0x4000);
136byte ChakkariCopy::readIO(
word port, EmuTime::param time)
138 return peekIO(port, time);
141byte ChakkariCopy::peekIO(
word , EmuTime::param )
const
144 if (copyButtonPressedSetting .getBoolean()) retVal &= ~0x01;
145 if (pauseButtonPressedSetting.getBoolean()) retVal &= ~0x02;
149byte ChakkariCopy::readMem(
word address, EmuTime::param time)
151 return peekMem(address, time);
154byte ChakkariCopy::peekMem(
word address, EmuTime::param )
const
156 return *getReadCacheLine(address);
159const byte* ChakkariCopy::getReadCacheLine(
word address)
const
161 if (modeSetting.getEnum() == COPY) {
163 if (address < 0x4000) {
164 return &biosRam[address];
167 if ((0x4000 <= address) && (address < 0x6000)) {
168 return &rom[address & 0x1FFF];
171 if ((0x6000 <= address) && (address < 0x8000)) {
172 return &workRam[address & 0x07FF];
176 if ((0x4000 <= address) && (address < 0x8000)) {
177 return &biosRam[address & 0x3FFF];
180 return unmappedRead.data();
183void ChakkariCopy::writeMem(
word address,
byte value, EmuTime::param )
185 *getWriteCacheLine(address) = value;
188byte* ChakkariCopy::getWriteCacheLine(
word address)
const
190 if (modeSetting.getEnum() == COPY) {
192 if ((address < 0x4000) && ((reg & 0x04) == 0)) {
193 return const_cast<byte*
>(&biosRam[address & 0x3FFF]);
197 if ((0x6000 <= address) && (address < 0x8000)) {
198 return const_cast<byte*
>(&workRam[address & 0x07FF]);
202 if ((0x4000 <= address) && (address < 0x8000)) {
203 return const_cast<byte*
>(&biosRam[address & 0x3FFF]);
206 return unmappedWrite.data();
209void ChakkariCopy::update(
const Setting& )
noexcept
212 invalidateDeviceRWCache();
215template<
typename Archive>
218 ar.template serializeBase<MSXDevice>(*
this);
219 ar.serialize(
"biosRam", biosRam,
222 if constexpr (Archive::IS_LOADER) {
223 writeIO(0, reg, getCurrentTime());
#define REGISTER_MSXDEVICE(CLASS, NAME)
ChakkariCopy(const DeviceConfig &config)
An MSXDevice is an emulated hardware component connected to the bus of the emulated MSX.
std::string getName(KeyCode keyCode)
Translate key code to key name.
This file implemented 3 utility functions:
uint16_t word
16 bit unsigned integer
void serialize(Archive &ar, T &t, unsigned version)
#define INSTANTIATE_SERIALIZE_METHODS(CLASS)