Adding original quicknes for proper benchmark comparison and testing
This commit is contained in:
parent
c71a339b18
commit
90f249fd16
|
@ -0,0 +1,3 @@
|
||||||
|
[submodule "extern/QuickNES_Core"]
|
||||||
|
path = extern/QuickNES_Core
|
||||||
|
url = https://github.com/libretro/QuickNES_Core.git
|
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit 058d66516ed3f1260b69e5b71cd454eb7e9234a3
|
|
@ -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 ]
|
||||||
|
)
|
22
meson.build
22
meson.build
|
@ -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'])
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 ]
|
|
||||||
)
|
)
|
Loading…
Reference in New Issue