32 if (mainRom.
size() != 32 * 1024) {
33 throw MSXException(
"Main ROM must be exactly 32kB in size.");
35 if (fontRom.
size() != 128 * 1024) {
36 throw MSXException(
"Font ROM must be exactly 128kB in size.");
38 if (dataRom.
size() != 32 * 1024) {
39 throw MSXException(
"Data ROM must be exactly 32kB in size.");
42 reset(EmuTime::dummy());
47 fontAddress = {0, 0, 0, 0};
51 setStrobe(
true, time);
61 if (address ==
one_of(0x7FC0, 0x7FC2, 0x7FC4, 0x7FC6)) {
63 }
else if (address ==
one_of(0x7FC1, 0x7FC3, 0x7FC5, 0x7FC7)) {
64 unsigned group = (address - 0x7FC1) / 2;
65 unsigned base = 0x8000 * group;
66 unsigned offset = fontAddress[group] & 0x7FFF;
67 return fontRom[base + offset];
68 }
else if (address == 0x7FC8 || address == 0x7FC9) {
70 }
else if (address == 0x7FCA || address == 0x7FCB) {
71 if ((dataAddress & (1 << 15)) == 0) {
72 return dataRom[dataAddress & 0x7FFF];
74 return sram[dataAddress & 0x7FF];
76 }
else if (address == 0x7FCC) {
78 return getPluggedPrintDev().
getStatus(time)
80 }
else if (address < 0x8000) {
81 return mainRom[address];
89 if (0x7FC0 <= address && address <= 0x7FC7) {
90 unsigned group = (address - 0x7FC0) / 2;
91 if ((address & 1) == 0) {
93 fontAddress[group] = (fontAddress[group] & 0xFF00) | uint16_t(value << 0);
96 fontAddress[group] = (fontAddress[group] & 0x00FF) | uint16_t(value << 8);
98 }
else if (address == 0x7FC8) {
99 dataAddress = (dataAddress & 0xFF00) | uint16_t(value << 0);
100 }
else if (address == 0x7FC9) {
101 dataAddress = (dataAddress & 0x00FF) | uint16_t(value << 8);
102 }
else if (address == 0x7FCA || address == 0x7FCB) {
103 if ((dataAddress & (1 << 15)) != 0) {
104 sram.
write(dataAddress & 0x7FF, value);
106 }
else if (address == 0x7FCC) {
107 setStrobe(value & 1, time);
108 }
else if (address == 0x7FCE) {
109 writeData(value, time);
118 }
else if (start < 0x8000) {
119 return &mainRom[start];
135void YamahaSKW01::setStrobe(
bool newStrobe, EmuTime::param time)
137 if (newStrobe != strobe) {
139 getPluggedPrintDev().
setStrobe(strobe, time);
143void YamahaSKW01::writeData(uint8_t newData, EmuTime::param time)
145 if (newData != data) {
147 getPluggedPrintDev().
writeData(data, time);
153 return "Yamaha SKW-01 printer port";
158 return "Printer Port";
164 getPluggedPrintDev().
writeData(data, time);
165 getPluggedPrintDev().
setStrobe(strobe, time);
170 return *checked_cast<PrinterPortDevice*>(&
getPlugged());
173template<
typename Archive>
176 ar.template serializeBase<MSXDevice>(*
this);
177 ar.serialize(
"fontAddress", fontAddress,
178 "dataAddress", dataAddress,
Represents something you can plug devices into.
Pluggable & getPlugged() const
Returns the Pluggable currently plugged in.
virtual void plug(Pluggable &device, EmuTime::param time)
This plugs a Pluggable in this Connector.
An MSXDevice is an emulated hardware component connected to the bus of the emulated MSX.
static std::array< byte, 0x10000 > unmappedRead
static std::array< byte, 0x10000 > unmappedWrite
virtual bool getStatus(EmuTime::param time)=0
Returns the STATUS signal: false = low = ready, true = high = not ready.
virtual void writeData(uint8_t data, EmuTime::param time)=0
Sets the data signals.
virtual void setStrobe(bool strobe, EmuTime::param time)=0
Sets the strobe signal: false = low, true = high.
void write(size_t addr, byte value)
YamahaSKW01(const DeviceConfig &config)
byte peekMem(word address, EmuTime::param time) const override
Read a byte from a given memory location.
void plug(Pluggable &dev, EmuTime::param time) override
This plugs a Pluggable in this Connector.
byte * getWriteCacheLine(word start) const override
Test that the memory in the interval [start, start + CacheLine::SIZE) is cacheable for writing.
void writeMem(word address, byte value, EmuTime::param time) override
Write a given byte to a given location at a certain time to this device.
void reset(EmuTime::param time) override
This method is called on reset.
std::string_view getDescription() const override
Get a description for this connector.
byte readMem(word address, EmuTime::param time) override
Read a byte from a location at a certain time from this device.
void serialize(Archive &ar, unsigned version)
std::string_view getClass() const override
A Connector belong to a certain class.
const byte * getReadCacheLine(word start) const override
Test that the memory in the interval [start, start + CacheLine::SIZE) is cacheable for reading.
std::string getName(KeyCode keyCode)
Translate key code to key name.
This file implemented 3 utility functions:
REGISTER_MSXDEVICE(ChakkariCopy, "ChakkariCopy")
uint16_t word
16 bit unsigned integer
#define INSTANTIATE_SERIALIZE_METHODS(CLASS)