From ec85ae7a4023127bba52643d1c9a70e20b575f7b Mon Sep 17 00:00:00 2001 From: Connor McLaughlin Date: Sat, 5 Oct 2019 16:29:14 +1000 Subject: [PATCH] Bus: Properly handle byte/word reads of DMA registers Fixes FF7 locking up on game start. --- src/core/bus.cpp | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-) diff --git a/src/core/bus.cpp b/src/core/bus.cpp index 14375f9df..a1cb790d6 100644 --- a/src/core/bus.cpp +++ b/src/core/bus.cpp @@ -16,6 +16,9 @@ #include Log_SetChannel(Bus); +#define FIXUP_WORD_READ_OFFSET(offset) ((offset) & ~u32(3)) +#define FIXUP_WORD_READ_VALUE(offset, value) ((value) >> (((offset) & u32(3)) * 8)) + // Offset and value remapping for (w32) registers from nocash docs. void FixupUnalignedWordAccessW32(u32& offset, u32& value) { @@ -505,21 +508,7 @@ void Bus::DoWriteSPU(MemoryAccessSize size, u32 offset, u32 value) u32 Bus::DoReadDMA(MemoryAccessSize size, u32 offset) { - u32 value = m_dma->ReadRegister(offset); - switch (size) - { - case MemoryAccessSize::Byte: - case MemoryAccessSize::HalfWord: - { - if ((offset & u32(0xF0)) >= 7 || (offset & u32(0x0F)) != 0x4) - FixupUnalignedWordAccessW32(offset, value); - } - - default: - break; - } - - return value; + return FIXUP_WORD_READ_VALUE(offset, m_dma->ReadRegister(FIXUP_WORD_READ_OFFSET(offset))); } void Bus::DoWriteDMA(MemoryAccessSize size, u32 offset, u32 value)