more DSP unfucking: make Teakra directly use melonDS's NWRAM banks instead of trying to translate to a flat buffer, fixes bugs with the way the memory banks are ordered etc

This commit is contained in:
Arisotura
2022-10-14 00:02:54 +02:00
parent a8fba8cc34
commit cdd05c10b4
6 changed files with 87 additions and 108 deletions

View File

@ -7,6 +7,11 @@
namespace Teakra {
struct SharedMemoryCallback {
std::function<std::uint16_t(std::uint32_t address)> read16;
std::function<void(std::uint32_t address, std::uint16_t value)> write16;
};
struct AHBMCallback {
std::function<std::uint8_t(std::uint32_t address)> read8;
std::function<void(std::uint32_t address, std::uint8_t value)> write8;
@ -25,9 +30,6 @@ public:
void Reset();
std::array<std::uint8_t, 0x80000>& GetDspMemory();
const std::array<std::uint8_t, 0x80000>& GetDspMemory() const;
// APBP Data
bool SendDataIsEmpty(std::uint8_t index) const;
void SendData(std::uint8_t index, std::uint16_t value);
@ -70,6 +72,7 @@ public:
// core
void Run(unsigned cycle);
void SetSharedMemoryCallback(const SharedMemoryCallback& callback);
void SetAHBMCallback(const AHBMCallback& callback);
void SetAudioCallback(std::function<void(std::array<std::int16_t, 2>)> callback);

View File

@ -5,19 +5,21 @@
namespace Teakra {
struct SharedMemory {
std::array<u8, 0x80000> raw{};
u16 ReadWord(u32 word_address) const {
u32 byte_address = word_address * 2;
u8 low = raw[byte_address];
u8 high = raw[byte_address + 1];
return low | ((u16)high << 8);
return read_external16(word_address << 1);
}
void WriteWord(u32 word_address, u16 value) {
u8 low = value & 0xFF;
u8 high = value >> 8;
u32 byte_address = word_address * 2;
raw[byte_address] = low;
raw[byte_address + 1] = high;
write_external16(word_address << 1, value);
}
void SetExternalMemoryCallback(
std::function<u16(u32)> read16, std::function<void(u32, u16)> write16) {
read_external16 = std::move(read16);
write_external16 = std::move(write16);
}
std::function<u16(u32)> read_external16;
std::function<void(u32, u16)> write_external16;
};
} // namespace Teakra

View File

@ -50,7 +50,6 @@ struct Teakra::Impl {
}
void Reset() {
//shared_memory.raw.fill(0); // BAD!!!!
miu.Reset();
apbp_from_cpu.Reset();
apbp_from_dsp.Reset();
@ -71,14 +70,6 @@ void Teakra::Reset() {
impl->Reset();
}
std::array<std::uint8_t, 0x80000>& Teakra::GetDspMemory() {
return impl->shared_memory.raw;
}
const std::array<std::uint8_t, 0x80000>& Teakra::GetDspMemory() const {
return impl->shared_memory.raw;
}
void Teakra::Run(unsigned cycle) {
impl->processor.Run(cycle);
}
@ -117,6 +108,9 @@ void Teakra::ClearSemaphore(std::uint16_t value) {
void Teakra::MaskSemaphore(std::uint16_t value) {
impl->apbp_from_dsp.MaskSemaphore(value);
}
void Teakra::SetSharedMemoryCallback(const SharedMemoryCallback& callback) {
impl->shared_memory.SetExternalMemoryCallback(callback.read16, callback.write16);
}
void Teakra::SetAHBMCallback(const AHBMCallback& callback) {
impl->ahbm.SetExternalMemoryCallback(callback.read8, callback.write8,
callback.read16, callback.write16,