getting closer and closer to the xfb copy loop in panda

This commit is contained in:
2026-05-13 11:27:28 +02:00
parent fc26f75118
commit 9c3a6789f6
9 changed files with 319 additions and 82 deletions
+101 -38
View File
@@ -4,9 +4,22 @@
#include "ircolib/mem_access.hpp"
namespace weee::core {
mem::mem() {
mem::mem() : vi(*this) {
mem1.resize(24_mib);
std::fill(mem1.begin(), mem1.end(), 0);
register_read16_handler(0x00000000, 0x017fffff,
[&](ircolib::u32 addr) { return ircolib::read_access<ircolib::u16>(mem1, addr); });
register_read32_handler(0x00000000, 0x017fffff,
[&](ircolib::u32 addr) { return ircolib::read_access<ircolib::u32>(mem1, addr); });
register_write16_handler(0x00000000, 0x017fffff, [&](ircolib::u32 addr, ircolib::u16 value) {
ircolib::write_access<ircolib::u16>(mem1, addr, value);
});
register_write32_handler(0x00000000, 0x017fffff, [&](ircolib::u32 addr, ircolib::u32 value) {
ircolib::write_access<ircolib::u32>(mem1, addr, value);
});
}
void mem::copy(std::vector<ircolib::u8> &src, const ircolib::u32 offset) {
@@ -14,7 +27,6 @@ void mem::copy(std::vector<ircolib::u8> &src, const ircolib::u32 offset) {
ircolib::panic("mem::copy outside mem1 range (src @ 0x{:08} for size 0x{:08X})", offset, src.size());
ircolib::swap_buffer<ircolib::u32>(src);
std::println("Copying {} bytes to mem1[{}]", src.size(), offset);
std::copy(src.begin(), src.end(), mem1.begin() + offset);
}
@@ -23,7 +35,6 @@ void mem::copy(ircolib::u8 *src, const ircolib::u32 size, const ircolib::u32 off
ircolib::panic("mem::copy outside mem1 range (src @ 0x{:08} for size 0x{:08X})", offset, size);
ircolib::swap_buffer<ircolib::u32>(src, size);
std::println("Copying {} bytes to mem1[{}]", size, offset);
memcpy(&mem1[offset], src, size);
}
@@ -31,46 +42,98 @@ void mem::set(const ircolib::u8 val, const ircolib::u32 size, const ircolib::u32
if (offset + size >= mem1.size())
ircolib::panic("mem::set outside mem1 range (@ 0x{:08} for size 0x{:08X})", offset, size);
std::println("Setting {} bytes to {} from mem1[{}]", size, val, offset);
memset(&mem1[offset], val, size);
}
template <>
ircolib::u32 mem::read(ircolib::u32 addr) {
ircolib::u8 mem::read8(ircolib::u32 addr) {
addr &= 0x0FFFFFFF;
if (addr > 0x017FFFFF)
ircolib::panic("mem::read unimplemented outside mem1 (0x{:08X})", addr);
return ircolib::read_access<ircolib::u32>(mem1, addr);
}
template <>
ircolib::u16 mem::read(ircolib::u32 addr) {
addr &= 0x0FFFFFFF;
if (addr > 0x017FFFFF)
ircolib::panic("mem::read unimplemented outside mem1 (0x{:08X})", addr);
return ircolib::read_access<ircolib::u16>(mem1, addr);
}
void mem::write(ircolib::u32 addr, ircolib::u32 value) {
addr &= 0x0FFFFFFF;
if (addr > 0x017FFFFF)
ircolib::panic("mem::write unimplemented outside mem1 (0x{:08X} = 0x{:08X})", addr, value);
ircolib::write_access<ircolib::u32>(mem1, addr, value);
}
void mem::write(ircolib::u32 addr, ircolib::u16 value) {
addr &= 0x0FFFFFFF;
if (addr > 0x017FFFFF && !ircolib::is_inside_range(addr, 0x0C002000, 0x0C0020FF))
ircolib::panic("mem::write unimplemented outside mem1 and vi (0x{:08X} = 0x{:08X})", addr, value);
if (addr <= 0x017FFFFF) {
ircolib::write_access<ircolib::u16>(mem1, addr, value);
return;
for (const auto &handler : read8_handlers) {
if (ircolib::is_inside_range(addr, handler.start, handler.end)) {
return handler.func(addr - handler.start);
}
}
vi.write(addr, value);
ircolib::panic("mem::read8 unimplemented addr 0x{:08X}", addr);
return 0;
}
ircolib::u16 mem::read16(ircolib::u32 addr) {
addr &= 0x0FFFFFFF;
for (const auto &handler : read16_handlers) {
if (ircolib::is_inside_range(addr, handler.start, handler.end)) {
return handler.func(addr - handler.start);
}
}
ircolib::panic("mem::read16 unimplemented addr 0x{:08X}", addr);
return 0;
}
ircolib::u32 mem::read32(ircolib::u32 addr) {
addr &= 0x0FFFFFFF;
for (const auto &handler : read32_handlers) {
if (ircolib::is_inside_range(addr, handler.start, handler.end)) {
return handler.func(addr - handler.start);
}
}
ircolib::panic("mem::read32 unimplemented addr 0x{:08X}", addr);
return 0;
}
ircolib::u64 mem::read64(ircolib::u32 addr) {
addr &= 0x0FFFFFFF;
for (const auto &handler : read64_handlers) {
if (ircolib::is_inside_range(addr, handler.start, handler.end)) {
return handler.func(addr - handler.start);
}
}
ircolib::panic("mem::read64 unimplemented addr 0x{:08X}", addr);
return 0;
}
void mem::write8(ircolib::u32 addr, ircolib::u8 value) {
addr &= 0x0FFFFFFF;
for (const auto &handler : write8_handlers) {
if (ircolib::is_inside_range(addr, handler.start, handler.end)) {
return handler.func(addr - handler.start, value);
}
}
ircolib::panic("mem::write8 unimplemented addr 0x{:08X} = 0x{:02X}", addr, value);
}
void mem::write16(ircolib::u32 addr, ircolib::u16 value) {
addr &= 0x0FFFFFFF;
for (const auto &handler : write16_handlers) {
if (ircolib::is_inside_range(addr, handler.start, handler.end)) {
return handler.func(addr - handler.start, value);
}
}
ircolib::panic("mem::write16 unimplemented addr 0x{:08X} = 0x{:04X}", addr, value);
}
void mem::write32(ircolib::u32 addr, ircolib::u32 value) {
addr &= 0x0FFFFFFF;
for (const auto &handler : write32_handlers) {
if (ircolib::is_inside_range(addr, handler.start, handler.end)) {
return handler.func(addr - handler.start, value);
}
}
ircolib::panic("mem::write32 unimplemented addr 0x{:08X} = 0x{:08X}", addr, value);
}
void mem::write64(ircolib::u32 addr, ircolib::u64 value) {
addr &= 0x0FFFFFFF;
for (const auto &handler : write64_handlers) {
if (ircolib::is_inside_range(addr, handler.start, handler.end)) {
return handler.func(addr - handler.start, value);
}
}
ircolib::panic("mem::write64 unimplemented addr 0x{:08X} = 0x{:016X}", addr, value);
}
} // namespace weee::core