From 5cf821acb688864922dc4650523740de60d3f0f0 Mon Sep 17 00:00:00 2001 From: Adrian Conlon <98398945+AdrianConlon@users.noreply.github.com> Date: Tue, 5 Mar 2024 10:29:01 +0000 Subject: [PATCH] More address simplifications --- M6502/inc/mos6502.h | 5 +++-- M6502/src/mos6502.cpp | 18 ++++++------------ inc/Processor.h | 2 ++ 3 files changed, 11 insertions(+), 14 deletions(-) diff --git a/M6502/inc/mos6502.h b/M6502/inc/mos6502.h index 1a02a6d..d36c78c 100644 --- a/M6502/inc/mos6502.h +++ b/M6502/inc/mos6502.h @@ -183,9 +183,10 @@ namespace EightBit { void maybe_fixup(register16_t address, uint8_t unfixed_page, bool always_fixup = false) noexcept { BUS().ADDRESS() = { address.low, unfixed_page }; const auto fixing = unfixed_page != address.high; - if (always_fixup || fixing) + if (always_fixup || fixing) { memoryRead(); - BUS().ADDRESS() = address; + BUS().ADDRESS().high = address.high; + } } void maybe_fixup(std::pair fixing, bool always_fixup = false) noexcept { diff --git a/M6502/src/mos6502.cpp b/M6502/src/mos6502.cpp index 1d1cd9d..4381dec 100644 --- a/M6502/src/mos6502.cpp +++ b/M6502/src/mos6502.cpp @@ -102,8 +102,7 @@ void EightBit::MOS6502::interrupt() noexcept { } set_flag(IF); // Disable IRQ const uint8_t vector = reset ? RSTvector : (nmi ? NMIvector : IRQvector); - BUS().ADDRESS() = { vector, 0xff }; - jump(getWordPaged()); + jump(Processor::getWordPaged(0xff, vector)); m_handlingRESET = m_handlingNMI = m_handlingINT = false; } @@ -425,24 +424,20 @@ void EightBit::MOS6502::dummyPush(const uint8_t value) noexcept { //// EightBit::register16_t EightBit::MOS6502::Address_ZeroPageIndirect() noexcept { - BUS().ADDRESS() = Address_ZeroPage(); - return getWordPaged(); + return Processor::getWordPaged(Address_ZeroPage()); } EightBit::register16_t EightBit::MOS6502::Address_Indirect() noexcept { - BUS().ADDRESS() = Address_Absolute(); - return getWordPaged(); + return Processor::getWordPaged(Address_Absolute()); } EightBit::register16_t EightBit::MOS6502::Address_ZeroPageX() noexcept { - BUS().ADDRESS() = Address_ZeroPage(); - memoryRead(); + memoryRead(Address_ZeroPage()); return register16_t(BUS().ADDRESS().low + X(), 0); } EightBit::register16_t EightBit::MOS6502::Address_ZeroPageY() noexcept { - BUS().ADDRESS() = Address_ZeroPage(); - memoryRead(); + memoryRead(Address_ZeroPage()); return register16_t(BUS().ADDRESS().low + Y(), 0); } @@ -457,8 +452,7 @@ std::pair EightBit::MOS6502::Address_AbsoluteY( } EightBit::register16_t EightBit::MOS6502::Address_IndexedIndirectX() noexcept { - BUS().ADDRESS() = Address_ZeroPageX(); - return getWordPaged(); + return Processor::getWordPaged(Address_ZeroPageX()); } std::pair EightBit::MOS6502::Address_IndirectIndexedY() noexcept { diff --git a/inc/Processor.h b/inc/Processor.h index b684085..0b95048 100644 --- a/inc/Processor.h +++ b/inc/Processor.h @@ -67,8 +67,10 @@ namespace EightBit { [[nodiscard]] virtual register16_t getWord() = 0; virtual void setWord(register16_t value) = 0; + [[nodiscard]] register16_t getWordPaged(register16_t address); [[nodiscard]] register16_t getWordPaged(uint8_t page, uint8_t offset); [[nodiscard]] virtual register16_t getWordPaged() = 0; + void setWordPaged(register16_t address, register16_t value); void setWordPaged(uint8_t page, uint8_t offset, register16_t value); virtual void setWordPaged(register16_t value) = 0;