aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--frontend/menu.c38
-rw-r--r--libpcsxcore/cdrom.h1
-rw-r--r--libpcsxcore/plugins.c17
-rw-r--r--libpcsxcore/plugins.h3
4 files changed, 58 insertions, 1 deletions
diff --git a/frontend/menu.c b/frontend/menu.c
index 7762905..20d334c 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 90523c3..1f70ff3 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 f965e0d..57e7ef2 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 9c24ece..8084143 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];
};