diff --git a/src/emucore/CartELF.cxx b/src/emucore/CartELF.cxx index 9c111b783..d6ec51b61 100644 --- a/src/emucore/CartELF.cxx +++ b/src/emucore/CartELF.cxx @@ -340,7 +340,7 @@ inline uInt64 CartridgeELF::getArmCycles() const // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - inline uInt8 CartridgeELF::driveBus(uInt16 address, uInt8 value) { - auto* nextTransaction = myTransactionQueue.getNextTransaction(address); + auto* nextTransaction = myTransactionQueue.getNextTransaction(address, getArmCycles()); if (nextTransaction) { nextTransaction->setBusState(myIsBusDriven, myDriveBusValue); syncClock(*nextTransaction); @@ -361,9 +361,6 @@ inline void CartridgeELF::syncClock(const BusTransactionQueue::Transaction& tran const Int64 transactionArmCycles = transaction.timestamp + myArmCyclesOffset; myArmCyclesOffset += currentSystemArmCycles - transactionArmCycles; - - if (transactionArmCycles > currentSystemArmCycles) - Logger::error("ARM took too many cycles between bus transitions"); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/emucore/CartELF.hxx b/src/emucore/CartELF.hxx index 68529844f..1ac58242b 100644 --- a/src/emucore/CartELF.hxx +++ b/src/emucore/CartELF.hxx @@ -120,7 +120,7 @@ class CartridgeELF: public Cartridge { BusFallbackDelegate myFallbackDelegate; ConsoleTiming myConsoleTiming{ConsoleTiming::ntsc}; - uInt32 myArmCyclesPer6502Cycle{140}; + uInt32 myArmCyclesPer6502Cycle{160}; Int64 myArmCyclesOffset{0}; diff --git a/src/emucore/elf/BusTransactionQueue.cxx b/src/emucore/elf/BusTransactionQueue.cxx index 915243635..ff7997cc1 100644 --- a/src/emucore/elf/BusTransactionQueue.cxx +++ b/src/emucore/elf/BusTransactionQueue.cxx @@ -124,12 +124,12 @@ bool BusTransactionQueue::hasPendingTransaction() const } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -BusTransactionQueue::Transaction* BusTransactionQueue::getNextTransaction(uInt16 address) +BusTransactionQueue::Transaction* BusTransactionQueue::getNextTransaction(uInt16 address, uInt64 timestamp) { if (myQueueSize == 0) return nullptr; Transaction* nextTransaction = &myQueue[myQueueNext]; - if (nextTransaction->address != (address & 0x1fff)) return nullptr; + if (nextTransaction->address != (address & 0x1fff) || nextTransaction->timestamp > timestamp) return nullptr; myQueueNext = (myQueueNext + 1) % myQueueCapacity; myQueueSize--; diff --git a/src/emucore/elf/BusTransactionQueue.hxx b/src/emucore/elf/BusTransactionQueue.hxx index 35d9fc41b..6ce03963d 100644 --- a/src/emucore/elf/BusTransactionQueue.hxx +++ b/src/emucore/elf/BusTransactionQueue.hxx @@ -50,7 +50,7 @@ class BusTransactionQueue { BusTransactionQueue& yield(uInt16 address); bool hasPendingTransaction() const; - Transaction* getNextTransaction(uInt16 address); + Transaction* getNextTransaction(uInt16 address, uInt64 timestamp); inline size_t size() const { return myQueueSize;