From 1df403c52368a3930b67dedabf8c0e1d522f1cc3 Mon Sep 17 00:00:00 2001 From: notaz Date: Tue, 8 Feb 2011 18:21:17 +0200 Subject: [PATCH] add cd swap functionality --- frontend/menu.c | 38 ++++++++++++++++++++++++++++++++++++++ libpcsxcore/cdrom.h | 1 + libpcsxcore/plugins.c | 17 +++++++++++++++++ libpcsxcore/plugins.h | 3 ++- 4 files changed, 58 insertions(+), 1 deletion(-) diff --git a/frontend/menu.c b/frontend/menu.c index 77629059..20d334c1 100644 --- a/frontend/menu.c +++ b/frontend/menu.c @@ -22,6 +22,7 @@ #include "omap.h" #include "common/plat.h" #include "../libpcsxcore/misc.h" +#include "../libpcsxcore/cdrom.h" #include "../libpcsxcore/psemu_plugin_defs.h" #include "revision.h" @@ -36,6 +37,7 @@ typedef enum MA_MAIN_LOAD_STATE, MA_MAIN_RESET_GAME, MA_MAIN_LOAD_ROM, + MA_MAIN_SWAP_CD, MA_MAIN_RUN_BIOS, MA_MAIN_CONTROLS, MA_MAIN_CREDITS, @@ -1335,6 +1337,36 @@ static int romsel_run(void) return 0; } +static int swap_cd_image(void) +{ + char *fname; + + fname = menu_loop_romsel(last_selected_fname, sizeof(last_selected_fname)); + if (fname == NULL) + return -1; + + printf("selected file: %s\n", fname); + + CdromId[0] = '\0'; + CdromLabel[0] = '\0'; + + set_cd_image(fname); + if (ReloadCdromPlugin() < 0) { + me_update_msg("failed to load cdr plugin"); + return -1; + } + if (CDR_open() < 0) { + me_update_msg("failed to open cdr plugin"); + return -1; + } + + SetCdOpenCaseTime(time(NULL) + 2); + LidInterrupt(); + + strcpy(last_selected_fname, rom_fname_reload); + return 0; +} + static int main_menu_handler(int id, int keys) { switch (id) @@ -1359,6 +1391,10 @@ static int main_menu_handler(int id, int keys) if (romsel_run() == 0) return 1; break; + case MA_MAIN_SWAP_CD: + if (swap_cd_image() == 0) + return 1; + break; case MA_MAIN_RUN_BIOS: if (run_bios() == 0) return 1; @@ -1387,6 +1423,7 @@ static menu_entry e_menu_main[] = mee_handler_id("Load State", MA_MAIN_LOAD_STATE, main_menu_handler), mee_handler_id("Reset game", MA_MAIN_RESET_GAME, main_menu_handler), mee_handler_id("Load CD image", MA_MAIN_LOAD_ROM, main_menu_handler), + mee_handler_id("Change CD image", MA_MAIN_SWAP_CD, main_menu_handler), mee_handler_id("Run BIOS", MA_MAIN_RUN_BIOS, main_menu_handler), mee_handler ("Options", menu_loop_options), mee_handler ("Controls", menu_loop_keyconfig), @@ -1409,6 +1446,7 @@ void menu_loop(void) me_enable(e_menu_main, MA_MAIN_SAVE_STATE, ready_to_go && CdromId[0]); me_enable(e_menu_main, MA_MAIN_LOAD_STATE, ready_to_go && CdromId[0]); me_enable(e_menu_main, MA_MAIN_RESET_GAME, ready_to_go); + me_enable(e_menu_main, MA_MAIN_SWAP_CD, ready_to_go); me_enable(e_menu_main, MA_MAIN_RUN_BIOS, bios_sel != 0); in_set_config_int(0, IN_CFG_BLOCKING, 1); diff --git a/libpcsxcore/cdrom.h b/libpcsxcore/cdrom.h index 90523c30..1f70ff36 100644 --- a/libpcsxcore/cdrom.h +++ b/libpcsxcore/cdrom.h @@ -108,6 +108,7 @@ void cdrRepplayInterrupt(); void cdrLidSeekInterrupt(); void cdrPlayInterrupt(); void cdrDmaInterrupt(); +void LidInterrupt(); unsigned char cdrRead0(void); unsigned char cdrRead1(void); unsigned char cdrRead2(void); diff --git a/libpcsxcore/plugins.c b/libpcsxcore/plugins.c index f965e0d0..57e7ef2d 100644 --- a/libpcsxcore/plugins.c +++ b/libpcsxcore/plugins.c @@ -794,6 +794,23 @@ void ReleasePlugins() { #endif } +// for CD swap +int ReloadCdromPlugin() +{ + if (hCDRDriver != NULL || cdrIsoActive()) CDR_shutdown(); + if (hCDRDriver != NULL) SysCloseLibrary(hCDRDriver); hCDRDriver = NULL; + + if (UsingIso()) { + LoadCDRplugin(NULL); + } else { + char Plugin[MAXPATHLEN]; + sprintf(Plugin, "%s/%s", Config.PluginsDir, Config.Cdr); + if (LoadCDRplugin(Plugin) == -1) return -1; + } + + return CDR_init(); +} + void SetIsoFile(const char *filename) { if (filename == NULL) { IsoFile[0] = '\0'; diff --git a/libpcsxcore/plugins.h b/libpcsxcore/plugins.h index 9c24ecef..8084143a 100644 --- a/libpcsxcore/plugins.h +++ b/libpcsxcore/plugins.h @@ -60,6 +60,7 @@ int LoadPlugins(); void ReleasePlugins(); int OpenPlugins(); void ClosePlugins(); +int ReloadCdromPlugin(); typedef unsigned long (CALLBACK* PSEgetLibType)(void); typedef unsigned long (CALLBACK* PSEgetLibVersion)(void); @@ -150,7 +151,7 @@ struct SubQ { unsigned char IndexNumber; unsigned char TrackRelativeAddress[3]; unsigned char Filler; - unsigned char AbsoluteAddress[3]; + unsigned char AbsoluteAddress[3]; unsigned char CRC[2]; char res1[72]; }; -- 2.39.5