Files
P3DS-test/third_party/teakra/src/memory_interface.h
wheremyfoodat 78002be334 Vendor Teakra, make emulator own DSP RAM and add DSP RAM to fastmem (#806)
* DSP: Own DSP RAM and add it to fastmem

* Vendor Teakra

* Add MacOS support to fastmem

* Fix MacOS fastmem paths

* Fix iOS build
2025-08-22 02:12:21 +03:00

74 lines
2.2 KiB
C++

#pragma once
#include <array>
#include "common_types.h"
#include "crash.h"
namespace Teakra {
class MemoryInterfaceUnit {
public:
u16 x_page = 0, y_page = 0, z_page = 0;
static constexpr u16 XYSizeResolution = 0x400;
std::array<u16, 2> x_size{{0x20, 0x20}};
std::array<u16, 2> y_size{{0x1E, 0x1E}};
u16 page_mode = 0;
u16 mmio_base = 0x8000;
static constexpr u16 MMIOSize = 0x0800;
static constexpr u32 DataMemoryOffset = 0x20000;
static constexpr u32 DataMemoryBankSize = 0x10000;
void Reset() {
*this = MemoryInterfaceUnit();
}
bool InMMIO(u16 addr) const {
return addr >= mmio_base && addr < mmio_base + MMIOSize;
}
u16 ToMMIO(u16 addr) const {
ASSERT(z_page == 0);
// according to GBATek ("DSi Teak I/O Ports (on ARM9 Side)"), these are mirrored
return (addr - mmio_base) & (MMIOSize - 1);
}
u32 ConvertDataAddress(u16 addr) const {
if (page_mode == 0) {
ASSERT(z_page < 2);
return DataMemoryOffset + addr + z_page * DataMemoryBankSize;
} else {
if (addr <= x_size[0] * XYSizeResolution) {
ASSERT(x_page < 2);
return DataMemoryOffset + addr + x_page * DataMemoryBankSize;
} else {
ASSERT(y_page < 2);
return DataMemoryOffset + addr + y_page * DataMemoryBankSize;
}
}
}
};
struct SharedMemory;
class MMIORegion;
class MemoryInterface {
public:
MemoryInterface(SharedMemory& shared_memory, MemoryInterfaceUnit& memory_interface_unit);
void SetMMIO(MMIORegion& mmio);
u16 ProgramRead(u32 address) const;
void ProgramWrite(u32 address, u16 value);
u16 DataRead(u16 address, bool bypass_mmio = false); // not const because it can be a FIFO register
void DataWrite(u16 address, u16 value, bool bypass_mmio = false);
u16 DataReadA32(u32 address) const;
void DataWriteA32(u32 address, u16 value);
u16 MMIORead(u16 address);
void MMIOWrite(u16 address, u16 value);
private:
SharedMemory& shared_memory;
MemoryInterfaceUnit& memory_interface_unit;
MMIORegion* mmio;
};
} // namespace Teakra