X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=fceu.git;a=blobdiff_plain;f=drivers%2Fgp2x%2Fmain.c;h=628f88b0ad88c707f6ed6def6b6a8d37cca41d11;hp=96ef3f9bdba175e6a1417246052998bd7b7a6eab;hb=890deff8bad82ef88678ac9c9cb7373677faf77a;hpb=989672f4f2b4b4b2b373271374e6546546091c10 diff --git a/drivers/gp2x/main.c b/drivers/gp2x/main.c index 96ef3f9..628f88b 100644 --- a/drivers/gp2x/main.c +++ b/drivers/gp2x/main.c @@ -28,6 +28,7 @@ #include #include "main.h" +#include "minimal.h" #include "throttle.h" #include "menu.h" #include "gp2x.h" @@ -37,24 +38,27 @@ #include "../common/unixdsp.h" #include "../common/cheat.h" +#include "../../fce.h" +#include "../../cart.h" + #include "dface.h" -// just for printing some iNES info for user.. -#include "../../fce.h" -#include "../../ines.h" + +void CleanSurface(void); // internals extern char lastLoadedGameName[2048]; extern uint8 Exit; // exit emu loop flag +extern int FSkip; void CloseGame(void); FCEUGI *fceugi = NULL; -static int ntsccol=0,ntschue=-1,ntsctint=-1; +int ntsccol=0,ntschue=-1,ntsctint=-1; int soundvol=70; int inited=0; -int srendlinev[2]={0,0}; -int erendlinev[2]={239,239}; +int srendlinev[2]={8,0}; +int erendlinev[2]={231,239}; int srendline,erendline; @@ -82,7 +86,6 @@ static void ParseGI(FCEUGI *gi) InputType[1]=gi->input[1]; if(gi->inputfc>=0) InputTypeFC=gi->inputfc; - FCEUI_GetCurrentVidSystem(&srendline,&erendline); } void FCEUD_PrintError(char *s) @@ -90,8 +93,8 @@ void FCEUD_PrintError(char *s) puts(s); } -static char *cpalette=0; -static void LoadCPalette(void) +char *cpalette=0; +void LoadCPalette(void) { char tmpp[192]; FILE *fp; @@ -99,6 +102,8 @@ static void LoadCPalette(void) if(!(fp=fopen(cpalette,"rb"))) { printf(" Error loading custom palette from file: %s\n",cpalette); + free(cpalette); + cpalette=0; return; } fread(tmpp,1,192,fp); @@ -123,26 +128,44 @@ static CFGSTRUCT fceuconfig[]={ ENDCFGSTRUCT }; -void SaveConfig(const char *name) +static const char *skip_path(const char *path) { + const char *p; + if (path == NULL) return NULL; + for (p = path+strlen(path)-1; p > path && *p != '/'; p--); + if (*p == '/') p++; + return p; +} + +int SaveConfig(const char *llgn_path) +{ + const char *name = skip_path(llgn_path); char tdir[2048]; + int ret; if (name) sprintf(tdir,"%s"PSS"cfg"PSS"%s.cfg",BaseDirectory,name); else sprintf(tdir,"%s"PSS"fceu2.cfg",BaseDirectory); - DriverInterface(DES_GETNTSCTINT,&ntsctint); - DriverInterface(DES_GETNTSCHUE,&ntschue); - SaveFCEUConfig(tdir,fceuconfig); + printf("saving cfg to %s ... ", tdir); fflush(stdout); + FCEUI_GetNTSCTH(&ntsctint, &ntschue); + ret=SaveFCEUConfig(tdir,fceuconfig); + printf(ret == 0 ? "done\n" : "failed\n"); + return ret; } -static void LoadConfig(const char *name) +static int LoadConfig(const char *llgn_path) { + const char *name = skip_path(llgn_path); char tdir[2048]; + int ret; if (name) sprintf(tdir,"%s"PSS"cfg"PSS"%s.cfg",BaseDirectory,name); else sprintf(tdir,"%s"PSS"fceu2.cfg",BaseDirectory); - LoadFCEUConfig(tdir,fceuconfig); - if(ntsctint>=0) DriverInterface(DES_SETNTSCTINT,&ntsctint); - if(ntschue>=0) DriverInterface(DES_SETNTSCHUE,&ntschue); + printf("loading cfg from %s ... ", tdir); fflush(stdout); + FCEUI_GetNTSCTH(&ntsctint, &ntschue); /* Get default settings for if no config file exists. */ + ret=LoadFCEUConfig(tdir,fceuconfig); + FCEUI_SetNTSCTH(ntsccol, ntsctint, ntschue); + printf(ret == 0 ? "done\n" : "failed\n"); + return ret; } static void LoadLLGN(void) @@ -163,7 +186,7 @@ static void LoadLLGN(void) static void SaveLLGN(void) { // save last loaded game name - if (lastLoadedGameName[0]) + if (lastLoadedGameName[0] && !(eoptions&EO_NOAUTOWRITE)) { char tdir[2048]; FILE *f; @@ -181,7 +204,7 @@ static void SaveLLGN(void) static void CreateDirs(void) { - char *subs[]={"fcs","snaps","gameinfo","sav","cheats","cfg"}; + char *subs[]={"fcs","snaps","gameinfo","sav","cheats","cfg","pal"}; char tdir[2048]; int x; @@ -212,12 +235,9 @@ static void CloseStuff(int signum) case SIGHUP:printf("Reach out and hang-up on someone.\n");break; case SIGPIPE:printf("The pipe has broken! Better watch out for floods...\n");break; case SIGSEGV:printf("Iyeeeeeeeee!!! A segmentation fault has occurred. Have a fluffy day.\n");break; - /* So much SIGBUS evil. */ - #ifdef SIGBUS #if(SIGBUS!=SIGSEGV) case SIGBUS:printf("I told you to be nice to the driver.\n");break; #endif - #endif case SIGFPE:printf("Those darn floating points. Ne'er know when they'll bite!\n");break; case SIGALRM:printf("Don't throw your clock at the meowing cats!\n");break; case SIGABRT:printf("Abort, Retry, Ignore, Fail?\n");break; @@ -250,13 +270,13 @@ static int DoArgs(int argc, char *argv[]) {"-input1",0,&inputa[0],0x4001},{"-input2",0,&inputa[1],0x4001}, {"-fcexp",0,&fcexp,0x4001}, - {"-gg",&docheckie[1],0,0}, - {"-no8lim",0,&eoptions,0x8001}, - {"-subase",0,&eoptions,0x8002}, + {"-gg",0,&eoptions,0x8000|EO_GG}, + {"-no8lim",0,&eoptions,0x8000|EO_NO8LIM}, {"-snapname",0,&eoptions,0x8000|EO_SNAPNAME}, {"-nofs",0,&eoptions,0x8000|EO_NOFOURSCORE}, {"-clipsides",0,&eoptions,0x8000|EO_CLIPSIDES}, {"-nothrottle",0,&eoptions,0x8000|EO_NOTHROTTLE}, + {"-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}, @@ -276,10 +296,8 @@ static int DoArgs(int argc, char *argv[]) } if(docheckie[0]) Settings.region_force=2; - if(docheckie[1]) - FCEUI_SetGameGenie(1); - FCEUI_DisableSpriteLimitation(1); - FCEUI_SaveExtraDataUnderBase(eoptions&2); + FCEUI_SetGameGenie(eoptions&EO_GG); + FCEUI_DisableSpriteLimitation(eoptions&EO_NO8LIM); FCEUI_SetSnapName(eoptions&EO_SNAPNAME); for(x=0;x<2;x++) @@ -288,13 +306,8 @@ static int DoArgs(int argc, char *argv[]) if(erendlinev[x]239) erendlinev[x]=239; } - printf("main() setrendered lines: %d, %d, %d, %d\n",srendlinev[0],erendlinev[0],srendlinev[1],erendlinev[1]); - printf("main() clip sides %d\n", eoptions&EO_CLIPSIDES); - srendlinev[0]=0; FCEUI_SetRenderedLines(srendlinev[0],erendlinev[0],srendlinev[1],erendlinev[1]); - FCEUI_SetRenderedLines(0,erendlinev[0],srendlinev[1],erendlinev[1]); - FCEUI_SetSoundVolume(soundvol); - DriverInterface(DES_NTSCCOL,&ntsccol); + FCEUI_SetSoundVolume(80); DoDriverArgs(); if(fcexp) @@ -339,7 +352,7 @@ static int DoArgs(int argc, char *argv[]) int CLImain(int argc, char *argv[]) { - int last_arg_parsed; + int last_arg_parsed, ret; /* TODO if(argc<=1) { ShowUsage(argv[0]); @@ -361,8 +374,8 @@ int CLImain(int argc, char *argv[]) LoadConfig(NULL); last_arg_parsed=DoArgs(argc-1,&argv[1]); gp2x_opt_setup(); - gp2x_cpuclock_gamma_update(); LoadLLGN(); + FCEUI_SetNTSCTH(ntsccol, ntsctint, ntschue); if(cpalette) LoadCPalette(); if(InitSound()) @@ -385,31 +398,34 @@ int CLImain(int argc, char *argv[]) { if (fceugi) CloseGame(); + ret=LoadConfig(lastLoadedGameName); + if (ret != 0) + { + LoadConfig(NULL); + } + FCEUI_SetEmuMode(Settings.accurate_mode); fceugi=FCEUI_LoadGame(lastLoadedGameName); if (fceugi) { - LoadConfig(lastLoadedGameName); + char infostring[32]; if (Settings.region_force) FCEUI_SetVidSystem(Settings.region_force - 1); ParseGI(fceugi); - //RefreshThrottleFPS(); InitOtherInput(); - // additional print for gpfce - // TODO: handlers for other formats then iNES - { - int MapperNo; - iNES_HEADER *head = iNESGetHead(); - MapperNo = (head->ROM_type>>4); - MapperNo|=(head->ROM_type2&0xF0); - FCEU_DispMessage("%s, Mapper: %d%s%s", PAL?"PAL":"NTSC", MapperNo, (head->ROM_type&2)?", BB":"", (head->ROM_type&4)?", T":""); - } + if ((eoptions&EO_GG) && geniestage == 0) { + strcpy(infostring, "gg.rom is missing, GG disabled"); + eoptions&=~EO_GG; + FCEUI_SetGameGenie(0); + } else + GameInterface(GI_INFOSTRING, infostring); + FCEU_DispMessage("%s", infostring); } else { switch(LoadGameLastError) { default: strcpy(menuErrorMsg, "failed to load ROM"); break; - case 2: strcpy(menuErrorMsg, "Can't find a ROM for movie"); 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; } @@ -426,14 +442,19 @@ 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_RGB_setscaling(0, 320, 240); gp2x_video_set_offs(0); break; - case 1: gp2x_video_RGB_setscaling(0, 256, 240); gp2x_video_set_offs(32); break; - case 2: gp2x_video_RGB_setscaling(0, 256, 240); gp2x_video_set_offs(32); break; // TODO - case 3: gp2x_video_RGB_setscaling(0, 320, 240); gp2x_video_set_offs(32); break; + 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; } + CleanSurface(); gp2x_start_sound(Settings.sound_rate, 16, 0); + RefreshThrottleFPS(); FCEUI_Emulate(); } @@ -441,6 +462,7 @@ int CLImain(int argc, char *argv[]) CloseGame(); SaveLLGN(); + FCEUI_Kill(); DriverKill(); return 0; } @@ -449,40 +471,38 @@ static int DriverInitialize(void) { SetSignals((void *)CloseStuff); - if(InitJoysticks()) - inited|=2; if(!InitVideo()) return 0; inited|=4; - if(!InitKeyboard()) return 0; - inited|=8; return 1; } static void DriverKill(void) { // SaveConfig(NULL); // done explicitly in menu now - SetSignals(SIG_IGN); + SetSignals(SIG_DFL); + + if(cpalette) free(cpalette); + cpalette=0; - if(inited&2) - KillJoysticks(); - if(inited&8) - KillKeyboard(); if(inited&4) KillVideo(); if(inited&1) KillSound(); - if(inited&16) - KillMouse(); inited=0; } void FCEUD_Update(uint8 *xbuf, int16 *Buffer, int Count) { - if(!Count && !NoWaiting && !(eoptions&EO_NOTHROTTLE)) + FCEUD_UpdateInput(); // must update input before blitting because of save confirmation stuff + BlitPrepare(xbuf == NULL); + if(!(eoptions&EO_NOTHROTTLE)) + { + if(Count) + WriteSound(Buffer,Count); SpeedThrottle(); - BlitScreen(xbuf); - if(Count && !NoWaiting && !(eoptions&EO_NOTHROTTLE)) - WriteSound(Buffer,Count); - FCEUD_UpdateInput(); + } + BlitScreen(xbuf == NULL); + // make sure last frame won't get skipped, because we need it for menu bg + if (Exit) FSkip=0; }