X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=fceu.git;a=blobdiff_plain;f=drivers%2Fgp2x%2Fmain.c;h=5926da78fd224405d57af238b3ce38f91f81a6e0;hp=ad36e016a635c1ca4b42f2020ed1045e93d49d27;hb=7b356ee3dc5d7e54d9dc06c413f84380d1044441;hpb=937bf65b1c80e9394547e5f105664bd26f3671de diff --git a/drivers/gp2x/main.c b/drivers/gp2x/main.c index ad36e01..5926da7 100644 --- a/drivers/gp2x/main.c +++ b/drivers/gp2x/main.c @@ -1,7 +1,4 @@ /* FCE Ultra - NES/Famicom Emulator - * - * Copyright notice for this file: - * Copyright (C) 2002 Ben Parnell * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -18,11 +15,6 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -/* This file contains or coordinates all of the code necessary to compile - on a UNIX system that can use svgalib, such as FreeBSD and Linux. - This code is not guaranteed to compile on FreeBSD, though. -*/ - #include #include @@ -36,25 +28,37 @@ #include #include "main.h" +#include "minimal.h" #include "throttle.h" +#include "menu.h" +#include "gp2x.h" #include "../common/config.h" #include "../common/args.h" #include "../common/unixdsp.h" #include "../common/cheat.h" +#include "../../fce.h" +#include "../../cart.h" + #include "dface.h" -static int ntsccol=0,ntschue=-1,ntsctint=-1; + +void CleanSurface(void); + +// internals +extern char lastLoadedGameName[2048]; +extern uint8 Exit; // exit emu loop flag +extern int FSkip; +void CloseGame(void); + +FCEUGI *fceugi = NULL; +int ntsccol=0,ntschue=-1,ntsctint=-1; int soundvol=70; int inited=0; -int swapbuttons=0; -int showfps=0; -int srendlinev[2]={0,0}; -//int srendlinev[2]={0,0}; -int erendlinev[2]={239,239}; -//int erendlinev[2]={231,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,32 +128,69 @@ static CFGSTRUCT fceuconfig[]={ ENDCFGSTRUCT }; -static void SaveConfig(void) +void SaveConfig(const char *name) { char tdir[2048]; - sprintf(tdir,"%s"PSS"fceu.cfg",BaseDirectory); - DriverInterface(DES_GETNTSCTINT,&ntsctint); - DriverInterface(DES_GETNTSCHUE,&ntschue); + if (name) + sprintf(tdir,"%s"PSS"cfg"PSS"%s.cfg",BaseDirectory,name); + else sprintf(tdir,"%s"PSS"fceu2.cfg",BaseDirectory); + FCEUI_GetNTSCTH(&ntsctint, &ntschue); SaveFCEUConfig(tdir,fceuconfig); } -static void LoadConfig(void) +static void LoadConfig(const char *name) { char tdir[2048]; - sprintf(tdir,"%s"PSS"fceu.cfg",BaseDirectory); + if (name) + sprintf(tdir,"%s"PSS"cfg"PSS"%s.cfg",BaseDirectory,name); + else sprintf(tdir,"%s"PSS"fceu2.cfg",BaseDirectory); + FCEUI_GetNTSCTH(&ntsctint, &ntschue); /* Get default settings for if no config file exists. */ LoadFCEUConfig(tdir,fceuconfig); - if(ntsctint>=0) DriverInterface(DES_SETNTSCTINT,&ntsctint); - if(ntschue>=0) DriverInterface(DES_SETNTSCHUE,&ntschue); + FCEUI_SetNTSCTH(ntsccol, ntsctint, ntschue); +} + +static void LoadLLGN(void) +{ + char tdir[2048]; + FILE *f; + int len; + sprintf(tdir,"%s"PSS"last_rom.txt",BaseDirectory); + f=fopen(tdir, "r"); + if(f) + { + len = fread(lastLoadedGameName, 1, sizeof(lastLoadedGameName)-1, f); + lastLoadedGameName[len] = 0; + fclose(f); + } } +static void SaveLLGN(void) +{ + // save last loaded game name + if (lastLoadedGameName[0] && !(eoptions&EO_NOAUTOWRITE)) + { + char tdir[2048]; + FILE *f; + sprintf(tdir,"%s"PSS"last_rom.txt",BaseDirectory); + f=fopen(tdir, "w"); + if(f) + { + fwrite(lastLoadedGameName, 1, strlen(lastLoadedGameName), f); + fclose(f); + sync(); + } + } +} + + static void CreateDirs(void) { - char *subs[5]={"fcs","snaps","gameinfo","sav","cheats"}; + char *subs[]={"fcs","snaps","gameinfo","sav","cheats","cfg","pal"}; char tdir[2048]; int x; mkdir(BaseDirectory,S_IRWXU); - for(x=0;x<5;x++) + for(x=0;x239) 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) @@ -295,92 +325,159 @@ static void DoArgs(int argc, char *argv[]) } } } + return ret; } + #include "usage.h" int CLImain(int argc, char *argv[]) { - FCEUGI *tmp; - int ret; - - if(argc<=1) + int last_arg_parsed; + /* TODO if(argc<=1) { ShowUsage(argv[0]); return 1; - } + }*/ if(!DriverInitialize()) { return 1; } - if(!(ret=FCEUI_Initialize())) + if(!FCEUI_Initialize()) return(1); GetBaseDirectory(BaseDirectory); FCEUI_SetBaseDirectory(BaseDirectory); + lastLoadedGameName[0] = 0; CreateDirs(); - LoadConfig(); - DoArgs(argc-2,&argv[1]); + LoadConfig(NULL); + last_arg_parsed=DoArgs(argc-1,&argv[1]); + gp2x_opt_setup(); + LoadLLGN(); + FCEUI_SetNTSCTH(ntsccol, ntsctint, ntschue); if(cpalette) LoadCPalette(); if(InitSound()) inited|=1; - if(!(tmp=FCEUI_LoadGame(argv[argc-1]))) - { - ret=0; - goto dk; - } - ParseGI(tmp); - //RefreshThrottleFPS(); - InitOtherInput(); - FCEUI_Emulate(); + if (argc > 1 && !last_arg_parsed) + { + strncpy(lastLoadedGameName, argv[argc-1], sizeof(lastLoadedGameName)); + lastLoadedGameName[sizeof(lastLoadedGameName)-1] = 0; + Exit = 0; + } + else + { + Exit = 1; + } - dk: + while (1) + { + if(!Exit) + { + if (fceugi) + CloseGame(); + fceugi=FCEUI_LoadGame(lastLoadedGameName); + if (fceugi) + { + char infostring[32]; + LoadConfig(lastLoadedGameName); + if (Settings.region_force) + FCEUI_SetVidSystem(Settings.region_force - 1); + ParseGI(fceugi); + InitOtherInput(); + + 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 10: strcpy(menuErrorMsg, "FDS BIOS ROM is missing, read docs"); break; + case 11: strcpy(menuErrorMsg, "Error reading auxillary FDS file"); break; + } + } + } + if(Exit || !fceugi) + { + int ret; + ret = gp2x_menu_do(); + if (ret == 1) break; // exit emu + if (ret == 2) { // reload ROM + Exit = 0; + continue; + } + } + + 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; + } + CleanSurface(); + gp2x_start_sound(Settings.sound_rate, 16, 0); + RefreshThrottleFPS(); + FCEUI_Emulate(); + } + + if (fceugi) + CloseGame(); + + SaveLLGN(); DriverKill(); - return(ret?0:1); + return 0; } 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(); - SetSignals(SIG_IGN); + // SaveConfig(NULL); // done explicitly in menu now + 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; }