Refactoring: Removed duplicated code for A12-based IRQs

This commit is contained in:
Souryo 2016-08-25 23:29:23 -04:00
parent d03e66839f
commit c0395b0bb2
6 changed files with 43 additions and 111 deletions

View file

@ -1,3 +1,5 @@
#pragma once
#include "stdafx.h"
#include "CPU.h"
#include "PPU.h"

View file

@ -3,8 +3,8 @@
#include "stdafx.h"
#include "BaseMapper.h"
#include "CPU.h"
#include "PPU.h"
#include "EmulationSettings.h"
#include "A12Watcher.h"
class MMC3 : public BaseMapper
{
@ -27,8 +27,7 @@ class MMC3 : public BaseMapper
bool _wramEnabled;
bool _wramWriteProtected;
uint32_t _lastCycle;
uint32_t _cyclesDown;
A12Watcher _a12Watcher;
bool _needIrq;
bool _forceMmc3RevAIrqs;
@ -53,8 +52,6 @@ class MMC3 : public BaseMapper
_irqReloadValue = 0;
_irqReload = false;
_irqEnabled = false;
_lastCycle = 0xFFFF;
_cyclesDown = 0xFFFF;
_wramEnabled = false;
_wramWriteProtected = false;
@ -179,8 +176,9 @@ class MMC3 : public BaseMapper
{
BaseMapper::StreamState(saving);
ArrayInfo<uint8_t> registers = { _registers, 8 };
SnapshotInfo a12Watcher{ &_a12Watcher };
Stream(_state.Reg8000, _state.RegA000, _state.RegA001, _currentRegister, _chrMode, _prgMode,
_irqReloadValue, _irqCounter, _irqReload, _irqEnabled, _lastCycle, _cyclesDown,
_irqReloadValue, _irqCounter, _irqReload, _irqEnabled, a12Watcher,
_wramEnabled, _wramWriteProtected, registers, _needIrq);
}
@ -266,27 +264,15 @@ class MMC3 : public BaseMapper
public:
virtual void NotifyVRAMAddressChange(uint16_t addr)
{
uint32_t cycle = PPU::GetFrameCycle();
if((addr & 0x1000) == 0) {
if(_needIrq) {
//Used by MC-ACC (Acclaim copy of the MMC3), see TriggerIrq above
CPU::SetIRQSource(IRQSource::External);
_needIrq = false;
}
if(_cyclesDown == 0) {
_cyclesDown = 1;
} else {
if(_lastCycle > cycle) {
//We changed frames
_cyclesDown += (89342 - _lastCycle) + cycle;
} else {
_cyclesDown += (cycle - _lastCycle);
switch(_a12Watcher.UpdateVramAddress(addr)) {
case A12StateChange::Fall:
if(_needIrq) {
//Used by MC-ACC (Acclaim copy of the MMC3), see TriggerIrq above
CPU::SetIRQSource(IRQSource::External);
_needIrq = false;
}
}
} else if(addr & 0x1000) {
if(_cyclesDown > 8) {
break;
case A12StateChange::Rise:
uint32_t count = _irqCounter;
if(_irqCounter == 0 || _irqReload) {
_irqCounter = _irqReloadValue;
@ -306,9 +292,7 @@ class MMC3 : public BaseMapper
}
}
_irqReload = false;
}
_cyclesDown = 0;
break;
}
_lastCycle = cycle;
}
};

View file

@ -29,7 +29,8 @@ protected:
void StreamState(bool saving)
{
BaseMapper::StreamState(saving);
Stream(_irqCounter, _irqEnabled, _irqEnabledAlt, _irqReloadValue, _a12Watcher);
SnapshotInfo a12Watcher{ &_a12Watcher };
Stream(_irqCounter, _irqEnabled, _irqEnabledAlt, _irqReloadValue, a12Watcher);
}
void NotifyVRAMAddressChange(uint16_t addr)

View file

@ -1,15 +1,14 @@
#pragma once
#include "stdafx.h"
#include "BaseMapper.h"
#include "PPU.h"
#include "CPU.h"
#include "A12Watcher.h"
class Mapper222 : public BaseMapper
{
private:
uint16_t _irqCounter;
uint32_t _cyclesDown;
uint32_t _lastCycle;
A12Watcher _a12Watcher;
protected:
virtual uint16_t GetPRGPageSize() { return 0x2000; }
@ -18,8 +17,6 @@ protected:
void InitMapper()
{
_irqCounter = 0;
_cyclesDown = 0;
_lastCycle = 0;
SelectPrgPage2x(1, -2);
}
@ -27,37 +24,21 @@ protected:
void StreamState(bool saving)
{
BaseMapper::StreamState(saving);
Stream(_irqCounter, _cyclesDown, _lastCycle);
SnapshotInfo a12Watcher{ &_a12Watcher };
Stream(_irqCounter, a12Watcher);
}
virtual void NotifyVRAMAddressChange(uint16_t addr)
{
uint32_t cycle = PPU::GetFrameCycle();
if((addr & 0x1000) == 0) {
if(_cyclesDown == 0) {
_cyclesDown = 1;
} else {
if(_lastCycle > cycle) {
//We changed frames
_cyclesDown += (89342 - _lastCycle) + cycle;
} else {
_cyclesDown += (cycle - _lastCycle);
if(_a12Watcher.UpdateVramAddress(addr) == A12StateChange::Rise) {
if(_irqCounter) {
_irqCounter++;
if(_irqCounter >= 240) {
CPU::SetIRQSource(IRQSource::External);
_irqCounter = 0;
}
}
} else if(addr & 0x1000) {
if(_cyclesDown > 8) {
if(_irqCounter) {
_irqCounter++;
if(_irqCounter >= 240) {
CPU::SetIRQSource(IRQSource::External);
_irqCounter = 0;
}
}
}
_cyclesDown = 0;
}
_lastCycle = cycle;
}
void WriteRegister(uint16_t addr, uint8_t value)

View file

@ -1,16 +1,15 @@
#pragma once
#include "stdafx.h"
#include "BaseMapper.h"
#include "A12Watcher.h"
#include "CPU.h"
#include "PPU.h"
class Mapper35 : public BaseMapper
{
private:
uint8_t _irqCounter;
bool _irqEnabled;
uint32_t _cyclesDown;
uint32_t _lastCycle;
A12Watcher _a12Watcher;
protected:
virtual uint16_t GetPRGPageSize() { return 0x2000; }
@ -20,8 +19,6 @@ protected:
{
_irqEnabled = false;
_irqCounter = 0;
_cyclesDown = 0;
_lastCycle = 0;
SelectPRGPage(3, -1);
}
@ -29,7 +26,8 @@ protected:
void StreamState(bool saving)
{
BaseMapper::StreamState(saving);
Stream(_irqCounter, _irqEnabled, _cyclesDown, _lastCycle);
SnapshotInfo a12Watcher{ &_a12Watcher };
Stream(_irqCounter, _irqEnabled, a12Watcher);
}
void WriteRegister(uint16_t addr, uint8_t value)
@ -61,32 +59,14 @@ protected:
virtual void NotifyVRAMAddressChange(uint16_t addr)
{
//MMC3-style A12 IRQ counter
uint32_t cycle = PPU::GetFrameCycle();
if((addr & 0x1000) == 0) {
if(_cyclesDown == 0) {
_cyclesDown = 1;
} else {
if(_lastCycle > cycle) {
//We changed frames
_cyclesDown += (89342 - _lastCycle) + cycle;
} else {
_cyclesDown += (cycle - _lastCycle);
if(_a12Watcher.UpdateVramAddress(addr) == A12StateChange::Rise) {
if(_irqEnabled) {
_irqCounter--;
if(_irqCounter == 0) {
_irqEnabled = false;
CPU::SetIRQSource(IRQSource::External);
}
}
} else if(addr & 0x1000) {
if(_cyclesDown > 8) {
if(_irqEnabled) {
_irqCounter--;
if(_irqCounter == 0) {
_irqEnabled = false;
CPU::SetIRQSource(IRQSource::External);
}
}
}
_cyclesDown = 0;
}
_lastCycle = cycle;
}
};

View file

@ -2,6 +2,7 @@
#include "stdafx.h"
#include "BaseMapper.h"
#include "CPU.h"
#include "A12Watcher.h"
class Rambo1 : public BaseMapper
{
@ -13,9 +14,8 @@ private:
bool _needReload = false;
uint8_t _irqCounter = 0;
uint8_t _irqReloadValue = 0;
uint32_t _lastCycle = 0;
uint32_t _cyclesDown = 0;
uint8_t _cpuClockCounter = 0;
A12Watcher _a12Watcher;
uint8_t _currentRegister = 0;
uint8_t _registers[16];
@ -36,8 +36,9 @@ protected:
{
BaseMapper::StreamState(saving);
ArrayInfo<uint8_t> registers = { _registers, 16 };
Stream(_irqEnabled, _irqCycleMode, _needReload, _needIrqDelay, _irqCounter, _irqReloadValue, _lastCycle,
_cyclesDown, _cpuClockCounter, _currentRegister, registers, _forceClock);
SnapshotInfo a12Watcher{ &_a12Watcher };
Stream(_irqEnabled, _irqCycleMode, _needReload, _needIrqDelay, _irqCounter, _irqReloadValue,
a12Watcher, _cpuClockCounter, _currentRegister, registers, _forceClock);
}
virtual void ProcessCpuClock()
@ -155,26 +156,9 @@ public:
virtual void NotifyVRAMAddressChange(uint16_t addr)
{
if(!_irqCycleMode) {
uint32_t cycle = PPU::GetFrameCycle();
if((addr & 0x1000) == 0) {
if(_cyclesDown == 0) {
_cyclesDown = 1;
} else {
if(_lastCycle > cycle) {
//We changed frames
_cyclesDown += (89342 - _lastCycle) + cycle;
} else {
_cyclesDown += (cycle - _lastCycle);
}
}
} else if(addr & 0x1000) {
if(_cyclesDown > 8) {
if(_a12Watcher.UpdateVramAddress(addr) == A12StateChange::Rise) {
ClockIrqCounter(Rambo1::PpuIrqDelay);
}
_cyclesDown = 0;
}
_lastCycle = cycle;
}
}
};