diff --git a/settings.c b/settings.c
new file mode 100644
index 0000000..a5246c3
--- /dev/null
+++ b/settings.c
@@ -0,0 +1,79 @@
+/*
+ This file is part of MiST-firmware
+
+ MiST-firmware 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
+ (at your option) any later version.
+
+ MiST-firmware 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 .
+*/
+
+#include
+#include "ini_parser.h"
+#include "settings.h"
+#include "user_io.h"
+#include "usb/joymapping.h"
+
+extern char s[FF_LFN_BUF + 1];
+
+static uint64_t status;
+
+// core ini sections
+const ini_section_t core_ini_sections[] = {
+ {1, "CFG"}
+};
+
+// core ini vars
+const ini_var_t core_ini_global_vars[] = {
+ {"JOYSTICK_REMAP", (void*)virtual_joystick_remap, CUSTOM_HANDLER, 0, 0, 1}
+};
+
+const ini_var_t core_ini_local_vars[] = {
+ {"STATUS", (void*)(&status), UINT64, 0, 0xFFFFFFFFFFFFFFFF, 1},
+ {"JOYSTICK_REMAP", (void*)virtual_joystick_remap, CUSTOM_HANDLER, 0, 0, 1}
+};
+
+static char settings_setup(ini_cfg_t *ini, char global) {
+ if(global) {
+ ini->filename = "/MISTCFG.INI";
+ } else {
+ if(!user_io_create_config_name(s, "CFG", CONFIG_ROOT)) {
+ ini->filename = s;
+ } else {
+ return 0;
+ }
+ }
+ ini->sections = core_ini_sections;
+ ini->vars = global ? core_ini_global_vars : core_ini_local_vars;
+ ini->nsections = (int)(sizeof(core_ini_sections) / sizeof(ini_section_t));
+ ini->nvars = global ? (int)(sizeof(core_ini_global_vars) / sizeof(ini_var_t)) :
+ (int)(sizeof(core_ini_local_vars) / sizeof(ini_var_t));
+ return 1;
+}
+
+unsigned char settings_load(char global)
+{
+ ini_cfg_t core_ini_cfg;
+ if (!settings_setup(&core_ini_cfg, global))
+ return 0;
+
+ ini_parse(&core_ini_cfg, 0, global ? 1 : 2);
+ if (!global) user_io_8bit_set_status(status, ~1);
+};
+
+unsigned char settings_save(char global)
+{
+ ini_cfg_t core_ini_cfg;
+ if (!settings_setup(&core_ini_cfg, global))
+ return 0;
+ if (!global) status = user_io_8bit_set_status(0,0);
+ virtual_joystick_remap_init(true);
+ ini_save(&core_ini_cfg, global ? 1 : 2);
+}
diff --git a/settings.h b/settings.h
new file mode 100644
index 0000000..daeb777
--- /dev/null
+++ b/settings.h
@@ -0,0 +1,19 @@
+/*
+ This file is part of MiST-firmware
+
+ MiST-firmware 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
+ (at your option) any later version.
+
+ MiST-firmware 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 .
+*/
+
+unsigned char settings_load(char global);
+unsigned char settings_save(char global);