diff --git a/src/config.cpp b/src/config.cpp index a9dfdee6..e6aa7db6 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -28,7 +28,7 @@ FCEUX\n\ \n\ "__TIME__" "__DATE__"\n"; - char *compilerString = FCEUD_GetCompilerString(); + const char *compilerString = FCEUD_GetCompilerString(); //allocate the string and concatenate the template with the compiler string if(aboutString) free(aboutString); diff --git a/src/driver.h b/src/driver.h index 9b663df4..72fbb586 100644 --- a/src/driver.h +++ b/src/driver.h @@ -10,7 +10,7 @@ FILE *FCEUD_UTF8fopen(const char *fn, const char *mode); //mbg 7/23/06 -char *FCEUD_GetCompilerString(); +const char *FCEUD_GetCompilerString(); /* This makes me feel dirty for some reason. */ void FCEU_printf(char *format, ...); @@ -21,7 +21,7 @@ void FCEUD_SetPalette(uint8 index, uint8 r, uint8 g, uint8 b); void FCEUD_GetPalette(uint8 i,uint8 *r, uint8 *g, uint8 *b); /* Displays an error. Can block or not. */ -void FCEUD_PrintError(char *s); +void FCEUD_PrintError(const char *s); void FCEUD_Message(const char *s); /* Network interface */ diff --git a/src/drivers/common/config.cpp b/src/drivers/common/config.cpp index 6a2642ea..15e8f8b5 100644 --- a/src/drivers/common/config.cpp +++ b/src/drivers/common/config.cpp @@ -126,7 +126,8 @@ void SaveParse(const CFGSTRUCT *cfgst, FILE *fp) if(*(char **)cfgst[x].ptr) { // Only save it if there IS a string. - SetValueR(fp,cfgst[x].name,*(char **)cfgst[x].ptr, strlen(*(char **)cfgst[x].ptr)+1); + unsigned int len = strlen(*(char **)cfgst[x].ptr); + SetValueR(fp,cfgst[x].name,*(char **)cfgst[x].ptr, len + 1); } } diff --git a/src/drivers/win/config.cpp b/src/drivers/win/config.cpp index b243b426..41a21279 100644 --- a/src/drivers/win/config.cpp +++ b/src/drivers/win/config.cpp @@ -70,7 +70,6 @@ static CFGSTRUCT fceuconfig[] = { NACS("odstates",directory_names[3]), NACS("odsnaps",directory_names[4]), NACS("odbase",directory_names[5]), - NACS("odbase",directory_names[6]), AC(winspecial), AC(winsizemulx), diff --git a/src/drivers/win/main.cpp b/src/drivers/win/main.cpp index 3815198c..ba62f0dc 100644 --- a/src/drivers/win/main.cpp +++ b/src/drivers/win/main.cpp @@ -28,7 +28,6 @@ #undef LPCWAVEFORMATEX #include "dsound.h" #include "dinput.h" -//#include //mbg merge 7/17/06 removed #include #include // For directories configuration dialog. #undef uint8 @@ -51,14 +50,44 @@ #include "tracer.h" #include "cdlogger.h" -//#include "memwatch.h" //mbg merge 7/19/06 removed-memwatch is gone #include "basicbot.h" +// #defines + #define VNSCLIP ((eoptions&EO_CLIPSIDES)?8:0) #define VNSWID ((eoptions&EO_CLIPSIDES)?240:256) -uint8 *xbsave=NULL; -int eoptions=EO_BGRUN | EO_FORCEISCALE; +#define SO_FORCE8BIT 1 +#define SO_SECONDARY 2 +#define SO_GFOCUS 4 +#define SO_D16VOL 8 +#define SO_MUTEFA 16 +#define SO_OLDUP 32 + +#define GOO_DISABLESS 1 /* Disable screen saver when game is loaded. */ +#define GOO_CONFIRMEXIT 2 /* Confirmation before exiting. */ +#define GOO_POWERRESET 4 /* Confirm on power/reset. */ + +//--------------------------- +//mbg merge 6/29/06 - new aboutbox + +#ifdef _M_X64 + #define _MSVC_ARCH "x64" +#else + #define _MSVC_ARCH "x86" +#endif +#ifdef _DEBUG + #define _MSVC_BUILD "debug" +#else + #define _MSVC_BUILD "release" +#endif +#define __COMPILER__STRING__ "msvc " _Py_STRINGIZE(_MSC_VER) " " _MSVC_ARCH " " _MSVC_BUILD +#define _Py_STRINGIZE(X) _Py_STRINGIZE1((X)) +#define _Py_STRINGIZE1(X) _Py_STRINGIZE2 ## X +#define _Py_STRINGIZE2(X) #X +//re: http://72.14.203.104/search?q=cache:HG-okth5NGkJ:mail.python.org/pipermail/python-checkins/2002-November/030704.html+_msc_ver+compiler+version+string&hl=en&gl=us&ct=clnk&cd=5 + +// External functions void ResetVideo(void); void ShowCursorAbs(int w); @@ -67,6 +96,13 @@ void FixWXY(int pref); void SetMainWindowStuff(void); int GetClientAbsRect(LPRECT lpRect); void UpdateFCEUWindow(void); +void FCEUD_Update(uint8 *XBuf, int32 *Buffer, int Count); +void ApplyDefaultCommandMapping(void); + +// Internal variables + +uint8 *xbsave = NULL; +int eoptions=EO_BGRUN | EO_FORCEISCALE; /** * Handle of the main window. @@ -92,6 +128,7 @@ static char *directory_names[6] = {0, 0, 0, 0, 0, 0}; static const char *default_directory_names[5] = {"cheats", "sav", "fcs", "snaps", "movie"}; #define NUMBER_OF_DIRECTORIES sizeof(directory_names) / sizeof(*directory_names) +#define NUMBER_OF_DEFAULT_DIRECTORIES sizeof(default_directory_names) / sizeof(*default_directory_names) static char TempArray[2048]; @@ -100,7 +137,71 @@ static char TempArray[2048]; **/ static char BaseDirectory[2048]; -void SetDirs(void) +static int exiting = 0; +static volatile int moocow = 0; + +/* Some timing-related variables (now ignored). */ +static int maxconbskip = 32; /* Maximum consecutive blit skips. */ +static int ffbskip = 32; /* Blit skips per blit when FF-ing */ + +static int moviereadonly = 1; + +static int fullscreen = 0; +static int soundflush = 0; +// Flag that indicates whether Game Genie is enabled or not. +static int genie = 0; + +// Flag that indicates whether PAL Emulation is enabled or not. +static int pal_emulation = 0; +static int status_icon = 1; +static int windowedfailed; +static double saspectw = 1, saspecth = 1; +static double winsizemulx = 1, winsizemuly = 1; +static int winwidth, winheight; +static int ismaximized = 0; + +static volatile int nofocus = 0; +static volatile int _userpause = 0; //mbg merge 7/18/06 changed tasbuild was using this only in a couple of places + +static uint32 goptions = GOO_DISABLESS; + +static int soundrate = 44100; +static int soundbuftime = 50; +/*static*/ int soundoptions = SO_SECONDARY | SO_GFOCUS; +static int soundvolume = 100; +static int soundquality = 0; +extern int autoHoldKey, autoHoldClearKey; +extern int frame_display, input_display; + +//mbg merge 7/17/06 did these have to be unsigned? +static int srendline, erendline; +static int srendlinen = 8; +static int erendlinen = 231; +static int srendlinep = 0; +static int erendlinep = 239; +static int totallines; + +static uint8 cpalette[192]; +static int vmod = 0; +int soundo = 1; +static int ntsccol = 0, ntsctint, ntschue; + +//mbg 6/30/06 - indicates that the main loop should close the game as soon as it can +int closeGame = 0; + +static int changerecursive=0; + +// qfox 09/17/06: moved the skipcount outside because it was completely pointless +// in there. +/** + * Counts the number of frames that have not been displayed + * Used for the bot, to skip frames (and save time). + **/ +int skipcount = 0; + +// Internal functions + +void SetDirs() { int x; @@ -128,17 +229,56 @@ void SetDirs(void) FCEUI_SetBaseDirectory(BaseDirectory); } } -/* Remove empty, unused directories. */ -void RemoveDirs(void) -{ - int x; - for(x=0;x<5;x++) - if(!directory_names[x]) - { - sprintf(TempArray,"%s\\%s",directory_names[5]?directory_names[5]:BaseDirectory,default_directory_names[x]); - RemoveDirectory(TempArray); - } +/** +* Creates a directory. +* +* @param dirname Name of the directory to create. +**/ +void DirectoryCreator(const char* dirname) +{ + CreateDirectory(dirname, 0); +} + +/** +* Removes a directory. +* +* @param dirname Name of the directory to remove. +**/ +void DirectoryRemover(const char* dirname) +{ + RemoveDirectory(dirname); +} + +/** +* Used to walk over the default directories array. +* +* @param callback Callback function that's called for every default directory name. +**/ +void DefaultDirectoryWalker(void (*callback)(const char*)) +{ + unsigned int curr_dir; + + for(curr_dir = 0; curr_dir < NUMBER_OF_DEFAULT_DIRECTORIES; curr_dir++) + { + if(!directory_names[curr_dir]) + { + sprintf( + TempArray, + "%s\\%s", + directory_names[NUMBER_OF_DEFAULT_DIRECTORIES] ? directory_names[NUMBER_OF_DEFAULT_DIRECTORIES] : BaseDirectory, + default_directory_names[curr_dir] + ); + + callback(TempArray); + } + } +} + +/* Remove empty, unused directories. */ +void RemoveDirs() +{ + DefaultDirectoryWalker(DirectoryRemover); } /** @@ -146,16 +286,7 @@ void RemoveDirs(void) **/ void CreateDirs(void) { - int x; - - for(x = 0; x < sizeof(default_directory_names) / sizeof(*default_directory_names); x++) - { - if(!directory_names[x]) - { - sprintf(TempArray, "%s\\%s", directory_names[5] ? directory_names[5] : BaseDirectory, default_directory_names[x]); - CreateDirectory(TempArray,0); - } - } + DefaultDirectoryWalker(DirectoryCreator); } static char *gfsdir=0; @@ -181,123 +312,66 @@ void GetBaseDirectory(void) } } -static int exiting=0; -static volatile int moocow = 0; int BlockingCheck(void) { - MSG msg; - moocow = 1; - while( PeekMessage( &msg, 0, 0, 0, PM_NOREMOVE ) ) { - if( GetMessage( &msg, 0, 0, 0)>0 ) - { - TranslateMessage(&msg); - DispatchMessage(&msg); - } - } - moocow = 0; - if(exiting) return(0); - return(1); + MSG msg; + moocow = 1; + + while( PeekMessage( &msg, 0, 0, 0, PM_NOREMOVE ) ) + { + if( GetMessage( &msg, 0, 0, 0)>0 ) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + } + + moocow = 0; + + return exiting ? 0 : 1; } -/* Some timing-related variables (now ignored). */ -static int maxconbskip = 32; /* Maximum consecutive blit skips. */ -static int ffbskip = 32; /* Blit skips per blit when FF-ing */ - -static int moviereadonly=1; - -static int fullscreen=0; -static int soundflush=0; -// Flag that indicates whether Game Genie is enabled or not. -static int genie = 0; - -// Flag that indicates whether PAL Emulation is enabled or not. -static int pal_emulation = 0; -static int status_icon=1; -static int windowedfailed; -static double saspectw=1, saspecth=1; -static double winsizemulx=1, winsizemuly=1; -static int winwidth,winheight; -static int ismaximized = 0; - -static volatile int nofocus=0; -//static volatile int userpause=0; //mbg merge 7/18/06 removed. this has been replaced with FCEU_EmulationPaused stuff -static volatile int _userpause=0; //mbg merge 7/18/06 changed tasbuild was using this only in a couple of places - -#define SO_FORCE8BIT 1 -#define SO_SECONDARY 2 -#define SO_GFOCUS 4 -#define SO_D16VOL 8 -#define SO_MUTEFA 16 -#define SO_OLDUP 32 - -#define GOO_DISABLESS 1 /* Disable screen saver when game is loaded. */ -#define GOO_CONFIRMEXIT 2 /* Confirmation before exiting. */ -#define GOO_POWERRESET 4 /* Confirm on power/reset. */ - -static uint32 goptions = GOO_DISABLESS; - -static int soundrate=44100; -static int soundbuftime=50; -/*static*/ int soundoptions=SO_SECONDARY|SO_GFOCUS; -static int soundvolume=100; -static int soundquality=0; -extern int autoHoldKey, autoHoldClearKey; -extern int frame_display, input_display; - -//mbg merge 7/17/06 did these have to be unsigned? -static int srendline,erendline; -static int srendlinen=8; -static int erendlinen=231; -static int srendlinep=0; -static int erendlinep=239; -static int totallines; - static void FixFL(void) { - FCEUI_GetCurrentVidSystem(&srendline,&erendline); - totallines=erendline-srendline+1; + FCEUI_GetCurrentVidSystem(&srendline, &erendline); + totallines = erendline - srendline + 1; } static void UpdateRendBounds(void) { - FCEUI_SetRenderedLines(srendlinen,erendlinen,srendlinep,erendlinep); - FixFL(); + FCEUI_SetRenderedLines(srendlinen, erendlinen, srendlinep, erendlinep); + FixFL(); } -static uint8 cpalette[192]; -static int vmod = 0; -int soundo=1; -static int ntsccol=0,ntsctint,ntschue; - -void FCEUD_PrintError(char *s) +/** +* Shows an error message in a message box. +* +* @param errormsg Text of the error message. +**/ +void FCEUD_PrintError(const char *errormsg) { - AddLogText(s,1); - if(fullscreen) ShowCursorAbs(1); - MessageBox(0,s,"FCE Ultra Error",MB_ICONERROR|MB_OK|MB_SETFOREGROUND|MB_TOPMOST); - if(fullscreen)ShowCursorAbs(0); + AddLogText(errormsg, 1); + + if(fullscreen) + { + ShowCursorAbs(1); + } + + MessageBox(0, errormsg, "FCE Ultra Error", MB_ICONERROR | MB_OK | MB_SETFOREGROUND | MB_TOPMOST); + + if(fullscreen) + { + ShowCursorAbs(0); + } } - -//--------------------------- -//mbg merge 6/29/06 - new aboutbox - -#ifdef _M_X64 - #define _MSVC_ARCH "x64" -#else - #define _MSVC_ARCH "x86" -#endif -#ifdef _DEBUG - #define _MSVC_BUILD "debug" -#else - #define _MSVC_BUILD "release" -#endif -#define __COMPILER__STRING__ "msvc " _Py_STRINGIZE(_MSC_VER) " " _MSVC_ARCH " " _MSVC_BUILD -#define _Py_STRINGIZE(X) _Py_STRINGIZE1((X)) -#define _Py_STRINGIZE1(X) _Py_STRINGIZE2 ## X -#define _Py_STRINGIZE2(X) #X -//re: http://72.14.203.104/search?q=cache:HG-okth5NGkJ:mail.python.org/pipermail/python-checkins/2002-November/030704.html+_msc_ver+compiler+version+string&hl=en&gl=us&ct=clnk&cd=5 - -char *FCEUD_GetCompilerString() { +/** +* Generates a compiler identification string. +* +* @return Compiler identification string +**/ +const char *FCEUD_GetCompilerString() +{ return __COMPILER__STRING__; } @@ -309,9 +383,6 @@ void ShowAboutBox(void) MessageBox(hAppWnd, FCEUI_GetAboutString(), FCEU_NAME, MB_OK); } -//mbg 6/30/06 - indicates that the main loop should close the game as soon as it can -int closeGame = 0; - /** * Exits FCE Ultra **/ @@ -344,75 +415,68 @@ void DoFCEUExit() closeGame = 1;//mbg 6/30/06 - for housekeeping purposes we need to exit after the emulation cycle finishes } +/** +* Changes the thread priority of the main thread. +**/ void DoPriority(void) { - if(eoptions&EO_HIGHPRIO) - { - if(!SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_HIGHEST)) - { - AddLogText("Error setting thread priority to THREAD_PRIORITY_HIGHEST.",1); - } - } - else - if(!SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_NORMAL)) - { - AddLogText("Error setting thread priority to THREAD_PRIORITY_NORMAL.",1); - } + if(eoptions & EO_HIGHPRIO) + { + if(!SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST)) + { + AddLogText("Error setting thread priority to THREAD_PRIORITY_HIGHEST.", 1); + } + } + else + { + if(!SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_NORMAL)) + { + AddLogText("Error setting thread priority to THREAD_PRIORITY_NORMAL.", 1); + } + } } -static int changerecursive=0; +// TODO: HORRIBLE #include "sound.cpp" #include "video.cpp" -//extern int winspecial; -//extern vmdef vmodes[11]; -//extern int disvaccel; -//extern int fssync; -//extern int winsync; -//int SetVideoMode(int fs); -//void DoVideoConfigFix(void); -//void FCEUD_BlitScreen(uint8 *XBuf); - #include "window.cpp" -//extern char *rfiles[10]; -//extern char *rdirs[10]; -//extern int EnableBackgroundInput; -//void ByebyeWindow(void); -//void DoTimingConfigFix(); -//void CreateMainWindow(); -//void UpdateMenu(); -//void ALoad(char *nameo); -//void LoadNewGamey(HWND hParent, char *initialdir); -//void UpdateMenu(); - #include "config.cpp" #include "args.cpp" -int DriverInitialize(void) +int DriverInitialize() { - if(soundo) - soundo=InitSound(); + if(soundo) + { + soundo = InitSound(); + } - SetVideoMode(fullscreen); - InitInputStuff(); /* Initialize DInput interfaces. */ - return 1; + SetVideoMode(fullscreen); + InitInputStuff(); /* Initialize DInput interfaces. */ + + return 1; } static void DriverKill(void) { - sprintf(TempArray,"%s/fceu98.cfg",BaseDirectory); + // Save config file + sprintf(TempArray, "%s/fceu98.cfg", BaseDirectory); SaveConfig(TempArray); + DestroyInput(); + ResetVideo(); - if(soundo) TrashSound(); + + if(soundo) + { + TrashSound(); + } + CloseWave(); + ByebyeWindow(); } -void FCEUD_Update(uint8 *XBuf, int32 *Buffer, int Count); -void ApplyDefaultCommandMapping(void); - - //mbg merge 7/18/06 - the function that contains the code that used to just be UpdateMemWatch() void _updateMemWatch() { //UpdateMemWatch() @@ -427,13 +491,13 @@ uint32 *BotInput; void win_AllocBuffers(uint8 **GameMemBlock, uint8 **RAM) { mapGameMemBlock = CreateFileMapping((HANDLE)0xFFFFFFFF,NULL,PAGE_READWRITE, 0, 131072,"fceu.GameMemBlock"); - + if(mapGameMemBlock == NULL || GetLastError() == ERROR_ALREADY_EXISTS) { //mbg 7/28/06 - is this the proper error handling? //do we need to indicate to user somehow that this failed in this emu instance? CloseHandle(mapGameMemBlock); - + mapGameMemBlock = NULL; *GameMemBlock = (uint8 *) malloc(131072); *RAM = (uint8 *) malloc(2048); @@ -461,7 +525,8 @@ void win_AllocBuffers(uint8 **GameMemBlock, uint8 **RAM) BotInput[0] = 0; } -void win_FreeBuffers(uint8 *GameMemBlock, uint8 *RAM) { +void win_FreeBuffers(uint8 *GameMemBlock, uint8 *RAM) +{ //clean up shared memory if(mapRAM) { @@ -674,7 +739,8 @@ doloopy: //mbg merge 7/19/06 - the function that contains the code that used to just be UpdateFCEUWindow() and FCEUD_UpdateInput() -void _updateWindow() { +void _updateWindow() +{ UpdateFCEUWindow(); FCEUD_UpdateInput(); PPUViewDoBlit(); @@ -886,13 +952,6 @@ void _updateWindow() { // } // end of !(old sound code) block //} -// qfox 09/17/06: moved the skipcount outside because it was completely pointless -// in there. -/** - * Counts the number of frames that have not been displayed - * Used for the bot, to skip frames (and save time). - **/ -int skipcount = 0; /** * Update the game and gamewindow with a new frame **/ @@ -1067,26 +1126,45 @@ void FCEUD_Update(uint8 *XBuf, int32 *Buffer, int Count) static void FCEUD_MakePathDirs(const char *fname) { char path[MAX_PATH]; - const char* div=fname; - do { - const char* fptr=strchr(div,'\\'); - if(!fptr) fptr=strchr(div,'/'); - if(!fptr) break; - int off=fptr-fname; - strncpy(path,fname,off); - path[off]='\0'; + const char* div = fname; + + do + { + const char* fptr = strchr(div, '\\'); + + if(!fptr) + { + fptr = strchr(div, '/'); + } + + if(!fptr) + { + break; + } + + int off = fptr - fname; + strncpy(path, fname, off); + path[off] = '\0'; mkdir(path); - div=fptr+1; - while(div[0]=='\\'||div[0]=='/') div++; + + div = fptr + 1; + + while(div[0] == '\\' || div[0] == '/') + { + div++; + } + } while(1); } FILE *FCEUD_UTF8fopen(const char *n, const char *m) { - if(strchr(m,'w')||strchr(m,'+')) - FCEUD_MakePathDirs(n); + if(strchr(m, 'w') || strchr(m, '+')) + { + FCEUD_MakePathDirs(n); + } - return(fopen(n,m)); + return(fopen(n, m)); } int FCEUD_ShowStatusIcon(void) @@ -1096,6 +1174,6 @@ int FCEUD_ShowStatusIcon(void) void FCEUD_ToggleStatusIcon(void) { - status_icon=!status_icon; + status_icon = !status_icon; UpdateCheckedMenuItems(); } diff --git a/vc8/fceux.vcproj b/vc8/fceux.vcproj index 8040c470..e469a8bf 100644 --- a/vc8/fceux.vcproj +++ b/vc8/fceux.vcproj @@ -1,7 +1,7 @@ - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + +