metaforce/NESEmulator/CNESEmulator.hpp

90 lines
2.6 KiB
C++
Raw Normal View History

2018-10-06 20:42:33 -07:00
#pragma once
2018-02-01 15:19:34 -08:00
#include "RetroTypes.hpp"
#include "zeus/CColor.hpp"
2022-01-31 16:06:54 -08:00
//#include "boo/graphicsdev/IGraphicsDataFactory.hpp"
2018-02-01 15:19:34 -08:00
#include "zeus/CMatrix4f.hpp"
2022-01-31 16:06:54 -08:00
#include "Runtime/Graphics/CGraphics.hpp"
2018-02-01 15:19:34 -08:00
2021-04-10 01:42:06 -07:00
namespace metaforce {
2018-02-03 22:46:47 -08:00
struct CFinalInput;
2018-02-01 15:19:34 -08:00
class IDvdRequest;
2018-12-07 21:30:43 -08:00
namespace MP1 {
2018-02-01 15:19:34 -08:00
2018-06-18 14:38:51 -07:00
#define NUM_AUDIO_BUFFERS 4
2018-02-01 15:19:34 -08:00
2023-10-22 09:21:20 -07:00
class CNESEmulator final {
2018-02-02 16:35:19 -08:00
public:
2018-12-07 21:30:43 -08:00
enum class EPasswordEntryState { NotPasswordScreen, NotEntered, Entered };
2018-02-02 16:35:19 -08:00
private:
2018-12-07 21:30:43 -08:00
static bool EmulatorConstructed;
std::unique_ptr<u8[]> m_nesEmuPBuf;
std::shared_ptr<IDvdRequest> m_dvdReq;
2018-02-01 15:19:34 -08:00
2018-12-07 21:30:43 -08:00
struct Vert {
zeus::CVector3f m_pos;
zeus::CVector2f m_uv;
};
2018-02-01 15:19:34 -08:00
2018-12-07 21:30:43 -08:00
struct Uniform {
zeus::CMatrix4f m_matrix;
zeus::CColor m_color;
};
2018-02-01 15:19:34 -08:00
2022-07-29 13:16:55 -07:00
GXTexObj m_texture;
2022-01-31 16:06:54 -08:00
// boo::ObjToken<boo::IGraphicsBufferD> m_uniBuf;
// boo::ObjToken<boo::IGraphicsBufferS> m_vbo;
// boo::ObjToken<boo::IShaderDataBinding> m_shadBind;
2018-02-01 15:19:34 -08:00
2018-12-07 21:30:43 -08:00
std::unique_ptr<u8[]> m_audioBufBlock;
u8* m_audioBufs[NUM_AUDIO_BUFFERS];
uint32_t m_headBuf = 0;
uint32_t m_tailBuf = 0;
uint32_t m_procBufs = NUM_AUDIO_BUFFERS;
uint32_t m_posInHeadBuf = 0;
uint32_t m_posInTailBuf = 0;
2023-10-22 09:21:20 -07:00
//boo::ObjToken<boo::IAudioVoice> m_booVoice;
2018-02-01 15:19:34 -08:00
2018-12-07 21:30:43 -08:00
// void* x4_loadBuf;
// void* x8_rom;
// void* xc_state;
// OSModuleInfo* x10_module = x4_loadBuf;
// void* x14_bss;
// void* x18_prgram;
// void* x1c_wram;
bool x20_gameOver = false;
u8 x21_passwordFromNES[18];
EPasswordEntryState x34_passwordEntryState = EPasswordEntryState::NotPasswordScreen;
bool x38_passwordPending = false;
u8 x39_passwordToNES[18];
static void DecryptMetroid(u8* dataIn, u8* dataOut, u32 decLen = 0x20000, u8 decByte = 0xe9, u32 xorLen = 0x1FFFC,
u32 xorVal = 0xA663);
void InitializeEmulator();
void DeinitializeEmulator();
void NesEmuMainLoop(bool forceDraw = false);
static bool CheckForGameOver(const u8* vram, u8* passwordOut = nullptr);
static EPasswordEntryState CheckForPasswordEntryScreen(const uint8_t* vram);
static bool SetPasswordIntoEntryScreen(u8* vram, u8* wram, const u8* password);
2018-02-01 15:19:34 -08:00
public:
2018-12-07 21:30:43 -08:00
CNESEmulator();
~CNESEmulator();
void ProcessUserInput(const CFinalInput& input, int);
void Update();
void Draw(const zeus::CColor& mulColor, bool filtering);
void LoadPassword(const u8* state);
const u8* GetPassword() const { return x21_passwordFromNES; }
bool IsGameOver() const { return x20_gameOver; }
EPasswordEntryState GetPasswordEntryState() const { return x34_passwordEntryState; }
2018-02-01 15:19:34 -08:00
2018-12-07 21:30:43 -08:00
int audioUpdate();
2023-10-22 09:21:20 -07:00
//void preSupplyAudio(boo::IAudioVoice& voice, double dt) {}
//size_t supplyAudio(boo::IAudioVoice& voice, size_t frames, int16_t* data);
2018-02-01 15:19:34 -08:00
};
2018-12-07 21:30:43 -08:00
} // namespace MP1
2021-04-10 01:42:06 -07:00
} // namespace metaforce