Changed the way cpu/ppu cycles are kept in memory (slightly faster)

This commit is contained in:
Souryo 2014-06-30 14:44:30 -04:00
parent b80b0a0d02
commit 2c55437a44
5 changed files with 31 additions and 9 deletions

View file

@ -1,7 +1,7 @@
#include "stdafx.h"
#include "CPU.h"
uint64_t CPU::CycleCount = 0;
int32_t CPU::CycleCount = 0;
uint32_t CPU::CyclePenalty = 0;
bool CPU::NMIFlag = false;
uint32_t CPU::IRQFlag = 0;
@ -136,6 +136,11 @@ uint32_t CPU::Exec()
return executedCycles + GetCyclePenalty();
}
void CPU::EndFrame()
{
CPU::CycleCount = 0;
}
void CPU::StreamState(bool saving)
{
Stream<uint16_t>(_state.PC);
@ -144,7 +149,7 @@ void CPU::StreamState(bool saving)
Stream<uint8_t>(_state.X);
Stream<uint8_t>(_state.Y);
Stream<uint64_t>(CPU::CycleCount);
Stream<int32_t>(CPU::CycleCount);
Stream<bool>(CPU::NMIFlag);
Stream<uint32_t>(CPU::IRQFlag);

View file

@ -45,7 +45,7 @@ private:
typedef void(CPU::*Func)();
static uint64_t CycleCount;
static int32_t CycleCount;
static uint32_t CyclePenalty;
Func _opTable[256];
@ -684,7 +684,7 @@ public:
static const uint32_t ClockRate = 1789773;
CPU(MemoryManager *memoryManager);
static uint64_t GetCycleCount() { return CPU::CycleCount; }
static int32_t GetCycleCount() { return CPU::CycleCount; }
static void IncCycleCount(uint32_t cycles) {
CPU::CyclePenalty += cycles;
CPU::CycleCount += cycles;
@ -702,6 +702,8 @@ public:
void Reset(bool softReset);
uint32_t Exec();
void EndFrame();
State GetState() { return _state; }
};

View file

@ -77,8 +77,14 @@ void Console::Run()
while(true) {
uint32_t executedCycles = _cpu->Exec();
_ppu->Exec();
bool frameDone = _apu->Exec(executedCycles);
if(frameDone) {
_cpu->EndFrame();
_ppu->EndFrame();
}
if(CheckFlag(EmulationFlags::LimitFPS) && frameDone) {
elapsedTime = clockTimer.GetElapsedMS();
while(targetTime > elapsedTime) {
@ -174,9 +180,14 @@ bool Console::RunTest(uint8_t *expectedResult)
uint8_t maxWait = 60;
uint8_t* lastFrameBuffer = new uint8_t[256 * 240 * 4];
while(true) {
_apu->Exec(_cpu->Exec());
uint32_t executedCycles = _cpu->Exec();
_ppu->Exec();
if(_apu->Exec(executedCycles)) {
_cpu->EndFrame();
_ppu->EndFrame();
}
if(timer.GetElapsedMS() > 100) {
if(memcmp(_ppu->GetFrameBuffer(), expectedResult, 256 * 240 * 4) == 0) {
return true;

View file

@ -633,8 +633,7 @@ void PPU::EndVBlank()
void PPU::Exec(uint32_t extraCycles)
{
uint64_t equivalentCycleCount = CPU::GetCycleCount() * 3;
int32_t gap = (int32_t)((int64_t)equivalentCycleCount - (int64_t)_cycleCount);
int32_t gap = CPU::GetCycleCount() * 3 - _cycleCount;
if(gap < 0) {
gap = 0;
}
@ -683,7 +682,7 @@ void PPU::StreamState(bool saving)
Stream<int32_t>(_scanline);
Stream<uint32_t>(_cycle);
Stream<uint32_t>(_frameCount);
Stream<uint64_t>(_cycleCount);
Stream<int32_t>(_cycleCount);
Stream<uint8_t>(_memoryReadBuffer);
StreamArray<uint8_t>(_paletteRAM, 0x100);

View file

@ -86,7 +86,7 @@ class PPU : public IMemoryHandler, public Snapshotable
int32_t _scanline = 0;
uint32_t _cycle = 0;
uint32_t _frameCount = 0;
uint64_t _cycleCount = 0;
int32_t _cycleCount = 0;
uint8_t _memoryReadBuffer = 0;
uint8_t _paletteRAM[0x100];
@ -214,4 +214,9 @@ class PPU : public IMemoryHandler, public Snapshotable
{
PPU::Instance->Exec(cycles);
}
void EndFrame()
{
_cycleCount = 0;
}
};