54 lines
1.8 KiB
C++
54 lines
1.8 KiB
C++
#include <cstring>
|
|
#include <mem.hpp>
|
|
#include <ircolib/log.hpp>
|
|
#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<ircolib::u8> &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<ircolib::u32>(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<ircolib::u32>(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<ircolib::u32>(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);
|
|
}
|
|
} // namespace weee::core
|