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,
102 reset(getCurrentTime());
103 modeSetting.attach(*
this);
106 ChakkariCopy::~ChakkariCopy()
108 modeSetting.detach(*
this);
111 void ChakkariCopy::reset(EmuTime::param time)
113 writeIO(0, 0xFF, time);
116 void ChakkariCopy::writeIO(
word ,
byte value, EmuTime::param )
118 byte diff = reg ^ value;
122 getCliComm().printInfo(
getName(),
" COPY LED ",
123 (((value & 1) == 0x01) ?
"OFF" :
"ON"));
126 getCliComm().printInfo(
getName(),
" PAUSE LED ",
127 (((value & 2) == 0x02) ?
"OFF" :
"ON"));
130 if (modeSetting.getEnum() == COPY) {
132 invalidateDeviceRWCache(0x0000, 0x4000);
137 byte ChakkariCopy::readIO(
word port, EmuTime::param time)
139 return peekIO(port, time);
142 byte ChakkariCopy::peekIO(
word , EmuTime::param )
const
145 if (copyButtonPressedSetting .getBoolean()) retVal &= ~0x01;
146 if (pauseButtonPressedSetting.getBoolean()) retVal &= ~0x02;
150 byte ChakkariCopy::readMem(
word address, EmuTime::param time)
152 return peekMem(address, time);
155 byte ChakkariCopy::peekMem(
word address, EmuTime::param )
const
157 return *getReadCacheLine(address);
160 const byte* ChakkariCopy::getReadCacheLine(
word address)
const
162 if (modeSetting.getEnum() == COPY) {
164 if (address < 0x4000) {
165 return &biosRam[address];
168 if ((0x4000 <= address) && (address < 0x6000)) {
169 return &rom[address & 0x1FFF];
172 if ((0x6000 <= address) && (address < 0x8000)) {
173 return &workRam[address & 0x07FF];
177 if ((0x4000 <= address) && (address < 0x8000)) {
178 return &biosRam[address & 0x3FFF];
184 void ChakkariCopy::writeMem(
word address,
byte value, EmuTime::param )
186 *getWriteCacheLine(address) = value;
189 byte* ChakkariCopy::getWriteCacheLine(
word address)
const
191 if (modeSetting.getEnum() == COPY) {
193 if ((address < 0x4000) && ((reg & 0x04) == 0)) {
194 return const_cast<byte*
>(&biosRam[address & 0x3FFF]);
198 if ((0x6000 <= address) && (address < 0x8000)) {
199 return const_cast<byte*
>(&workRam[address & 0x07FF]);
203 if ((0x4000 <= address) && (address < 0x8000)) {
204 return const_cast<byte*
>(&biosRam[address & 0x3FFF]);
207 return unmappedWrite;
210 void ChakkariCopy::update(
const Setting& ) noexcept
213 invalidateDeviceRWCache();
216 template<
typename Archive>
219 ar.template serializeBase<MSXDevice>(*
this);
220 ar.serialize(
"biosRam", biosRam,
224 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.
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)