From 677b5dd8142b2f98b22a26e4d1757355cba4bdc5 Mon Sep 17 00:00:00 2001 From: notaz Date: Sun, 25 Nov 2007 22:43:35 +0000 Subject: [PATCH] PSP sustend/resume and stuff git-svn-id: file:///home/notaz/opt/svn/PicoDrive/platform@306 be3aeb3a-fb24-0410-a615-afba39da0efa --- base_readme.txt | 1 + gp2x/menu.c | 25 +++++++++++++++++++++++-- psp/emu.c | 16 ++++++++++++++++ psp/emu.h | 1 + psp/main.c | 7 ++++++- psp/mp3.c | 14 ++++++++++++++ psp/mp3.h | 2 +- psp/psp.c | 35 ++++++++++++++++++++++++++++++++++- psp/psp.h | 2 ++ 9 files changed, 98 insertions(+), 5 deletions(-) diff --git a/base_readme.txt b/base_readme.txt index ab4174a..17578a5 100644 --- a/base_readme.txt +++ b/base_readme.txt @@ -641,6 +641,7 @@ Changelog * Fixed a sram bug in memhandlers (fixes Shining in the Darkness saves). * PSP: fixed another bug in memhanlers, which crashed the emu for some games (like NBA Jam and NHL 9x). + * Added suspend/resume handling for Sega CD games. * Some other small tweaks I forgot about. 1.35a diff --git a/gp2x/menu.c b/gp2x/menu.c index afac0bb..8b4968c 100644 --- a/gp2x/menu.c +++ b/gp2x/menu.c @@ -133,17 +133,36 @@ static void menu_flip(void) // --------- loading ROM screen ---------- +static int cdload_called = 0; + static void load_progress_cb(int percent) { int ln, len = percent * 320 / 100; unsigned short *dst = (unsigned short *)gp2x_screen + 320*20; if (len > 320) len = 320; - for (ln = 10; ln > 0; ln--, dst += 320) + for (ln = 8; ln > 0; ln--, dst += 320) memset(dst, 0xff, len*2); menu_flip(); } +static void cdload_progress_cb(int percent) +{ + int ln, len = percent * 320 / 100; + unsigned short *dst = (unsigned short *)gp2x_screen + 320*20; + + memset(dst, 0xff, 320*2*8); + + smalltext_out16(1, 3*10, "Processing CD image / MP3s", 0xffff); + smalltext_out16_lim(1, 4*10, romFileName, 0xffff, 80); + dst += 30; + + if (len > 320) len = 320; + for (ln = 8; ln > 0; ln--, dst += 320) + memset(dst, 0xff, len*2); + cdload_called = 1; +} + void menu_romload_prepare(const char *rom_name) { const char *p = rom_name + strlen(rom_name); @@ -157,12 +176,14 @@ void menu_romload_prepare(const char *rom_name) gp2x_memcpy_buffers(3, gp2x_screen, 0, 320*240*2); menu_flip(); PicoCartLoadProgressCB = load_progress_cb; + PicoCDLoadProgressCB = cdload_progress_cb; + cdload_called = 0; } void menu_romload_end(void) { PicoCartLoadProgressCB = NULL; - smalltext_out16(1, 30, "Starting emulation...", 0xffff); + smalltext_out16(1, cdload_called ? 60 : 30, "Starting emulation...", 0xffff); menu_flip(); } diff --git a/psp/emu.c b/psp/emu.c index 9c69d88..a5e6ba7 100644 --- a/psp/emu.c +++ b/psp/emu.c @@ -1075,3 +1075,19 @@ void emu_ResetGame(void) reset_timing = 1; } +void emu_HandleResume(void) +{ + if (!(PicoMCD & 1)) return; + + // reopen files.. + if (Pico_mcd->TOC.Tracks[0].F != NULL) + { + lprintf("emu_HandleResume: reopen %s\n", romFileName); + pm_close(Pico_mcd->TOC.Tracks[0].F); + Pico_mcd->TOC.Tracks[0].F = pm_open(romFileName); + lprintf("reopen %s\n", Pico_mcd->TOC.Tracks[0].F != NULL ? "ok" : "failed"); + } + + mp3_reopen_file(); +} + diff --git a/psp/emu.h b/psp/emu.h index 7a3dbb1..17b20e7 100644 --- a/psp/emu.h +++ b/psp/emu.h @@ -26,6 +26,7 @@ void emu_Deinit(void); void emu_Loop(void); void emu_ResetGame(void); void emu_forcedFrame(void); +void emu_HandleResume(void); void emu_msg_cb(const char *msg); diff --git a/psp/main.c b/psp/main.c index dbe20b7..bf3069c 100644 --- a/psp/main.c +++ b/psp/main.c @@ -66,13 +66,18 @@ int pico_main(void) break; case PGS_Suspending: - psp_wait_suspend(); + while (engineState == PGS_Suspending) + psp_wait_suspend(); break; case PGS_RestartRun: engineState = PGS_Running; case PGS_Running: + if (psp_unhandled_suspend) { + psp_resume_suspend(); + emu_HandleResume(); + } emu_Loop(); #ifdef GPROF goto endloop; diff --git a/psp/mp3.c b/psp/mp3.c index db3e39d..af50611 100644 --- a/psp/mp3.c +++ b/psp/mp3.c @@ -473,3 +473,17 @@ int mp3_get_offset(void) // 0-1023 } +void mp3_reopen_file(void) +{ + if (mp3_fname == NULL) return; + lprintf("mp3_reopen_file(%s)\n", mp3_fname); + + // try closing, just in case + if (mp3_handle >= 0) sceIoClose(mp3_handle); + + mp3_handle = sceIoOpen(mp3_fname, PSP_O_RDONLY, 0777); + if (mp3_handle >= 0) + sceIoLseek32(mp3_handle, mp3_src_pos, PSP_SEEK_SET); + lprintf("mp3_reopen_file %s\n", mp3_handle >= 0 ? "ok" : "failed"); +} + diff --git a/psp/mp3.h b/psp/mp3.h index d95d04b..e2eab6a 100644 --- a/psp/mp3.h +++ b/psp/mp3.h @@ -4,5 +4,5 @@ extern int mp3_last_error; int mp3_init(void); void mp3_deinit(void); - +void mp3_reopen_file(void); diff --git a/psp/psp.c b/psp/psp.c index 6b65c2a..67eb8c6 100644 --- a/psp/psp.c +++ b/psp/psp.c @@ -7,6 +7,7 @@ #include #include #include +#include #include #include @@ -59,6 +60,8 @@ int main() unsigned int __attribute__((aligned(16))) guCmdList[GU_CMDLIST_SIZE]; void *psp_screen = VRAM_FB0; +int psp_unhandled_suspend = 0; + static int current_screen = 0; /* front bufer */ static SceUID main_thread_id = -1; @@ -88,7 +91,10 @@ static int power_callback(int unknown, int pwrflags, void *common) } } else if (pwrflags & PSP_POWER_CB_RESUME_COMPLETE) + { engineState = old_state; + psp_unhandled_suspend = 1; + } //sceDisplayWaitVblankStart(); return 0; @@ -115,6 +121,11 @@ static int callback_thread(SceSize args, void *argp) void psp_init(void) { SceUID thid; + char buff[128], *r; + + /* fw 1.5 sometimes returns 8002032c, although getcwd works */ + r = getcwd(buff, sizeof(buff)); + if (r) sceIoChdir(buff); main_thread_id = sceKernelGetThreadId(); @@ -258,6 +269,25 @@ void psp_wait_suspend(void) sceDisplayWaitVblankStart(); } +void psp_resume_suspend(void) +{ + // for some reason file IO doesn't seem to work + // after resume for some period of time, at least on 1.5 + SceUID fd; + int i; + for (i = 0; i < 30; i++) { + fd = sceIoOpen("dummy.txt", PSP_O_WRONLY|PSP_O_APPEND, 0777); + if (fd != 0x80010013) break; // device not available + sceKernelDelayThread(32 * 1024); + } + if (fd >= 0) sceIoClose(fd); + sceDisplayWaitVblankStart(); + psp_unhandled_suspend = 0; + if (i < 30) + lprintf("io resumed after %i tries\n", i); + else lprintf("io resume failed\n"); +} + /* alt logging */ #define LOG_FILE "log.txt" @@ -281,6 +311,7 @@ void lprintf(const char *fmt, ...) va_end(vl); #else static SceUID logfd = -1; + static int msg_count = 0; char buff[256]; log_entry *le, *le1; @@ -307,7 +338,7 @@ void lprintf(const char *fmt, ...) logfd = sceIoOpen(LOG_FILE, PSP_O_WRONLY|PSP_O_APPEND, 0777); if (logfd < 0) { - logfd = -2; + if (msg_count == 0) logfd = -2; return; } @@ -321,10 +352,12 @@ void lprintf(const char *fmt, ...) le1 = le->next; sceIoWrite(logfd, le->buff, strlen(le->buff)); free(le); + msg_count++; } } sceIoWrite(logfd, buff, strlen(buff)); + msg_count++; // make sure it gets flushed sceIoClose(logfd); diff --git a/psp/psp.h b/psp/psp.h index d94d3ec..7269863 100644 --- a/psp/psp.h +++ b/psp/psp.h @@ -30,6 +30,7 @@ void psp_msleep(int ms); #define GU_CMDLIST_SIZE (16*1024) extern unsigned int guCmdList[GU_CMDLIST_SIZE]; +extern int psp_unhandled_suspend; void *psp_video_get_active_fb(void); void psp_video_switch_to_single(void); @@ -44,6 +45,7 @@ int psp_set_cpu_clock(int clock); char *psp_get_status_line(void); void psp_wait_suspend(void); +void psp_resume_suspend(void); /* shorter btn names */ #define BTN_UP PSP_CTRL_UP -- 2.39.2