all repos — mgba @ 5dca78356932bc4e89ff55856eeda25e42e8e8db

mGBA Game Boy Advance Emulator

ARM9: Fix blx lr
Vicki Pfau vi@endrift.com
Fri, 17 Mar 2017 13:06:11 -0700
commit

5dca78356932bc4e89ff55856eeda25e42e8e8db

parent

92e4c859a715221981ffd270a1b7ffaeabe4a639

2 files changed, 7 insertions(+), 5 deletions(-)

jump to
M src/arm/isa-arm.csrc/arm/isa-arm.c

@@ -706,9 +706,10 @@ THUMB_WRITE_PC;)

DEFINE_INSTRUCTION_ARM(BLX2, int rm = opcode & 0x0000000F; + int address = cpu->gprs[rm]; cpu->gprs[ARM_LR] = cpu->gprs[ARM_PC] - WORD_SIZE_ARM; - _ARMSetMode(cpu, cpu->gprs[rm] & 0x00000001); - cpu->gprs[ARM_PC] = cpu->gprs[rm] & 0xFFFFFFFE; + _ARMSetMode(cpu, address & 0x00000001); + cpu->gprs[ARM_PC] = address & 0xFFFFFFFE; if (cpu->executionMode == MODE_THUMB) { THUMB_WRITE_PC; } else {
M src/arm/isa-thumb.csrc/arm/isa-thumb.c

@@ -422,13 +422,14 @@ })

DEFINE_INSTRUCTION_THUMB(BLX2, int rm = (opcode >> 3) & 0xF; - _ARMSetMode(cpu, cpu->gprs[rm] & 0x00000001); + int address = cpu->gprs[rm]; + _ARMSetMode(cpu, address & 0x00000001); int misalign = 0; if (rm == ARM_PC) { - misalign = cpu->gprs[rm] & 0x00000002; + misalign = address & 0x00000002; } cpu->gprs[ARM_LR] = cpu->gprs[ARM_PC] - 1; - cpu->gprs[ARM_PC] = (cpu->gprs[rm] & 0xFFFFFFFE) - misalign; + cpu->gprs[ARM_PC] = (address & 0xFFFFFFFE) - misalign; if (cpu->executionMode == MODE_THUMB) { THUMB_WRITE_PC; } else {