From: notaz Date: Sun, 9 Sep 2012 21:55:40 +0000 (+0300) Subject: use picofe menu, move generic code out of gp2x/ X-Git-Tag: r1~11 X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4a2a617ac879a95babe3b8a822188b71e9769ba4;p=fceu.git use picofe menu, move generic code out of gp2x/ --- diff --git a/.gitignore b/.gitignore index 0558aee..f683457 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ cscope.out tags *.swp +drivers/common/revision.h diff --git a/Makefile.sdl b/Makefile.sdl index e9a2ecf..85da117 100644 --- a/Makefile.sdl +++ b/Makefile.sdl @@ -24,19 +24,16 @@ endif all: fceu -gpfce.gpe: fceu - cp fceu $@ - include zlib/Makefile -OBJDRIVER = drivers/gp2x_test/minimal.o drivers/gp2x_test/throttle.o \ - ${G}gp2x.o ${G}main.o ${G}gp2x-sound.o ${G}gp2x-video.o \ - ${G}usbjoy.o ${G}menu.o \ - ${L}fonts.o ${L}readpng.o ${L}linux/plat.o \ +OBJDRIVER = drivers/sdl/sdl.o drivers/sdl/minimal.o drivers/sdl/throttle.o \ + ${G}gp2x-sound.o ${G}gp2x-video.o ${G}usbjoy.o \ + ${L}fonts.o ${L}readpng.o ${L}input.o ${L}in_sdl.o ${L}linux/plat.o \ + ${C}main.o ${C}menu.o \ ${C}cheat.o ${C}config.o ${C}args.o ${C}vidblit.o ${C}unix-netplay.o \ ${UNZIPOBJS} \ ppu.o movie.o fceu098.o ppu098.o -LDRIVER += -lm -lz -lpng `sdl-config --libs` +LDRIVER += -lm -lz -lpng `sdl-config --libs` OBJDRIVER += x6502.o @@ -44,21 +41,16 @@ x6502.o: x6502.c x6502.h ops.h fce.h sound.h dprintf.h include Makefile.base +${C}menu.o: ${C}revision.h ${B}main.o: ${B}main.c ${B}main.h ${B}usage.h ${B}input.c ${B}gp2x.o: ${B}gp2x.c ${B}gp2x.h ${B}rev.h ${B}throttle.o: ${B}throttle.c ${B}main.h ${B}throttle.h ppu.o: ppu.c ppu.h -${B}rev.h: FORCE - @if [ -f $@ ]; then prevrev=`cat $@`; else prevrev="00"; fi; \ - if [ "`which svn`" != "" ]; then \ - rev=`svn update|tail -n 1|sed 's/.*\ \(.*\)\./\1/g'|sed "s/'//g"`; \ - fi; \ - if [ "$$rev" = "" ]; then rev="0"; fi; \ - if [ "$$rev" != "$$prevrev" ]; then \ - echo "$$rev" > $@; \ - fi - +${C}revision.h: FORCE + @(git describe || echo) | sed -e 's/.*/#define REV "\0"/' > $@_ + @diff -q $@_ $@ > /dev/null 2>&1 || cp $@_ $@ + @rm $@_ .PHONY: FORCE include Makefile.common diff --git a/drivers/gp2x/dface.h b/drivers/common/dface.h similarity index 95% rename from drivers/gp2x/dface.h rename to drivers/common/dface.h index cb66b5c..b22d07d 100644 --- a/drivers/gp2x/dface.h +++ b/drivers/common/dface.h @@ -8,6 +8,7 @@ void GetBaseDirectory(char *BaseDirectory); int InitSound(void); void WriteSound(int16 *Buffer, int Count); +void StartSound(void); void KillSound(void); void SilenceSound(int s); diff --git a/drivers/gp2x/input.c b/drivers/common/input.c similarity index 71% rename from drivers/gp2x/input.c rename to drivers/common/input.c index f554f35..e4d0466 100644 --- a/drivers/gp2x/input.c +++ b/drivers/common/input.c @@ -20,7 +20,8 @@ #include "../../input.h" #include "../../svga.h" #include "../../video.h" -#include "usbjoy.h" +#include "../libpicofe/input.h" +#include "input.h" /* UsrInputType[] is user-specified. InputType[] is current (game loading can override user settings) @@ -55,8 +56,9 @@ static void setsoundvol(int soundvolume) prev_snd_on = !!soundvolume; } + platform_set_volume(soundvolume); + // draw on screen :D - gp2x_sound_volume(soundvolume, soundvolume); int meterval=soundvolume/5; for (soundvolIndex = 0; soundvolIndex < 20; soundvolIndex++) { @@ -80,51 +82,78 @@ static void do_emu_acts(uint32 acts) acts &= acts ^ prev_emu_acts; prev_emu_acts = actsc; - if (acts & (3 << 30)) + if (acts & (EACT_SAVE_STATE | EACT_LOAD_STATE)) { - unsigned long keys; int do_it = 1; - if (acts & (1 << 30)) + int need_confirm = 0; + const char *nm; + char tmp[64]; + int keys, len; + + if (acts & EACT_LOAD_STATE) { if (Settings.sstate_confirm & 2) { - FCEU_DispMessage("LOAD STATE? (Y=yes, X=no)"); - FCEU_PutImage(); - FCEUD_Update(XBuf+8,NULL,0); - while( !((keys = gp2x_joystick_read(1)) & (GP2X_X|GP2X_Y)) ) usleep(50*1024); - if (keys & GP2X_X) do_it = 0; - FCEU_CancelDispMessage(); + need_confirm = 1; } - if (do_it) FCEUI_LoadState(); } else { if (Settings.sstate_confirm & 1) { char *fname = FCEU_MakeFName(FCEUMKF_STATE,CurrentState,0); - FILE *st=fopen(fname,"rb"); + FILE *st = fopen(fname, "rb"); free(fname); if (st) { fclose(st); - FCEU_DispMessage("OVERWRITE SAVE? (Y=yes, X=no)"); - FCEU_PutImage(); - FCEUD_Update(XBuf+8,NULL,0); - while( !((keys = gp2x_joystick_read(1)) & (GP2X_X|GP2X_Y)) ) usleep(50*1024); - if (keys & GP2X_X) do_it = 0; - FCEU_CancelDispMessage(); + need_confirm = 1; } } - if (do_it) FCEUI_SaveState(); } + + if (need_confirm) { + strcpy(tmp, (acts & EACT_LOAD_STATE) ? + "LOAD STATE?" : "OVERWRITE SAVE?"); + len = strlen(tmp); + nm = in_get_key_name(-1, -PBTN_MA3); + snprintf(tmp + len, sizeof(tmp) - len, "(%s=yes, ", nm); + len = strlen(tmp); + nm = in_get_key_name(-1, -PBTN_MBACK); + snprintf(tmp + len, sizeof(tmp) - len, "%s=no)", nm); + + FCEU_DispMessage(tmp); + FCEU_PutImage(); + FCEUD_Update(XBuf+8, NULL, 0); + + in_set_config_int(0, IN_CFG_BLOCKING, 1); + while (in_menu_wait_any(NULL, 50) & (PBTN_MA3|PBTN_MBACK)) + ; + while ( !((keys = in_menu_wait_any(NULL, 50)) & (PBTN_MA3|PBTN_MBACK)) ) + ; + if (keys & PBTN_MBACK) + do_it = 0; + while (in_menu_wait_any(NULL, 50) & (PBTN_MA3|PBTN_MBACK)) + ; + in_set_config_int(0, IN_CFG_BLOCKING, 0); + + FCEU_CancelDispMessage(); + } + if (do_it) { + if (acts & EACT_LOAD_STATE) + FCEUI_LoadState(); + else + FCEUI_SaveState(); + } + RefreshThrottleFPS(); } - else if (acts & (3 << 28)) // state slot next/prev + else if (acts & (EACT_NEXT_SLOT|EACT_PREV_SLOT)) { FILE *st; char *fname; - CurrentState += (acts & (1 << 29)) ? 1 : -1; + CurrentState += (acts & EACT_NEXT_SLOT) ? 1 : -1; if (CurrentState > 9) CurrentState = 0; if (CurrentState < 0) CurrentState = 9; @@ -134,17 +163,17 @@ static void do_emu_acts(uint32 acts) FCEU_DispMessage("[%s] State Slot %i", st ? "USED" : "FREE", CurrentState); if (st) fclose(st); } - else if (acts & (1 << 27)) // FDS insert/eject + else if (acts & EACT_FDS_INSERT) { if(FCEUGameInfo.type == GIT_FDS) FCEU_DoSimpleCommand(FCEUNPCMD_FDSINSERT); } - else if (acts & (1 << 26)) // FDS select + else if (acts & EACT_FDS_SELECT) { if(FCEUGameInfo.type == GIT_FDS) FCEU_DoSimpleCommand(FCEUNPCMD_FDSSELECT); } - else if (acts & (1 << 25)) // VS Unisystem insert coin + else if (acts & EACT_INSERT_COIN) { if(FCEUGameInfo.type == GIT_VSUNI) FCEU_DoSimpleCommand(FCEUNPCMD_VSUNICOIN); @@ -152,32 +181,31 @@ static void do_emu_acts(uint32 acts) } -#define down(b) (keys & GP2X_##b) -static void do_fake_mouse(unsigned long keys) +static void do_fake_mouse(uint32 acts) { static int x=256/2, y=240/2; int speed = 3; - if (down(A)) speed = 1; - if (down(Y)) speed = 5; + if (acts & NKEY_B_TURBO) speed = 1; + if (acts & NKEY_A_TURBO) speed = 5; - if (down(LEFT)) + if (acts & NKEY_LEFT) { x -= speed; if (x < 0) x = 0; } - else if (down(RIGHT)) + else if (acts & NKEY_RIGHT) { x += speed; if (x > 255) x = 255; } - if (down(UP)) + if (acts & NKEY_UP) { y -= speed; if (y < 0) y = 0; } - else if (down(DOWN)) + else if (acts & NKEY_DOWN) { y += speed; if (y > 239) y = 239; @@ -186,8 +214,8 @@ static void do_fake_mouse(unsigned long keys) MouseData[0] = x; MouseData[1] = y; MouseData[2] = 0; - if (down(B)) MouseData[2] |= 1; - if (down(X)) MouseData[2] |= 2; + if (acts & NKEY_A) MouseData[2] |= 1; + if (acts & NKEY_B) MouseData[2] |= 2; } @@ -195,16 +223,20 @@ static void FCEUD_UpdateInput(void) { static int volpushed_frames = 0; static int turbo_rate_cnt_a[2] = {0,0}, turbo_rate_cnt_b[2] = {0,0}; - unsigned long keys = gp2x_joystick_read(0); - uint32 all_acts[2] = {0,0}; - int i; + uint32 all_acts[2], emu_acts; + int actions[IN_BINDTYPE_COUNT] = { 0, }; - if ((down(VOL_DOWN) && down(VOL_UP)) || (keys & (GP2X_L|GP2X_START)) == (GP2X_L|GP2X_START)) + in_update(actions); + all_acts[0] = actions[IN_BINDTYPE_PLAYER12]; + all_acts[1] = actions[IN_BINDTYPE_PLAYER12] >> 16; + emu_acts = actions[IN_BINDTYPE_EMU]; + + if (emu_acts & EACT_ENTER_MENU) { Exit = 1; return; } - else if (down(VOL_UP)) + else if (emu_acts & EACT_VOLUME_UP) { /* wait for at least 10 updates, because user may be just trying to enter menu */ if (volpushed_frames++ > 10 && (volpushed_frames&1)) { @@ -214,7 +246,7 @@ static void FCEUD_UpdateInput(void) setsoundvol(soundvol); } } - else if (down(VOL_DOWN)) + else if (emu_acts & EACT_VOLUME_DOWN) { if (volpushed_frames++ > 10 && (volpushed_frames&1)) { soundvol-=1; @@ -233,74 +265,32 @@ static void FCEUD_UpdateInput(void) if (InputType[1] != SI_GAMEPAD) { /* try to feed fake mouse there */ - do_fake_mouse(keys); - } - - for (i = 0; i < 32; i++) - { - if (keys & (1 << i)) - { - uint32 acts, u = 32; - acts = Settings.KeyBinds[i]; - if (!acts) continue; - if ((1 << i) & combo_keys) - { - // combo key detected, try to find if other is pressed - for (u = i+1; u < 32; u++) - { - if ((keys & (1 << u)) && (Settings.KeyBinds[u] & acts)) - { - keys &= ~(1 << u); - acts &= Settings.KeyBinds[u]; - break; - } - } - } - if (u != 32) acts &= combo_acts; // other combo key pressed - else acts &= ~combo_acts; - all_acts[(acts>>16)&1] |= acts; - } - } - - // add joy inputs - if (num_of_joys > 0) - { - int joy; - gp2x_usbjoy_update(); - for (joy = 0; joy < num_of_joys; joy++) { - int keys = gp2x_usbjoy_check2(joy); - for (i = 0; i < 32; i++) { - if (keys & (1 << i)) { - int acts = Settings.JoyBinds[joy][i]; - all_acts[(acts>>16)&1] |= acts; - } - } - } + do_fake_mouse(all_acts[0]); } // player 1 JSreturn |= all_acts[0] & 0xff; - if (all_acts[0] & 0x100) { // A turbo + if (all_acts[0] & NKEY_A_TURBO) { turbo_rate_cnt_a[0] += Settings.turbo_rate_add; JSreturn |= (turbo_rate_cnt_a[0] >> 24) & 1; } - if (all_acts[0] & 0x200) { // B turbo + if (all_acts[0] & NKEY_B_TURBO) { turbo_rate_cnt_b[0] += Settings.turbo_rate_add; JSreturn |= (turbo_rate_cnt_b[0] >> 23) & 2; } // player 2 JSreturn |= (all_acts[1] & 0xff) << 16; - if (all_acts[1] & 0x100) { // A turbo + if (all_acts[1] & NKEY_A_TURBO) { turbo_rate_cnt_a[1] += Settings.turbo_rate_add; JSreturn |= (turbo_rate_cnt_a[1] >> 8) & 0x10000; } - if (all_acts[1] & 0x200) { // B turbo + if (all_acts[1] & NKEY_B_TURBO) { turbo_rate_cnt_b[1] += Settings.turbo_rate_add; JSreturn |= (turbo_rate_cnt_b[1] >> 7) & 0x20000; } - do_emu_acts(all_acts[0]|all_acts[1]); + do_emu_acts(emu_acts); } diff --git a/drivers/common/input.h b/drivers/common/input.h new file mode 100644 index 0000000..6bec074 --- /dev/null +++ b/drivers/common/input.h @@ -0,0 +1,52 @@ +enum nkeys_bits { + NKEYB_A = 0, + NKEYB_B, + NKEYB_SELECT, + NKEYB_START, + NKEYB_UP, + NKEYB_DOWN, + NKEYB_LEFT, + NKEYB_RIGHT, + NKEYB_A_TURBO, + NKEYB_B_TURBO, +}; + +enum nkeys { + NKEY_A = 1 << NKEYB_A, + NKEY_B = 1 << NKEYB_B, + NKEY_SELECT = 1 << NKEYB_SELECT, + NKEY_START = 1 << NKEYB_START, + NKEY_UP = 1 << NKEYB_UP, + NKEY_DOWN = 1 << NKEYB_DOWN, + NKEY_LEFT = 1 << NKEYB_LEFT, + NKEY_RIGHT = 1 << NKEYB_RIGHT, + NKEY_A_TURBO = 1 << NKEYB_A_TURBO, + NKEY_B_TURBO = 1 << NKEYB_B_TURBO, +}; + +enum emu_actions_bits { + EACTB_SAVE_STATE = 31, + EACTB_LOAD_STATE = 30, + EACTB_NEXT_SLOT = 29, + EACTB_PREV_SLOT = 28, + EACTB_FDS_INSERT = 27, + EACTB_FDS_SELECT = 26, + EACTB_INSERT_COIN = 25, + EACTB_ENTER_MENU = 24, + EACTB_VOLUME_UP = 23, + EACTB_VOLUME_DOWN = 22, +}; + +enum emu_actions { + EACT_SAVE_STATE = 1 << EACTB_SAVE_STATE, + EACT_LOAD_STATE = 1 << EACTB_LOAD_STATE, + EACT_NEXT_SLOT = 1 << EACTB_NEXT_SLOT, + EACT_PREV_SLOT = 1 << EACTB_PREV_SLOT, + EACT_FDS_INSERT = 1 << EACTB_FDS_INSERT, + EACT_FDS_SELECT = 1 << EACTB_FDS_SELECT, + EACT_INSERT_COIN = 1 << EACTB_INSERT_COIN, + EACT_ENTER_MENU = 1 << EACTB_ENTER_MENU, + EACT_VOLUME_UP = 1 << EACTB_VOLUME_UP, + EACT_VOLUME_DOWN = 1 << EACTB_VOLUME_DOWN, +}; + diff --git a/drivers/gp2x/main.c b/drivers/common/main.c similarity index 86% rename from drivers/gp2x/main.c rename to drivers/common/main.c index 091fc83..616b7c6 100644 --- a/drivers/gp2x/main.c +++ b/drivers/common/main.c @@ -27,27 +27,44 @@ #include #include -#include "../common/main.h" -#include "minimal.h" +#include "main.h" #include "throttle.h" +#include "config.h" +#include "args.h" +#include "unixdsp.h" +#include "cheat.h" +#include "dface.h" +#include "platform.h" #include "menu.h" -#include "gp2x.h" - -#include "../common/config.h" -#include "../common/args.h" -#include "../common/unixdsp.h" -#include "../common/cheat.h" +#include "settings.h" #include "../../fce.h" #include "../../cart.h" -#include "dface.h" +// these are now here to try to make compatible configs +// between different versions of the emu +DSETTINGS Settings; +CFGSTRUCT DriverConfig[]={ + AC(Settings.turbo_rate_add), + AC(Settings.sound_rate), + AC(Settings.showfps), + AC(Settings.scaling), + AC(Settings.frameskip), + AC(Settings.sstate_confirm), + AC(Settings.region_force), + AC(Settings.cpuclock), + AC(Settings.mmuhack), + AC(Settings.ramtimings), + AC(Settings.gamma), + AC(Settings.perfect_vsync), + AC(Settings.accurate_mode), + ENDCFGSTRUCT +}; void CleanSurface(void); // internals -extern char lastLoadedGameName[2048]; extern uint8 Exit; // exit emu loop flag extern int FSkip; void CloseGame(void); @@ -260,6 +277,9 @@ static int DoArgs(int argc, char *argv[]) static char *inputa[2]={0,0}; static char *fcexp=0; static int docheckie[4]; +#ifdef NETWORK + static int docheckie2[2]={0,0}; +#endif static ARGPSTRUCT FCEUArgs[]={ {"-soundvol",0,&soundvol,0}, @@ -279,8 +299,15 @@ static int DoArgs(int argc, char *argv[]) {"-noautowrite",0,&eoptions,0x8000|EO_NOAUTOWRITE}, {"-slstart",0,&srendlinev[0],0},{"-slend",0,&erendlinev[0],0}, {"-slstartp",0,&srendlinev[1],0},{"-slendp",0,&erendlinev[1],0}, - {0,(void *)DriverArgs,0,0}, - {0,0,0,0} + {"-sound",0,&Settings.sound_rate,0}, + {"-showfps",0,&Settings.showfps,0}, + #ifdef NETWORK + {"-connect",&docheckie2[0],&netplayhost,0x4001}, + {"-server",&docheckie2[1],0,0}, + {"-netport",0,&Port,0}, + #endif + {0,(void *)DriverArgs,0,0}, + {0,0,0,0} }; memset(docheckie,0,sizeof(docheckie)); @@ -308,6 +335,15 @@ static int DoArgs(int argc, char *argv[]) FCEUI_SetRenderedLines(srendlinev[0],erendlinev[0],srendlinev[1],erendlinev[1]); FCEUI_SetSoundVolume(80); + #ifdef NETWORK + if(docheckie2[0]) + netplay=2; + else if(docheckie2[1]) + netplay=1; + + if(netplay) + FCEUI_SetNetworkPlay(netplay); + #endif DoDriverArgs(); if(fcexp) @@ -350,7 +386,7 @@ static int DoArgs(int argc, char *argv[]) #include "usage.h" -int CLImain(int argc, char *argv[]) +int main(int argc, char *argv[]) { int last_arg_parsed, ret; /* TODO if(argc<=1) @@ -359,6 +395,7 @@ int CLImain(int argc, char *argv[]) return 1; }*/ + platform_init(); if(!DriverInitialize()) { return 1; @@ -369,11 +406,15 @@ int CLImain(int argc, char *argv[]) GetBaseDirectory(BaseDirectory); FCEUI_SetBaseDirectory(BaseDirectory); lastLoadedGameName[0] = 0; + menu_init(); + in_init(); CreateDirs(); LoadConfig(NULL); last_arg_parsed=DoArgs(argc-1,&argv[1]); - gp2x_opt_setup(); + platform_late_init(); + in_probe(); + LoadLLGN(); FCEUI_SetNTSCTH(ntsccol, ntsctint, ntschue); if(cpalette) @@ -424,17 +465,17 @@ int CLImain(int argc, char *argv[]) else { switch(LoadGameLastError) { - default: strcpy(menuErrorMsg, "failed to load ROM"); break; - case 2: strcpy(menuErrorMsg, "Can't find a ROM for ips/movie"); break; - case 10: strcpy(menuErrorMsg, "FDS BIOS ROM is missing, read docs"); break; - case 11: strcpy(menuErrorMsg, "Error reading auxillary FDS file"); break; + default: menu_update_msg("failed to load ROM"); break; + case 2: menu_update_msg("Can't find a ROM for ips/movie"); break; + case 10: menu_update_msg("FDS BIOS ROM is missing, read docs"); break; + case 11: menu_update_msg("Error reading auxillary FDS file"); break; } } } if(Exit || !fceugi) { int ret; - ret = gp2x_menu_do(); + ret = menu_loop(); if (ret == 1) break; // exit emu if (ret == 2) { // reload ROM Exit = 0; @@ -442,18 +483,11 @@ int CLImain(int argc, char *argv[]) } } - gp2x_opt_update(); PrepareOtherInput(); FCEUI_GetCurrentVidSystem(&srendline,&erendline); - gp2x_video_changemode(Settings.scaling == 3 ? 15 : 8); - switch (Settings.scaling & 3) { - case 0: gp2x_video_set_offs(0); gp2x_video_RGB_setscaling(320, 240); break; - case 1: gp2x_video_set_offs(32); gp2x_video_RGB_setscaling(256, 240); break; - case 2: gp2x_video_set_offs(32+srendline*320); gp2x_video_RGB_setscaling(256, erendline-srendline); break; - case 3: gp2x_video_set_offs(32); gp2x_video_RGB_setscaling(320, 240); break; - } + platform_apply_config(); CleanSurface(); - gp2x_start_sound(Settings.sound_rate, 16, 0); + StartSound(); RefreshThrottleFPS(); FCEUI_Emulate(); } @@ -464,7 +498,8 @@ int CLImain(int argc, char *argv[]) SaveLLGN(); FCEUI_Kill(); DriverKill(); - return 0; + platform_finish(); + return 0; } static int DriverInitialize(void) @@ -506,3 +541,4 @@ void FCEUD_Update(uint8 *xbuf, int16 *Buffer, int Count) if (Exit) FSkip=0; } + diff --git a/drivers/common/main.h b/drivers/common/main.h index 4739595..0b9bf7d 100644 --- a/drivers/common/main.h +++ b/drivers/common/main.h @@ -30,6 +30,7 @@ extern int eoptions; #define EO_NOAUTOWRITE 256 extern int srendline,erendline,srendlinev[2],erendlinev[2]; extern int NoWaiting; +extern int soundvol; extern FCEUGI *fceugi; diff --git a/drivers/common/menu.c b/drivers/common/menu.c new file mode 100644 index 0000000..5fe0cfc --- /dev/null +++ b/drivers/common/menu.c @@ -0,0 +1,649 @@ +/* + * (C) Gražvydas "notaz" Ignotas, 2010-2011 + * + * This work is licensed under the terms of any of these licenses + * (at your option): + * - GNU GPL, version 2 or later. + * - GNU LGPL, version 2.1 or later. + * See the COPYING file in the top-level directory. + */ + +#include +#include +#include +#include +#include + +#include "main.h" +#include "menu.h" +#include "input.h" +#include "settings.h" +#include "config.h" +#include "args.h" +#include "dface.h" +#include "../libpicofe/plat.h" +#include "../libpicofe/input.h" +#include "../../state.h" +#include "../../general.h" +#include "../../input.h" +#include "../../palette.h" +#include "revision.h" + +#define array_size(x) (sizeof(x) / sizeof(x[0])) + +#define state_slot CurrentState +extern uint8 Exit; + +typedef enum +{ + MA_NONE = 1, + MA_CTRL_PLAYER1, + MA_CTRL_PLAYER2, + MA_CTRL_EMU, + MA_CTRL_DEADZONE, + MA_OPT_SAVECFG, + MA_OPT_SAVECFG_GAME, + MA_CTRL_DEV_FIRST, + MA_CTRL_DEV_NEXT, + MA_OPT_NTSC_COLOR, + MA_OPT_NTSC_TINT, + MA_OPT_NTSC_HUE, + MA_OPT_SREND_N, + MA_OPT_EREND_N, + MA_OPT_SREND_P, + MA_OPT_EREND_P, + MA_OPT_CLIP, + MA_OPT_NO8LIM, + MA_OPT_GG, + MA_OPT_SHOWFPS, + MA_OPT_FSKIP, + MA_OPT_RENDERER, + MA_OPT_SOUNDON, + MA_OPT_SOUNDRATE, + MA_OPT_REGION, + MA_OPT_TURBO, + MA_OPT_SSTATE, + MA_OPT_SSLOT, + MA_OPT_GAMMA, + MA_MAIN_RESUME_GAME, + MA_MAIN_SAVE_STATE, + MA_MAIN_LOAD_STATE, + MA_MAIN_RESET_GAME, + MA_MAIN_LOAD_ROM, + MA_MAIN_CHEATS, + MA_MAIN_CREDITS, + MA_MAIN_EXIT, +} menu_id; + +void emu_make_path(char *buff, const char *end, int size) +{ + int pos, end_len; + + end_len = strlen(end); + pos = plat_get_root_dir(buff, size); + strncpy(buff + pos, end, size - pos); + buff[size - 1] = 0; + if (pos + end_len > size - 1) + printf("Warning: path truncated: %s\n", buff); +} + +static int emu_check_save_file(int slot, int *time) +{ + struct stat status; + char *fname; + FILE *st; + int retval = 0; + int ret; + + fname = FCEU_MakeFName(FCEUMKF_STATE,CurrentState,0); + st = fopen(fname,"rb"); + if (st == NULL) + goto out; + fclose(st); + + retval = 1; + if (time == NULL) + goto out; + + ret = stat(fname, &status); + if (ret != 0) + goto out; + + if (status.st_mtime < 1347000000) + goto out; // probably bad rtc like on some Caanoos + + *time = status.st_mtime; + +out: + free(fname); + return retval; +} + +static int emu_save_load_game(int load, int unused) +{ + if (load) + FCEUI_LoadState(); + else + FCEUI_SaveState(); + + return 0; +} + +// rrrr rggg gggb bbbb +static unsigned short fname2color(const char *fname) +{ + static const char *rom_exts[] = { ".zip", ".nes", ".fds", ".unf", + ".nez", ".unif" }; + static const char *other_exts[] = { ".nsf", ".ips", ".fcm" }; + const char *ext = strrchr(fname, '.'); + int i; + + if (ext == NULL) + return 0xffff; + for (i = 0; i < array_size(rom_exts); i++) + if (strcasecmp(ext, rom_exts[i]) == 0) + return 0xbdff; + for (i = 0; i < array_size(other_exts); i++) + if (strcasecmp(ext, other_exts[i]) == 0) + return 0xaff5; + return 0xffff; +} + +static const char *filter_exts[] = { + ".txt", ".srm", ".pnd" +}; + +#define MENU_ALIGN_LEFT +#ifdef __ARM_ARCH_7A__ // assume hires device +#define MENU_X2 1 +#else +#define MENU_X2 0 +#endif + +#include "../libpicofe/menu.c" + +static void draw_savestate_bg(int slot) +{ +} + +static void debug_menu_loop(void) +{ +} + +// ------------ patch/gg menu ------------ + +extern void *cheats; +static int cheat_count, cheat_start, cheat_pos; + +static int countcallb(char *name, uint32 a, uint8 v, int compare, int s, int type, void *data) +{ + cheat_count++; + return 1; +} + +static int clistcallb(char *name, uint32 a, uint8 v, int compare, int s, int type, void *data) +{ + int pos; + + pos = cheat_start + cheat_pos; + cheat_pos++; + if (pos < 0) return 1; + if (pos >= g_menuscreen_h / me_sfont_h) return 0; + + smalltext_out16(14, pos * me_sfont_h, s ? "ON " : "OFF", 0xffff); + smalltext_out16(14 + me_sfont_w*4, pos * me_sfont_h, type ? "S" : "R", 0xffff); + smalltext_out16(14 + me_sfont_w*6, pos * me_sfont_h, name, 0xffff); + + return 1; +} + +static void draw_patchlist(int sel) +{ + int pos, max_cnt; + + menu_draw_begin(1, 1); + + max_cnt = g_menuscreen_h / me_sfont_h; + cheat_start = max_cnt / 2 - sel; + cheat_pos = 0; + FCEUI_ListCheats(clistcallb, 0); + + pos = cheat_start + cheat_pos; + if (pos < max_cnt) + smalltext_out16(14, pos * me_sfont_h, "done", 0xffff); + + text_out16(5, max_cnt / 2 * me_sfont_h, ">"); + menu_draw_end(); +} + +void patches_menu_loop(void) +{ + static int menu_sel = 0; + int inp; + + cheat_count = 0; + FCEUI_ListCheats(countcallb, 0); + + for (;;) + { + draw_patchlist(menu_sel); + inp = in_menu_wait(PBTN_UP|PBTN_DOWN|PBTN_LEFT|PBTN_RIGHT|PBTN_L|PBTN_R + |PBTN_MOK|PBTN_MBACK, NULL, 33); + if (inp & PBTN_UP ) { menu_sel--; if (menu_sel < 0) menu_sel = cheat_count; } + if (inp & PBTN_DOWN) { menu_sel++; if (menu_sel > cheat_count) menu_sel = 0; } + if (inp &(PBTN_LEFT|PBTN_L)) { menu_sel-=10; if (menu_sel < 0) menu_sel = 0; } + if (inp &(PBTN_RIGHT|PBTN_R)) { menu_sel+=10; if (menu_sel > cheat_count) menu_sel = cheat_count; } + if (inp & PBTN_MOK) { // action + if (menu_sel < cheat_count) + FCEUI_ToggleCheat(menu_sel); + else break; + } + if (inp & PBTN_MBACK) + break; + } +} + +// -------------- key config -------------- + +// b_turbo,a_turbo RLDU SEBA +me_bind_action me_ctrl_actions[] = +{ + { "UP ", NKEY_UP }, + { "DOWN ", NKEY_DOWN }, + { "LEFT ", NKEY_LEFT }, + { "RIGHT ", NKEY_RIGHT }, + { "A ", NKEY_A }, + { "B ", NKEY_B }, + { "A TURBO", NKEY_A_TURBO }, + { "B TURBO", NKEY_B_TURBO }, + { "START ", NKEY_START }, + { "SELECT ", NKEY_SELECT }, + { NULL, 0 } +}; + +me_bind_action emuctrl_actions[] = +{ + { "Save State ", EACT_SAVE_STATE }, + { "Load State ", EACT_LOAD_STATE }, + { "Next State Slot ", EACT_NEXT_SLOT }, + { "Prev State Slot ", EACT_PREV_SLOT }, + { "FDS Insert/Eject ", EACT_FDS_INSERT }, + { "FDS Select Disk ", EACT_FDS_SELECT }, + { "VSUni Insert Coin", EACT_INSERT_COIN }, + { "Enter Menu ", EACT_ENTER_MENU }, + { NULL, 0 } +}; + +static int key_config_loop_wrap(int id, int keys) +{ + switch (id) { + case MA_CTRL_PLAYER1: + key_config_loop(me_ctrl_actions, array_size(me_ctrl_actions) - 1, 0); + break; + case MA_CTRL_PLAYER2: + key_config_loop(me_ctrl_actions, array_size(me_ctrl_actions) - 1, 1); + break; + case MA_CTRL_EMU: + key_config_loop(emuctrl_actions, array_size(emuctrl_actions) - 1, -1); + break; + default: + break; + } + return 0; +} + +static const char *mgn_dev_name(int id, int *offs) +{ + const char *name = NULL; + static int it = 0; + + if (id == MA_CTRL_DEV_FIRST) + it = 0; + + for (; it < IN_MAX_DEVS; it++) { + name = in_get_dev_name(it, 1, 1); + if (name != NULL) + break; + } + + it++; + return name; +} + +static const char *mgn_saveloadcfg(int id, int *offs) +{ + return ""; +} + +static void config_commit(void); + +static int mh_savecfg(int id, int keys) +{ + const char *fname = NULL; + if (id == MA_OPT_SAVECFG_GAME) + fname = lastLoadedGameName; + + config_commit(); + if (SaveConfig(fname) == 0) + menu_update_msg("config saved"); + else + menu_update_msg("failed to write config"); + + return 1; +} + +static int mh_input_rescan(int id, int keys) +{ + //menu_sync_config(); + in_probe(); + menu_update_msg("rescan complete."); + + return 0; +} + +static menu_entry e_menu_keyconfig[] = +{ + mee_handler_id("Player 1", MA_CTRL_PLAYER1, key_config_loop_wrap), + mee_handler_id("Player 2", MA_CTRL_PLAYER2, key_config_loop_wrap), + mee_handler_id("Emulator controls", MA_CTRL_EMU, key_config_loop_wrap), + mee_label (""), +// mee_range ("Analog deadzone", MA_CTRL_DEADZONE, analog_deadzone, 1, 99), + mee_cust_nosave("Save global config", MA_OPT_SAVECFG, mh_savecfg, mgn_saveloadcfg), + mee_cust_nosave("Save cfg for loaded game", MA_OPT_SAVECFG_GAME, mh_savecfg, mgn_saveloadcfg), + mee_handler ("Rescan devices:", mh_input_rescan), + mee_label (""), + mee_label_mk (MA_CTRL_DEV_FIRST, mgn_dev_name), + mee_label_mk (MA_CTRL_DEV_NEXT, mgn_dev_name), + mee_label_mk (MA_CTRL_DEV_NEXT, mgn_dev_name), + mee_label_mk (MA_CTRL_DEV_NEXT, mgn_dev_name), + mee_label_mk (MA_CTRL_DEV_NEXT, mgn_dev_name), + mee_label_mk (MA_CTRL_DEV_NEXT, mgn_dev_name), + mee_label_mk (MA_CTRL_DEV_NEXT, mgn_dev_name), + mee_end, +}; + +static int menu_loop_keyconfig(int id, int keys) +{ + static int sel = 0; + + me_loop(e_menu_keyconfig, &sel); + return 0; +} + +// --------- FCEU options ---------- + +extern int ntsccol,ntschue,ntsctint; +extern int srendlinev[2]; +extern int erendlinev[2]; +extern int eoptions; +extern char *cpalette; +extern void LoadCPalette(void); + +static menu_entry e_menu_fceu_options[] = +{ + //gp2x_text_out15(tl_x, y, "Custom palette: %s", cpal); + mee_onoff ("NTSC Color Emulation", MA_OPT_NTSC_COLOR, ntsccol, 1), + mee_range (" Tint (default: 56)", MA_OPT_NTSC_TINT, ntsctint, 0, 128), + mee_range (" Hue (default: 72)", MA_OPT_NTSC_HUE, ntschue, 0, 128), + mee_range ("First visible line (NTSC)", MA_OPT_SREND_N, srendlinev[0], 0, 239), + mee_range ("Last visible line (NTSC)", MA_OPT_EREND_N, erendlinev[0], 0, 239), + mee_range ("First visible line (PAL)", MA_OPT_SREND_P, srendlinev[1], 0, 239), + mee_range ("Last visible line (PAL)", MA_OPT_EREND_P, erendlinev[1], 0, 239), + mee_onoff ("Clip 8 left/right columns", MA_OPT_CLIP, eoptions, EO_CLIPSIDES), + mee_onoff ("Disable 8 sprite limit", MA_OPT_NO8LIM, eoptions, EO_NO8LIM), + mee_onoff ("Enable authentic GameGenie",MA_OPT_GG, eoptions, EO_GG), + mee_end, +}; + +static int menu_loop_fceu_options(int id, int keys) +{ + static int sel = 0; + int i; + + FCEUI_GetNTSCTH(&ntsctint, &ntschue); + + me_loop(e_menu_fceu_options, &sel); + + for(i = 0; i < 2; i++) + { + if (srendlinev[i] < 0 || srendlinev[i] > 239) + srendlinev[i] = 0; + if (erendlinev[i] < srendlinev[i] || erendlinev[i] > 239) + erendlinev[i] = 239; + } + FCEUI_SetNTSCTH(ntsccol, ntsctint, ntschue); + FCEUI_SetRenderedLines(srendlinev[0],erendlinev[0],srendlinev[1],erendlinev[1]); + FCEUI_DisableSpriteLimitation(eoptions&EO_NO8LIM); + FCEUI_SetGameGenie(eoptions&EO_GG); + //if (cpalette) LoadCPalette(); + //else + FCEUI_SetPaletteArray(0); // set to default + FCEU_ResetPalette(); + + return 0; +} + +// -------------- options -------------- + +static const char *men_frameskip[] = { "Auto", "0", "1", "2", "3", "4", NULL }; +static const char *men_rates[] = { "8000", "11025", "16000", "22050", "44100", NULL }; +static const int men_rates_i[] = { 8000 , 11025 , 16000 , 22050 , 44100 }; +static const char *men_region[] = { "Auto", "NTSC", "PAL", NULL }; +static const char *men_sstate[] = { "OFF", "writes", "loads", "both", NULL }; +static const char h_renderer[] = "ROM reload required for this\n" + "setting to take effect"; + +static int sndrate_i; +static int sndon; +static int turbo_i; + +static void config_commit(void) +{ + Settings.sound_rate = men_rates_i[sndrate_i]; + soundvol = sndon ? 0 : 50; + Settings.turbo_rate_add = (turbo_i * 2 << 24) / 60 + 1; + + if (Settings.region_force) + FCEUI_SetVidSystem(Settings.region_force - 1); +} + +static menu_entry e_menu_options[] = +{ + mee_onoff ("Show FPS", MA_OPT_SHOWFPS, Settings.showfps, 1), + mee_enum ("Frameskip", MA_OPT_FSKIP, Settings.frameskip, men_frameskip), + mee_onoff_h ("Accurate renderer (slow)",MA_OPT_RENDERER, Settings.accurate_mode, 1, h_renderer), + mee_onoff ("Enable sound", MA_OPT_SOUNDON, sndon, 1), + mee_enum ("Sound Rate", MA_OPT_SOUNDRATE, sndrate_i, men_rates), + mee_enum ("Region", MA_OPT_REGION, Settings.region_force, men_region), + mee_range ("Turbo rate (Hz)", MA_OPT_TURBO, turbo_i, 1, 30), + mee_enum ("Confirm savestate", MA_OPT_SSTATE, Settings.sstate_confirm, men_sstate), + mee_range ("Save slot", MA_OPT_SSLOT, CurrentState, 0, 9), + mee_range ("Gamma correction", MA_OPT_GAMMA, Settings.gamma, 0, 300), + mee_handler ("[FCE Ultra options]", menu_loop_fceu_options), + mee_cust_nosave("Save global config", MA_OPT_SAVECFG, mh_savecfg, mgn_saveloadcfg), + mee_cust_nosave("Save cfg for loaded game",MA_OPT_SAVECFG_GAME, mh_savecfg, mgn_saveloadcfg), + mee_end, +}; + +static int menu_loop_options(int id, int keys) +{ + static int sel = 0; + int oldrate; + int i; + + oldrate = Settings.sound_rate; + for (i = 0; i < array_size(men_rates_i); i++) { + if (Settings.sound_rate == men_rates_i[i]) { + sndrate_i = i; + break; + } + } + sndon = soundvol != 0; + turbo_i = (Settings.turbo_rate_add * 60 / 2) >> 24; + + me_loop(e_menu_options, &sel); + + config_commit(); + if (oldrate != Settings.sound_rate) + InitSound(); + + return 0; +} + +// -------------- root menu -------------- + +static const char credits_text[] = + "GPFCE " REV "\n" + "(c) notaz, 2007,2012\n\n" + "Based on FCE Ultra versions\n" + "0.81 and 0.98.1x\n\n" + " - Credits -\n" + "Bero: FCE\n" + "Xodnizel: FCE Ultra\n" + "FCA author: 6502 core\n"; + +static void draw_frame_credits(void) +{ + smalltext_out16(4, 1, "build: " __DATE__ " " __TIME__ " " REV, 0xe7fc); +} + +static int romsel_run(void) +{ + const char *fname; + + fname = menu_loop_romsel(lastLoadedGameName, sizeof(lastLoadedGameName)); + if (fname == NULL) + return -1; + + printf("selected file: %s\n", fname); + //keys_load_all(cfg); + + strcpy(lastLoadedGameName, rom_fname_reload); + return 0; +} + +static int menu_loop_ret; + +static int main_menu_handler(int id, int keys) +{ + switch (id) + { + case MA_MAIN_RESUME_GAME: + if (fceugi) + return 1; + break; + case MA_MAIN_SAVE_STATE: + if (fceugi) { + Exit = 0; + return menu_loop_savestate(0); + } + break; + case MA_MAIN_LOAD_STATE: + if (fceugi) { + Exit = 0; + return menu_loop_savestate(1); + } + break; + case MA_MAIN_RESET_GAME: + if (fceugi) { + FCEU_DoSimpleCommand(FCEUNPCMD_RESET); + Exit = 0; + return 0; + } + break; + case MA_MAIN_LOAD_ROM: + if (romsel_run() == 0) { + menu_loop_ret = 2; + return 1; + } + break; + case MA_MAIN_CREDITS: + draw_menu_message(credits_text, draw_frame_credits); + in_menu_wait(PBTN_MOK|PBTN_MBACK, NULL, 70); + break; + case MA_MAIN_EXIT: + menu_loop_ret = 1; + return 1; + default: + lprintf("%s: something unknown selected\n", __FUNCTION__); + break; + } + + return 0; +} + +static menu_entry e_menu_main[] = +{ + mee_handler_id("Resume game", MA_MAIN_RESUME_GAME, main_menu_handler), + mee_handler_id("Save State", MA_MAIN_SAVE_STATE, main_menu_handler), + 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 ROM", MA_MAIN_LOAD_ROM, main_menu_handler), + mee_handler ("Options", menu_loop_options), + mee_handler ("Controls", menu_loop_keyconfig), + mee_handler_id("Cheats", MA_MAIN_CHEATS, main_menu_handler), + mee_handler_id("Credits", MA_MAIN_CREDITS, main_menu_handler), + mee_handler_id("Exit", MA_MAIN_EXIT, main_menu_handler), + mee_end, +}; + +// ---------------------------- + +int menu_loop(void) +{ + static int sel = 0; + + menu_loop_ret = 0; + + me_enable(e_menu_main, MA_MAIN_RESUME_GAME, fceugi != NULL); + me_enable(e_menu_main, MA_MAIN_SAVE_STATE, fceugi != NULL); + me_enable(e_menu_main, MA_MAIN_LOAD_STATE, fceugi != NULL); + me_enable(e_menu_main, MA_MAIN_RESET_GAME, fceugi != NULL); + me_enable(e_menu_main, MA_MAIN_CHEATS, fceugi && cheats); + + plat_video_menu_enter(fceugi != NULL); + in_set_config_int(0, IN_CFG_BLOCKING, 1); + + do { + me_loop_d(e_menu_main, &sel, NULL, NULL); + } while (!fceugi && menu_loop_ret == 0); + + /* wait until menu, ok, back is released */ + while (in_menu_wait_any(NULL, 50) & (PBTN_MENU|PBTN_MOK|PBTN_MBACK)) + ; + + in_set_config_int(0, IN_CFG_BLOCKING, 0); + plat_video_menu_leave(); + + return menu_loop_ret; +} + +void menu_init(void) +{ + char buff[256]; + + g_border_style = 1; + menu_init_base(); + + //menu_load_config(0); + + g_menubg_src_ptr = calloc(g_menuscreen_w * g_menuscreen_h * 2, 1); + g_menubg_ptr = calloc(g_menuscreen_w * g_menuscreen_h * 2, 1); + if (g_menubg_src_ptr == NULL || g_menubg_ptr == NULL) { + fprintf(stderr, "OOM\n"); + exit(1); + } + + emu_make_path(buff, "skin/background.png", sizeof(buff)); + readpng(g_menubg_src_ptr, buff, READPNG_BG, g_menuscreen_w, g_menuscreen_h); +} + +void menu_update_msg(const char *msg) +{ + strncpy(menu_error_msg, msg, sizeof(menu_error_msg)); + menu_error_msg[sizeof(menu_error_msg) - 1] = 0; + + menu_error_time = plat_get_ticks_ms(); + lprintf("msg: %s\n", menu_error_msg); +} + diff --git a/drivers/common/menu.h b/drivers/common/menu.h new file mode 100644 index 0000000..881f231 --- /dev/null +++ b/drivers/common/menu.h @@ -0,0 +1,3 @@ +void menu_init(void); +int menu_loop(void); +void menu_update_msg(const char *msg); diff --git a/drivers/common/platform.h b/drivers/common/platform.h new file mode 100644 index 0000000..7135b23 --- /dev/null +++ b/drivers/common/platform.h @@ -0,0 +1,5 @@ +void platform_init(void); +void platform_late_init(void); +void platform_apply_config(void); +void platform_set_volume(int val); // 0-100 +void platform_finish(void); diff --git a/drivers/gp2x/gp2x.h b/drivers/common/settings.h similarity index 83% rename from drivers/gp2x/gp2x.h rename to drivers/common/settings.h index b0861a9..536b5e3 100644 --- a/drivers/gp2x/gp2x.h +++ b/drivers/common/settings.h @@ -1,26 +1,21 @@ -#define GP2X_PORT_VERSION "0.4" - typedef struct { - // gp2x specific - int KeyBinds[32]; - int JoyBinds[4][32]; int turbo_rate_add; // 8.24 int int sound_rate; // in Hz int showfps; - int scaling; // unscaled=0, hw_hor, hw_hor_vert, sw_hor int frameskip; // -1 ~ auto, >=0 ~ count int sstate_confirm; int region_force; // 0 ~ off, 1 ~ NTSC, 2 ~ PAL + int gamma; + int accurate_mode; + // gp2x specific + int KeyBinds[32]; + int JoyBinds[4][32]; + int scaling; // unscaled=0, hw_hor, hw_hor_vert, sw_hor int cpuclock; int mmuhack; int ramtimings; - int gamma; int perfect_vsync; - int accurate_mode; } DSETTINGS; extern DSETTINGS Settings; -void gp2x_opt_setup(void); -void gp2x_opt_update(void); - diff --git a/drivers/gp2x/throttle.h b/drivers/common/throttle.h similarity index 100% rename from drivers/gp2x/throttle.h rename to drivers/common/throttle.h diff --git a/drivers/gp2x/usage.h b/drivers/common/usage.h similarity index 91% rename from drivers/gp2x/usage.h rename to drivers/common/usage.h index 425a907..320fc31 100644 --- a/drivers/gp2x/usage.h +++ b/drivers/common/usage.h @@ -23,7 +23,12 @@ void ShowUsage(char *prog) printf("\nUsage is as follows:\n%s filename\n\n",prog); puts("Options:"); puts(DriverUsage); -puts("-cpalette x Load a custom global palette from file x.\n\ +puts( +"-sound x Sound.\n\ + 0 = Disabled.\n\ + Otherwise, x = playback rate.\n\ +-showfps x Display fps counter if x is nonzero\n\ +-cpalette x Load a custom global palette from file x.\n\ -ntsccol x Emulate an NTSC's TV's colors.\n\ 0 = Disabled.\n\ 1 = Enabled.\n\ diff --git a/drivers/gp2x/gp2x-sound.c b/drivers/gp2x/gp2x-sound.c index 666aee1..b4a38e0 100644 --- a/drivers/gp2x/gp2x-sound.c +++ b/drivers/gp2x/gp2x-sound.c @@ -18,9 +18,9 @@ #include #include "../../driver.h" -#include "gp2x.h" +#include "../common/settings.h" +#include "../common/throttle.h" #include "minimal.h" -#include "throttle.h" extern int soundvol; @@ -54,6 +54,11 @@ uint32 GetWriteSound(void) return 1024; } +void StartSound(void) +{ + gp2x_start_sound(Settings.sound_rate, 16, 0); +} + int KillSound(void) { //FCEUI_Sound(0); diff --git a/drivers/gp2x/gp2x-video.c b/drivers/gp2x/gp2x-video.c index 7f4159b..c8b094c 100644 --- a/drivers/gp2x/gp2x-video.c +++ b/drivers/gp2x/gp2x-video.c @@ -22,7 +22,7 @@ #include "../../video.h" #include "../common/main.h" -#include "gp2x.h" +#include "../common/settings.h" #include "minimal.h" #include "../libpicofe/fonts.h" #include "asmutils.h" diff --git a/drivers/gp2x/gp2x.c b/drivers/gp2x/gp2x.c index ab00045..ac8bb92 100644 --- a/drivers/gp2x/gp2x.c +++ b/drivers/gp2x/gp2x.c @@ -5,7 +5,9 @@ #include "../../driver.h" #include "../common/config.h" #include "../common/args.h" -#include "gp2x.h" +#include "../common/platform.h" +#include "../common/settings.h" +#include "../common/revision.h" #include "gp2x-video.h" #ifdef NETWORK #include "unix-netplay.h" @@ -15,71 +17,21 @@ #include "cpuctrl.h" #include "squidgehack.h" -int GP2X_PORT_REV = -#include "rev.h" -; - extern uint8 PAL; -int CLImain(int argc, char *argv[]); - -DSETTINGS Settings; -CFGSTRUCT DriverConfig[]={ - ACA(Settings.KeyBinds), - ACA(Settings.JoyBinds), - AC(Settings.turbo_rate_add), - AC(Settings.sound_rate), - AC(Settings.showfps), - AC(Settings.scaling), - AC(Settings.frameskip), - AC(Settings.sstate_confirm), - AC(Settings.region_force), - AC(Settings.cpuclock), - AC(Settings.mmuhack), - AC(Settings.ramtimings), - AC(Settings.gamma), - AC(Settings.perfect_vsync), - AC(Settings.accurate_mode), - ENDCFGSTRUCT -}; - - char *DriverUsage= -"-joyx y Use joystick y as virtual joystick x.\n\ --sound x Sound.\n\ - 0 = Disabled.\n\ - Otherwise, x = playback rate.\n\ --showfps x Display fps counter if x is nonzero\n\ --mmuhack x Enable squidge's MMU hack if x is nonzero (GP2X).\n\ +"-mmuhack x Enable squidge's MMU hack if x is nonzero (GP2X).\n\ -ramtimings x Enable RAM overclocking if x is nonzero (GP2X).\n\ -" -#ifdef NETWORK -"-connect s Connect to server 's' for TCP/IP network play.\n\ --server Be a host/server for TCP/IP network play.\n\ --netport x Use TCP/IP port x for network play." -#endif -; +"; -#ifdef NETWORK -static int docheckie[2]={0,0}; -#endif ARGPSTRUCT DriverArgs[]={ - {"-sound",0,&Settings.sound_rate,0}, - {"-showfps",0,&Settings.showfps,0}, {"-mmuhack",0,&Settings.mmuhack,0}, {"-ramtimings",0,&Settings.ramtimings,0}, {"-menu",0,&ext_menu,0x4001}, {"-menustate",0,&ext_state,0x4001}, - #ifdef NETWORK - {"-connect",&docheckie[0],&netplayhost,0x4001}, - {"-server",&docheckie[1],0,0}, - {"-netport",0,&Port,0}, - #endif {0,0,0,0} }; - - void GetBaseDirectory(char *BaseDirectory) { strcpy(BaseDirectory, "fceultra"); @@ -113,29 +65,15 @@ static void SetDefaults(void) void DoDriverArgs(void) { - #ifdef NETWORK - if(docheckie[0]) - netplay=2; - else if(docheckie[1]) - netplay=1; - - if(netplay) - FCEUI_SetNetworkPlay(netplay); - #endif } -char **g_argv; int mmuhack_status = 0; -// TODO: cleanup -int main(int argc, char *argv[]) +void platform_init(void) { - int ret; - g_argv = argv; - - printf("Starting GPFCE - Port version " GP2X_PORT_VERSION " r%i (" __DATE__ ")\n", GP2X_PORT_REV); + printf("Starting GPFCE " REV " (" __DATE__ ")\n"); puts("Based on FCE Ultra "VERSION_STRING" and 0.98.1x versions"); puts("Original port by Zheng Zhu"); puts("Menu/optimization/misc work by notaz\n"); @@ -144,9 +82,10 @@ int main(int argc, char *argv[]) cpuctrl_init(); SetDefaults(); +} - ret = CLImain(argc,argv); - +void platform_finish(void) +{ // unscale the screen, in case it is bad. gp2x_video_RGB_setscaling(320, 240); @@ -160,9 +99,13 @@ int main(int argc, char *argv[]) return(ret?0:-1); } +void platform_set_volume(int val) // 0-100 +{ + platform_set_volume(val, val); +} /* optional GP2X stuff to be done after config is loaded */ -void gp2x_opt_setup(void) +void platform_late_init(void) { if (Settings.mmuhack) { int ret = mmuhack(); @@ -178,7 +121,7 @@ void gp2x_opt_setup(void) } } -void gp2x_opt_update(void) +void platform_apply_config(void) { static int prev_cpuclock = 200, prev_gamma = 100, prev_vsync = 0, prev_pal = 0; if (Settings.cpuclock != 0 && Settings.cpuclock != prev_cpuclock) @@ -206,6 +149,14 @@ void gp2x_opt_update(void) } prev_vsync = Settings.perfect_vsync; } + + gp2x_video_changemode(Settings.scaling == 3 ? 15 : 8); + switch (Settings.scaling & 3) { + case 0: gp2x_video_set_offs(0); gp2x_video_RGB_setscaling(320, 240); break; + case 1: gp2x_video_set_offs(32); gp2x_video_RGB_setscaling(256, 240); break; + case 2: gp2x_video_set_offs(32+srendline*320); gp2x_video_RGB_setscaling(256, erendline-srendline); break; + case 3: gp2x_video_set_offs(32); gp2x_video_RGB_setscaling(320, 240); break; + } } diff --git a/drivers/gp2x/throttle.c b/drivers/gp2x/throttle.c index c572598..5a5f55e 100644 --- a/drivers/gp2x/throttle.c +++ b/drivers/gp2x/throttle.c @@ -1,6 +1,6 @@ #include +#include "../common/settings.h" #include "main.h" -#include "gp2x.h" #include "minimal.h" #include "throttle.h" diff --git a/drivers/gp2x_test/minimal.c b/drivers/sdl/minimal.c similarity index 100% rename from drivers/gp2x_test/minimal.c rename to drivers/sdl/minimal.c diff --git a/drivers/sdl/sdl.c b/drivers/sdl/sdl.c new file mode 100644 index 0000000..db4d5c1 --- /dev/null +++ b/drivers/sdl/sdl.c @@ -0,0 +1,93 @@ +#include +#include "../common/platform.h" +#include "../common/args.h" +#include "../common/settings.h" +#include "../common/input.h" +#include "../libpicofe/menu.h" +#include "../libpicofe/input.h" +#include "../libpicofe/in_sdl.h" + +static const struct in_default_bind in_sdl_defbinds[] = { + { SDLK_UP, IN_BINDTYPE_PLAYER12, NKEYB_UP }, + { SDLK_DOWN, IN_BINDTYPE_PLAYER12, NKEYB_DOWN }, + { SDLK_LEFT, IN_BINDTYPE_PLAYER12, NKEYB_LEFT }, + { SDLK_RIGHT, IN_BINDTYPE_PLAYER12, NKEYB_RIGHT }, + { SDLK_z, IN_BINDTYPE_PLAYER12, NKEYB_B }, + { SDLK_x, IN_BINDTYPE_PLAYER12, NKEYB_A }, + { SDLK_a, IN_BINDTYPE_PLAYER12, NKEYB_B_TURBO }, + { SDLK_s, IN_BINDTYPE_PLAYER12, NKEYB_A_TURBO }, + { SDLK_ESCAPE, IN_BINDTYPE_EMU, EACTB_ENTER_MENU }, + { 0, 0, 0 } +}; + +SDL_Surface *screen; + +void platform_init(void) +{ + memset(&Settings, 0, sizeof(Settings)); + Settings.frameskip = -1; // auto + Settings.sound_rate = 44100; + Settings.turbo_rate_add = (8*2 << 24) / 60 + 1; // 8Hz turbofire + Settings.gamma = 100; + Settings.sstate_confirm = 1; + + g_menuscreen_w = 320; + g_menuscreen_h = 240; + + // tmp + { + extern void gp2x_init(); + gp2x_init(); + } +} + +void platform_late_init(void) +{ + in_sdl_init(in_sdl_defbinds); +} + +void platform_apply_config(void) +{ +} + +void platform_set_volume(int val) +{ +} + +void platform_finish(void) +{ +} + +void plat_video_menu_enter(int is_rom_loaded) +{ + screen = SDL_SetVideoMode(320, 240, 16, 0); +} + +void plat_video_menu_begin(void) +{ + g_menuscreen_ptr = screen->pixels; +} + +void plat_video_menu_end(void) +{ + SDL_Flip(screen); +} + +void plat_video_menu_leave(void) +{ +} + +char *DriverUsage=""; + +ARGPSTRUCT DriverArgs[]={ + {0,0,0,0} +}; + +void DoDriverArgs(void) +{ +} + +void GetBaseDirectory(char *BaseDirectory) +{ + strcpy(BaseDirectory, "fceultra"); +} diff --git a/drivers/gp2x_test/throttle.c b/drivers/sdl/throttle.c similarity index 95% rename from drivers/gp2x_test/throttle.c rename to drivers/sdl/throttle.c index 4a6d699..5272226 100644 --- a/drivers/gp2x_test/throttle.c +++ b/drivers/sdl/throttle.c @@ -2,8 +2,8 @@ #include #include "../common/main.h" -#include "../gp2x/gp2x.h" -#include "../gp2x/throttle.h" +#include "../common/throttle.h" +#include "../common/settings.h" extern uint8 PAL; diff --git a/input.h b/input.h index 7c0da59..14586d0 100644 --- a/input.h +++ b/input.h @@ -38,3 +38,4 @@ void FCEUI_VSUniCoin(void); void FCEUI_ResetNES(void); void FCEUI_PowerNES(void); +extern char lastLoadedGameName [2048];