Adding original quicknes for proper benchmark comparison and testing

This commit is contained in:
Sergio Martin 2024-01-14 10:59:20 +01:00
parent c71a339b18
commit 90f249fd16
6 changed files with 128 additions and 18 deletions

3
.gitmodules vendored
View File

@ -0,0 +1,3 @@
[submodule "extern/QuickNES_Core"]
path = extern/QuickNES_Core
url = https://github.com/libretro/QuickNES_Core.git

1
extern/QuickNES_Core vendored Submodule

@ -0,0 +1 @@
Subproject commit 058d66516ed3f1260b69e5b71cd454eb7e9234a3

76
extern/meson.build vendored Normal file
View File

@ -0,0 +1,76 @@
# quickNES Core sources
quickNESCoreSrc = [
'QuickNES_Core/nes_emu/abstract_file.cpp',
'QuickNES_Core/nes_emu/apu_state.cpp',
'QuickNES_Core/nes_emu/Blip_Buffer.cpp',
'QuickNES_Core/nes_emu/Effects_Buffer.cpp',
'QuickNES_Core/nes_emu/Mapper_Fme7.cpp',
'QuickNES_Core/nes_emu/Mapper_Mmc5.cpp',
'QuickNES_Core/nes_emu/Mapper_Namco106.cpp',
'QuickNES_Core/nes_emu/Mapper_Vrc6.cpp',
'QuickNES_Core/nes_emu/misc_mappers.cpp',
'QuickNES_Core/nes_emu/Mapper_15.cpp',
'QuickNES_Core/nes_emu/Mapper_60.cpp',
'QuickNES_Core/nes_emu/Multi_Buffer.cpp',
'QuickNES_Core/nes_emu/Nes_Apu.cpp',
'QuickNES_Core/nes_emu/Nes_Buffer.cpp',
'QuickNES_Core/nes_emu/Nes_Cart.cpp',
'QuickNES_Core/nes_emu/Nes_Core.cpp',
'QuickNES_Core/nes_emu/Nes_Cpu.cpp',
'QuickNES_Core/nes_emu/nes_data.cpp',
'QuickNES_Core/nes_emu/Nes_Effects_Buffer.cpp',
'QuickNES_Core/nes_emu/Nes_Emu.cpp',
'QuickNES_Core/nes_emu/Nes_File.cpp',
'QuickNES_Core/nes_emu/Nes_Fme7_Apu.cpp',
'QuickNES_Core/nes_emu/Nes_Mapper.cpp',
'QuickNES_Core/nes_emu/nes_mappers.cpp',
'QuickNES_Core/nes_emu/Nes_Mmc1.cpp',
'QuickNES_Core/nes_emu/Nes_Mmc3.cpp',
'QuickNES_Core/nes_emu/Mapper_Misc.cpp',
'QuickNES_Core/nes_emu/Mapper_Unrom512.cpp',
'QuickNES_Core/nes_emu/Mapper_Vrc1.cpp',
'QuickNES_Core/nes_emu/Mapper_Vrc3.cpp',
'QuickNES_Core/nes_emu/Mapper_Vrc2_4.cpp',
'QuickNES_Core/nes_emu/Mapper_Vrc7.cpp',
'QuickNES_Core/nes_emu/Nes_Vrc7.cpp',
'QuickNES_Core/nes_emu/emu2413.cpp',
'QuickNES_Core/nes_emu/emu2413_state.cpp',
'QuickNES_Core/nes_emu/Nes_Namco_Apu.cpp',
'QuickNES_Core/nes_emu/Mmc24.cpp',
'QuickNES_Core/nes_emu/Nes_Oscs.cpp',
'QuickNES_Core/nes_emu/Nes_Ppu.cpp',
'QuickNES_Core/nes_emu/Nes_Ppu_Impl.cpp',
'QuickNES_Core/nes_emu/Nes_Ppu_Rendering.cpp',
'QuickNES_Core/nes_emu/Nes_State.cpp',
'QuickNES_Core/nes_emu/nes_util.cpp',
'QuickNES_Core/nes_emu/Nes_Vrc6_Apu.cpp',
'QuickNES_Core/nes_emu/Data_Reader.cpp',
'QuickNES_Core/nes_emu/Mappers.cpp',
'QuickNES_Core/nes_emu/Mapper_74x161x162x32.cpp',
'QuickNES_Core/nes_emu/Mapper_180.cpp',
'QuickNES_Core/nes_emu/Mapper_193.cpp',
'QuickNES_Core/nes_emu/Mapper_240.cpp',
'QuickNES_Core/nes_emu/Mapper_241.cpp',
'QuickNES_Core/nes_emu/Mapper_244.cpp',
'QuickNES_Core/nes_emu/Mapper_246.cpp',
'QuickNES_Core/nes_emu/Mapper_AveNina.cpp',
'QuickNES_Core/nes_emu/Mapper_IremG101.cpp',
'QuickNES_Core/nes_emu/Mapper_IremTamS1.cpp',
'QuickNES_Core/nes_emu/Mapper_JalecoJF11.cpp',
'QuickNES_Core/nes_emu/Mapper_Namco54xx.cpp',
'QuickNES_Core/nes_emu/Mapper_Sunsoft1.cpp',
'QuickNES_Core/nes_emu/Mapper_Sunsoft2.cpp',
'QuickNES_Core/nes_emu/Mapper_TaitoX1005.cpp',
'QuickNES_Core/nes_emu/Mapper_TaitoTC0190.cpp',
'QuickNES_Core/nes_emu/Mapper_Un1rom.cpp',
'QuickNES_Core/nes_emu/nes_ntsc.cpp'
]
# quickNES Core Configuration
quickNESCoreDependency = declare_dependency(
compile_args : [ '-DUSE_ORIGINAL_QUICKNES'],
include_directories : include_directories(['QuickNES_Core/nes_emu']),
sources : [ quickNESCoreSrc ]
)

View File

@ -7,11 +7,12 @@ project('quickerNES','c','cpp',
# Getting page alignment option # Getting page alignment option
pageSize = get_option('CPUFunctionAlignment') pageSize = get_option('CPUFunctionAlignment')
# Loading source dependencies # Loading dependencies
subdir('source') subdir('source')
subdir('extern')
# Common application flags # Common application flags
commonCompileArgs = [ '-Wfatal-errors', '-Wall', '-Werror', '-Wno-multichar' ] commonCompileArgs = [ '-Wfatal-errors', '-Wall', '-Wno-multichar' ]
# Building playback tool # Building playback tool
@ -26,18 +27,27 @@ quickerNESPlayerSrc = [
executable('player', executable('player',
'source/player.cpp', 'source/player.cpp',
cpp_args : [ commonCompileArgs, '-DNCURSES' ], cpp_args : [ commonCompileArgs, '-DNCURSES' ],
dependencies : [ quickerNESApplicationDependency, dependency('sdl2'), dependency('SDL2_image') ], dependencies : [ quickerNESCoreDependency, quickerNESApplicationDependency, dependency('sdl2'), dependency('SDL2_image') ],
include_directories : include_directories(['source']), include_directories : include_directories(['source']),
link_args : [ '-lncurses' ], link_args : [ '-lncurses' ],
sources : quickerNESPlayerSrc sources : quickerNESPlayerSrc
) )
# Building tester tool # Building tester tool for QuickerNES
tester = executable('tester', tester = executable('quickerNESTester',
'source/tester.cpp',
cpp_args : [ commonCompileArgs, '-Werror' ],
dependencies : [ quickerNESCoreDependency, quickerNESApplicationDependency ],
include_directories : include_directories(['../extern/json'])
)
# Building tester tool for the original QuickNES
tester = executable('quickNESTester',
'source/tester.cpp', 'source/tester.cpp',
cpp_args : [ commonCompileArgs ], cpp_args : [ commonCompileArgs ],
dependencies : [ quickerNESApplicationDependency ], dependencies : [ quickNESCoreDependency, quickerNESApplicationDependency ],
include_directories : include_directories(['../extern/json']) include_directories : include_directories(['../extern/json'])
) )

View File

@ -1,11 +1,16 @@
#pragma once #pragma once
#include <core/Nes_Emu.h> #include <Nes_Emu.h>
#include <core/Nes_State.h> #include <Nes_State.h>
#include <string> #include <string>
#include <utils.hpp> #include <utils.hpp>
#include "sha1/sha1.hpp" #include "sha1/sha1.hpp"
#ifdef USE_ORIGINAL_QUICKNES
extern void register_misc_mappers();
extern void register_extra_mappers();
#endif
#define _LOW_MEM_SIZE 0x800 #define _LOW_MEM_SIZE 0x800
#define _HIGH_MEM_SIZE 0x2000 #define _HIGH_MEM_SIZE 0x2000
#define _NAMETABLES_MEM_SIZE 0x1000 #define _NAMETABLES_MEM_SIZE 0x1000
@ -26,6 +31,12 @@ class EmuInstance
// Creating new emulator // Creating new emulator
_nes = new Nes_Emu; _nes = new Nes_Emu;
// If running the original QuickNES, register extra mappers now
#ifdef USE_ORIGINAL_QUICKNES
register_misc_mappers();
register_extra_mappers();
#endif
// Loading ROM // Loading ROM
std::string romData; std::string romData;
bool status = loadStringFromFile(romData, romFilePath.c_str()); bool status = loadStringFromFile(romData, romFilePath.c_str());
@ -42,7 +53,7 @@ class EmuInstance
// Getting state size to use // Getting state size to use
_stateSize = getStateSizeImpl(); _stateSize = getStateSizeImpl();
// Loading state file, if specified // Loading state file, if specified
if (stateFilePath != "") loadStateFile(stateFilePath); if (stateFilePath != "") loadStateFile(stateFilePath);
} }
@ -52,8 +63,8 @@ class EmuInstance
uint8_t* getHighMem() { return _nes->high_mem();}; uint8_t* getHighMem() { return _nes->high_mem();};
const uint8_t* getChrMem() { return _nes->chr_mem();}; const uint8_t* getChrMem() { return _nes->chr_mem();};
size_t getChrMemSize() { return _nes->chr_size();}; size_t getChrMemSize() { return _nes->chr_size();};
uint8_t* getSpriteRAM() { return _nes->spr_mem(); } // uint8_t* getSpriteRAM() { return _nes->spr_mem(); }
uint16_t getSpriteRAMSize() { return _nes->spr_mem_size(); } // uint16_t getSpriteRAMSize() { return _nes->spr_mem_size(); }
const std::string getRomSHA1() const { return _romSHA1String; }; const std::string getRomSHA1() const { return _romSHA1String; };
@ -62,6 +73,7 @@ class EmuInstance
// Loading state data // Loading state data
std::string stateData; std::string stateData;
bool status = loadStringFromFile(stateData, stateFilePath.c_str()); bool status = loadStringFromFile(stateData, stateFilePath.c_str());
if (status == false) EXIT_WITH_ERROR("Could not find/read state file: %s\n", stateFilePath.c_str()); if (status == false) EXIT_WITH_ERROR("Could not find/read state file: %s\n", stateFilePath.c_str());
Mem_File_Reader stateReader(stateData.data(), (int)stateData.size()); Mem_File_Reader stateReader(stateData.data(), (int)stateData.size());
Auto_File_Reader stateFile(stateReader); Auto_File_Reader stateFile(stateReader);
@ -198,11 +210,20 @@ class EmuInstance
inline size_t getStateSizeImpl() const inline size_t getStateSizeImpl() const
{ {
// Using dry writer to just obtain the state size #ifdef USE_ORIGINAL_QUICKNES
Dry_Writer w; #define _DUMMY_SIZE 65536
Auto_File_Writer a(w); uint8_t data[_DUMMY_SIZE];
_nes->save_state(a); Mem_Writer w(data, _DUMMY_SIZE);
return w.size(); Auto_File_Writer a(w);
_nes->save_state(a);
return w.size();
#else
// Using dry writer to just obtain the state size
Dry_Writer w;
Auto_File_Writer a(w);
_nes->save_state(a);
return w.size();
#endif
} }
// Emulator instance // Emulator instance

View File

@ -5,6 +5,5 @@ subdir('core')
quickerNESApplicationDependency = declare_dependency( quickerNESApplicationDependency = declare_dependency(
include_directories : include_directories(['.', '../extern']), include_directories : include_directories(['.', '../extern']),
sources : [ '../extern/metrohash128/metrohash128.cpp' ], sources : [ '../extern/metrohash128/metrohash128.cpp' ]
dependencies : [ quickerNESCoreDependency ]
) )