summaryrefslogtreecommitdiff
path: root/mknes.c
diff options
context:
space:
mode:
Diffstat (limited to 'mknes.c')
-rw-r--r--mknes.c55
1 files changed, 26 insertions, 29 deletions
diff --git a/mknes.c b/mknes.c
index f8850b0..567d000 100644
--- a/mknes.c
+++ b/mknes.c
@@ -1,4 +1,5 @@
#define GL_SILENCE_DEPRECATION
+#define _GNU_SOURCE
#ifdef _WIN32
#define NOMINMAX
@@ -57,8 +58,8 @@ static void audio_callback(int16_t *data, size_t frames) { }
#ifdef BENCHMARK
// Embed the ROM for benchmarking to eliminate file I/O overhead
// Uncomment the ROM you want to benchmark:
-INCBIN_BYTES(benchmark_rom, "data/Life Force (USA).nes");
-// INCBIN_BYTES(benchmark_rom, "data/0000/Super Mario Bros. (World) (HVC-SM).nes");
+// INCBIN_BYTES(benchmark_rom, "data/Life Force (USA).nes");
+INCBIN_BYTES(benchmark_rom, "data/0000/Super Mario Bros. (World) (HVC-SM).nes");
// INCBIN_BYTES(benchmark_rom, "data/0003/Gradius (USA).zip");
#endif
@@ -177,6 +178,10 @@ static uint32_t frames; // debug information
#include "mknes_ines2.c"
#include "mknes_mapper.c"
+#ifdef BENCHMARK
+#include "mknes_bench.c"
+#endif
+
// struct nes_state nstate;
static void framebuffer_callback(struct mkfw_state *mkfw_window, int32_t width, int32_t height, float aspect_ratio) {
@@ -240,14 +245,28 @@ int main(int argc, char **argv) {
// protect_opcode_lut();
struct nes_state *nstate = aligned_alloc(4096, (sizeof(struct nes_state) + 4095) & ~4095);
- memset(nstate, 0, sizeof(struct nes_state));
- ppu_reset(nstate);
#ifdef BENCHMARK
- // Use embedded ROM for consistent benchmarking without file I/O overhead
- ines2_load_from_memory(nstate, benchmark_rom, INCBIN_SIZE(benchmark_rom));
+ // Run benchmark with configurable parameters
+ uint32_t num_runs = 10;
+ uint32_t frames_per_run = 0x1000;
+
+ // Parse command line arguments
+ for(int i = 1; i < argc; i++) {
+ if(strcmp(argv[i], "-n") == 0 && i + 1 < argc) {
+ num_runs = atoi(argv[i + 1]);
+ i++;
+ } else if(strcmp(argv[i], "-f") == 0 && i + 1 < argc) {
+ frames_per_run = atoi(argv[i + 1]);
+ i++;
+ }
+ }
+ run_benchmark(nstate, num_runs, frames_per_run);
+ return 0;
#else
+ memset(nstate, 0, sizeof(struct nes_state));
+ ppu_reset(nstate);
// ines2_load(nstate, "data/0000/10-Yard Fight (USA, Europe).nes");
// ines2_load(nstate, "data/0000/Balloon Fight (USA).nes");
// ines2_load(nstate, "data/0000/Excitebike (Japan, USA).nes");
@@ -299,32 +318,10 @@ int main(int argc, char **argv) {
// ines2_load(nstate, "data/Blaster Master (USA).zip"); // mapper 1
// ines2_load(nstate, "AccuracyCoin.nes"); // mapper 1
-#endif
mapper_setup(nstate);
cpu_reset(nstate);
-#ifdef BENCHMARK
- for(uint32_t i = 0; i < 0x1000; ++i) {
- while(!nstate->ppu.frame_ready) {
- // PROFILE_NAMED("nes emulator");
- cpu_tick(nstate);
- }
- nstate->ppu.frame_ready = 0;
- frames++;
- }
-
- // for(size_t i = 0; i < 9; ++i) {
- // printf("count %d: %lld\n", i, sprite_counts[i]);
- // }
-
- // for(size_t i = 0; i < 256; ++i) {
- // printf("instr %2.2x: %lld\n", i, instr_count[i]);
- // }
-
- return 0;
-#else
-
// WINDOW SETUP
struct mkfw_state *window = mkfw_init(WINDOW_WIDTH, WINDOW_HEIGHT);
mkfw_set_window_title(window, "mknes");
@@ -408,7 +405,7 @@ int main(int argc, char **argv) {
// free_nes_state(&nstate);
timer_shutdown();
mkfw_cleanup(window);
-#endif
return 0;
+#endif
}