Files
ZSNES/zsnes/src/cfgload.c

1525 lines
41 KiB
C

/*
Copyright (C) 1997-2005 ZSNES Team ( zsKnight, _Demo_, pagefault, Nach )
http://www.zsnes.com
http://sourceforge.net/projects/zsnes
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 the Free Software Foundation; either
version 2 of the License, or (at your option) any later
version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#ifdef __UNIXSDL__
#include "gblhdr.h"
#else
#include <io.h>
#include <stdio.h>
#include <string.h>
#ifndef _MSC_VER
#include <unistd.h>
#else
#include <direct.h>
#endif
#endif
#define StringA "FRAMESKIP"
#define StringB "AUTOFRAMESKIP"
#define StringC "PLAYER1DEVICE"
#define StringD "PLAYER2DEVICE"
#define StringE "SCANKEY1"
#define StringF "SCANKEY2"
#define StringG "SOUND"
#define StringH "SOUNDRATE"
#ifdef __WIN32__
#define StringI "VIDEOMODEWIN"
#endif
#ifdef __UNIXSDL__
#define StringI "VIDEOMODELIN"
#endif
#ifdef __MSDOS__
#define StringI "VIDEOMODEDOS"
#endif
#define StringJ "EXECUTE"
#define StringM "STEREO"
#define StringN "GUIDISABLE"
#define StringO "SCANLINES"
#define StringP "INTERPOLATION"
#define StringQ "ENTERSKIP"
#define StringR "FORCE8BIT"
#define StringS "SAVEDIRECTORY"
#define StringT "GAMEDIRECTORY"
#define StringU "JOYMAP1"
#define StringV "NEWGFX"
#define StringW "VSYNC"
#define StringX "VOLUME"
#define StringY "ECHODISABLE"
#define StringZ "REVERSESTEREO"
#define String1 "PL34TO12SHARE"
#define String2 "DONTSAVE"
#define String3 "REINITTIME"
#define ASCIIChar2Bool(x) (((x)-'0') ? 1 : 0)
extern char CMDLineStr[256];
extern char LoadDir[128];
extern char LoadDrive[2];
extern unsigned int pl2selk;
extern unsigned int pl2startk;
extern unsigned int pl2upk;
extern unsigned int pl2Ak;
extern unsigned int pl2Bk;
extern unsigned int pl2Lk;
extern unsigned int pl2Rk;
extern unsigned int pl2Xk;
extern unsigned int pl2Yk;
extern unsigned int pl2downk;
extern unsigned int pl2leftk;
extern unsigned int pl2rightk;
extern unsigned char pl2contrl;
extern unsigned int pl1selk;
extern unsigned int pl1startk;
extern unsigned int pl1upk;
extern unsigned int pl1Ak;
extern unsigned int pl1Bk;
extern unsigned int pl1Lk;
extern unsigned int pl1Rk;
extern unsigned int pl1Xk;
extern unsigned int pl1Yk;
extern unsigned int pl1downk;
extern unsigned int pl1leftk;
extern unsigned int pl1rightk;
extern unsigned char pl1contrl;
extern unsigned char JoyBC;
extern unsigned char JoyLC;
extern unsigned char JoyRC;
extern unsigned char JoySelec;
extern unsigned char JoyStart;
extern unsigned char JoyXC;
extern unsigned char JoyYC;
extern unsigned char JoyAC;
extern unsigned int per2exec;
extern unsigned int newengen;
extern char SRAMDrive[2];
extern unsigned char DontSavePath;
extern unsigned char guioff;
extern unsigned char frameskip;
extern unsigned char enterpress;
extern unsigned char cvidmode;
extern unsigned char antienab;
extern unsigned char StereoSound;
extern unsigned int SoundQuality;
extern unsigned char MusicRelVol;
extern unsigned char Force8b;
extern unsigned char scanlines;
extern unsigned char soundon;
extern unsigned char spcon;
extern unsigned char vsyncon;
extern unsigned char savecfgforce;
//extern void Open_File();
extern unsigned int ZFileRead();
extern unsigned int ZOpenMode;
extern unsigned int ZCloseFileHandle;
extern char *ZOpenFileName;
extern unsigned char *ZFileWriteBlock;
extern unsigned int ZFileWriteSize;
extern unsigned int ZFileWriteHandle;
extern unsigned char *ZFileReadBlock;
extern unsigned int ZFileReadHandle;
extern unsigned int ZFileReadSize;
extern unsigned int ZOpenFile(); //Create_File. Open_File
extern unsigned int ZFileWrite(); //Write_File();
extern unsigned int ZCloseFile(); //Close_File
#ifdef __UNIXSDL__
extern char zcfgdir[1024];
unsigned char cfgloadsdir = 1; //Set to yes, since savedir is always set and considered to be changed
#else
unsigned char cfgloadsdir = 0; //Only set to yes if modified in the paths window
#endif
char SRAMDir[1024];
char LoadDriveB[2];
char LoadDirB[128];
unsigned char cfgsoundon = 0;
unsigned char cfgSoundQuality = 5;
unsigned char cfgStereoSound = 1;
unsigned char cfgguioff = 0;
unsigned char cfgper2exec = 100;
unsigned char cfgcvidmode = 4;
unsigned char cfgscanline = 0;
unsigned char cfginterp = 0;
unsigned char cfgenterskip = 0;
unsigned char cfgforce8b = 0;
unsigned char cfgloadgdir = 0;
unsigned char cfgnewgfx = 0;
unsigned char cfgvsync = 0;
unsigned char cfgvolume = 75;
unsigned char cfgecho = 0;
unsigned char RevStereo = 0;
unsigned char JoyStatRead = 0;
unsigned char pl12s34 = 0;
unsigned char cfgdontsave = 0;
unsigned char cfgreinittime = 30;
#define ConvertJoyMapHelp(a,b,c)\
if(b == c) \
{\
if(c!=0)\
{ \
c+=0x81;\
a=c;\
}\
}
void ConvertJoyMap1()
{
unsigned int bl;
// Convert if 2,4,6, or sidewinder
if (pl1contrl == 2)
{
pl1Bk = 0x83;
pl1Yk = 0x82;
pl1upk = 0xCC;
pl1downk = 0xCD;
pl1leftk = 0xCE;
pl1rightk = 0xCF;
}
if (pl1contrl == 3 || pl1contrl == 4)
{
bl = 4;
}
else
{
bl = 0;
}
if (pl1contrl == 5)
{
bl = 6;
}
if (bl != 0)
{
// Convert button data
pl1upk = 0xCC;
pl1downk = 0xCD;
pl1leftk = 0xCE;
pl1rightk = 0xCF;
ConvertJoyMapHelp(JoyStart, bl, pl1startk);
ConvertJoyMapHelp(JoySelec, bl, pl1selk);
ConvertJoyMapHelp(JoyBC, bl, pl1Yk);
ConvertJoyMapHelp(JoyYC, bl, pl1Xk);
ConvertJoyMapHelp(JoyAC, bl, pl1Bk);
ConvertJoyMapHelp(JoyXC, bl, pl1Ak);
ConvertJoyMapHelp(JoyLC, bl, pl1Lk);
ConvertJoyMapHelp(JoyRC, bl, pl1Rk);
}
if (pl1contrl == 6)
{
pl1upk = 0xD4;
pl1downk = 0xD5;
pl1leftk = 0xD6;
pl1rightk = 0xD7;
pl1startk = 0xC8;
pl1selk = 0xC9;
pl1Ak = 0x89;
pl1Bk = 0x88;
pl1Xk = 0x8C;
pl1Yk = 0x8B;
pl1Lk = 0x8E;
pl1Rk = 0x8F;
}
return;
}
void ConvertJoyMap2()
{
unsigned int bl;
// mov al,[pl2contrl]
// Convert if 2,4,6, or sidewinder
//If pl1contrl=2 and pl2contrl=2, then set pl2 buttons to 3 & 4
if (pl2contrl == 2)
{
if (pl1contrl != 2)
{
pl2Bk = 0x83;
pl2Yk = 0x82;
pl2upk = 0xCC;
pl2downk = 0xCD;
pl2leftk = 0xCE;
pl2rightk = 0xCF;
}
else
{
pl2Bk = 0x85;
pl2Yk = 0x84;
pl2upk = 0xE8;
pl2downk = 0xE9;
pl2leftk = 0xEA;
pl2rightk = 0xEB;
}
}
if (pl2contrl == 3 || pl2contrl == 4)
{
bl = 4;
}
else
{
bl = 0;
}
if (pl2contrl == 5)
{
bl = 6;
}
if (bl != 0)
{
//Convert button data
pl2upk = 0xCC;
pl2downk = 0xCD;
pl2leftk = 0xCE;
pl2rightk = 0xCF;
ConvertJoyMapHelp(JoyStart, bl, pl2startk);
ConvertJoyMapHelp(JoySelec, bl, pl2selk);
ConvertJoyMapHelp(JoyBC, bl, pl2Yk);
ConvertJoyMapHelp(JoyYC, bl, pl2Xk);
ConvertJoyMapHelp(JoyAC, bl, pl2Bk);
ConvertJoyMapHelp(JoyXC, bl, pl2Ak);
ConvertJoyMapHelp(JoyLC, bl, pl2Lk);
ConvertJoyMapHelp(JoyRC, bl, pl2Rk);
}
//If both sidewinder, set pl2 buttons to sw2
if (pl2contrl == 6)
{
if (pl1contrl != 6)
{
pl2upk = 0xD4;
pl2downk = 0xD5;
pl2leftk = 0xD6;
pl2rightk = 0xD7;
pl2startk = 0xC8;
pl2selk = 0xC9;
pl2Ak = 0x89;
pl2Bk = 0x88;
pl2Xk = 0x8C;
pl2Yk = 0x8B;
pl2Lk = 0x8E;
pl2Rk = 0x8F;
}
else
{
pl2upk = 0xDC;
pl2downk = 0xDD;
pl2leftk = 0xDE;
pl2rightk = 0xDF;
pl2startk = 0xD0;
pl2selk = 0xD1;
pl2Ak = 0x91;
pl2Bk = 0x90;
pl2Xk = 0x94;
pl2Yk = 0x93;
pl2Lk = 0x96;
pl2Rk = 0x97;
pl2contrl = 7;
}
}
return;
}
void ConvertJoyMap()
{
if (JoyStatRead == 1)
{
ConvertJoyMap1();
ConvertJoyMap2();
}
return;
}
#define SAVE_LINE(a) fwrite(a, 1, strlen(a), fp)
#define WRITE_LINE(a) sprintf(buffer, a);\
SAVE_LINE(buffer);
void DOScreatenewcfg()
{
char buffer[4096];
FILE *fp = 0;
if (cfgdontsave && !savecfgforce)
{
return;
}
#ifdef __UNIXSDL__
chdir(zcfgdir);
#endif
fp = fopen(CMDLineStr, "wb");
if (!fp)
{
return;
}
WRITE_LINE("; ZSNES Configuration file\r\n\r\n");
WRITE_LINE("; Frame Skip: 0 = Auto, 1-10 = Skip 0 .. 9\r\n\r\n");
sprintf(buffer, "FrameSkip = %d\r\n\r\n", frameskip);
SAVE_LINE(buffer);
// WRITE_LINE("; Auto Frame Skip = 0 or 1 (1 = ON)\r\n\r\n");
// sprintf(buffer, "AutoFrameSkip = %d\r\n\r\n", (frameskip == 0) ? 1 : 0);
// SAVE_LINE(buffer);
WRITE_LINE("; Player 1/2 Input Device. Use the GUI to set these values\r\n");
WRITE_LINE("; NOTE : Using this to select joysticks manually will NOT work!\r\n\r\n");
sprintf(buffer, "Player1Device = %d\r\n", pl1contrl);
SAVE_LINE(buffer);
sprintf(buffer, "Player2Device = %d\r\n\r\n", pl2contrl);
SAVE_LINE(buffer);
WRITE_LINE("; Keyboard Scancodes/Joystick Mappings for Keyboard 1 & 2\r\n");
WRITE_LINE("; In order of Right, Left, Down, Up, Start, Select, B, Y, A, X, L, R\r\n");
WRITE_LINE("; Use the GUI to set these values\r\n\r\n");
sprintf(buffer, "ScanKey1 = %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d\r\n", pl1rightk, pl1leftk,
pl1downk, pl1upk, pl1startk, pl1selk, pl1Bk, pl1Yk, pl1Ak, pl1Xk, pl1Lk, pl1Rk);
SAVE_LINE(buffer);
sprintf(buffer, "ScanKey2 = %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d\r\n\r\n", pl2rightk, pl2leftk,
pl2downk, pl2upk, pl2startk, pl2selk, pl2Bk, pl2Yk, pl2Ak, pl2Xk, pl2Lk, pl2Rk);
SAVE_LINE(buffer);
WRITE_LINE("; Share Player 3 and 4 control inputs with Player 1 and 2 to allow\r\n");
WRITE_LINE("; 2 devices to be shared on a single player. This feature automatically\r\n");
WRITE_LINE("; disables MultiTap (Multiplayer 5) support. Set this to 1 to enable.\r\n\r\n");
sprintf(buffer, "Pl34to12Share = %d\r\n\r\n", pl12s34);
SAVE_LINE(buffer);
WRITE_LINE("; Percent to Execute [50 .. 150]\r\n\r\n");
sprintf(buffer, "Execute = %d\r\n\r\n", cfgper2exec);
SAVE_LINE(buffer);
#ifdef __WIN32__
WRITE_LINE("; Video Mode, 0 - 32\r\n");
WRITE_LINE("; 0 = 256x224 R WIN 1 = 256x224 R FULL\r\n");
WRITE_LINE("; 2 = 512x448 R WIN 3 = 512x448 DR WIN\r\n");
WRITE_LINE("; 4 = 640x480 S WIN 5 = 640x480 DS WIN\r\n");
WRITE_LINE("; 6 = 640x480 DR FULL 7 = 640x480 DS FULL\r\n");
WRITE_LINE("; 8 = 640x480 S FULL 9 = 768x672 R WIN\r\n");
WRITE_LINE("; 10 = 768x672 DR WIN 11 = 800x600 S WIN\r\n");
WRITE_LINE("; 12 = 800x600 DS WIN 13 = 800x600 S FULL\r\n");
WRITE_LINE("; 14 = 800x600 DR FULL 15 = 800x600 DS FULL\r\n");
WRITE_LINE("; 16 = 1024x768 S WIN 17 = 1024x768 DS WIN\r\n");
WRITE_LINE("; 18 = 1024x768 S FULL 19 = 1024x768 DR FULL\r\n");
WRITE_LINE("; 20 = 1024x768 DS FULL 21 = 1024x896 R WIN\r\n");
WRITE_LINE("; 22 = 1024x896 DR WIN 23 = 1280x960 S WIN\r\n");
WRITE_LINE("; 24 = 1280x960 DS WIN 25 = 1280x960 S FULL\r\n");
WRITE_LINE("; 26 = 1280x960 DR FULL 27 = 1280x960 DS FULL\r\n");
WRITE_LINE("; 28 = 1280x1024 S WIN 29 = 1280x1024 DS WIN\r\n");
WRITE_LINE("; 30 = 1280x1024 S FULL 31 = 1280x1024 DR FULL\r\n");
WRITE_LINE("; 32 = 1280x1024 DS FULL 33 = 1600x1200 S WIN\r\n");
WRITE_LINE("; 34 = 1600x1200 DS WIN 35 = 1600x1200 DR FULL\r\n");
WRITE_LINE("; 36 = 1600x1200 DS FULL\r\n\r\n");
sprintf(buffer, "VideoModeWin = %d\r\n\r\n", cfgcvidmode);
SAVE_LINE(buffer);
#endif
#ifdef __UNIXSDL__
#ifdef __OPENGL__
WRITE_LINE("; Video Mode, 0 - 21\r\n");
#else
WRITE_LINE("; Video Mode, 0 - 5\r\n");
#endif
WRITE_LINE("; 0 = 256x224 R WIN 1 = 256x224 R FULL\r\n");
WRITE_LINE("; 2 = 512x448 DR WIN 3 = 512x448 DR FULL\r\n");
WRITE_LINE("; 4 = 640x480 DR FULL 5 = 800x600 DR FULL\r\n");
#ifdef __OPENGL__
WRITE_LINE("; 6 = 256x224 OR WIN 7 = 512x448 ODR WIN\r\n");
WRITE_LINE("; 8 = 640x480 ODS FULL 9 = 640x480 ODS WIN\r\n");
WRITE_LINE("; 10 = 640x576 ODR WIN 11 = 768x672 ODR WIN\r\n");
WRITE_LINE("; 12 = 800x600 ODS FULL 13 = 800x600 ODS WIN\r\n");
WRITE_LINE("; 14 = 896x784 ODR WIN 15 = 1024x768 ODS FULL\r\n");
WRITE_LINE("; 16 = 1024x768 ODS WIN 17 = 1024x896 ODR WIN\r\n");
WRITE_LINE("; 18 = 1280x960 ODS FULL 19 = 1280x1024 ODS FULL\r\n");
WRITE_LINE("; 20 = 1600x1200 ODR FULL 21 = VARIABLE ODR WIN\r\n");
#endif
sprintf(buffer, "\r\nVideoModeLin = %d\r\n\r\n", cfgcvidmode);
SAVE_LINE(buffer);
#endif
#ifdef __MSDOS__
WRITE_LINE("; Video Mode, 0 - 18\r\n");
WRITE_LINE("; 0 = 256x224x8B (MODEQ) 1 = 256x240x8B (MODEQ)\r\n");
WRITE_LINE("; 2 = 256x256x8B (MODEQ) 3 = 320x224x8B (MODEX)\r\n");
WRITE_LINE("; 4 = 320x240x8B (MODEX) 5 = 320x256x8B (MODEX)\r\n");
WRITE_LINE("; 6 = 640x480x16B (VESA1) 7 = 320x240x8B (VESA2)\r\n");
WRITE_LINE("; 8 = 320x240x16B (VESA2) 9 = 320x480x8B (VESA2)\r\n");
WRITE_LINE("; 10 = 320x480x16B (VESA2) 11 = 512x384x8B (VESA2)\r\n");
WRITE_LINE("; 12 = 512x384x16B (VESA2) 13 = 640x400x8B (VESA2)\r\n");
WRITE_LINE("; 14 = 640x400x16B (VESA2) 15 = 640x480x8B (VESA2)\r\n");
WRITE_LINE("; 16 = 640x480x16B (VESA2) 17 = 800x600x8B (VESA2)\r\n");
WRITE_LINE("; 18 = 800x600x16B (VESA2)\r\n\r\n");
sprintf(buffer, "VideoModeDos = %d\r\n\r\n", cfgcvidmode);
SAVE_LINE(buffer);
#endif
WRITE_LINE("; Sound Emulation = 0 or 1 (1 = ON)\r\n\r\n");
sprintf(buffer, "Sound = %d\r\n\r\n", cfgsoundon);
SAVE_LINE(buffer);
WRITE_LINE("; Sound Sampling Rate\r\n");
WRITE_LINE("; 0 = 8,000 Hz, 1 = 11,025 Hz, 2 = 22,050 Hz\r\n");
WRITE_LINE("; 3 = 44,100 Hz, 4 = 16,000 Hz, 5 = 32,000 Hz\r\n");
WRITE_LINE("; 6 = 48,000 Hz\r\n\r\n");
sprintf(buffer, "SoundRate = %d\r\n\r\n", cfgSoundQuality);
SAVE_LINE(buffer);
WRITE_LINE("; Stereo (0 = off, 1 = on)\r\n\r\n");
sprintf(buffer, "Stereo = %d\r\n\r\n", cfgStereoSound);
SAVE_LINE(buffer);
WRITE_LINE("; Stereo Reversed. Swaps left channel with right. (0 = off, 1 = L <-> R)\r\n\r\n");
sprintf(buffer, "ReverseStereo = %d\r\n\r\n", RevStereo);
SAVE_LINE(buffer);
WRITE_LINE("; GUI Disable (1 = Disable GUI, 0 = Enable GUI)\r\n\r\n");
sprintf(buffer, "GUIDisable = %d\r\n\r\n", cfgguioff);
SAVE_LINE(buffer);
WRITE_LINE("; New Graphics Engine (1 = Enable, 0 = Disable)\r\n");
#ifdef __MSDOS__
WRITE_LINE("; All 256 color modes and 320x240x65536 supported\r\n");
#endif
sprintf(buffer, "\r\nNewGfx = %d\r\n\r\n", cfgnewgfx);
SAVE_LINE(buffer);
WRITE_LINE("; Scanlines (0 = Disable, 1 = Full, 2 = 25%%, 3 = 50%%)\r\n");
#ifdef __MSDOS__
WRITE_LINE("; 256x256x256 or 640x480 modes only (25%% and 50%% in 640x480x65536 mode only)\r\n");
#endif
sprintf(buffer, "\r\nScanlines = %d\r\n", cfgscanline);
SAVE_LINE(buffer);
#ifdef __MSDOS__
WRITE_LINE("\r\n; Interpolation (1 = Enable, 0 = Disable) - 640x480x65536 mode only\r\n");
WRITE_LINE("; This option also Enables EAGLE - 640x480x256 mode only\r\n");
#else
WRITE_LINE("; Interpolation (1 = Enable, 0 = Disable)\r\n");
#endif
sprintf(buffer, "\r\nInterpolation = %d\r\n\r\n", cfginterp);
SAVE_LINE(buffer);
#ifndef __UNIXSDL__
WRITE_LINE("; VSync (1 = Enable, 0 = Disable) - Wait for Vertical Sync (Fast cpu reqd)\r\n\r\n");
sprintf(buffer, "VSync = %d\r\n\r\n", cfgvsync);
SAVE_LINE(buffer);
#endif
#ifdef __MSDOS__
WRITE_LINE("; Skip Enter Press at Beginning (1 = Yes, 0 = No)\r\n\r\n");
sprintf(buffer, "EnterSkip = %d\r\n\r\n", cfgenterskip);
SAVE_LINE(buffer);
WRITE_LINE("; Force 8-bit sound on (1 = Yes, 0 = No)\r\n\r\n");
sprintf(buffer, "Force8bit = %d\r\n\r\n", cfgforce8b);
SAVE_LINE(buffer);
#endif
WRITE_LINE("; Disable Echo (1 = Yes, 0 = No)\r\n\r\n");
sprintf(buffer, "EchoDisable = %d\r\n\r\n", cfgecho);
SAVE_LINE(buffer);
WRITE_LINE("; Sound Volume Level (0 .. 100)\r\n");
WRITE_LINE("; Note : Setting this too high can cause sound overflow which degrades quality\r\n\r\n");
sprintf(buffer, "Volume = %d\r\n\r\n", cfgvolume);
SAVE_LINE(buffer);
WRITE_LINE("; Set this to 1 if you do not want ZSNES to save the configuration files.\r\n\r\n");
sprintf(buffer, "DontSave = %d\r\n\r\n", cfgdontsave);
SAVE_LINE(buffer);
WRITE_LINE("; Savefile directory. Leave it blank if you want the save files to be in the\r\n");
WRITE_LINE("; same directory as the games. It should be in a format like : C:\\dir\\dir\r\n\r\n");
if (cfgloadsdir)
{
sprintf(buffer, "SaveDirectory = %s\r\n\r\n", SRAMDir);
}
else
{
sprintf(buffer, "SaveDirectory = \r\n\r\n");
}
SAVE_LINE(buffer);
WRITE_LINE("; Game directory. This is the directory where the GUI starts at.\r\n");
WRITE_LINE("; ZSNES automatically writes the current directory here upon exit.\r\n\r\n");
if (DontSavePath != 1)
{
#ifdef __UNIXSDL__
sprintf(buffer, "GameDirectory = %s\r\n\r\n", LoadDir);
#else
sprintf(buffer, "GameDirectory = %c:\\%s\r\n", (char) (*LoadDrive + 65), LoadDir);
#endif
}
else
{
#ifdef __UNIXSDL__
sprintf(buffer, "GameDirectory = %s\r\n\r\n", LoadDirB);
#else
sprintf(buffer, "GameDirectory = %c:\\%s\r\n", (char) (*LoadDriveB + 65), LoadDirB);
#endif
}
SAVE_LINE(buffer);
fclose(fp);
}
unsigned char _per2exec;
unsigned char _volume;
unsigned short _fileloc;
unsigned char _eofile;
unsigned char _ignore;
unsigned int _strlen;
unsigned int _stralen; // actual string length
unsigned int _strlena;
unsigned int _strlenb;
unsigned char _cchar;
unsigned char _forceauto;
char _string[128]; // full string
char _stringa[128];
char _stringb[128];
unsigned char _usespace;
void getcfg()
{
unsigned char button_select = 0;
int i = 0, j = 0;
char temp;
unsigned char no_save = 0;
_forceauto = 0;
//open file
ZOpenFileName = CMDLineStr;
ZOpenMode = 0;
i = ZOpenFile();
if (-1 != i)
{
_fileloc = i;
//mov [.fileloc],ax //handled above
_eofile = 0;
ZFileReadHandle = _fileloc;
ZFileReadSize = 1;
ZFileReadBlock = &_cchar;
do
{
_strlen = 0;
_stralen = 0;
_ignore = 0;
while (0 != (i = ZFileRead()))
{
if (_cchar == ';')
{
_strlen++;
_ignore = 1;
continue;
}
else if (_cchar == 13)
{
}
else if (_cchar == 10)
break;
else
{
if (_strlen <= 127)
{
if (_ignore != 1)
{
_string[_stralen] = _cchar;
_stralen++;
}
}
_strlen++;
}
}
if (i == 0)
_eofile = 1;
if (_stralen > 1)
{
_string[_stralen] = '\0';
//; search for ='s
i = 0;
j = 0;
do
{
if (_string[i] == '=')
j++;
i++;
}
while ((unsigned)i < _stralen);
if (j == 1)
{
i = 0;
j = 0;
_strlena = 0;
_strlenb = 0;
while ((unsigned)i < _stralen)
{
if (_string[i] == '=')
{
i++;
if ((unsigned)i == _stralen)
continue;
j = 0;
_usespace = 0;
while ((unsigned)i < _stralen)
{
temp = _string[i];
if (_usespace || temp != ' ')
{
#ifndef __UNIXSDL__
if (temp >= 'a' && temp <= 'z')
temp -= ('a' - 'A');
#endif
_usespace = 1;
_stringb[j] = temp;
_strlenb++;
j++;
}
i++;
}
_stringb[_strlenb] = '\0';
}
else
{
if (_string[i] != ' ')
{
temp = _string[i];
if (_string[i] >= 'a' && _string[i] <= 'z')
{
temp -= ('a' - 'A');
}
_stringa[j] = temp;
_strlena++;
j++;
}
i++;
}
}
_stringa[_strlena] = '\0';
no_save = 0;
if (_strlena != 0 && _strlenb != 0)
{
if (_strlena == strlen(StringA))
{
if (!strcmp(StringA, _stringa))
{
if (_strlenb == 1)
{
if (*_stringb >= '0' && *_stringb <= '9')
{
if (_forceauto != 1)
{
frameskip = *_stringb - 48;//shouldn't this be 48??
}
}
}
}
}
if (_strlena == strlen(StringB))
{
if (!strcmp(StringB, _stringa))
{
if (_strlenb == 1)
{
if (*_stringb == '1')
{
_forceauto = 1;
frameskip = 0;
}
}
}
}
if (_strlena == strlen(StringC))
{
if (!strcmp(_stringa, StringC))
{
if (_strlenb == 2)
{
if (*_stringb == '1')
{
if (_stringb[1] >= '0' && _stringb[1] <= '8')
{
pl1contrl = _stringb[1] - 38;
}
}
}
else if (_strlenb == 1)
{
if (*_stringb >= '0' && *_stringb <= '9')
{
pl1contrl = *_stringb - 48;
}
}
}
}
if (_strlena == strlen(StringD))
{
if (!strcmp(_stringa, StringD))
{
if (_strlenb == 2)
{
if (*_stringb == '1')
{
if (_stringb[1] >= '0' && _stringb[1] <= '8')
{
pl2contrl = _stringb[1] - 38;
}
}
}
if (_strlenb == 1)
{
if (*_stringb >= '0' && *_stringb <= '9')
{
pl2contrl = *_stringb - 48;
}
}
}
}
if (_strlena == strlen(StringE))
{
if (!strcmp(_stringa, StringE))
{
i = 0;
j = 0;
button_select = 0;
while (_strlenb > 0)
{
if (_stringb[i] != ',')
{
if (_stringb[i] < '0' || _stringb[i] > '9')
{
i++;
_strlenb--;
continue;
}
j *= 10;
j += ((_stringb[i] - 48) & 0xFF);
}
if (_stringb[i] == ',')
{
// In order of Right, Left, Down, Up, Start, Select, A, B, X, Y, L, R
if (button_select == 0)
pl1rightk = j;
if (button_select == 1)
pl1leftk = j;
if (button_select == 2)
pl1downk = j;
if (button_select == 3)
pl1upk = j;
if (button_select == 4)
pl1startk = j;
if (button_select == 5)
pl1selk = j;
if (button_select == 6)
pl1Bk = j;
if (button_select == 7)
pl1Yk = j;
if (button_select == 8)
pl1Ak = j;
if (button_select == 9)
pl1Xk = j;
if (button_select == 10)
pl1Lk = j;
if (button_select == 11)
pl1Rk = j;
j = 0;
button_select++;
}
i++;
_strlenb--;
}
if (_strlenb == 0)
{
// In order of Right, Left, Down, Up, Start, Select, A, B, X, Y, L, R
if (button_select == 0)
pl1rightk = j;
if (button_select == 1)
pl1leftk = j;
if (button_select == 2)
pl1downk = j;
if (button_select == 3)
pl1upk = j;
if (button_select == 4)
pl1startk = j;
if (button_select == 5)
pl1selk = j;
if (button_select == 6)
pl1Bk = j;
if (button_select == 7)
pl1Yk = j;
if (button_select == 8)
pl1Ak = j;
if (button_select == 9)
pl1Xk = j;
if (button_select == 10)
pl1Lk = j;
if (button_select == 11)
pl1Rk = j;
}
}
}
if (_strlena == strlen(StringF))
{
if (!strcmp(_stringa, StringF))
{
i = 0;
j = 0;
button_select = 0;
while (_strlenb != 0)
{
if (_stringb[i] != ',')
{
if (_stringb[i] < '0' || _stringb[i] > '9')
{
i++;
_strlenb--;
continue;
}
j *= 10;
j += ((_stringb[i] - 48) & 0xFF);
}
if (_stringb[i] == ',')
{
// In order of Right, Left, Down, Up, Start, Select, A, B, X, Y, L, R
if (button_select == 0)
pl2rightk = j;
if (button_select == 1)
pl2leftk = j;
if (button_select == 2)
pl2downk = j;
if (button_select == 3)
pl2upk = j;
if (button_select == 4)
pl2startk = j;
if (button_select == 5)
pl2selk = j;
if (button_select == 6)
pl2Bk = j;
if (button_select == 7)
pl2Yk = j;
if (button_select == 8)
pl2Ak = j;
if (button_select == 9)
pl2Xk = j;
if (button_select == 10)
pl2Lk = j;
if (button_select == 11)
pl2Rk = j;
j = 0;
button_select++;
}
i++;
_strlenb--;
}
if (_strlenb == 0)
{
// In order of Right, Left, Down, Up, Start, Select, A, B, X, Y, L, R
if (button_select == 0)
pl2rightk = j;
if (button_select == 1)
pl2leftk = j;
if (button_select == 2)
pl2downk = j;
if (button_select == 3)
pl2upk = j;
if (button_select == 4)
pl2startk = j;
if (button_select == 5)
pl2selk = j;
if (button_select == 6)
pl2Bk = j;
if (button_select == 7)
pl2Yk = j;
if (button_select == 8)
pl2Ak = j;
if (button_select == 9)
pl2Xk = j;
if (button_select == 10)
pl2Lk = j;
if (button_select == 11)
pl2Rk = j;
j = 0;
button_select++;
}
}
}
if (_strlena == strlen(StringG))
{
if (!strcmp(_stringa, StringG))
{
if (_strlenb == 1)
{
spcon = ASCIIChar2Bool(*_stringb); // SPC Enabled?
soundon = ASCIIChar2Bool(*_stringb);
cfgsoundon = ASCIIChar2Bool(*_stringb);
}
}
}
if (_strlena == strlen(StringH))
{
if (!strcmp(_stringa, StringH))
{
if (_strlenb == 1)
{
if (*_stringb >= '0' && *_stringb <= '6')
{
SoundQuality = *_stringb - 48;
cfgSoundQuality = *_stringb - 48;
}
}
}
}
if (_strlena == strlen(StringI))
{
if (!strcmp(_stringa, StringI))
{
if (_strlenb == 2)
{
if (*_stringb == '1')
{
cvidmode = _stringb[1] - 38;
cfgcvidmode = _stringb[1] - 38;
}
if (*_stringb == '2')
{
cvidmode = _stringb[1] - 28;
cfgcvidmode = _stringb[1] - 28;
}
if (*_stringb == '3')
{
cvidmode = _stringb[1] - 18;
cfgcvidmode = _stringb[1] - 18;
}
}
else if (_strlenb == 1)
{
if (*_stringb >= '0' && *_stringb <= '9')
{
cvidmode = *_stringb - 48;
cfgcvidmode = *_stringb - 48;
}
}
}
}
if (_strlena == strlen(StringJ))
{
if (!strcmp(_stringa, StringJ))
{
if (_strlenb != 0)
{
i = 0;
_per2exec = 0;
do
{
if (_per2exec >= 100)
{
no_save = 1;
break; //needs to go pasr setting the vars.
}
_per2exec *= 10;
if (_stringb[i] >= '0' && _stringb[i] <= '9')
{
_per2exec += (_stringb[i] - 48);
}
else
{
no_save = 1;
break; //needs to go pasr setting the vars.
}
i++;
}
while ((unsigned)i < _strlenb);
if ((_per2exec<150 && _per2exec>50) && !no_save)
{
per2exec = _per2exec;
cfgper2exec = _per2exec;
}
}
}
}
if (_strlena == strlen(StringM))
{
if (!strcmp(StringM, _stringa))
{
if (_strlenb == 1)
{
StereoSound = ASCIIChar2Bool(*_stringb);
cfgStereoSound = ASCIIChar2Bool(*_stringb);
}
}
}
if (_strlena == strlen(StringN))
{
if (!strcmp(StringN, _stringa))
{
if (_strlenb == 1)
{
if (*_stringb == '1')
{
guioff = 1;
cfgguioff = 1;
}
}
}
}
if (_strlena == strlen(StringO))
{
if (!strcmp(StringO, _stringa))
{
if (_strlenb == 1)
{
if (*_stringb == '1')
{
scanlines = 1;
cfgscanline = 1;
}
if (*_stringb == '2')
{
scanlines = 2;
cfgscanline = 2;
}
if (*_stringb == '3')
{
scanlines = 3;
cfgscanline = 3;
}
}
}
}
if (_strlena == strlen(StringP))
{
if (!strcmp(_stringa, StringP))
{
if (_strlenb == 1)
{
if (*_stringb == '1')
{
antienab = 1;
cfginterp = 1;
}
}
}
}
if (_strlena == strlen(StringQ))
{
if (!strcmp(_stringa, StringQ))
{
if (_strlenb == 1)
{
if (*_stringb == '1')
{
enterpress = 1;
cfgenterskip = 1;
}
}
}
}
if (_strlena == strlen(StringR))
{
if (!strcmp(_stringa, StringR))
{
if (_strlenb == 1)
{
if (*_stringb == '1')
{
Force8b = 1;
cfgforce8b = 1;
}
}
}
}
if (_strlena == strlen(StringS))
{
if (!strcmp(_stringa, StringS))
{
if (_strlenb >= 1)
{
cfgloadsdir = 1;
strncpy(SRAMDir, _stringb, _strlenb);
SRAMDir[_strlenb]='\0';
}
}
}
if (_strlena == strlen(StringT))
{
if (!strcmp(_stringa, StringT))
{
if (_strlenb >= 3)
{
#ifndef __UNIXSDL__
if (_stringb[1] == ':' && _stringb[2] == '\\')
{
cfgloadgdir = 1;
*LoadDrive = (char) (_stringb[0] - 65);
LoadDriveB[0] = _stringb[0] - 65;
strncpy(LoadDir, _stringb + 3, _strlenb - 3);
*(LoadDir + (_strlenb - 3)) = '\0';
#else
cfgloadgdir = 1;
strncpy(LoadDir, _stringb, _strlenb);
LoadDir[_strlenb] = '\0';
#endif
strcpy(LoadDirB, LoadDir);
#ifndef __UNIXSDL__
}
#endif
}
}
}
if (_strlena == strlen(StringU))
{
if (!strcmp(_stringa, StringU))
{
JoyStatRead = 1;
i = 0;
button_select = 0;
j = 0;
while (_strlenb != 0)
{
if (_stringb[i] != ',')
{
if (_stringb[i] < '0' || _stringb[i] > '9')
{
i++;
_strlenb--;
continue;
}
j *= 10;
j += (_stringb[i] - 48);
}
if (_strlenb == 0 || _stringb[i] == ',')
{
// In order of Start, Select, B, Y, A, X, L, R
if (button_select == 0)
JoyStart = j;
if (button_select == 1)
JoySelec = j;
if (button_select == 2)
JoyBC = j;
if (button_select == 3)
JoyYC = j;
if (button_select == 4)
JoyAC = j;
if (button_select == 5)
JoyXC = j;
if (button_select == 6)
JoyLC = j;
if (button_select == 7)
JoyRC = j;
j = 0;
button_select++;
}
i++;
_strlenb--;
}
}
}
if (_strlena == strlen(StringV))
{
if (!strcmp(_stringa, StringV))
{
if (_strlenb == 1)
{
if (*_stringb == '1')
{
newengen = 1;
cfgnewgfx = 1;
}
}
}
}
if (_strlena == strlen(StringW))
{
if (!strcmp(_stringa, StringW))
{
if (_strlenb == 1)
{
if (*_stringb == '1')
{
vsyncon = 1;
cfgvsync = 1;
}
}
}
}
if (_strlena == strlen(StringX))
{
if (!strcmp(_stringa, StringX))
{
if (_strlenb != 0)
{
i = 0;
_volume = 0;
do
{
if (_volume >= 100)
{
no_save = 1;
break; //needs to go pasr setting the vars.
}
_volume *= 10;
if (_stringb[i] >= '0' && _stringb[i] <= '9')
_volume += (_stringb[i] - 48);
else
{
no_save = 1;
break; //needs to go pasr setting the vars.
}
i++;
}
while ((unsigned)i < _strlenb);
if (_volume <= 100 && !no_save)
{
MusicRelVol = _volume;
cfgvolume = _volume;
}
}
}
}
if (_strlena == strlen(StringY))
{
if (!strcmp(_stringa, StringY))
{
if (_strlenb == 1)
{
if (*_stringb == '1')
cfgecho = 1;
}
}
}
if (_strlena == strlen(StringZ))
{
if (!strcmp(_stringa, StringZ))
{
if (_strlenb == 1)
{
if (*_stringb == '1')
RevStereo = 1;
}
}
}
if (_strlena == strlen(String1))
{
if (!strcmp(String1, _stringa))
{
if (_strlenb == 1)
{
if (*_stringb == '1')
pl12s34 = 1;
}
}
}
if (_strlena == strlen(String2))
{
if (!strcmp(_stringa, String2))
{
if (_strlenb == 1)
{
if (*_stringb == '1')
cfgdontsave = 1;
}
}
}
if (_strlena == strlen(String3))
{
if (!strcmp(_stringa, String3))
{
if (_strlenb == 0)
{
i = 0;
_per2exec = 0;
do
{
if (_per2exec >= 100)
{
no_save = 1;
break; //should go past the setting of cfgreinit
}
_per2exec *= 10;
if (_stringb[i] >= '0' && _stringb[i] <= '9')
{
_per2exec += (_stringb[i] - 48);
}
else
{
no_save = 1;
break;
}
i++;
}
while ((unsigned)i < _strlenb);
if ((_per2exec<150 && _per2exec>5) && !no_save)//shouldn't this be 50?
cfgreinittime = _per2exec;
}
}
}
}
}
}
}
while (_eofile == 0);
ZCloseFileHandle = _fileloc;
ZCloseFile();
}
else
{
DOScreatenewcfg();
}
}
unsigned char SRAMChdirFail = 0;
void SRAMChdir()
{
if (!chdir(SRAMDir))
{
SRAMChdirFail = 0;
}
else
{
SRAMChdirFail = 1;
}
}
void SRAMDirCurDir()
{
getcwd(SRAMDir,1024);
}
void UpChdir()
{
chdir("..");
}