www.pudn.com > virtual_gameboy-0.8.8.zip > VGB.C


/** VGB: portable GameBoy emulator ***************************/ 
/**                                                         **/ 
/**                           VGB.c                         **/ 
/**                                                         **/ 
/** This file contains generic main() procedure statrting   **/ 
/** the emulation.                                          **/ 
/**                                                         **/ 
/** Copyright (C) Marat Fayzullin 1995                      **/ 
/**               Marcel de Kogel 1996                      **/ 
/**     You are not allowed to distribute this software     **/ 
/**     commercially. Please, notify me, if you make any    **/ 
/**     changes to this file.                               **/ 
/**                                                         **/ 
/** Edited for use with MS-DOS by Marcel de Kogel           **/ 
/*************************************************************/ 
 
 
#include  
#include  
#include  
#include  
#include  
#include  
 
#include "GB.h" 
#include "Help.h" 
 
#define MAX_CONFIG_FILE_SIZE    4096 
#define MAX_FILE_NAME           256 
 
struct colorscheme_struct 
{ 
 char *color0; 
 char *color1; 
 char *color2; 
 char *color3; 
}; 
 
static struct colorscheme_struct defcolorschemes[] = 
{ 
 { "white","#B0B0B0","#606060","black" }, 
 { "#c2e3b3","#9cb88e","#688063","#506d4c" }, 
 { "#ffff50","#bdbd48","#7b7bac","#292952" }, 
 { "#cbec50", "#a3d55a", "#5c9447", "#056d21" }, 
 { "#a0a000", "#707000", "#555500", "#191900" }, 
 { "#e6a428", "#ba8522", "#8d661b", "#614615" }, 
 
}; 
 
static struct colorscheme_struct colorschemes[256]; 
 
char *Options[]= 
{ 
  "verbose","vperiod","uperiod","help","shm","noshm", 
  "trap","saver","nosaver","color0","color1","color2", 
  "color3","cheat","delay","nodelay","crc","nocrc", 
  "video","sound","volume","background","ifreq","swapbuttons", 
  "colorscheme","definecolorscheme","spritecolor0","spritecolor1", 
  "spritecolor2","spritecolor3","spritecolorscheme","brightness", 
  "spritebrightness","windowbrightness","windowcolorscheme", 
  "windowcolor0","windowcolor1","windowcolor2","windowcolor3","stereo", 
  "backgroundcolorscheme","backgroundcolor0","backgroundcolor1","backgroundcolor2","backgroundcolor3", 
  "autoa","autob","logsnd","keys","backgroundbrightness", 
  NULL 
}; 
 
char *AbvOptions[]= 
{ 
  "vb","vp","up","he","shm","noshm", 
  "trap","saver","nosaver","c0","c1","c2", 
  "c3","cheat","delay","nodelay","crc","nocrc", 
  "video","sound","vol","bg","ifreq","swap", 
  "cs","dcs","sc0","sc1","sc2","sc3","scs","br","sbr","wbr","wcs", 
  "wc0","wc1","wc2","wc3","stereo", 
  "bcs","bc0","bc1","bc2","bc3", 
  "autoa","autob","logsnd","keys","bbr", 
  NULL 
}; 
 
extern int   UseSHM; 
extern int   SaveCPU; 
extern char *ColorNames[8]; 
#ifdef MSDOS 
extern int videomode; 
extern int soundmode; 
extern byte mastervolume; 
extern int swapbuttons; 
extern int IFreq; 
extern int IntSync; 
extern int brightness,spritebrightness,windowbrightness,backgroundbrightness; 
extern int stereomode; 
extern char *szKeys; 
#endif 
 
#define _DefExt         ".gb" 
 
static int _argc; 
static char *_argv[4096]; 
static char MainConfigFile[MAX_CONFIG_FILE_SIZE]; 
static char SubConfigFile[MAX_CONFIG_FILE_SIZE]; 
static char szTempFileName[MAX_FILE_NAME]; 
static char *CartName="CART.GB"; 
static char _CartName[MAX_FILE_NAME]; 
static char ProgramPath[MAX_FILE_NAME]; 
static char CartNameNoExt[MAX_FILE_NAME]; 
char szGifFile[MAX_FILE_NAME]; 
static char _SaveName[MAX_FILE_NAME]; 
extern char *SaveName; 
 
static void SelectColorScheme (int nr) 
{ 
 ColorNames[0]=ColorNames[4]=ColorNames[8]=colorschemes[nr].color0; 
 ColorNames[1]=ColorNames[5]=ColorNames[9]=colorschemes[nr].color1; 
 ColorNames[2]=ColorNames[6]=ColorNames[10]=colorschemes[nr].color2; 
 ColorNames[3]=ColorNames[7]=ColorNames[11]=colorschemes[nr].color3; 
} 
 
static void SelectSpriteColorScheme (int nr) 
{ 
 ColorNames[4]=colorschemes[nr].color0; 
 ColorNames[5]=colorschemes[nr].color1; 
 ColorNames[6]=colorschemes[nr].color2; 
 ColorNames[7]=colorschemes[nr].color3; 
} 
 
static void SelectWindowColorScheme (int nr) 
{ 
 ColorNames[8]=colorschemes[nr].color0; 
 ColorNames[9]=colorschemes[nr].color1; 
 ColorNames[10]=colorschemes[nr].color2; 
 ColorNames[11]=colorschemes[nr].color3; 
} 
 
static void SelectBackgroundColorScheme (int nr) 
{ 
 ColorNames[0]=colorschemes[nr].color0; 
 ColorNames[1]=colorschemes[nr].color1; 
 ColorNames[2]=colorschemes[nr].color2; 
 ColorNames[3]=colorschemes[nr].color3; 
} 
 
static void DefineColorScheme (int nr,char *c0,char *c1,char *c2,char *c3) 
{ 
 if (nr>=128 && nr<=255) 
 { 
  colorschemes[nr].color0=c0; 
  colorschemes[nr].color1=c1; 
  colorschemes[nr].color2=c2; 
  colorschemes[nr].color3=c3; 
 } 
} 
 
static int ParseOptions (int argc,char *argv[]) 
{ 
 int N,I,J; 
 int misparm; 
  for(N=1,I=0;N=argc) 
                   misparm=1; 
                 else 
                 { 
                   VPeriod=atoi(argv[N]); 
                   if((VPeriod<1000)||(VPeriod>320000)) VPeriod=69905; 
                 } 
                 break; 
        case 2:  N++; 
                 if(N>=argc) 
                   misparm=1; 
                 else 
                 { 
                   UPeriod=atoi(argv[N]); 
                   if(UPeriod>20) UPeriod=2; 
                 } 
                 break; 
        case 3:  printf ("VGB MS-DOS 0.8b1\n" 
                         "Core emulator code copyright (C) 1995,1996  Marat Fayzullin\n" 
                         "MS-DOS port copyright (C) 1996  Marcel de Kogel\n"); 
                 for(J=0;HelpText[J];J++) 
                 { 
                  if (!strcmp(HelpText[J],"")) 
                  { 
                   puts (""); 
                   printf("-- more --"); fflush(stdout); 
                   getch (); printf ("\n"); 
                  } 
                  puts(HelpText[J]); 
                 } 
                 return 0; 
        case 13: N++; 
                 if(N>=argc) 
                   misparm=1; 
                 else 
                   if(!AddCheat(argv[N])) 
                   { 
                     printf("Wrong cheat data supplied\n"); 
                     return 0; 
                   } 
                 break; 
        case 14: LineDelay=1;break; 
        case 15: LineDelay=0;break; 
        case 16: CheckCRC=1;break; 
        case 17: CheckCRC=0;break; 
#ifdef DEBUG 
        case 6:  N++; 
                 if(N>=argc) 
                   misparm=1; 
                 else  
                   sscanf(argv[N],"%hX",&Trap); 
                 break; 
#endif 
#ifdef MSDOS 
        case 9:  N++; 
                 if(N=argc) 
              return 0; 
     break; 
    case 25: 
             N+=5; 
             if (N>=argc) 
              return 0; 
    case 14: case 15: case 16: case 17: 
             break; 
    default: return 0; 
   } 
  } 
 } 
 return 1; 
} 
 
static void LoadConfigFile (char *szFileName,unsigned char *ptr) 
{ 
 FILE *infile; 
 infile=fopen (szFileName,"rb"); 
 if (infile==NULL) 
  return; 
 fread (ptr,1,MAX_CONFIG_FILE_SIZE,infile); 
 fclose (infile); 
 while (*ptr) 
 { 
  while (*ptr && *ptr<=' ') 
   ++ptr; 
  if (*ptr) 
  { 
   _argv[_argc++]=ptr; 
   while (*ptr && *ptr>' ') 
    ++ptr; 
   if (*ptr) 
    *ptr++='\0'; 
  } 
 } 
} 
 
static void FixFileNames (void) 
{ 
 char *p,*q; 
 _fixpath (CartName,_CartName); 
 strlwr (_CartName); 
 CartName=_CartName; 
 strcpy (CartNameNoExt,CartName); 
 p=CartNameNoExt; 
 q=strchr(CartNameNoExt,'/'); 
 while (q)                      /* get last '/' */ 
 { 
  p=++q; 
  q=strchr(q,'/'); 
 }; 
 q=NULL; 
 while ((p=strchr(p,'.'))!=NULL) /* get last '.' */ 
 { 
  q=p; 
  ++p; 
 } 
 if (q)                         /* remove extension */ 
  *q='\0'; 
 else 
  strcat (CartName,_DefExt); 
} 
 
static void GetPath (char *szFile,char *szPath) 
{ 
 char *p,*q; 
 strcpy (szPath,szFile); 
 p=szPath; 
 q=strchr(p,'/'); 
 while (q)                      /* get last '/' */ 
 { 
  p=++q; 
  q=strchr(q,'/'); 
 }; 
 *p='\0';                       /* remove filename */ 
} 
 
int main(int argc,char *argv[]) 
{ 
 TrapBadOps=0;LineDelay=1;CheckCRC=1;  
 VPeriod=69905;UPeriod=0; 
 Verbose=1; 
 
 memset (colorschemes,0,sizeof(colorschemes)); 
 memcpy (colorschemes,defcolorschemes,sizeof(defcolorschemes)); 
 SelectColorScheme (0); 
 
 memset (MainConfigFile,0,sizeof(MainConfigFile)); 
 memset (SubConfigFile,0,sizeof(SubConfigFile)); 
 strlwr (argv[0]); 
 GetPath (argv[0],ProgramPath); 
 _argc=1; 
 _argv[0]=argv[0]; 
/* Load Config Files */ 
 strcpy (szTempFileName,ProgramPath); 
 strcat (szTempFileName,"vgb-dos.cfg"); 
 strcpy (szGifFile,ProgramPath); 
 strcat (szGifFile,"vgb-dos.gif"); 
 LoadConfigFile (szTempFileName,MainConfigFile); 
 if (!ParseOptions(_argc,_argv)) 
  return 1; 
 GetCartName (argc,argv); 
 FixFileNames (); 
 strcpy (_SaveName,CartNameNoExt); 
 strcat (_SaveName,".sav"); 
 SaveName=_SaveName; 
 strcpy (szTempFileName,CartNameNoExt); 
 strcat (szTempFileName,".cfg"); 
 _argc=1; 
 LoadConfigFile (szTempFileName,SubConfigFile); 
 if (!ParseOptions(_argc,_argv)) 
  return 1; 
 if (!ParseOptions(argc,argv)) 
  return 1; 
 
 IntSync=1; 
 if (!IFreq) 
 { 
  IFreq=60; 
  IntSync=0; 
  if (!UPeriod) UPeriod=2; 
 } 
 if (IFreq<5) IFreq=5; 
 if (IFreq>500) IFreq=500; 
 
 StartGB(CartName); 
 TrashGB(); 
 return(0); 
}