📄 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 <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <sys/stat.h>
#include <conio.h>
#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;N++)
{
misparm=0;
if(*argv[N]!='-')
{
if(I++)
{
printf("Excessive filename '%s'\n",argv[N]);
return 0;
}
}
else
{
for(J=0;Options[J];J++)
if(!strcmp(argv[N]+1,Options[J])) break;
if (!Options[J])
for(J=0;AbvOptions[J];J++)
if(!strcmp(argv[N]+1,AbvOptions[J])) break;
switch(J)
{
case 0: N++;
if(N<argc)
{ Verbose=atoi(argv[N]);TrapBadOps=Verbose&0x04; }
else misparm=1;
break;
case 1: N++;
if(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) ColorNames[0]=ColorNames[4]=ColorNames[8]=argv[N];
else misparm=1;
break;
case 10: N++;
if(N<argc) ColorNames[1]=ColorNames[5]=ColorNames[9]=argv[N];
else misparm=1;
break;
case 11: N++;
if(N<argc) ColorNames[2]=ColorNames[6]=ColorNames[10]=argv[N];
else misparm=1;
break;
case 12: N++;
if(N<argc) ColorNames[3]=ColorNames[7]=ColorNames[11]=argv[N];
else misparm=1;
break;
case 18: N++;
if(N<argc)
videomode=atoi(argv[N]);
else
misparm=1;
break;
case 19: N++;
if(N<argc)
soundmode=atoi(argv[N]);
else
misparm=1;
break;
case 20: N++;
if(N<argc)
mastervolume=atoi(argv[N]);
else
misparm=1;
break;
case 21: N++;
if(N<argc)
{
_fixpath (argv[N],szGifFile);
strlwr (szGifFile);
if (strchr(szGifFile,'.')==0)
strcat (szGifFile,".gif");
}
else
misparm=1;
break;
case 22: N++;
if(N<argc)
IFreq=atoi(argv[N]);
else
misparm=1;
break;
case 23: N++;
if(N<argc)
swapbuttons=atoi(argv[N]);
else
misparm=1;
break;
case 24: N++;
if(N<argc)
SelectColorScheme (atoi(argv[N]));
else
misparm=1;
break;
case 25: if((N+5)<argc)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -