diff --git a/M6502/inc/mos6502.h b/M6502/inc/mos6502.h index fee4ebd..bd02400 100644 --- a/M6502/inc/mos6502.h +++ b/M6502/inc/mos6502.h @@ -84,10 +84,10 @@ namespace EightBit { register16_t Address_Indirect(); uint8_t Address_ZeroPageX(); uint8_t Address_ZeroPageY(); - std::pair Address_AbsoluteX(); - std::pair Address_AbsoluteY(); + std::pair Address_AbsoluteX(); + std::pair Address_AbsoluteY(); register16_t Address_IndexedIndirectX(); - std::pair Address_IndirectIndexedY(); + std::pair Address_IndirectIndexedY(); register16_t Address_relative_byte(); // Addressing modes, read diff --git a/M6502/src/mos6502.cpp b/M6502/src/mos6502.cpp index a38ece2..e08036e 100644 --- a/M6502/src/mos6502.cpp +++ b/M6502/src/mos6502.cpp @@ -414,29 +414,29 @@ uint8_t EightBit::MOS6502::Address_ZeroPageY() { return address + Y(); } -std::pair EightBit::MOS6502::Address_AbsoluteX() { +std::pair EightBit::MOS6502::Address_AbsoluteX() { auto address = Address_Absolute(); const auto page = address.high; address += X(); - return { address, address.high != page }; + return { address, page }; } -std::pair EightBit::MOS6502::Address_AbsoluteY() { +std::pair EightBit::MOS6502::Address_AbsoluteY() { auto address = Address_Absolute(); const auto page = address.high; address += Y(); - return { address, address.high != page }; + return { address, page }; } EightBit::register16_t EightBit::MOS6502::Address_IndexedIndirectX() { return getWordPaged(0, Address_ZeroPageX()); } -std::pair EightBit::MOS6502::Address_IndirectIndexedY() { +std::pair EightBit::MOS6502::Address_IndirectIndexedY() { auto address = Address_ZeroPageIndirect(); const auto page = address.high; address += Y(); - return { address, address.high != page }; + return { address, page }; } EightBit::register16_t EightBit::MOS6502::Address_relative_byte() { @@ -458,17 +458,19 @@ uint8_t EightBit::MOS6502::AM_ZeroPage() { } uint8_t EightBit::MOS6502::AM_AbsoluteX() { - const auto [address, paged] = Address_AbsoluteX(); - if (UNLIKELY(paged)) - addCycle(); - return Processor::busRead(address); + const auto [address, page] = Address_AbsoluteX(); + auto possible = getBytePaged(page, address.low); + if (UNLIKELY(page != address.high)) + possible = Processor::busRead(address); + return possible; } uint8_t EightBit::MOS6502::AM_AbsoluteY() { - const auto [address, paged] = Address_AbsoluteY(); - if (UNLIKELY(paged)) - addCycle(); - return Processor::busRead(address); + const auto[address, page] = Address_AbsoluteY(); + auto possible = getBytePaged(page, address.low); + if (UNLIKELY(page != address.high)) + possible = Processor::busRead(address); + return possible; } uint8_t EightBit::MOS6502::AM_ZeroPageX() { @@ -484,10 +486,11 @@ uint8_t EightBit::MOS6502::AM_IndexedIndirectX() { } uint8_t EightBit::MOS6502::AM_IndirectIndexedY() { - const auto [address, paged] = Address_IndirectIndexedY(); - if (UNLIKELY(paged)) - addCycle(); - return Processor::busRead(address); + const auto [address, page] = Address_IndirectIndexedY(); + auto possible = getBytePaged(page, address.low); + if (page != address.high) + possible = Processor::busRead(address); + return possible; } ////