2023-09-21 23:53:14 -04:00
|
|
|
/*
|
|
|
|
* =====================================================================================
|
|
|
|
*
|
|
|
|
* Filename: main.c
|
|
|
|
*
|
|
|
|
* Description: Emulator main loop
|
|
|
|
*
|
|
|
|
* Version: 1.0
|
|
|
|
* Created: 2023-09-21 09:50:34 PM
|
|
|
|
* Revision: none
|
|
|
|
* Compiler: gcc
|
|
|
|
*
|
|
|
|
* Author: William Nolin,
|
|
|
|
* Organization:
|
|
|
|
*
|
|
|
|
* =====================================================================================
|
|
|
|
*/
|
2024-08-20 20:43:42 -04:00
|
|
|
#include <errno.h>
|
2023-09-21 23:53:14 -04:00
|
|
|
#include <stdlib.h>
|
2024-08-20 20:43:42 -04:00
|
|
|
#include <string.h>
|
|
|
|
#include <unistd.h>
|
|
|
|
#include <sys/stat.h>
|
2024-04-30 12:28:43 -04:00
|
|
|
#include "log.h"
|
2023-09-21 23:53:14 -04:00
|
|
|
|
2023-12-03 00:27:07 -05:00
|
|
|
#include "include/rom.h"
|
2024-01-06 14:27:09 -05:00
|
|
|
#include "include/system.h"
|
2024-05-17 00:33:37 -04:00
|
|
|
#include "gui.h"
|
2023-09-21 23:53:14 -04:00
|
|
|
|
2024-08-20 20:43:42 -04:00
|
|
|
struct log_files {
|
|
|
|
FILE *info;
|
|
|
|
FILE *debug;
|
|
|
|
};
|
|
|
|
struct log_files log_files;
|
|
|
|
|
|
|
|
FILE *add_log_file(char *name, int level) {
|
|
|
|
char *full_name = malloc((5 + strlen(name)) * sizeof(char));
|
|
|
|
strcpy(full_name, "logs/");
|
|
|
|
strcat(full_name, name);
|
|
|
|
|
|
|
|
FILE *log_file = fopen(full_name, "w");
|
|
|
|
if (!log_file) {
|
|
|
|
perror("fopen");
|
|
|
|
int fopen_err = errno;
|
|
|
|
log_error("Failed to open log file '%s': %s", full_name, strerror(fopen_err));
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
log_add_fp(log_file, level);
|
|
|
|
return log_file;
|
|
|
|
}
|
|
|
|
|
|
|
|
void init_logging() {
|
2024-09-01 15:54:41 -04:00
|
|
|
log_set_level(LOG_INFO);
|
2024-08-20 20:43:42 -04:00
|
|
|
|
|
|
|
// Print current working directory
|
|
|
|
char cwd[256];
|
|
|
|
if (getcwd(cwd, 256) == NULL) {
|
|
|
|
int getcwd_error = errno;
|
|
|
|
log_error("Failed to read current working directory: %s", strerror(getcwd_error));
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
log_info("Using working directory '%s'", cwd);
|
|
|
|
|
|
|
|
// Make sure log directory exists
|
|
|
|
char *folder_name = "logs/";
|
|
|
|
struct stat sb;
|
|
|
|
if (stat(folder_name, &sb) != 0 || !S_ISDIR(sb.st_mode)) {
|
|
|
|
if (mkdir(folder_name, 0755) == 0) {
|
|
|
|
log_debug("Created logs folder");
|
|
|
|
} else {
|
|
|
|
log_error("Failed to create logs folder: %s", strerror(errno));
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
log_files.info = add_log_file("nes.log", LOG_INFO);
|
|
|
|
#if DEBUG
|
|
|
|
log_files.debug = add_log_file("nes_debug.log", LOG_DEBUG);
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
void close_logging() {
|
|
|
|
fclose(log_files.info);
|
2024-09-01 15:54:41 -04:00
|
|
|
|
|
|
|
#if DEBUG
|
2024-08-20 20:43:42 -04:00
|
|
|
fclose(log_files.debug);
|
2024-09-01 15:54:41 -04:00
|
|
|
#endif
|
2024-08-20 20:43:42 -04:00
|
|
|
}
|
|
|
|
|
2024-01-07 16:20:37 -05:00
|
|
|
int main() {
|
2024-08-06 17:30:57 -04:00
|
|
|
char *rom_path = "./test_roms/dk_japan.nes";
|
|
|
|
// char *rom_path = "./test_roms/smb.nes";
|
2024-08-20 20:43:42 -04:00
|
|
|
|
|
|
|
init_logging();
|
2023-12-23 16:35:23 -05:00
|
|
|
|
2024-06-16 19:22:40 -04:00
|
|
|
if (!gui_init()) {
|
|
|
|
return EXIT_FAILURE;
|
|
|
|
}
|
|
|
|
|
2024-05-17 00:33:37 -04:00
|
|
|
system_init();
|
2024-01-07 16:20:37 -05:00
|
|
|
|
2024-05-06 20:23:44 -04:00
|
|
|
if (!rom_load(rom_path)) {
|
|
|
|
system_uninit();
|
2024-10-03 19:24:03 -04:00
|
|
|
gui_free();
|
2024-01-06 14:27:09 -05:00
|
|
|
return EXIT_FAILURE;
|
|
|
|
}
|
2023-09-21 23:53:14 -04:00
|
|
|
|
2024-05-06 20:23:44 -04:00
|
|
|
system_start();
|
2024-05-17 00:33:37 -04:00
|
|
|
|
2024-10-03 19:24:03 -04:00
|
|
|
while (true) {
|
2024-05-17 00:33:37 -04:00
|
|
|
if (gui_input() < 0) {
|
2024-10-03 19:24:03 -04:00
|
|
|
// The main window has been closed, stop the emulation
|
|
|
|
break;
|
2024-05-17 00:33:37 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
system_next_frame();
|
|
|
|
gui_render();
|
2024-06-16 19:22:40 -04:00
|
|
|
|
2024-10-03 19:24:03 -04:00
|
|
|
// Delay the next frame to lock the emulation to 60hz
|
2024-05-17 13:16:21 -04:00
|
|
|
gui_delay();
|
2024-05-17 00:33:37 -04:00
|
|
|
}
|
2024-01-07 16:20:37 -05:00
|
|
|
|
2024-05-06 20:23:44 -04:00
|
|
|
system_uninit();
|
2024-05-23 22:44:52 -04:00
|
|
|
rom_unload();
|
2024-10-03 19:24:03 -04:00
|
|
|
gui_free();
|
2024-05-17 00:33:37 -04:00
|
|
|
|
2024-08-20 20:43:42 -04:00
|
|
|
close_logging();
|
|
|
|
|
2024-01-16 15:46:22 -05:00
|
|
|
return EXIT_SUCCESS;
|
2024-01-06 14:27:09 -05:00
|
|
|
}
|