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); }