DSPLLE: Add assertion for bad DMA alignment

I haven't tested this extensively on real hardware, but I do know that bad things happen if the address isn't properly aligned, and libogc says it should be 32-byte aligned.
This commit is contained in:
Pokechu22 2023-01-23 15:06:57 -08:00
parent 9fe1d80920
commit e140516130
1 changed files with 8 additions and 0 deletions

View File

@ -5,6 +5,7 @@
#include <string> #include <string>
#include "Common/Assert.h"
#include "Common/CommonTypes.h" #include "Common/CommonTypes.h"
#include "Common/Hash.h" #include "Common/Hash.h"
#include "Common/Logging/Log.h" #include "Common/Logging/Log.h"
@ -40,6 +41,11 @@ void WriteHostMemory(u8 value, u32 addr)
void DMAToDSP(u16* dst, u32 addr, u32 size) void DMAToDSP(u16* dst, u32 addr, u32 size)
{ {
// Hardware testing indicates that a misaligned DMA address does not work properly (it's unclear
// exactly what goes wrong currently). A size that's not a multiple of 32 is allowed, though
// (and occurs with modern libogc homebrew uCode, including the oggpalyer (asnd uCode) and
// modplay (aesnd uCode) examples). It's untested whether extra bytes are copied in that case.
ASSERT_MSG(DSPLLE, (addr & 0x1f) == 0, "DSP DMA addr must be 32-byte aligned (was {:08x})", addr);
auto& system = Core::System::GetInstance(); auto& system = Core::System::GetInstance();
auto& memory = system.GetMemory(); auto& memory = system.GetMemory();
memory.CopyFromEmuSwapped(dst, addr, size); memory.CopyFromEmuSwapped(dst, addr, size);
@ -47,6 +53,8 @@ void DMAToDSP(u16* dst, u32 addr, u32 size)
void DMAFromDSP(const u16* src, u32 addr, u32 size) void DMAFromDSP(const u16* src, u32 addr, u32 size)
{ {
// See comment in DMAToDSP
ASSERT_MSG(DSPLLE, (addr & 0x1f) == 0, "DSP DMA addr must be 32-byte aligned (was {:08x})", addr);
auto& system = Core::System::GetInstance(); auto& system = Core::System::GetInstance();
auto& memory = system.GetMemory(); auto& memory = system.GetMemory();
memory.CopyToEmuSwapped(addr, src, size); memory.CopyToEmuSwapped(addr, src, size);