diff --git a/core/src/mos6502.cpp b/core/src/mos6502.cpp index 430e4229..f2899f74 100644 --- a/core/src/mos6502.cpp +++ b/core/src/mos6502.cpp @@ -629,10 +629,14 @@ Pipeline Mos6502::create_zeropage_indexed_addressing_steps( Pipeline Mos6502::create_absolute_addressing_steps() { Pipeline result; - result.push([=]() { ++registers_->pc; }); result.push([=]() { + tmp_ = mmu_->read_byte(registers_->pc); + ++registers_->pc; + }); + result.push([=]() { + const uint16_t upper = mmu_->read_byte(registers_->pc) << 8; ++registers_->pc; - effective_address_ = mmu_->read_word(registers_->pc - 2); + effective_address_ = tmp_ | upper; }); return result; } diff --git a/core/test/src/test_cpu.cpp b/core/test/src/test_cpu.cpp index 7e302ad2..11b37350 100644 --- a/core/test/src/test_cpu.cpp +++ b/core/test/src/test_cpu.cpp @@ -510,8 +510,13 @@ class CpuAbsoluteTest : public CpuTest { stage_instruction(instruction); expected.pc += 2; - EXPECT_CALL(mmu, read_word(start_pc + 1)) - .WillOnce(Return(effective_address)); + const uint8_t lower_address = effective_address & 0x00FF; + const uint8_t upper_address = (effective_address & 0xFF00) >> 8; + + EXPECT_CALL(mmu, read_byte(start_pc + 1)) + .WillOnce(Return(lower_address)); + EXPECT_CALL(mmu, read_byte(start_pc + 2)) + .WillOnce(Return(upper_address)); EXPECT_CALL(mmu, read_byte(effective_address)) .WillOnce(Return(memory_content)); @@ -524,8 +529,13 @@ class CpuAbsoluteTest : public CpuTest { stage_instruction(instruction); expected.pc += 2; - EXPECT_CALL(mmu, read_word(start_pc + 1)) - .WillOnce(Return(effective_address)); + const uint8_t lower_address = effective_address & 0x00FF; + const uint8_t upper_address = (effective_address & 0xFF00) >> 8; + + EXPECT_CALL(mmu, read_byte(start_pc + 1)) + .WillOnce(Return(lower_address)); + EXPECT_CALL(mmu, read_byte(start_pc + 2)) + .WillOnce(Return(upper_address)); EXPECT_CALL(mmu, write_byte(effective_address, memory_content)); step_execution(4);