bsnes/higan/sfc/ppu/counter/counter.hpp
Tim Allen 47d4bd4d81 Update to v096r01 release.
byuu says:

Changelog:

- restructured the project and removed a whole bunch of old/dead
  directives from higan/GNUmakefile
- huge amounts of work on hiro/cocoa (compiles but ~70% of the
  functionality is commented out)
- fixed a masking error in my ARM CPU disassembler [Lioncash]
- SFC: decided to change board cic=(411,413) back to board
  region=(ntsc,pal) ... the former was too obtuse

If you rename Boolean (it's a problem with an include from ruby, not
from hiro) and disable all the ruby drivers, you can compile an
OS X binary, but obviously it's not going to do anything.

It's a boring WIP, I just wanted to push out the project structure
change now at the start of this WIP cycle.
2015-12-30 17:54:59 +11:00

50 lines
1.4 KiB
C++

//PPUcounter emulates the H/V latch counters of the S-PPU2.
//
//real hardware has the S-CPU maintain its own copy of these counters that are
//updated based on the state of the S-PPU Vblank and Hblank pins. emulating this
//would require full lock-step synchronization for every clock tick.
//to bypass this and allow the two to run out-of-order, both the CPU and PPU
//classes inherit PPUcounter and keep their own counters.
//the timers are kept in sync, as the only differences occur on V=240 and V=261,
//based on interlace. thus, we need only synchronize and fetch interlace at any
//point before this in the frame, which is handled internally by this class at
//V=128.
class PPUcounter {
public:
alwaysinline void tick();
alwaysinline void tick(unsigned clocks);
alwaysinline bool field () const;
alwaysinline uint16 vcounter() const;
alwaysinline uint16 hcounter() const;
inline uint16 hdot() const;
inline uint16 lineclocks() const;
alwaysinline bool field (unsigned offset) const;
alwaysinline uint16 vcounter(unsigned offset) const;
alwaysinline uint16 hcounter(unsigned offset) const;
inline void reset();
function<void ()> scanline;
void serialize(serializer&);
private:
inline void vcounter_tick();
struct {
bool interlace;
bool field;
uint16 vcounter;
uint16 hcounter;
} status;
struct {
bool field[2048];
uint16 vcounter[2048];
uint16 hcounter[2048];
int32 index;
} history;
};