partially working menu
[fceu.git] / drivers / gp2x / main.c
index fc9c7b6..e9223f2 100644 (file)
@@ -37,6 +37,8 @@
 
 #include "main.h"
 #include "throttle.h"
+#include "menu.h"
+#include "gp2x.h"
 
 #include "../common/config.h"
 #include "../common/args.h"
 
 #include "dface.h"
 
+// just for printing some iNES info for user..
+#include "../../fce.h"
+#include "../../ines.h"
+
+// internals
+extern char lastLoadedGameName[2048];
+extern uint8 Exit; // exit emu loop flag
+void CloseGame(void);
+
+FCEUGI *fceugi = NULL;
 static int ntsccol=0,ntschue=-1,ntsctint=-1;
 int soundvol=70;
 int inited=0;
@@ -52,9 +64,7 @@ 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 srendline,erendline;
 
 
@@ -119,6 +129,7 @@ static CFGSTRUCT fceuconfig[]={
        AC(eoptions),
        ACA(srendlinev),
        ACA(erendlinev),
+       ACA(lastLoadedGameName),
        ADDCFGSTRUCT(DriverConfig),
        ENDCFGSTRUCT
 };
@@ -189,16 +200,16 @@ static void CloseStuff(int signum)
         exit(1);
 }
 
-static void DoArgs(int argc, char *argv[])
+static int DoArgs(int argc, char *argv[])
 {
         static char *cortab[5]={"none","gamepad","zapper","powerpad","arkanoid"};
         static int cortabi[5]={SI_NONE,SI_GAMEPAD,
-                               SI_ZAPPER,SI_POWERPAD,SI_ARKANOID};
+                               SI_ZAPPER,SI_POWERPADA,SI_ARKANOID};
        static char *fccortab[5]={"none","arkanoid","shadow","4player","fkb"};
        static int fccortabi[5]={SIFC_NONE,SIFC_ARKANOID,SIFC_SHADOW,
                                 SIFC_4PLAYER,SIFC_FKB};
 
-       int x;
+       int x, ret;
        static char *inputa[2]={0,0};
        static char *fcexp=0;
        static int docheckie[4];
@@ -228,7 +239,7 @@ static void DoArgs(int argc, char *argv[])
         };
 
         memset(docheckie,0,sizeof(docheckie));
-       ParseArguments(argc, argv, FCEUArgs);
+       ret=ParseArguments(argc, argv, FCEUArgs);
        if(cpalette)
        {
         if(cpalette[0]=='0')
@@ -295,51 +306,97 @@ static void DoArgs(int argc, char *argv[])
          }
         }
        }
+       return ret;
 }
 
 #include "usage.h"
 
 int CLImain(int argc, char *argv[])
 {
-       FCEUGI *tmp;
-       int ret;
+       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();
-        if(argc<=1)
-        {
-         ShowUsage(argv[0]);
-         return 1;
-        }
         LoadConfig();
-        DoArgs(argc-2,&argv[1]);
+       gp2x_opt_setup();
+        last_arg_parsed=DoArgs(argc-1,&argv[1]);
        if(cpalette)
         LoadCPalette();
        if(InitSound())
         inited|=1;
 
-        if(!(tmp=FCEUI_LoadGame(argv[argc-1])))
-        {
-         ret=0;
-         goto dk;
-        }
-       ParseGI(tmp);
-       //RefreshThrottleFPS();
-        if(!DriverInitialize())
-        {
-         ret=0;
-         goto dk;
-        }
-       InitOtherInput();
-       FCEUI_Emulate();
+       if (argc > 1 && !last_arg_parsed)
+       {
+        strncpy(lastLoadedGameName, argv[argc-1], sizeof(lastLoadedGameName));
+        lastLoadedGameName[sizeof(lastLoadedGameName)-1] = 0;
+        Exit = 0;
+       }
+       else
+       {
+        lastLoadedGameName[0] = 0;
+        Exit = 1;
+       }
+
+       while (1)
+       {
+        if(!Exit)
+        {
+         if (fceugi)
+          CloseGame();
+          fceugi=FCEUI_LoadGame(lastLoadedGameName);
+         if (fceugi)
+         {
+          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":"");
+          }
+         }
+         else
+          strcpy(menuErrorMsg, "failed to load ROM");
+        }
+         if(Exit || !fceugi)
+         {
+          int ret;
+         ret = gp2x_menu_do();
+         if (ret == 1) break;          // exit emu
+         if (ret == 2) {               // reload ROM
+          Exit = 0;
+          continue;
+         }
+         }
+
+        gp2x_video_changemode(Settings.scaling == 3 ? 15 : 8);
+         gp2x_video_RGB_setscaling(0, 320, 240);
+        gp2x_start_sound(22050, 16, 0);
+        FCEUI_Emulate();
+       }
 
-       dk:
        DriverKill();
-        return(ret?0:1);
+        return 0;
 }
 
 static int DriverInitialize(void)
@@ -373,13 +430,13 @@ static void DriverKill(void)
  inited=0;
 }
 
-void FCEUD_Update(uint8 *XBuf, int16 *Buffer, int Count)
+void FCEUD_Update(uint8 *xbuf, int16 *Buffer, int Count)
 {
  if(!Count && !NoWaiting && !(eoptions&EO_NOTHROTTLE))
   SpeedThrottle();
- BlitScreen(XBuf);
- if(Count)
-  WriteSound(Buffer,Count,NoWaiting);
+ BlitScreen(xbuf);
+ if(Count && !NoWaiting && !(eoptions&EO_NOTHROTTLE))
+  WriteSound(Buffer,Count);
  FCEUD_UpdateInput();
 }