diff --git a/MiSTer.ini b/MiSTer.ini index 019d0df..cbe33d0 100644 --- a/MiSTer.ini +++ b/MiSTer.ini @@ -361,3 +361,6 @@ controller_unique_mapping=0 ; code if less than osd_lock_time seconds have passed since the OSD was closed. ; set to 0 for manual lock from OSD osd_lock_time=5 + +; use custom main for specific core. This option should be used only inside specific core. +;main=some_binary_file diff --git a/cfg.cpp b/cfg.cpp index 34c4aac..118637d 100644 --- a/cfg.cpp +++ b/cfg.cpp @@ -130,6 +130,7 @@ static const ini_var_t ini_vars[] = { "OSD_LOCK", (void*)(&(cfg.osd_lock)), STRING, 0, sizeof(cfg.osd_lock) - 1 }, { "OSD_LOCK_TIME", (void*)(&(cfg.osd_lock_time)), UINT16, 0, 60 }, { "DEBUG", (void *)(&(cfg.debug)), UINT8, 0, 1 }, + { "MAIN", (void*)(&(cfg.main)), STRING, 0, sizeof(cfg.main) - 1 }, }; static const int nvars = (int)(sizeof(ini_vars) / sizeof(ini_var_t)); @@ -555,6 +556,7 @@ void cfg_parse() cfg.video_saturation = 100; cfg.video_hue = 0; strcpy(cfg.video_gain_offset, "1, 0, 1, 0, 1, 0"); + strcpy(cfg.main, "MiSTer"); has_video_sections = false; using_video_section = false; cfg_error_count = 0; diff --git a/cfg.h b/cfg.h index b7b9656..491ba29 100644 --- a/cfg.h +++ b/cfg.h @@ -98,6 +98,7 @@ typedef struct { char osd_lock[25]; uint16_t osd_lock_time; char debug; + char main[1024]; } cfg_t; extern cfg_t cfg; diff --git a/fpga_io.cpp b/fpga_io.cpp index 51c4811..a313a76 100644 --- a/fpga_io.cpp +++ b/fpga_io.cpp @@ -610,7 +610,7 @@ char *getappname() return dest; } -void app_restart(const char *path, const char *xml) +void app_restart(const char *path, const char *xml, const char *exe) { sync(); fpga_core_reset(1); @@ -620,8 +620,8 @@ void app_restart(const char *path, const char *xml) offload_stop(); - char *appname = getappname(); - printf("restarting the %s\n", appname); + const char *appname = exe ? exe : getappname(); + printf("restarting to %s\n", appname); execl(appname, appname, path, xml, NULL); printf("Something went wrong. Rebooting...\n"); diff --git a/fpga_io.h b/fpga_io.h index 5448e24..cba66c3 100644 --- a/fpga_io.h +++ b/fpga_io.h @@ -36,7 +36,7 @@ int fpga_get_io_version(); int fpga_load_rbf(const char *name, const char *cfg = 0, const char *xml = 0); void reboot(int cold); -void app_restart(const char *path, const char *xml = 0); +void app_restart(const char *path, const char *xml = 0, const char *exe = 0); char *getappname(); void fpga_wait_to_reset(); diff --git a/user_io.cpp b/user_io.cpp index c51a17b..44e62c7 100644 --- a/user_io.cpp +++ b/user_io.cpp @@ -1376,6 +1376,13 @@ void user_io_init(const char *path, const char *xml) sleep(1); } + const char *main = getFullPath(cfg.main); + if (strcasecmp(main, getappname()) && FileExists(main)) + { + printf("Current exec is %s, core requires exec %s\n", getappname(), main); + app_restart(path, xml, main); + } + uint8_t hotswap[4] = {}; ide_reset(hotswap); @@ -3119,7 +3126,7 @@ void user_io_poll() else if (op & 1) { uint32_t buf_n = sizeof(buffer[0]) / blksz; - int psx_blksz = 0; + unsigned int psx_blksz = 0; if (is_psx() && blksz == 2352) { //returns 0 if the mounted disk is not a chd, otherwise returns the chd hunksize in bytes