mirror of
https://github.com/melonDS-emu/melonDS.git
synced 2024-11-14 13:27:41 -07:00
fix double data aborts with strd
This commit is contained in:
parent
317a8c61e5
commit
1871c48849
@ -1217,7 +1217,7 @@ bool ARMv4::DataWrite32(u32 addr, u32 val)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool ARMv4::DataWrite32S(u32 addr, u32 val)
|
||||
bool ARMv4::DataWrite32S(u32 addr, u32 val, bool dataabort)
|
||||
{
|
||||
addr &= ~3;
|
||||
|
||||
|
@ -135,7 +135,7 @@ public:
|
||||
virtual bool DataWrite8(u32 addr, u8 val) = 0;
|
||||
virtual bool DataWrite16(u32 addr, u16 val) = 0;
|
||||
virtual bool DataWrite32(u32 addr, u32 val) = 0;
|
||||
virtual bool DataWrite32S(u32 addr, u32 val) = 0;
|
||||
virtual bool DataWrite32S(u32 addr, u32 val, bool dataabort = false) = 0;
|
||||
|
||||
virtual void AddCycles_C() = 0;
|
||||
virtual void AddCycles_CI(s32 numI) = 0;
|
||||
@ -256,7 +256,7 @@ public:
|
||||
bool DataWrite8(u32 addr, u8 val) override;
|
||||
bool DataWrite16(u32 addr, u16 val) override;
|
||||
bool DataWrite32(u32 addr, u32 val) override;
|
||||
bool DataWrite32S(u32 addr, u32 val) override;
|
||||
bool DataWrite32S(u32 addr, u32 val, bool dataabort = false) override;
|
||||
|
||||
void AddCycles_C() override
|
||||
{
|
||||
@ -405,7 +405,7 @@ public:
|
||||
bool DataWrite8(u32 addr, u8 val) override;
|
||||
bool DataWrite16(u32 addr, u16 val) override;
|
||||
bool DataWrite32(u32 addr, u32 val) override;
|
||||
bool DataWrite32S(u32 addr, u32 val) override;
|
||||
bool DataWrite32S(u32 addr, u32 val, bool dataabort = false) override;
|
||||
void AddCycles_C() override;
|
||||
void AddCycles_CI(s32 num) override;
|
||||
void AddCycles_CDI() override;
|
||||
|
@ -273,7 +273,7 @@ A_IMPLEMENT_WB_LDRSTR(LDRB)
|
||||
u32 r = (cpu->CurInstr>>12) & 0xF; \
|
||||
if (r&1) { r--; printf("!! MISALIGNED STRD %d\n", r+1); } \
|
||||
bool dataabort = !cpu->DataWrite32(offset, cpu->R[r ]); /* yes, this data abort behavior is on purpose */ \
|
||||
dataabort |= !cpu->DataWrite32S (offset+4, cpu->R[r+1]); /* no, i dont understand it either */ \
|
||||
dataabort |= !cpu->DataWrite32S (offset+4, cpu->R[r+1], dataabort); /* no, i dont understand it either */ \
|
||||
cpu->AddCycles_CD(); \
|
||||
if (dataabort) return; \
|
||||
if (cpu->CurInstr & (1<<21)) cpu->R[(cpu->CurInstr>>16) & 0xF] = offset;
|
||||
@ -284,7 +284,7 @@ A_IMPLEMENT_WB_LDRSTR(LDRB)
|
||||
u32 r = (cpu->CurInstr>>12) & 0xF; \
|
||||
if (r&1) { r--; printf("!! MISALIGNED STRD_POST %d\n", r+1); } \
|
||||
bool dataabort = !cpu->DataWrite32(addr, cpu->R[r ]); \
|
||||
dataabort |= !cpu->DataWrite32S (addr+4, cpu->R[r+1]); \
|
||||
dataabort |= !cpu->DataWrite32S (addr+4, cpu->R[r+1], dataabort); \
|
||||
cpu->AddCycles_CD(); \
|
||||
if (dataabort) return; \
|
||||
cpu->R[(cpu->CurInstr>>16) & 0xF] += offset;
|
||||
|
@ -1014,11 +1014,11 @@ bool ARMv5::DataWrite32(u32 addr, u32 val)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool ARMv5::DataWrite32S(u32 addr, u32 val)
|
||||
bool ARMv5::DataWrite32S(u32 addr, u32 val, bool dataabort)
|
||||
{
|
||||
if (!(PU_Map[addr>>12] & 0x02))
|
||||
{
|
||||
DataAbort();
|
||||
if (!dataabort) DataAbort();
|
||||
return false;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user