there might be an off by 1 error...
This commit is contained in:
+29
-24
@@ -7,6 +7,9 @@ namespace weee::core {
|
||||
mem::mem() : vi(*this) {
|
||||
mem1.resize(24_mib);
|
||||
std::fill(mem1.begin(), mem1.end(), 0);
|
||||
|
||||
register_read8_handler(0x00000000, 0x017fffff, [&](ircolib::u32 addr) { return mem1[addr]; });
|
||||
|
||||
register_read16_handler(0x00000000, 0x017fffff,
|
||||
[&](ircolib::u32 addr) { return ircolib::read_access<ircolib::u16>(mem1, addr); });
|
||||
|
||||
@@ -16,6 +19,8 @@ mem::mem() : vi(*this) {
|
||||
register_read64_handler(0x00000000, 0x017fffff,
|
||||
[&](ircolib::u32 addr) { return ircolib::read_access<ircolib::u64>(mem1, addr); });
|
||||
|
||||
register_write8_handler(0x00000000, 0x017fffff, [&](ircolib::u32 addr, ircolib::u8 value) { mem1[addr] = value; });
|
||||
|
||||
register_write16_handler(0x00000000, 0x017fffff, [&](ircolib::u32 addr, ircolib::u16 value) {
|
||||
ircolib::write_access<ircolib::u16>(mem1, addr, value);
|
||||
});
|
||||
@@ -52,7 +57,7 @@ void mem::set(const ircolib::u8 val, const ircolib::u32 size, const ircolib::u32
|
||||
memset(&mem1[offset], val, size);
|
||||
}
|
||||
|
||||
ircolib::u8 mem::read8(ircolib::u32 addr) {
|
||||
std::expected<ircolib::u8, std::string> mem::read8(ircolib::u32 addr) {
|
||||
addr &= 0x0FFFFFFF;
|
||||
for (const auto &handler : read8_handlers) {
|
||||
if (ircolib::is_inside_range(addr, handler.start, handler.end)) {
|
||||
@@ -60,11 +65,10 @@ ircolib::u8 mem::read8(ircolib::u32 addr) {
|
||||
}
|
||||
}
|
||||
|
||||
ircolib::panic("mem::read8 unimplemented addr 0x{:08X}", addr);
|
||||
return 0;
|
||||
return std::unexpected(std::format("mem::read8 unimplemented addr 0x{:08X}", addr));
|
||||
}
|
||||
|
||||
ircolib::u16 mem::read16(ircolib::u32 addr) {
|
||||
std::expected<ircolib::u16, std::string> mem::read16(ircolib::u32 addr) {
|
||||
addr &= 0x0FFFFFFF;
|
||||
for (const auto &handler : read16_handlers) {
|
||||
if (ircolib::is_inside_range(addr, handler.start, handler.end)) {
|
||||
@@ -72,11 +76,10 @@ ircolib::u16 mem::read16(ircolib::u32 addr) {
|
||||
}
|
||||
}
|
||||
|
||||
ircolib::panic("mem::read16 unimplemented addr 0x{:08X}", addr);
|
||||
return 0;
|
||||
return std::unexpected(std::format("mem::read16 unimplemented addr 0x{:08X}", addr));
|
||||
}
|
||||
|
||||
ircolib::u32 mem::read32(ircolib::u32 addr) {
|
||||
std::expected<ircolib::u32, std::string> mem::read32(ircolib::u32 addr) {
|
||||
addr &= 0x0FFFFFFF;
|
||||
for (const auto &handler : read32_handlers) {
|
||||
if (ircolib::is_inside_range(addr, handler.start, handler.end)) {
|
||||
@@ -84,11 +87,10 @@ ircolib::u32 mem::read32(ircolib::u32 addr) {
|
||||
}
|
||||
}
|
||||
|
||||
ircolib::panic("mem::read32 unimplemented addr 0x{:08X}", addr);
|
||||
return 0;
|
||||
return std::unexpected(std::format("mem::read32 unimplemented addr 0x{:08X}", addr));
|
||||
}
|
||||
|
||||
ircolib::u64 mem::read64(ircolib::u32 addr) {
|
||||
std::expected<ircolib::u64, std::string> mem::read64(ircolib::u32 addr) {
|
||||
addr &= 0x0FFFFFFF;
|
||||
for (const auto &handler : read64_handlers) {
|
||||
if (ircolib::is_inside_range(addr, handler.start, handler.end)) {
|
||||
@@ -96,51 +98,54 @@ ircolib::u64 mem::read64(ircolib::u32 addr) {
|
||||
}
|
||||
}
|
||||
|
||||
ircolib::panic("mem::read64 unimplemented addr 0x{:08X}", addr);
|
||||
return 0;
|
||||
return std::unexpected(std::format("mem::read64 unimplemented addr 0x{:08X}", addr));
|
||||
}
|
||||
|
||||
void mem::write8(ircolib::u32 addr, ircolib::u8 value) {
|
||||
std::expected<void, std::string> 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);
|
||||
handler.func(addr - handler.start, value);
|
||||
return std::expected<void, std::string>();
|
||||
}
|
||||
}
|
||||
|
||||
ircolib::panic("mem::write8 unimplemented addr 0x{:08X} = 0x{:02X}", addr, value);
|
||||
return std::unexpected(std::format("mem::write8 unimplemented addr 0x{:08X} = 0x{:02X}", addr, value));
|
||||
}
|
||||
|
||||
void mem::write16(ircolib::u32 addr, ircolib::u16 value) {
|
||||
std::expected<void, std::string> 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);
|
||||
handler.func(addr - handler.start, value);
|
||||
return std::expected<void, std::string>();
|
||||
}
|
||||
}
|
||||
|
||||
ircolib::panic("mem::write16 unimplemented addr 0x{:08X} = 0x{:04X}", addr, value);
|
||||
return std::unexpected(std::format("mem::write16 unimplemented addr 0x{:08X} = 0x{:04X}", addr, value));
|
||||
}
|
||||
|
||||
void mem::write32(ircolib::u32 addr, ircolib::u32 value) {
|
||||
std::expected<void, std::string> 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);
|
||||
handler.func(addr - handler.start, value);
|
||||
return std::expected<void, std::string>();
|
||||
}
|
||||
}
|
||||
|
||||
ircolib::panic("mem::write32 unimplemented addr 0x{:08X} = 0x{:08X}", addr, value);
|
||||
return std::unexpected(std::format("mem::write32 unimplemented addr 0x{:08X} = 0x{:08X}", addr, value));
|
||||
}
|
||||
|
||||
void mem::write64(ircolib::u32 addr, ircolib::u64 value) {
|
||||
std::expected<void, std::string> 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);
|
||||
handler.func(addr - handler.start, value);
|
||||
return std::expected<void, std::string>();
|
||||
}
|
||||
}
|
||||
|
||||
ircolib::panic("mem::write64 unimplemented addr 0x{:08X} = 0x{:016X}", addr, value);
|
||||
return std::unexpected(std::format("mem::write64 unimplemented addr 0x{:08X} = 0x{:016X}", addr, value));
|
||||
}
|
||||
} // namespace weee::core
|
||||
|
||||
Reference in New Issue
Block a user