summaryrefslogtreecommitdiffstats
path: root/gearboy/platforms/desktop-shared/config.cpp
diff options
context:
space:
mode:
authorLouis Burda <quent.burda@gmail.com>2022-06-02 15:28:40 +0200
committerLouis Burda <quent.burda@gmail.com>2022-06-02 15:28:40 +0200
commit5bc16063c29aa4d3d287ebd163ccdbcbf54c4f9f (patch)
treec131f947a37b3af2d14d41e9eda098bdec2d061c /gearboy/platforms/desktop-shared/config.cpp
parent78a5f810b22f0d8cafa05f638b0cb2e889824859 (diff)
downloadcscg2022-gearboy-master.tar.gz
cscg2022-gearboy-master.zip
Added submodule filesHEADmaster
Diffstat (limited to 'gearboy/platforms/desktop-shared/config.cpp')
-rw-r--r--gearboy/platforms/desktop-shared/config.cpp355
1 files changed, 355 insertions, 0 deletions
diff --git a/gearboy/platforms/desktop-shared/config.cpp b/gearboy/platforms/desktop-shared/config.cpp
new file mode 100644
index 00000000..e9ae50a3
--- /dev/null
+++ b/gearboy/platforms/desktop-shared/config.cpp
@@ -0,0 +1,355 @@
+/*
+ * Gearboy - Nintendo Game Boy Emulator
+ * Copyright (C) 2012 Ignacio Sanchez
+
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see http://www.gnu.org/licenses/
+ *
+ */
+
+#include <SDL.h>
+#include "../../src/gearboy.h"
+#define MINI_CASE_SENSITIVE
+#include "mINI/ini.h"
+
+#define CONFIG_IMPORT
+#include "config.h"
+
+static bool check_portable(void);
+static int read_int(const char* group, const char* key, int default_value);
+static void write_int(const char* group, const char* key, int integer);
+static float read_float(const char* group, const char* key, float default_value);
+static void write_float(const char* group, const char* key, float value);
+static bool read_bool(const char* group, const char* key, bool default_value);
+static void write_bool(const char* group, const char* key, bool boolean);
+static std::string read_string(const char* group, const char* key);
+static void write_string(const char* group, const char* key, std::string value);
+
+void config_init(void)
+{
+ if (check_portable())
+ config_root_path = SDL_GetBasePath();
+ else
+ config_root_path = SDL_GetPrefPath("Geardome", GEARBOY_TITLE);
+
+ strcpy(config_emu_file_path, config_root_path);
+ strcat(config_emu_file_path, "config.ini");
+
+ strcpy(config_imgui_file_path, config_root_path);
+ strcat(config_imgui_file_path, "imgui.ini");
+
+ config_ini_file = new mINI::INIFile(config_emu_file_path);
+}
+
+void config_destroy(void)
+{
+ SafeDelete(config_ini_file)
+ SDL_free(config_root_path);
+}
+
+void config_read(void)
+{
+ if (!config_ini_file->read(config_ini_data))
+ {
+ Log("Unable to load settings from %s", config_emu_file_path);
+ return;
+ }
+
+ Log("Loading settings from %s", config_emu_file_path);
+
+ config_debug.debug = read_bool("Debug", "Debug", false);
+ config_debug.show_audio = read_bool("Debug", "Audio", false);
+ config_debug.show_disassembler = read_bool("Debug", "Disassembler", true);
+ config_debug.show_gameboy = read_bool("Debug", "GameBoy", true);
+ config_debug.show_iomap = read_bool("Debug", "IOMap", false);
+ config_debug.show_memory = read_bool("Debug", "Memory", true);
+ config_debug.show_processor = read_bool("Debug", "Processor", true);
+ config_debug.show_video = read_bool("Debug", "Video", false);
+ config_debug.font_size = read_int("Debug", "FontSize", 0);
+
+ config_emulator.ffwd_speed = read_int("Emulator", "FFWD", 1);
+ config_emulator.save_slot = read_int("Emulator", "SaveSlot", 0);
+ config_emulator.start_paused = read_bool("Emulator", "StartPaused", false);
+ config_emulator.force_dmg = read_bool("Emulator", "ForceDMG", false);
+ config_emulator.force_gba = read_bool("Emulator", "ForceGBA", false);
+ config_emulator.mbc = read_int("Emulator", "MBC", 0);
+ config_emulator.dmg_bootrom = read_bool("Emulator", "DMGBootrom", false);
+ config_emulator.dmg_bootrom_path = read_string("Emulator", "DMGBootromPath");
+ config_emulator.gbc_bootrom = read_bool("Emulator", "GBCBootrom", false);
+ config_emulator.gbc_bootrom_path = read_string("Emulator", "GBCBootromPath");
+ config_emulator.savefiles_dir_option = read_int("Emulator", "SaveFilesDirOption", 0);
+ config_emulator.savefiles_path = read_string("Emulator", "SaveFilesPath");
+ config_emulator.savestates_dir_option = read_int("Emulator", "SaveStatesDirOption", 0);
+ config_emulator.savestates_path = read_string("Emulator", "SaveStatesPath");
+
+ if (config_emulator.savefiles_path.empty())
+ {
+ config_emulator.savefiles_path = config_root_path;
+ }
+ if (config_emulator.savestates_path.empty())
+ {
+ config_emulator.savestates_path = config_root_path;
+ }
+
+ for (int i = 0; i < config_max_recent_roms; i++)
+ {
+ std::string item = "RecentROM" + std::to_string(i);
+ config_emulator.recent_roms[i] = read_string("Emulator", item.c_str());
+ }
+
+ config_video.scale = read_int("Video", "Scale", 0);
+ config_video.ratio = read_int("Video", "AspectRatio", 0);
+ config_video.fps = read_bool("Video", "FPS", false);
+ config_video.bilinear = read_bool("Video", "Bilinear", false);
+ config_video.mix_frames = read_bool("Video", "MixFrames", true);
+ config_video.mix_frames_intensity = read_float("Video", "MixFramesIntensity", 0.50f);
+ config_video.matrix = read_bool("Video", "Matrix", true);
+ config_video.matrix_intensity = read_float("Video", "MatrixIntensity", 0.30f);
+ config_video.palette = read_int("Video", "Palette", 0);
+ for (int i = 0; i < config_max_custom_palettes; i++)
+ {
+ for (int c = 0; c < 4; c++)
+ {
+ char pal_label_r[32];
+ char pal_label_g[32];
+ char pal_label_b[32];
+ sprintf(pal_label_r, "CustomPalette%i%iR", i, c);
+ sprintf(pal_label_g, "CustomPalette%i%iG", i, c);
+ sprintf(pal_label_b, "CustomPalette%i%iB", i, c);
+ config_video.color[i][c].red = read_int("Video", pal_label_r, config_video.color[i][c].red);
+ config_video.color[i][c].green = read_int("Video", pal_label_g, config_video.color[i][c].green);
+ config_video.color[i][c].blue = read_int("Video", pal_label_b, config_video.color[i][c].blue);
+ }
+ }
+ config_video.sync = read_bool("Video", "Sync", true);
+ config_video.color_correction = read_bool("Video", "ColorCorrection", true);
+
+ config_audio.enable = read_bool("Audio", "Enable", true);
+ config_audio.sync = read_bool("Audio", "Sync", true);
+
+ config_input.key_left = (SDL_Scancode)read_int("Input", "KeyLeft", SDL_SCANCODE_LEFT);
+ config_input.key_right = (SDL_Scancode)read_int("Input", "KeyRight", SDL_SCANCODE_RIGHT);
+ config_input.key_up = (SDL_Scancode)read_int("Input", "KeyUp", SDL_SCANCODE_UP);
+ config_input.key_down = (SDL_Scancode)read_int("Input", "KeyDown", SDL_SCANCODE_DOWN);
+ config_input.key_a = (SDL_Scancode)read_int("Input", "KeyA", SDL_SCANCODE_A);
+ config_input.key_b = (SDL_Scancode)read_int("Input", "KeyB", SDL_SCANCODE_S);
+ config_input.key_start = (SDL_Scancode)read_int("Input", "KeyStart", SDL_SCANCODE_RETURN);
+ config_input.key_select = (SDL_Scancode)read_int("Input", "KeySelect", SDL_SCANCODE_SPACE);
+
+ config_input.gamepad = read_bool("Input", "Gamepad", true);
+ config_input.gamepad_directional = read_int("Input", "GamepadDirectional", 0);
+ config_input.gamepad_invert_x_axis = read_bool("Input", "GamepadInvertX", false);
+ config_input.gamepad_invert_y_axis = read_bool("Input", "GamepadInvertY", false);
+ config_input.gamepad_a = read_int("Input", "GamepadA", SDL_CONTROLLER_BUTTON_B);
+ config_input.gamepad_b = read_int("Input", "GamepadB", SDL_CONTROLLER_BUTTON_A);
+ config_input.gamepad_start = read_int("Input", "GamepadStart", SDL_CONTROLLER_BUTTON_START);
+ config_input.gamepad_select = read_int("Input", "GamepadSelect", SDL_CONTROLLER_BUTTON_BACK);
+ config_input.gamepad_x_axis = read_int("Input", "GamepadX", SDL_CONTROLLER_AXIS_LEFTX);
+ config_input.gamepad_y_axis = read_int("Input", "GamepadY", SDL_CONTROLLER_AXIS_LEFTY);
+
+ Log("Settings loaded");
+}
+
+void config_write(void)
+{
+ Log("Saving settings to %s", config_emu_file_path);
+
+ write_bool("Debug", "Debug", config_debug.debug);
+ write_bool("Debug", "Audio", config_debug.show_audio);
+ write_bool("Debug", "Disassembler", config_debug.show_disassembler);
+ write_bool("Debug", "GameBoy", config_debug.show_gameboy);
+ write_bool("Debug", "IOMap", config_debug.show_iomap);
+ write_bool("Debug", "Memory", config_debug.show_memory);
+ write_bool("Debug", "Processor", config_debug.show_processor);
+ write_bool("Debug", "Video", config_debug.show_video);
+ write_int("Debug", "FontSize", config_debug.font_size);
+
+ write_int("Emulator", "FFWD", config_emulator.ffwd_speed);
+ write_int("Emulator", "SaveSlot", config_emulator.save_slot);
+ write_bool("Emulator", "StartPaused", config_emulator.start_paused);
+ write_bool("Emulator", "ForceDMG", config_emulator.force_dmg);
+ write_bool("Emulator", "ForceGBA", config_emulator.force_gba);
+ write_int("Emulator", "MBC", config_emulator.mbc);
+ write_bool("Emulator", "DMGBootrom", config_emulator.dmg_bootrom);
+ write_string("Emulator", "DMGBootromPath", config_emulator.dmg_bootrom_path);
+ write_bool("Emulator", "GBCBootrom", config_emulator.gbc_bootrom);
+ write_string("Emulator", "GBCBootromPath", config_emulator.gbc_bootrom_path);
+ write_int("Emulator", "SaveFilesDirOption", config_emulator.savefiles_dir_option);
+ write_string("Emulator", "SaveFilesPath", config_emulator.savefiles_path);
+ write_int("Emulator", "SaveStatesDirOption", config_emulator.savestates_dir_option);
+ write_string("Emulator", "SaveStatesPath", config_emulator.savestates_path);
+
+ for (int i = 0; i < config_max_recent_roms; i++)
+ {
+ std::string item = "RecentROM" + std::to_string(i);
+ write_string("Emulator", item.c_str(), config_emulator.recent_roms[i]);
+ }
+
+ write_int("Video", "Scale", config_video.scale);
+ write_int("Video", "AspectRatio", config_video.ratio);
+ write_bool("Video", "FPS", config_video.fps);
+ write_bool("Video", "Bilinear", config_video.bilinear);
+ write_bool("Video", "MixFrames", config_video.mix_frames);
+ write_float("Video", "MixFramesIntensity", config_video.mix_frames_intensity);
+ write_bool("Video", "Matrix", config_video.matrix);
+ write_float("Video", "MatrixIntensity", config_video.matrix_intensity);
+ write_int("Video", "Palette", config_video.palette);
+ for (int i = 0; i < config_max_custom_palettes; i++)
+ {
+ for (int c = 0; c < 4; c++)
+ {
+ char pal_label_r[32];
+ char pal_label_g[32];
+ char pal_label_b[32];
+ sprintf(pal_label_r, "CustomPalette%i%iR", i, c);
+ sprintf(pal_label_g, "CustomPalette%i%iG", i, c);
+ sprintf(pal_label_b, "CustomPalette%i%iB", i, c);
+ write_int("Video", pal_label_r, config_video.color[i][c].red);
+ write_int("Video", pal_label_g, config_video.color[i][c].green);
+ write_int("Video", pal_label_b, config_video.color[i][c].blue);
+ }
+ }
+ write_bool("Video", "Sync", config_video.sync);
+ write_bool("Video", "ColorCorrection", config_video.color_correction);
+
+ write_bool("Audio", "Enable", config_audio.enable);
+ write_bool("Audio", "Sync", config_audio.sync);
+
+ write_int("Input", "KeyLeft", config_input.key_left);
+ write_int("Input", "KeyRight", config_input.key_right);
+ write_int("Input", "KeyUp", config_input.key_up);
+ write_int("Input", "KeyDown", config_input.key_down);
+ write_int("Input", "KeyA", config_input.key_a);
+ write_int("Input", "KeyB", config_input.key_b);
+ write_int("Input", "KeyStart", config_input.key_start);
+ write_int("Input", "KeySelect", config_input.key_select);
+
+ write_bool("Input", "Gamepad", config_input.gamepad);
+ write_int("Input", "GamepadDirectional", config_input.gamepad_directional);
+ write_bool("Input", "GamepadInvertX", config_input.gamepad_invert_x_axis);
+ write_bool("Input", "GamepadInvertY", config_input.gamepad_invert_y_axis);
+ write_int("Input", "GamepadA", config_input.gamepad_a);
+ write_int("Input", "GamepadB", config_input.gamepad_b);
+ write_int("Input", "GamepadStart", config_input.gamepad_start);
+ write_int("Input", "GamepadSelect", config_input.gamepad_select);
+ write_int("Input", "GamepadX", config_input.gamepad_x_axis);
+ write_int("Input", "GamepadY", config_input.gamepad_y_axis);
+
+ if (config_ini_file->write(config_ini_data, true))
+ {
+ Log("Settings saved");
+ }
+}
+
+static bool check_portable(void)
+{
+ char* base_path;
+ char portable_file_path[260];
+
+ base_path = SDL_GetBasePath();
+
+ strcpy(portable_file_path, base_path);
+ strcat(portable_file_path, "portable.ini");
+
+ FILE* file = fopen(portable_file_path, "r");
+
+ if (IsValidPointer(file))
+ {
+ fclose(file);
+ return true;
+ }
+
+ return false;
+}
+
+static int read_int(const char* group, const char* key, int default_value)
+{
+ int ret = 0;
+
+ std::string value = config_ini_data[group][key];
+
+ if(value.empty())
+ ret = default_value;
+ else
+ ret = std::stoi(value);
+
+ Log("Load setting: [%s][%s]=%d", group, key, ret);
+ return ret;
+}
+
+static void write_int(const char* group, const char* key, int integer)
+{
+ std::string value = std::to_string(integer);
+ config_ini_data[group][key] = value;
+ Log("Save setting: [%s][%s]=%s", group, key, value.c_str());
+}
+
+static float read_float(const char* group, const char* key, float default_value)
+{
+ float ret = 0.0f;
+
+ std::string value = config_ini_data[group][key];
+
+ if(value.empty())
+ ret = default_value;
+ else
+ ret = strtof(value.c_str(), NULL);
+
+ Log("Load setting: [%s][%s]=%.2f", group, key, ret);
+ return ret;
+}
+
+static void write_float(const char* group, const char* key, float value)
+{
+ std::string value_str = std::to_string(value);
+ config_ini_data[group][key] = value_str;
+ Log("Save setting: [%s][%s]=%s", group, key, value_str.c_str());
+}
+
+static bool read_bool(const char* group, const char* key, bool default_value)
+{
+ bool ret;
+
+ std::string value = config_ini_data[group][key];
+
+ if(value.empty())
+ ret = default_value;
+ else
+ std::istringstream(value) >> std::boolalpha >> ret;
+
+ Log("Load setting: [%s][%s]=%s", group, key, ret ? "true" : "false");
+ return ret;
+}
+
+static void write_bool(const char* group, const char* key, bool boolean)
+{
+ std::stringstream converter;
+ converter << std::boolalpha << boolean;
+ std::string value;
+ value = converter.str();
+ config_ini_data[group][key] = value;
+ Log("Save setting: [%s][%s]=%s", group, key, value.c_str());
+}
+
+static std::string read_string(const char* group, const char* key)
+{
+ std::string ret = config_ini_data[group][key];
+ Log("Load setting: [%s][%s]=%s", group, key, ret.c_str());
+ return ret;
+}
+
+static void write_string(const char* group, const char* key, std::string value)
+{
+ config_ini_data[group][key] = value;
+ Log("Save setting: [%s][%s]=%s", group, key, value.c_str());
+} \ No newline at end of file