Refactoring: Removed duplicated code for A12-based IRQs
This commit is contained in:
parent
d03e66839f
commit
c0395b0bb2
6 changed files with 43 additions and 111 deletions
|
@ -1,3 +1,5 @@
|
|||
#pragma once
|
||||
|
||||
#include "stdafx.h"
|
||||
#include "CPU.h"
|
||||
#include "PPU.h"
|
||||
|
|
42
Core/MMC3.h
42
Core/MMC3.h
|
@ -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;
|
||||
}
|
||||
};
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
};
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
};
|
Loading…
Add table
Reference in a new issue