Mesen-S/Core/SuperGameboy.h
2020-06-24 19:20:55 -04:00

80 lines
1.7 KiB
C++

#pragma once
#include "stdafx.h"
#include "BaseCoprocessor.h"
#include "../Utilities/HermiteResampler.h"
class Console;
class MemoryManager;
class BaseCartridge;
class Spc;
class Gameboy;
class GbPpu;
class SuperGameboy : public BaseCoprocessor
{
private:
Console* _console = nullptr;
MemoryManager* _memoryManager = nullptr;
BaseCartridge* _cart = nullptr;
Spc* _spc = nullptr;
Gameboy* _gameboy = nullptr;
GbPpu* _ppu = nullptr;
uint8_t _control = 0;
uint64_t _resetClock = 0;
double _clockRatio = 0;
uint8_t _input[4] = {};
uint8_t _inputIndex = 0;
bool _listeningForPacket = false;
bool _waitForHigh = true;
bool _packetReady = false;
uint64_t _inputWriteClock = 0;
uint8_t _inputValue = 0;
uint8_t _packetData[16] = {};
uint8_t _packetByte = 0;
uint8_t _packetBit = 0;
uint8_t _lcdRowSelect = 0;
uint16_t _readPosition = 0;
uint8_t _lcdBuffer[4][1280] = {};
HermiteResampler _resampler;
int16_t* _mixBuffer = nullptr;
uint32_t _mixSampleCount = 0;
uint8_t GetLcdRow();
uint8_t GetLcdBufferRow();
uint8_t GetPlayerCount();
public:
SuperGameboy(Console* console);
~SuperGameboy();
void Reset() override;
uint8_t Read(uint32_t addr) override;
void Write(uint32_t addr, uint8_t value) override;
void Run() override;
void ProcessInputPortWrite(uint8_t value);
void LogPacket();
void WriteLcdColor(uint8_t scanline, uint8_t pixel, uint8_t color);
void MixAudio(uint32_t targetRate, int16_t* soundSamples, uint32_t sampleCount);
void UpdateClockRatio();
uint32_t GetClockRate();
uint8_t GetInputIndex();
uint8_t GetInput();
uint8_t Peek(uint32_t addr) override;
void PeekBlock(uint32_t addr, uint8_t* output) override;
AddressInfo GetAbsoluteAddress(uint32_t address) override;
void Serialize(Serializer& s) override;
};