mirror of
https://github.com/melonDS-emu/melonDS.git
synced 2025-07-25 23:29:55 -06:00
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:
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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,
|
||||
|
Reference in New Issue
Block a user