menu and controls wip..
[fceu.git] / drivers / gp2x / main.c
index fc9c7b6..6a31f9d 100644 (file)
@@ -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
  * 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 <unistd.h>
 #include <sys/types.h>
@@ -37,6 +29,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;
-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,23 +119,28 @@ static CFGSTRUCT fceuconfig[]={
        AC(eoptions),
        ACA(srendlinev),
        ACA(erendlinev),
+       ACA(lastLoadedGameName),
        ADDCFGSTRUCT(DriverConfig),
        ENDCFGSTRUCT
 };
 
-static void SaveConfig(void)
+void SaveConfig(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);
         DriverInterface(DES_GETNTSCTINT,&ntsctint);
         DriverInterface(DES_GETNTSCHUE,&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);
         LoadFCEUConfig(tdir,fceuconfig);
         if(ntsctint>=0) DriverInterface(DES_SETNTSCTINT,&ntsctint);
         if(ntschue>=0) DriverInterface(DES_SETNTSCHUE,&ntschue);
@@ -143,12 +148,12 @@ static void LoadConfig(void)
 
 static void CreateDirs(void)
 {
- char *subs[5]={"fcs","snaps","gameinfo","sav","cheats"};
+ char *subs[]={"fcs","snaps","gameinfo","sav","cheats","cfg"};
  char tdir[2048];
  int x;
 
  mkdir(BaseDirectory,S_IRWXU);
- for(x=0;x<5;x++)
+ for(x=0;x<sizeof(subs)/sizeof(subs[0]);x++)
  {
   sprintf(tdir,"%s"PSS"%s",BaseDirectory,subs[x]);
   mkdir(tdir,S_IRWXU);
@@ -189,16 +194,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];
@@ -221,14 +226,12 @@ static void DoArgs(int argc, char *argv[])
         {"-nothrottle",0,&eoptions,0x8000|EO_NOTHROTTLE},
          {"-slstart",0,&srendlinev[0],0},{"-slend",0,&erendlinev[0],0},
          {"-slstartp",0,&srendlinev[1],0},{"-slendp",0,&erendlinev[1],0},
-            {"-swapbuttons",&swapbuttons, 0, 0},
-            {"-showfps",&showfps, 0, 0},
         {0,(void *)DriverArgs,0,0},
         {0,0,0,0}
         };
 
         memset(docheckie,0,sizeof(docheckie));
-       ParseArguments(argc, argv, FCEUArgs);
+       ret=ParseArguments(argc, argv, FCEUArgs);
        if(cpalette)
        {
         if(cpalette[0]=='0')
@@ -295,51 +298,102 @@ 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]);
+        LoadConfig(NULL);
+        last_arg_parsed=DoArgs(argc-1,&argv[1]);
+       gp2x_opt_setup();
+       gp2x_cpuclock_update();
        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
+       {
+        Exit = 1;
+       }
+
+       while (1)
+       {
+        if(!Exit)
+        {
+         if (fceugi)
+          CloseGame();
+          fceugi=FCEUI_LoadGame(lastLoadedGameName);
+         if (fceugi)
+         {
+          LoadConfig(lastLoadedGameName);
+          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();
+       }
+
+       if (fceugi)
+        CloseGame();
 
-       dk:
        DriverKill();
-        return(ret?0:1);
+        return 0;
 }
 
 static int DriverInitialize(void)
@@ -357,7 +411,7 @@ static int DriverInitialize(void)
 
 static void DriverKill(void)
 {
- SaveConfig();
+ SaveConfig(NULL);
  SetSignals(SIG_IGN);
 
  if(inited&2)
@@ -373,13 +427,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();
 }