mirror of
https://github.com/Lime3DS/Lime3DS
synced 2024-12-28 10:02:31 -06:00
Merge pull request #848 from lioncash/ldm
arm_dyncom_thumb: Fix handling of writeback for thumb LDMIA
This commit is contained in:
commit
b1cb0a3f2c
1 changed files with 19 additions and 5 deletions
|
@ -327,11 +327,25 @@ tdstate thumb_translate(u32 addr, u32 instr, u32* ainstr, u32* inst_size) {
|
|||
|
||||
case 24: // STMIA
|
||||
case 25: // LDMIA
|
||||
*ainstr = ((tinstr & (1 << 11)) // base
|
||||
? 0xE8B00000 // LDMIA
|
||||
: 0xE8A00000) // STMIA
|
||||
|((tinstr & 0x0700) << (16 - 8)) // Rb
|
||||
|(tinstr & 0x00FF); // mask8
|
||||
if (tinstr & (1 << 11))
|
||||
{
|
||||
unsigned int base = 0xE8900000;
|
||||
unsigned int rn = BITS(tinstr, 8, 10);
|
||||
|
||||
// Writeback
|
||||
if ((tinstr & (1 << rn)) == 0)
|
||||
base |= (1 << 21);
|
||||
|
||||
*ainstr = base // base (LDMIA)
|
||||
| (rn << 16) // Rn
|
||||
| (tinstr & 0x00FF); // Register list
|
||||
}
|
||||
else
|
||||
{
|
||||
*ainstr = 0xE8A00000 // base (STMIA)
|
||||
| (BITS(tinstr, 8, 10) << 16) // Rn
|
||||
| (tinstr & 0x00FF); // Register list
|
||||
}
|
||||
break;
|
||||
|
||||
case 26: // Bcc
|
||||
|
|
Loading…
Reference in a new issue