#include "Common.h" #include "Core/Shared/RecordedRomTest.h" #include "Core/Shared/Emulator.h" #include "Core/Shared/EmuSettings.h" extern unique_ptr _emu; shared_ptr _recordedRomTest; extern "C" { DllExport RomTestResult __stdcall RunRecordedTest(char* filename, bool inBackground) { if(inBackground) { unique_ptr emu(new Emulator()); emu->Initialize(); emu->GetSettings()->SetFlag(EmulationFlags::ConsoleMode); shared_ptr romTest(new RecordedRomTest(emu.get(), true)); return romTest->Run(filename); } else { shared_ptr romTest(new RecordedRomTest(_emu.get(), false)); return romTest->Run(filename); } } DllExport uint64_t __stdcall RunTest(char* filename, uint32_t address, MemoryType memType) { unique_ptr emu(new Emulator()); emu->Initialize(); emu->GetSettings()->SetFlag(EmulationFlags::ConsoleMode); emu->GetSettings()->GetGameboyConfig().Model = GameboyModel::Gameboy; emu->GetSettings()->GetGameboyConfig().RamPowerOnState = RamState::AllZeros; emu->LoadRom((VirtualFile)filename, VirtualFile()); emu->GetSettings()->SetFlag(EmulationFlags::MaximumSpeed); while(emu->GetFrameCount() < 500) { std::this_thread::sleep_for(std::chrono::duration(10)); } ConsoleMemoryInfo memInfo = emu->GetMemory(memType); uint8_t* memBuffer = (uint8_t*)memInfo.Memory; uint64_t result = memBuffer[address]; for(int i = 1; i < 8; i++) { if(address + i < memInfo.Size) { result |= ((uint64_t)memBuffer[address + i] << (8*i)); } else { break; } } emu->Stop(false); emu->Release(); return result; } DllExport void __stdcall RomTestRecord(char* filename, bool reset) { _recordedRomTest.reset(new RecordedRomTest(_emu.get(), false)); _recordedRomTest->Record(filename, reset); } DllExport void __stdcall RomTestStop() { if(_recordedRomTest) { _recordedRomTest->Stop(); _recordedRomTest.reset(); } } DllExport bool __stdcall RomTestRecording() { return _recordedRomTest != nullptr; } }