diff --git a/src/Emulator/Peripherals/Peripherals/CPU/MSP430X/MSP430X.cs b/src/Emulator/Peripherals/Peripherals/CPU/MSP430X/MSP430X.cs index 2e955e6d9..ee64539c1 100644 --- a/src/Emulator/Peripherals/Peripherals/CPU/MSP430X/MSP430X.cs +++ b/src/Emulator/Peripherals/Peripherals/CPU/MSP430X/MSP430X.cs @@ -525,10 +525,21 @@ private uint GetOperandValue(Registers register, AddressingMode addressingMode, { uint registerValue = GetRegisterValue(register, addressingMode); var offset = (accessWidth != AccessWidth._8bit) || register == Registers.PC ? 2U : 1U; - address = (ulong)registerValue | addressExtension; - address &= 0xFFFFF; SetRegisterValue(register, (uint)(registerValue + offset) & 0xFFFFF); - return PerformMemoryRead(address, accessWidth); + if (register == Registers.PC) { + // immediate addressing (@PC+) + // get immediate value @PC and append the extended address + uint imm20 = PerformMemoryRead(registerValue, AccessWidth._16bit); + imm20 |= addressExtension; + return imm20; + } else { + // indirect addressing (@Rn+) + // get addr in the register and append the extended address + // then access the memory + address = (ulong)registerValue | addressExtension; + address &= 0xFFFFF; + return PerformMemoryRead(address, accessWidth); + } } default: