mirror of
https://github.com/libretro/Mesen.git
synced 2024-12-11 10:54:01 +00:00
55 lines
985 B
C++
55 lines
985 B
C++
#pragma once
|
|
|
|
#include "stdafx.h"
|
|
#include "PPU.h"
|
|
#include "Snapshotable.h"
|
|
|
|
enum class A12StateChange
|
|
{
|
|
None = 0,
|
|
Rise = 1,
|
|
Fall = 2
|
|
};
|
|
|
|
class A12Watcher : public Snapshotable
|
|
{
|
|
private:
|
|
uint32_t _lastCycle = 0;
|
|
uint32_t _cyclesDown = 0;
|
|
|
|
public:
|
|
void StreamState(bool saving) override
|
|
{
|
|
Stream(_lastCycle, _cyclesDown);
|
|
}
|
|
|
|
template<uint8_t minDelay = 10>
|
|
A12StateChange UpdateVramAddress(uint16_t addr, uint32_t frameCycle)
|
|
{
|
|
A12StateChange result = A12StateChange::None;
|
|
|
|
if(_cyclesDown > 0) {
|
|
if(_lastCycle > frameCycle) {
|
|
//We changed frames
|
|
_cyclesDown += (89342 - _lastCycle) + frameCycle;
|
|
} else {
|
|
_cyclesDown += (frameCycle - _lastCycle);
|
|
}
|
|
}
|
|
|
|
if((addr & 0x1000) == 0) {
|
|
if(_cyclesDown == 0) {
|
|
_cyclesDown = 1;
|
|
result = A12StateChange::Fall;
|
|
}
|
|
} else if(addr & 0x1000) {
|
|
if(_cyclesDown > minDelay) {
|
|
result = A12StateChange::Rise;
|
|
}
|
|
_cyclesDown = 0;
|
|
}
|
|
_lastCycle = frameCycle;
|
|
|
|
return result;
|
|
}
|
|
}; |