#include #include #include #include "ircolib/mem_access.hpp" namespace weee::core { mem::mem() { mem1.resize(24_mib); std::fill(mem1.begin(), mem1.end(), 0); } void mem::copy(std::vector &src, const ircolib::u32 offset) { if (offset + src.size() >= mem1.size()) ircolib::panic("mem::copy outside mem1 range (src @ 0x{:08} for size 0x{:08X})", offset, src.size()); ircolib::swap_buffer(src); std::println("Copying {} bytes to mem1[{}]", src.size(), offset); std::copy(src.begin(), src.end(), mem1.begin() + offset); } void mem::copy(ircolib::u8 *src, const ircolib::u32 size, const ircolib::u32 offset) { if (offset + size >= mem1.size()) ircolib::panic("mem::copy outside mem1 range (src @ 0x{:08} for size 0x{:08X})", offset, size); ircolib::swap_buffer(src, size); std::println("Copying {} bytes to mem1[{}]", size, offset); memcpy(&mem1[offset], src, size); } void mem::set(const ircolib::u8 val, const ircolib::u32 size, const ircolib::u32 offset) { 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); } ircolib::u32 mem::read(ircolib::u32 addr) { addr &= 0x0FFFFFFF; if (addr > 0x017FFFFF) ircolib::panic("mem::read unimplemented outside mem1 (0x{:08X})", addr); return ircolib::read_access(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(mem1, addr, value); } } // namespace weee::core