all repos — mgba @ a635f4de4db88f8fddd4464225edb925bde8da95

mGBA Game Boy Advance Emulator

Implement addressing mode 1 ASR register shift
Jeffrey Pfau jeffrey@endrift.com
Thu, 02 May 2013 00:32:04 -0700
commit

a635f4de4db88f8fddd4464225edb925bde8da95

parent

86c228f2e4b16df681658cb2d52b0cf1d5fe19ab

1 files changed, 24 insertions(+), 1 deletions(-)

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

@@ -104,7 +104,30 @@ }

static inline void _shiftASRR(struct ARMCore* cpu, uint32_t opcode) { int rm = opcode & 0x0000000F; - ARM_STUB; + int rs = (opcode >> 8) & 0x0000000F; + ++cpu->cycles; + int shift = cpu->gprs[rs]; + if (rs == ARM_PC) { + shift += 4; + } + shift &= 0xFF; + int shiftVal = cpu->gprs[rm]; + if (rm == ARM_PC) { + shiftVal += 4; + } + if (!shift) { + cpu->shifterOperand = shiftVal; + cpu->shifterCarryOut = cpu->cpsr.c; + } else if (shift < 32) { + cpu->shifterOperand = shiftVal >> shift; + cpu->shifterCarryOut = (shiftVal >> (shift - 1)) & 1; + } else if (cpu->gprs[rm] >> 31) { + cpu->shifterOperand = 0xFFFFFFFF; + cpu->shifterCarryOut = 1; + } else { + cpu->shifterOperand = 0; + cpu->shifterCarryOut = 0; + } } static inline void _shiftROR(struct ARMCore* cpu, uint32_t opcode) {