Files
weee/core/mem.hpp
T
2026-05-20 17:55:07 +02:00

100 lines
4.0 KiB
C++

#pragma once
#include <string>
#include <vector>
#include <ircolib/types.hpp>
#include <broadway/mmio/vi.hpp>
#include <broadway/mmio/pi.hpp>
#include <broadway/mmio/mi.hpp>
#include <broadway/mmio/dsp.hpp>
#include <broadway/mmio/ai.hpp>
#include <broadway/mmio/exi.hpp>
#include <broadway/mmio/si.hpp>
#include <functional>
#include <expected>
namespace weee::core {
template <typename T>
struct read_handler {
std::function<T(ircolib::u32)> func;
ircolib::u32 start, end;
};
template <typename T>
struct write_handler {
std::function<void(ircolib::u32, T)> func;
ircolib::u32 start, end;
};
struct mem {
mem();
void register_read8_handler(ircolib::u32 start, ircolib::u32 end,
const std::function<ircolib::u8(ircolib::u32)> &func) {
read8_handlers.push_back({std::move(func), start, end});
}
void register_read16_handler(ircolib::u32 start, ircolib::u32 end,
const std::function<ircolib::u16(ircolib::u32)> &func) {
read16_handlers.push_back({std::move(func), start, end});
}
void register_read32_handler(ircolib::u32 start, ircolib::u32 end,
const std::function<ircolib::u32(ircolib::u32)> &func) {
read32_handlers.push_back({std::move(func), start, end});
}
void register_read64_handler(ircolib::u32 start, ircolib::u32 end,
const std::function<ircolib::u64(ircolib::u32)> &func) {
read64_handlers.push_back({std::move(func), start, end});
}
void register_write8_handler(ircolib::u32 start, ircolib::u32 end,
const std::function<void(ircolib::u32, ircolib::u8)> &func) {
write8_handlers.push_back({std::move(func), start, end});
}
void register_write16_handler(ircolib::u32 start, ircolib::u32 end,
const std::function<void(ircolib::u32, ircolib::u16)> &func) {
write16_handlers.push_back({std::move(func), start, end});
}
void register_write32_handler(ircolib::u32 start, ircolib::u32 end,
const std::function<void(ircolib::u32, ircolib::u32)> &func) {
write32_handlers.push_back({std::move(func), start, end});
}
void register_write64_handler(ircolib::u32 start, ircolib::u32 end,
const std::function<void(ircolib::u32, ircolib::u64)> &func) {
write64_handlers.push_back({std::move(func), start, end});
}
std::expected<ircolib::u8, std::string> read8(ircolib::u32);
std::expected<ircolib::u16, std::string> read16(ircolib::u32);
std::expected<ircolib::u32, std::string> read32(ircolib::u32);
std::expected<ircolib::u64, std::string> read64(ircolib::u32);
std::expected<void, std::string> write8(ircolib::u32, ircolib::u8);
std::expected<void, std::string> write16(ircolib::u32, ircolib::u16);
std::expected<void, std::string> write32(ircolib::u32, ircolib::u32);
std::expected<void, std::string> write64(ircolib::u32, ircolib::u64);
void copy(std::vector<ircolib::u8> &src, const ircolib::u32 offset);
void copy(ircolib::u8 *src, const ircolib::u32 size, const ircolib::u32 offset);
void set(const ircolib::u8 val, const ircolib::u32 size, const ircolib::u32 offset);
std::vector<ircolib::u8> mem1;
std::vector<ircolib::u8> ipl{};
private:
std::vector<read_handler<ircolib::u8>> read8_handlers{};
std::vector<read_handler<ircolib::u16>> read16_handlers{};
std::vector<read_handler<ircolib::u32>> read32_handlers{};
std::vector<read_handler<ircolib::u64>> read64_handlers{};
std::vector<write_handler<ircolib::u8>> write8_handlers{};
std::vector<write_handler<ircolib::u16>> write16_handlers{};
std::vector<write_handler<ircolib::u32>> write32_handlers{};
std::vector<write_handler<ircolib::u64>> write64_handlers{};
public:
video_interface vi;
processor_interface pi;
memory_interface mi;
dsp dsp;
exi exi;
audio_interface ai;
serial_interface si;
};
} // namespace weee::core