15 DummyVRAMOBserver VRAMWindow::dummyObserver;
17 VRAMWindow::VRAMWindow(
Ram& vram)
20 observer = &dummyObserver;
23 effectiveBaseMask = 0;
51 unsigned transform(
unsigned address);
59 "CPU view on video RAM given the current display mode.",
65 unsigned LogicalVRAMDebuggable::transform(
unsigned address)
68 ? ((address << 16) | (address >> 1)) & 0x1FFFF
97 VDPVRAM& vram_,
unsigned actualSize)
99 "physical VRAM" :
"physical " + vdp.
getName() +
" VRAM",
100 "VDP-screen-mode-independent view on the video RAM.",
108 return vram.
cpuRead(address, time);
113 vram.
cpuWrite(address, value, time);
119 static unsigned bufferSize(
unsigned size)
126 return std::max(0x20000u, size);
131 , data(vdp_.getDeviceConfig2(), bufferSize(size))
138 , cmdReadWindow(data)
139 , cmdWriteWindow(data)
143 , bitmapVisibleWindow(data)
144 , bitmapCacheWindow(data)
145 , spriteAttribTable(data)
146 , spritePatternTable(data)
167 if (data.
getSize() != actualSize) {
168 assert(data.
getSize() > actualSize);
172 memset(&data[actualSize], 0xFF, data.
getSize() - actualSize);
187 cmdEngine->
sync(time);
195 cmdEngine->
sync(time);
207 : (std::min(Math::
powerOfTwo(actualSize), 16384u) - 1) | (1u << 14)
220 static inline unsigned swapAddr(
unsigned x)
226 return 1 | ((x & 0x007F) << 1) | ((x & 0x7FC0) << 2);
230 if (vrMode == newVRmode) {
240 for (
int i = 0x7FFF; i >=0; --i) {
241 std::swap(data[i], data[swapAddr(i)]);
245 for (
int i = 0; i < 0x8000; ++i) {
246 std::swap(data[i], data[swapAddr(i)]);
253 this->renderer = renderer;
311 for (
unsigned addr8 = 0; addr8 < 0x4000; addr8 += 64) {
312 unsigned addr4 = (addr8 & 0x203F) |
313 ((addr8 & 0x1000) >> 6) |
314 ((addr8 & 0x0FC0) << 1);
315 const byte* src = &data[addr8];
316 byte* dst = &tmp[addr4];
317 memcpy(dst, src, 64);
321 for (
unsigned addr4 = 0; addr4 < 0x4000; addr4 += 64) {
322 unsigned addr8 = (addr4 & 0x203F) |
323 ((addr4 & 0x0040) << 6) |
324 ((addr4 & 0x1F80) >> 1);
325 const byte* src = &data[addr4];
326 byte* dst = &tmp[addr8];
327 memcpy(dst, src, 64);
330 memcpy(&data[0], tmp,
sizeof(tmp));
334 template<
typename Archive>
337 ar.serialize(
"baseAddr", baseAddr);
338 ar.serialize(
"baseMask", origBaseMask);
339 ar.serialize(
"indexMask", indexMask);
341 effectiveBaseMask = origBaseMask & sizeMask;
342 combiMask = ~effectiveBaseMask | indexMask;
347 template<
typename Archive>
352 setSizeMask(static_cast<MSXDevice&>(vdp).getCurrentTime());
355 ar.serialize_blob(
"data", &data[0], actualSize);