quickerNES/source/quickNES/nesInstance.hpp

86 lines
2.4 KiB
C++
Raw Permalink Normal View History

#pragma once
2024-07-28 14:52:05 +00:00
#include "../nesInstanceBase.hpp"
2024-01-29 15:54:27 +00:00
#include "core/nes_emu/Nes_Emu.h"
#include "core/nes_emu/Nes_State.h"
2024-07-28 14:52:05 +00:00
#include "jaffarCommon/deserializers/base.hpp"
#include "jaffarCommon/serializers/base.hpp"
#define _DUMMY_SIZE 65536
2024-01-22 17:50:52 +00:00
typedef Nes_Emu emulator_t;
extern void register_misc_mappers();
extern void register_extra_mappers();
extern void register_mapper_70();
2024-01-28 18:57:24 +00:00
class NESInstance final : public NESInstanceBase
{
2024-01-20 10:21:34 +00:00
public:
2024-07-28 14:52:05 +00:00
NESInstance(const nlohmann::json &config) : NESInstanceBase(config)
2024-01-20 10:21:34 +00:00
{
// If running the original QuickNES, register extra mappers now
register_misc_mappers();
register_extra_mappers();
register_mapper_70();
}
2024-01-29 18:47:52 +00:00
uint8_t *getLowMem() const override { return _nes.low_mem(); };
size_t getLowMemSize() const override { return 0x800; };
2024-07-28 14:52:05 +00:00
void serializeState(jaffarCommon::serializer::Base &serializer) const override
2024-01-20 10:21:34 +00:00
{
2024-02-09 19:43:42 +00:00
Mem_Writer w(serializer.getOutputDataBuffer(), _stateSize, 0);
2024-01-20 10:21:34 +00:00
Auto_File_Writer a(w);
2024-01-28 18:57:24 +00:00
_nes.save_state(a);
2024-01-20 10:21:34 +00:00
}
2024-07-28 14:52:05 +00:00
void deserializeState(jaffarCommon::deserializer::Base &deserializer) override
2024-01-20 10:21:34 +00:00
{
2024-02-09 19:43:42 +00:00
Mem_File_Reader r(deserializer.getInputDataBuffer(), _stateSize);
2024-01-20 10:21:34 +00:00
Auto_File_Reader a(r);
2024-01-28 18:57:24 +00:00
_nes.load_state(a);
2024-01-20 10:21:34 +00:00
}
2024-02-09 19:43:42 +00:00
inline size_t getFullStateSize() const override
{
uint8_t *data = (uint8_t *)malloc(_DUMMY_SIZE);
Mem_Writer w(data, _DUMMY_SIZE);
Auto_File_Writer a(w);
2024-01-28 18:57:24 +00:00
_nes.save_state(a);
free(data);
return w.size();
}
2024-02-09 19:43:42 +00:00
inline size_t getDifferentialStateSize() const override { return getFullStateSize(); }
2024-02-06 16:54:39 +00:00
2024-01-28 18:57:24 +00:00
std::string getCoreName() const override { return "QuickNES"; }
void doSoftReset() override { _nes.reset(false); }
void doHardReset() override { _nes.reset(true); }
void *getInternalEmulatorPointer() override { return &_nes; }
2024-07-28 14:43:09 +00:00
void advanceState(const jaffar::input_t &input) override
{
if (_doRendering == true) _nes.emulate_frame(input.port1, input.port2);
if (_doRendering == false) _nes.emulate_skip_frame(input.port1, input.port2);
}
2024-01-28 18:57:24 +00:00
2024-07-28 14:52:05 +00:00
protected:
bool loadROMImpl(const uint8_t *romData, const size_t romSize) override
2024-01-20 10:21:34 +00:00
{
2024-01-28 18:57:24 +00:00
// Loading rom data
Mem_File_Reader romReader(romData, (int)romSize);
Auto_File_Reader romFile(romReader);
auto result = _nes.load_ines(romFile);
return result == 0;
2024-01-20 10:21:34 +00:00
}
2024-07-28 14:52:05 +00:00
void enableStateBlockImpl(const std::string &block) override {};
void disableStateBlockImpl(const std::string &block) override {};
2024-01-20 10:21:34 +00:00
private:
// Emulator instance
2024-01-28 18:57:24 +00:00
emulator_t _nes;
};