4 years ago[popt] secure_getenv.c: secure_getenv() wrapper for systems that don't have it. bugfix/popt-1.16-apply-patches github/bugfix/popt-1.16-apply-patches
David Korth [Mon, 7 Sep 2015 21:17:40 +0000 (17:17 -0400)] 
[popt] secure_getenv.c: secure_getenv() wrapper for systems that don't have it.

On Windows, this just calls getenv(), since there's no real way to
implement "security" here.

On non-Windows systems, it checks if euid == uid and egid == gid.
If either of them are incorrect, security restrictions will be enabled,
and popt_secure_getenv() will always return NULL. Otherwise, security
restrictions will be disabled, and popt_secure_getenv() will simply
call getenv() with the specified parameter.

system.h: Declare and use popt_secure_getenv() if the system doesn't
have secure_getenv() or __secure_getenv().

4 years ago[popt] Partially applied patches/popt-1.16-28.19.suse/popt-libc-updates.patch.
David Korth [Mon, 7 Sep 2015 21:07:59 +0000 (17:07 -0400)] 
[popt] Partially applied patches/popt-1.16-28.19.suse/popt-libc-updates.patch.

The secure_getenv() patch was applied, though I enabled a fallback to
getenv(), since Windows doesn't have secure_getenv().

The strerror_r() patch was NOT applied, since Windows doesn't have
this (though it does have strerror_s() starting with MSVC 2005).
More importantly, the strerror_r() usage is WRONG; it ends up returning
a pointer to an automatic array variable, which can easily result in
shenanigans occurring.

4 years ago[popt] Applied patches/popt-1.16-28.19.suse/popt-alignment-checks.patch.
David Korth [Mon, 7 Sep 2015 20:29:22 +0000 (16:29 -0400)] 
[popt] Applied patches/popt-1.16-28.19.suse/popt-alignment-checks.patch.

4 years ago[popt] Applied patches/popt-1.16-6.fc23/popt-1.16-man-page.patch.
David Korth [Mon, 7 Sep 2015 20:19:58 +0000 (16:19 -0400)] 
[popt] Applied patches/popt-1.16-6.fc23/popt-1.16-man-page.patch.

4 years ago[popt] Applied patches/popt-1.16-6.fc23/popt-1.16-help.patch.
David Korth [Mon, 7 Sep 2015 20:19:36 +0000 (16:19 -0400)] 
[popt] Applied patches/popt-1.16-6.fc23/popt-1.16-help.patch.

4 years ago[popt] Applied patches/popt-1.16-6.fc23/popt-1.16-execfail.patch.
David Korth [Mon, 7 Sep 2015 20:16:44 +0000 (16:16 -0400)] 
[popt] Applied patches/popt-1.16-6.fc23/popt-1.16-execfail.patch.

4 years ago[popt] patches/: Added patches from Fedora and openSUSE.
David Korth [Mon, 7 Sep 2015 20:11:22 +0000 (16:11 -0400)] 
[popt] patches/: Added patches from Fedora and openSUSE.

The patches haven't been applied yet. I suspect some of them aren't
necessary due to the autoconf infrastructure not being present.

4 years ago[libgens] CrazyEffect: Use size and color depth properties from the MdFb.
David Korth [Sun, 6 Sep 2015 19:54:51 +0000 (15:54 -0400)] 
[libgens] CrazyEffect: Use size and color depth properties from the MdFb.

- Don't hard-code 336 and 336*240. Use pxCount and pxPitch values
  from the MdFb to allow for changes later. Note that the CrazyEffect
  does manipulate pixels outside of the visible area in order to
  reduce code complexity.

- run(): Check the color depth of the MdFb and run the appropriate
  "Crazy" Effect function.

4 years ago[libgens] CrazyEffect.cpp: Cache the random number.
David Korth [Sun, 6 Sep 2015 19:43:34 +0000 (15:43 -0400)] 
[libgens] CrazyEffect.cpp: Cache the random number.

The Xorshift+ RNG generates a 64-bit random number. We only need a
15-bit number, so we can get four 15-bit numbers from a single
64-bit number.

4 years ago[libgens] CrazyEffect: Created a private class.
David Korth [Sun, 6 Sep 2015 19:34:59 +0000 (15:34 -0400)] 
[libgens] CrazyEffect: Created a private class.

Moved internal variables and functions into the private class.

The colorMask accessor and mutator functions are no longer inline.
The two-parameter run() function is still inline.

4 years ago[libzomg] Metadata_win32.cpp: Remove trailing NULL bytes from the username.
David Korth [Sun, 6 Sep 2015 19:13:43 +0000 (15:13 -0400)] 
[libzomg] Metadata_win32.cpp: Remove trailing NULL bytes from the username.

GetUserName() and GetUserNameEx() return NULL-terminated strings.
We shouldn't include the NULL terminator; otherwise, C stdio will
stop printing the string data once it encounters the NULL.

This broke the PrintMetadata test on Windows 98SE, since fputs()
stopped printing text once it reached the NULL byte in the username.

Sidenote: While GetUserNameEx() returns a NULL-terminated string,
lpnSize doesn't include the NULL terminator. This is why it worked
correctly on Windows XP, but not Windows 98SE.

4 years ago[libzomg] Metadata_win32.cpp: Differentiate between Win95, Win98, Win98SE, and WinMe.
David Korth [Sun, 6 Sep 2015 18:49:41 +0000 (14:49 -0400)] 
[libzomg] Metadata_win32.cpp: Differentiate between Win95, Win98, Win98SE, and WinMe.

TODO: Add Win95 OSR releases?

Re-added the (unsigned int) casts for snprintf() to work around MinGW
defining DWORD as unsigned long.

This was originally added in commit 57e5e27f991c8031050fee159c122644ebbb38dd:
[libzomg] Metadata_win32.cpp: Use %u for Windows version components.

but was accidentally reverted in merge commit 41315273bfa61407f41575022ecb732347ae2129:
Merge branch 'gens-sdl-libW32U' into gens-sdl-basic-frontend

4 years ago[libzomg] Metadata_win32.cpp: Only use the low word of the build number on Win9x.
David Korth [Sun, 6 Sep 2015 18:41:42 +0000 (14:41 -0400)] 
[libzomg] Metadata_win32.cpp: Only use the low word of the build number on Win9x.

Windows 98SE reports its build number as 67766446 (0x040A08AE).
I have no idea what the 0x040A is, but the 0x08AE is 2222, which
is the correct build number.

Only use the low word on 9x. On NT-based systems, use the full build
number, since it's always correct.

4 years ago[gens-sdl] Set the window icon on Windows.
David Korth [Sun, 6 Sep 2015 18:31:42 +0000 (14:31 -0400)] 
[gens-sdl] Set the window icon on Windows.

This uses Win32 API to set the window class icon to the application
icon from the Win32 resource section in the executable.

TODO: Non-Windows icons.

4 years ago[gens-sdl] OsdGL: Wrap text lines if they're too long.
David Korth [Sun, 6 Sep 2015 17:03:29 +0000 (13:03 -0400)] 
[gens-sdl] OsdGL: Wrap text lines if they're too long.

TODO: Actual word wrapping, not just text wrapping.

4 years agoMerge branch 'feature/gens-sdl-split-into-EventLoop'
David Korth [Sun, 6 Sep 2015 16:52:02 +0000 (12:52 -0400)] 
Merge branch 'feature/gens-sdl-split-into-EventLoop'

4 years agoCMakeLists.txt: Re-enable the OpenGL check, again.
David Korth [Sun, 6 Sep 2015 16:51:33 +0000 (12:51 -0400)] 
CMakeLists.txt: Re-enable the OpenGL check, again.

This is a regression from commit bc62fb7e872a92b03c2f2344e6e831acee617d15.
([libcompat] cpuflags_ppc.c: If this is Wii U, return "Espresso", not "Broadway".)

4 years ago[gens-sdl] gens-sdl.cpp: Removed unused includes. feature/gens-sdl-split-into-EventLoop github/feature/gens-sdl-split-into-EventLoop
David Korth [Sun, 6 Sep 2015 16:39:47 +0000 (12:39 -0400)] 
[gens-sdl] gens-sdl.cpp: Removed unused includes.

Most of these are needed by the event loops, which have been split
out into separate files.

Removed the Win32-only freopen() calls. SDL2 dropped support for stdio
redirection, so we don't have to undo it anymore.

4 years ago[gens-sdl] Moved the frameskip code into EmuLoop::runFrame().
David Korth [Sun, 6 Sep 2015 16:31:37 +0000 (12:31 -0400)] 
[gens-sdl] Moved the frameskip code into EmuLoop::runFrame().

EmuLoop::runFrame() calls abstract virtual functions runFullFrame() and
runFastFrame() depending on the number of frames to skip. These are
implemented by the subclasses.

This eliminates the frameskip duplication between EmuLoop and CrazyEffectLoop.

4 years ago[libcompat] cpuflags_ppc.c: If this is Wii U, return "Espresso", not "Broadway".
David Korth [Sat, 5 Sep 2015 21:19:01 +0000 (17:19 -0400)] 
[libcompat] cpuflags_ppc.c: If this is Wii U, return "Espresso", not "Broadway".

Marked the strings as static const. in the HW_RVL path, cpu_name is not
static, since it's determined at runtime. (Well, it could be static,
since isWiiU() never returns a different value, but I'm not doing that.)

Also fixed a syntax error in the GameCube path.

4 years agoUse stdint.h instead of cstdint.
David Korth [Sat, 5 Sep 2015 16:50:28 +0000 (12:50 -0400)] 
Use stdint.h instead of cstdint.

MSVC 6.0 doesn't have either one, so I'm using a custom version of
stdint.h for compatibility. I don't have a cstdint file for VC6,
so just use stdint.h instead of cstdint.

That having been said, I just hit the infamous 'for' loop variable
scope bug in VC6, so I think I'm done trying to get Gens/GS II to
compile with a 17-year-old compiler.

4 years ago[libcompat] Use _stati64() instead of _stat64().
David Korth [Sat, 5 Sep 2015 16:46:14 +0000 (12:46 -0400)] 
[libcompat] Use _stati64() instead of _stat64().

_stat64() was added in MSVC 2005, while _stati64() is available
in MSVC 6.0 and possibly earlier versions.

struct _stati64 has a 64-bit filesize, and depending on MSVC version,
either a 32-bit (pre-2005) or 64-bit (2005+) time_t.

Note that struct _stati64 is affected by _USE_32BIT_TIME_T in MSVC 2005
and later versions, so we have to make sure it doesn't get defined.

Note the extra underscores. This matches the standard convention
for config.h macros.

4 years agoImproved compatibility with older versions of MSVC.
David Korth [Sat, 5 Sep 2015 16:27:43 +0000 (12:27 -0400)] 
Improved compatibility with older versions of MSVC.

Note that stdint.h was first added in MSVC 2010, so for older versions,
you'll need to add stdint.h to the MSVC include path first.

win32-msvc.cmake: Only add -Zc:wchar_t for MSVC 2002 and later.

- 'sealed' was added in MSVC 2005.
- Support for variadic macros was also added in MSVC 2005.
- (TODO: Verify MSVC 2002 and 2003.)

- Check for localtime_s(). This function seems to have been added
  in MSVC 2005, but since I'm not sure, we're better off doing a
  CMake check instead of version checks. This also works for MinGW,
  which provides inlined versions.
  - Sidenote: On MSVC 2005, localtime_s() is a macro that's defined
    to either _localtime32_s() or _localtime64_s(). The inline part
    of CHECK_FUNCTION_EXISTS_OR_INLINE() will handle that.

- WtoA_filename(): Declare 'int cbMbs' at the top of the macro.
  I didn't catch this with MSVC 2010 because the ANSI code is
  disabled there, since 2010's minimum target is Windows 2000.

- Use #pragma message() instead of #warning. MSVC doesn't support
  this preprocessor directive at all, but it was never tripped
  until I tried compiling with MSVC 6.0, which doesn't support
  _fseeki64() and _ftelli64().

cpuflags_x86.h: Added an inline asm version for older MSVC that
doesn't support CPU intrinsics, e.g. __cpuid().
- TODO: Do MSVC 2002 or 2003 support __cpuid()?

4 years ago[libgenstext] Don't use CMake's TEST_BIG_ENDIAN() function.
David Korth [Sat, 5 Sep 2015 15:43:58 +0000 (11:43 -0400)] 
[libgenstext] Don't use CMake's TEST_BIG_ENDIAN() function.

Copied byteorder.h from libcompat. We're using a copy because we
don't want libgenstext to depend on libcompat.

Interestingly, I found this by attempting to build Gens/GS II with
MSVC 6.0 (lol). TEST_BIG_ENDIAN() failed because it couldn't find
a suitable type to test.

4 years ago[gens-sdl] Added "typedef BaseClass super;" to all derived classes.
David Korth [Sat, 5 Sep 2015 15:33:49 +0000 (11:33 -0400)] 
[gens-sdl] Added "typedef BaseClass super;" to all derived classes.

This makes it easier to access functions in the direct superclass.

GLShader, GLShaderFastBlur: Added an equivalent to Q_DISABLE_COPY().

4 years ago[gens-qt4] Added "typedef BaseClass super;" to all derived classes.
David Korth [Sat, 5 Sep 2015 15:24:50 +0000 (11:24 -0400)] 
[gens-qt4] Added "typedef BaseClass super;" to all derived classes.

This makes it easier to access functions in the direct superclass.

Other changes:
- Added Q_DISABLE_COPY() where appropriate.
- Removed extraneous semicolons from Q_DISABLE_COPY().
- GensWindow: Added 'parent' and 'flags' parameters to the constructor.
  - TODO: Set flags to a preset value, like other windows?
- EmuThread:
  - Added a parent parameter to the constructor.
  - Moved isStopRequested() out of the class declaration.
    - Similar to IdleThread.

4 years ago[gens-sdl] EmuLoop: Moved internal SDL event processing functions to the private...
David Korth [Sat, 5 Sep 2015 14:17:16 +0000 (10:17 -0400)] 
[gens-sdl] EmuLoop: Moved internal SDL event processing functions to the private class.

Marked getSaveSlot_mtime() as static, since it doens't depend on
any of the class variables.

4 years ago[libgens] EmuContext: Mark overridden functions correctly.
David Korth [Sat, 5 Sep 2015 03:51:39 +0000 (23:51 -0400)] 
[libgens] EmuContext: Mark overridden functions correctly.

Changed all overridden functions in EmuMD and EmuPico to final.
I'm pretty sure EmuMCD and Emu32X won't be deriving from EmuMD
directly, especially since EmuPico isn't.

This was found by running a build with clang-3.7.0, which printed
warnings similar to the following:

[ 33%] Building CXX object src/libgens/CMakeFiles/gens.dir/cpu/M68K_Mem.cpp.o
In file included from src/libgens/cpu/M68K_Mem.cpp:42:
src/libgens/EmuContext/EmuMD.hpp:51:7: warning: 'softReset' overrides a member function
      but is not marked 'override' [-Winconsistent-missing-override]
                int softReset(void);
src/libgens/EmuContext/EmuContext.hpp:82:15: note: overridden virtual function is here
                virtual int softReset(void) = 0;
In file included from /home/d

4 years agoAlways use __volatile__ when using the 'emms' instruction.
David Korth [Sat, 5 Sep 2015 03:45:50 +0000 (23:45 -0400)] 
Always use __volatile__ when using the 'emms' instruction.

4 years ago[doc] TODO.txt: Added more stuff and reorganized some things.
David Korth [Sat, 5 Sep 2015 03:44:28 +0000 (23:44 -0400)] 
[doc] TODO.txt: Added more stuff and reorganized some things.

4 years ago[cmake] win32.cmake: Enable secure template overloads.
David Korth [Sat, 5 Sep 2015 03:40:02 +0000 (23:40 -0400)] 
[cmake] win32.cmake: Enable secure template overloads.

This allows MSVC to silently replace certain "unsafe" functions,
e.g. memcpy(), with Microsoft's "secure" versions, e.g. memcpy_s(),
without making any code changes.

MinGW also supports this, though it didn't seem to do anything in my
tests, probably because I'm still targetting the base MSVCRT.DLL.

Moved common Win32 CFLAGS out of the compiler-specific .cmake files
and into win32.cmake.

4 years ago[libcompat] W32U_libc.c::W32U_stat64(): Work around an MSVCRT bug with regards to...
David Korth [Sat, 5 Sep 2015 03:08:17 +0000 (23:08 -0400)] 
[libcompat] W32U_libc.c::W32U_stat64(): Work around an MSVCRT bug with regards to empty strings.

All versions of MSVCRT prior to MSVC 2015's UCRT have a bug where it will
blindly access pathname[1] without checking if pathname[0] is not NULL.
This can cause an out-of-bounds memory access if pathname[0] is the last
byte of a page, and the next page isn't allocated.

- http://blogs.msdn.com/b/vcblog/archive/2014/06/18/crt-features-fixes-and-breaking-changes-in-visual-studio-14-ctp1.aspx
- http://connect.microsoft.com/VisualStudio/feedback/details/796796/msvcrt-stat-actually-stat64i32-blindly-refers-to-2nd-char-of-string-parameter
- https://github.com/dynamorio/drmemory/issues/1298#c1

In addition, W32U_stat64() will set errno = EFAULT if either pathname or
buf is NULL. MSVCRT would normally crash if that happened, while glibc
sets errno = EFAULT and returns -1.

4 years ago[libgens/tests] test_VdpPalette_DAC: Added 32X palette tests.
David Korth [Sat, 5 Sep 2015 02:54:38 +0000 (22:54 -0400)] 
[libgens/tests] test_VdpPalette_DAC: Added 32X palette tests.

test_VdpPalette_DAC_generate.c: Added support for generating a
test file for 32X palettes.

4 years ago[libgens/tests] test_VdpPalette_DAC.cpp: If the test suite failed due to a fatal...
David Korth [Sat, 5 Sep 2015 02:43:27 +0000 (22:43 -0400)] 
[libgens/tests] test_VdpPalette_DAC.cpp: If the test suite failed due to a fatal error, and no actual tests ran, return the error code.

This ensures that the test suite fails in CTest if e.g. the test file
has the wrong format, resulting in the test suite aborting without
running any actual tests.

4 years ago[libgens/tests] TestSuite: Reset errno after calling isatty().
David Korth [Sat, 5 Sep 2015 02:41:28 +0000 (22:41 -0400)] 
[libgens/tests] TestSuite: Reset errno after calling isatty().

On POSIX-compliant systems, isatty() sets errno to either EINVAL or
ENOTTY if the specified fd is not a TTY. This can cause problems
later, so reset errno to 0 afterwards.

test_VdpPalette_DAC.cpp::parse_number(): Reset errno to 0 before
calling strtol(), since strtol() only sets errno if an error occurred;
it won't clear errno if no error occurred.

This fixes an issue where the DAC tests didn't run properly when
run using CTest (e.g. 'make test') due to the changes required
for color text output on Windows.

This is a regression from commit 81e684d91685661d09b354c2174167f429970ffe.
([libgens/tests] TestSuite: Added color support on Windows.)

4 years ago[libgens] VdpPalette: Added 32X CRam accessor functions.
David Korth [Sat, 5 Sep 2015 02:21:14 +0000 (22:21 -0400)] 
[libgens] VdpPalette: Added 32X CRam accessor functions.

- Added assertions to the 16-bit standard CRam functions.
- VdpPalette::reset(): Clear 32X CRam. (m_cram32X)

4 years ago[libgens/tests] TestSuite, test_VdpPalette_DAC: Removed 'using namespace std;'.
David Korth [Sat, 5 Sep 2015 02:14:02 +0000 (22:14 -0400)] 
[libgens/tests] TestSuite, test_VdpPalette_DAC: Removed 'using namespace std;'.

Use individual 'using' statements for each class.

Use std::ostringstream instead of std::stringstream.

4 years ago[libgens/tests] TestSuite: Added color support on Windows.
David Korth [Sat, 5 Sep 2015 02:11:12 +0000 (22:11 -0400)] 
[libgens/tests] TestSuite: Added color support on Windows.

Also check if color should be enabled on Linux.

Use a FILE* instead of hard-coding stderr.

The Print*() functions are no longer static, since they need
to access m_is_color and m_f_out.

4 years ago[libgens/tests] CMakeLists: Specify test_VdpPalette_DAC_generate directly instead...
David Korth [Sat, 5 Sep 2015 01:58:30 +0000 (21:58 -0400)] 
[libgens/tests] CMakeLists: Specify test_VdpPalette_DAC_generate directly instead of getting the target's location manually.

Specifying the target instead of the executable filename works,
and with fewer lines of code.

4 years ago[libgens/tests] test_VdpPalette_DAC_generate.c: Synchronized PalMode_t with VdpPalette.
David Korth [Sat, 5 Sep 2015 01:57:36 +0000 (21:57 -0400)] 
[libgens/tests] test_VdpPalette_DAC_generate.c: Synchronized PalMode_t with VdpPalette.

Note that the order of the palette code in this file is the order in
which the palette functions were added, and won't match PalMode_t.

4 years ago[libgens/tests] test_VdpPalette_DAC_generate.c: Updated to compile with MSVC.
David Korth [Sat, 5 Sep 2015 01:55:09 +0000 (21:55 -0400)] 
[libgens/tests] test_VdpPalette_DAC_generate.c: Updated to compile with MSVC.

- Use popt instead of getopt_long().
- Moved variable declarations to the beginning of functions.

4 years ago[libgens/tests] test_VdpPalette_DAC_generate.c: Color Scale Method was removed a...
David Korth [Sat, 5 Sep 2015 01:46:25 +0000 (21:46 -0400)] 
[libgens/tests] test_VdpPalette_DAC_generate.c: Color Scale Method was removed a while ago.

CSM was removed in commit c4d6ae9a7bb8603d5a330b841902c8533cd8b560,
but I forgot to remove --csm from the help listing.

Commit c4d6ae9a7bb8603d5a330b841902c8533cd8b560:
Removed VDP color adjustment.

4 years ago[tools] mcd_pcm.c: poptAlias's argv parameter must be free()able.
David Korth [Sat, 5 Sep 2015 01:38:09 +0000 (21:38 -0400)] 
[tools] mcd_pcm.c: poptAlias's argv parameter must be free()able.

We have to allocate argv manually in order to fix some memory issues.
poptFreeContext() tried free()ing the argv parameter, which resulted
in massive failure because it was an automatic variable.

4 years ago[tools] mcd_pcm.c: Differentiate between "no input filename" and "too many parameters".
David Korth [Sat, 5 Sep 2015 01:36:33 +0000 (21:36 -0400)] 
[tools] mcd_pcm.c: Differentiate between "no input filename" and "too many parameters".

4 years ago[tools] mcd_pcm.c: Fixed some out_filename issues.
David Korth [Sat, 5 Sep 2015 01:34:53 +0000 (21:34 -0400)] 
[tools] mcd_pcm.c: Fixed some out_filename issues.

- Specify &out_filename in the poptOption array.
- strdup() the filename to prevent memory allocation issues.

4 years ago*.rc: #include <windows.h>, not "winresrc.h".
David Korth [Fri, 4 Sep 2015 01:48:24 +0000 (21:48 -0400)] 
*.rc: #include <windows.h>, not "winresrc.h".

Also moved the include above the program-specific resource header.

It turns out that <windows.h> ends up including <winresrc.h> when
compiling using rc and/or windres, so there's no point in manually
specifying winresrc.h instead of windows.h.

4 years ago[zlib] CMakeLists.txt: Compile GNU assembler sources when using Clang.
David Korth [Fri, 4 Sep 2015 00:45:48 +0000 (20:45 -0400)] 
[zlib] CMakeLists.txt: Compile GNU assembler sources when using Clang.

Note that the compiler ID is "AppleClang" when using Apple's version of
LLVM/Clang with cmake-3.0+.

4 years agoc++11-compat.clang.h: Added support for LLVM/clang.
David Korth [Fri, 4 Sep 2015 00:43:11 +0000 (20:43 -0400)] 
c++11-compat.clang.h: Added support for LLVM/clang.

The rest of the build system seems to work fine with the gcc options,
at least on Linux. I'll need to test it on Mac OS X later.

4 years agoc++11-compat.msvc.h: Fixed the include guard comment at the bottom of the file.
David Korth [Fri, 4 Sep 2015 00:25:55 +0000 (20:25 -0400)] 
c++11-compat.msvc.h: Fixed the include guard comment at the bottom of the file.

4 years agoSplit c++11-compat.h's compiler-specific defines into separate files.
David Korth [Fri, 4 Sep 2015 00:19:09 +0000 (20:19 -0400)] 
Split c++11-compat.h's compiler-specific defines into separate files.

c++11-compat.gcc.h: gcc
c++11-compat.msvc.h: MSVC

Note that although clang and icc define __GNUC__ (at least on Linux),
their emulated gcc version numbers is entirely made up, and they don't
correspond to the C++ 2011 implementation.

4 years agoRenamed msvc-c99-compat.h to c++11-compat.msvc.h.
David Korth [Fri, 4 Sep 2015 00:03:47 +0000 (20:03 -0400)] 
Renamed msvc-c99-compat.h to c++11-compat.msvc.h.

Preparation for splitting out all compiler-specific stuff from
c++11-compat.h into individual header files.

4 years ago[libgens/tests] EEPRomI2CTest/CMakeLists.txt: Split debug symbols.
David Korth [Fri, 4 Sep 2015 00:03:35 +0000 (20:03 -0400)] 
[libgens/tests] EEPRomI2CTest/CMakeLists.txt: Split debug symbols.

4 years ago[libgens] CrazyEffect: Improved performance by using a faster RNG.
David Korth [Thu, 3 Sep 2015 04:54:57 +0000 (00:54 -0400)] 
[libgens] CrazyEffect: Improved performance by using a faster RNG.

Xorshift+ is significantly faster than both glibc's and MSVC 2010's
rand() function. On my ThinkPad T60p, the Linux rand() version usually
runs at around 45-50 fps if something else is running, but the new
Xorshift+ version runs at 56-60 fps.

This version also helps to reduce the CPU load a bit.

TODO: Cache the upper bits of Xorshift+'s result so we can get
at least two 15-bit values out of a single iteration.

4 years ago[gens-sdl] CrazyEffectLoop: Stop SDL video when exiting the event loop.
David Korth [Thu, 3 Sep 2015 04:45:52 +0000 (00:45 -0400)] 
[gens-sdl] CrazyEffectLoop: Stop SDL video when exiting the event loop.

FIXME: We're not using audio here, so maybe deleting sdlHandler won't crash?

4 years ago[gens-sdl] EventLoop: New function processSdlEventQueue().
David Korth [Thu, 3 Sep 2015 04:27:14 +0000 (00:27 -0400)] 
[gens-sdl] EventLoop: New function processSdlEventQueue().

This consolidates the pause, OSD processing, and video expose handling
from EmuLoop and CrazyEffectLoop into a single function.

- Wait for what would be the next frame when emulation is paused?
  (This is in EmuLoop and CrazyEffectLoop, not processSdlEventQueue().)
- paused_t: Add assign/copy constructors and operator==(), or are they
  even needed?

4 years agoMerge branch 'feature/gens-sdl-Win32-resources'
David Korth [Thu, 3 Sep 2015 03:37:32 +0000 (23:37 -0400)] 
Merge branch 'feature/gens-sdl-Win32-resources'

4 years ago[gens-qt4] resources/win32/: Synchronized the resources with gens-sdl. feature/gens-sdl-Win32-resources github/feature/gens-sdl-Win32-resources
David Korth [Thu, 3 Sep 2015 03:35:40 +0000 (23:35 -0400)] 
[gens-qt4] resources/win32/: Synchronized the resources with gens-sdl.

config.gens-qt4.h.in: Added the CMake version macros.

4 years ago[gens-sdl] gens-sdl.exe.manifest: Removed some extra spaces in the OS version section.
David Korth [Thu, 3 Sep 2015 03:33:56 +0000 (23:33 -0400)] 
[gens-sdl] gens-sdl.exe.manifest: Removed some extra spaces in the OS version section.

4 years ago[gens-sdl] gens-sdl.rc: Updated the version information.
David Korth [Thu, 3 Sep 2015 03:30:51 +0000 (23:30 -0400)] 
[gens-sdl] gens-sdl.rc: Updated the version information.

Use the VERSION_* macros for GENS_VERSION_WIN32.

Updated the version strings such that all descriptions and names
are "Gens/GS II (Basic SDL2 frontend)" and all versions are

TODO: Define "Development Build" as VERSION_DESC or something,
and synchronize version definitions everywhere.

4 years ago[gens-sdl] gens-sdl.rc: Removed embedded NULLs in strings.
David Korth [Thu, 3 Sep 2015 03:24:56 +0000 (23:24 -0400)] 
[gens-sdl] gens-sdl.rc: Removed embedded NULLs in strings.

This was apparently a thing because Microsoft did this in an example
resource script years ago, but it's not necessary.

Reference: https://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/66e0c3d2-d7d7-46f9-a5ad-6da98d3de0ac/windows-7-not-displaying-all-the-information-from-versioninfo-block?forum=windowsgeneraldevelopmentissues

4 years ago[gens-sdl] gens-sdl.rc: #include "winresrc.h", not "winnt.h".
David Korth [Thu, 3 Sep 2015 03:23:06 +0000 (23:23 -0400)] 
[gens-sdl] gens-sdl.rc: #include "winresrc.h", not "winnt.h".

winnt.h doesn't include all of the necessary headers required for
version resources, e.g. verrsrc.h. winresrc.h does include everything.
It also includes winuser.rh, which contains the macro required for

This fixes the "Details" tab and probably also fixes issues caused
by the application manifest not being present.

4 years ago[gens-sdl] gens-sdl.exe.manifest: Disable DPI awareness; add WinVista and Win7 OS...
David Korth [Thu, 3 Sep 2015 03:19:30 +0000 (23:19 -0400)] 
[gens-sdl] gens-sdl.exe.manifest: Disable DPI awareness; add WinVista and Win7 OS IDs.

I'll test DPI awareness eventually. gens-sdl can't really take
advantage of it, since the rendering resolution is limited by
the system being emulated, and there's no GUI elements other
than the main window.

4 years ago[gens-sdl] Copied the Win32 resource script from gens-qt4.
David Korth [Thu, 3 Sep 2015 03:17:04 +0000 (23:17 -0400)] 
[gens-sdl] Copied the Win32 resource script from gens-qt4.

config.gens-sdl.h.in: Added version macros from the root CMakeLists.txt.

FIXME: The version information isn't showing up in the file properties
dialog. ResEdit shows that it has actual strings as the resource IDs
instead of the values those strings are supposed to represent.

4 years ago[gens-sdl] EventLoop_p.hpp: New header for EventLoopPrivate.
David Korth [Thu, 3 Sep 2015 03:07:21 +0000 (23:07 -0400)] 
[gens-sdl] EventLoop_p.hpp: New header for EventLoopPrivate.

Moved EventLoop's protected and private variables into EventLoopPrivate.

Rebased EmuLoopPrivate and CrazyEffectLoopPrivate on EventLoopPrivate.

Added Qt-style d_func() functions to handle private class inheritance.

Moved the OS-specific includes and yield() macro to EventLoop_p.hpp.

EventLoop: Added a vBackend accessor so gens-sdl can print messages
to the Onscreen Display.

4 years ago[gens-sdl] Created an EventLoop base class and rebased EmuLoop and CrazyEffectLoop.
David Korth [Thu, 3 Sep 2015 02:36:13 +0000 (22:36 -0400)] 
[gens-sdl] Created an EventLoop base class and rebased EmuLoop and CrazyEffectLoop.

The LibGens::Timing object has been moved to EventLoop::m_clks.

- Move EventLoop objects into a private class in EventLoop_p.hpp.
- Make EmuLoop's and CrazyEventLoop's private classes inherit
  from EventLoopPrivate.
- More cleanup and refactoring.

4 years ago[gens-sdl] EmuLoop.cpp::doStretchMode(): Use vBackend directly.
David Korth [Thu, 3 Sep 2015 02:15:12 +0000 (22:15 -0400)] 
[gens-sdl] EmuLoop.cpp::doStretchMode(): Use vBackend directly.

We're caching sdlHandler's vBackend for this exact reason.

Incidentally, later in the function, we *do* use vBackend directly
in order to print the message on the screen.

4 years ago[gens-sdl] Split the emulation loop and "Crazy" Effect loop into separate files.
David Korth [Thu, 3 Sep 2015 01:22:17 +0000 (21:22 -0400)] 
[gens-sdl] Split the emulation loop and "Crazy" Effect loop into separate files.

All of the functions are currently in the GensSdl namespace without
any enclosing classes.

EmuLoop.cpp has its own processSdlEvent_emuLoop() function to handle keys
that aren't needed for the "Crazy" Effect, e.g. savestates. If an event
isn't handled by EmuLoop, gens-sdl.cpp's processSdlEvent_common() will
try processing it. If that doesn't handle it, the key will be sent
to the KeyManager.

TODO: Convert EmuLoop and CrazyEffectLoop to classes with a common
base class.

4 years ago[zlib] CMakeLists.txt: Fixed the 64-bit MSVC build.
David Korth [Thu, 3 Sep 2015 01:15:15 +0000 (21:15 -0400)] 
[zlib] CMakeLists.txt: Fixed the 64-bit MSVC build.

inffas8664.c is required in order to use the asm code. Otherwise,
it fails to link because inflate_fast() is undefined.

4 years ago[gens-sdl] gens-sdl.cpp: Yield after every frame when rendering the "Crazy" effect.
David Korth [Wed, 2 Sep 2015 06:28:57 +0000 (02:28 -0400)] 
[gens-sdl] gens-sdl.cpp: Yield after every frame when rendering the "Crazy" effect.

TODO: Use the frameskip code to limit frames?

4 years ago[libgens] CrazyEffect: Improve performance on systems where RAND_MAX >= 0x3FFFFFFF.
David Korth [Wed, 2 Sep 2015 06:26:13 +0000 (02:26 -0400)] 
[libgens] CrazyEffect: Improve performance on systems where RAND_MAX >= 0x3FFFFFFF.

glibc's RAND_MAX is 0x7FFFFFFF. We can cache the high bits as a second
random number in order to cut the number of rand() calls in half.

This increases performance on my system from around ~45-50 fps to
~56-60 fps in both the debug and release builds. There's no difference
between the two, so I suspect that rand() is the main bottleneck.

TODO: Use a faster rand() implementation, e.g. Mersenne Twister?

4 years ago[libgens] CrazyEffect: Simplified the template parameters.
David Korth [Wed, 2 Sep 2015 06:14:10 +0000 (02:14 -0400)] 
[libgens] CrazyEffect: Simplified the template parameters.

The template now takes RBits, GBits, and BBits, similar to the other
effects. All of the masks are calculated within the function, and gcc
should be able to calculate these at compile time.

4 years ago[gens-sdl] gens-sdl.cpp: Added a quick and dirty test mode for the "Crazy" Effect.
David Korth [Wed, 2 Sep 2015 05:48:52 +0000 (01:48 -0400)] 
[gens-sdl] gens-sdl.cpp: Added a quick and dirty test mode for the "Crazy" Effect.

TODO: Split it into a separate main loop so we can run it without
initializing audio or an emulation context.

4 years ago[mdZ80] CMakeLists.txt: Use SET_MSVC_DEBUG_PATH().
David Korth [Wed, 2 Sep 2015 05:03:57 +0000 (01:03 -0400)] 
[mdZ80] CMakeLists.txt: Use SET_MSVC_DEBUG_PATH().

4 years agoExplicitly set the source language for the mdZ80 and starscream asm files.
David Korth [Wed, 2 Sep 2015 05:00:47 +0000 (01:00 -0400)] 
Explicitly set the source language for the mdZ80 and starscream asm files.

CMake assumed these were nasm, but due to the issues with the
zlib assembler files, we might as well explicitly specify that
these are, in fact, nasm files.

Prefixed the mdZ80 SRCS variable name with "mdZ80_" instead of
just using "SRCS".

4 years ago[zlib] _MODIFIED_ZLIB.txt: Also check for __x86_64__ in addition to __amd64__.
David Korth [Wed, 2 Sep 2015 04:55:18 +0000 (00:55 -0400)] 
[zlib] _MODIFIED_ZLIB.txt: Also check for __x86_64__ in addition to __amd64__.

4 years ago[zlib] Enable ASM optimizations on i386 and amd64.
David Korth [Wed, 2 Sep 2015 04:52:21 +0000 (00:52 -0400)] 
[zlib] Enable ASM optimizations on i386 and amd64.

set_source_files_properties(): Set COMPILE_FLAGS to "". Leaving out the
flags parameter entirely caused a CMake error:

CMake Error at extlib/zlib/CMakeLists.txt:152 (set_source_files_properties):
  set_source_files_properties called with incorrect number of arguments.

MSVC assembler: Explicilty set the language of the asm files as ASM_MASM.
For some reason, CMake is assuming that all .asm files are ASM_NASM,
which prevented these files from being assembled correctly.

4 years ago[libcompat] CMakeLists.txt: Update the regular expressions.
David Korth [Wed, 2 Sep 2015 04:43:20 +0000 (00:43 -0400)] 
[libcompat] CMakeLists.txt: Update the regular expressions.

This matches the version used in cmake/platform/msvc.cmake.

Specify 'arch' instead of "${arch}", since the MATCHES operator can
take a variable name in addition to a plain string.

4 years ago[cmake] platform/msvc.cmake: Set CMAKE_SIZEOF_VOID_P if it isn't set.
David Korth [Wed, 2 Sep 2015 04:42:51 +0000 (00:42 -0400)] 
[cmake] platform/msvc.cmake: Set CMAKE_SIZEOF_VOID_P if it isn't set.

CMake seems to forget to set this variable in MSVC builds sometimes.

FIXME: This won't work if we're cross-compiling, e.g. using the
x86_amd64 or amd64_x86 toolchains.

4 years ago[zlib] Added checks for __x86_64__ in addition to __amd64__.
David Korth [Wed, 2 Sep 2015 04:12:24 +0000 (00:12 -0400)] 
[zlib] Added checks for __x86_64__ in addition to __amd64__.

Intel's compiler defines __x86_64__ but not __amd64__.

4 years agoCheck for __x86_64__ in addition to __amd64__.
David Korth [Wed, 2 Sep 2015 04:09:42 +0000 (00:09 -0400)] 
Check for __x86_64__ in addition to __amd64__.

Intel's compiler defines __x86_64__ but not __amd64__ because of reasons.

4 years ago[libgens/tests] AudioWriteTest.cpp: Check for __GNUC__ when checking for MMX/SSE2.
David Korth [Wed, 2 Sep 2015 04:08:31 +0000 (00:08 -0400)] 
[libgens/tests] AudioWriteTest.cpp: Check for __GNUC__ when checking for MMX/SSE2.

4 years ago[doc] TODO.txt: localtime_r() wrapper returns _Tm.
David Korth [Wed, 2 Sep 2015 03:12:37 +0000 (23:12 -0400)] 
[doc] TODO.txt: localtime_r() wrapper returns _Tm.

This was fixed in commit 001c2ac491c85e784b82f40a9a463c0d98e6259e.
([libcompat] reentrant.h: Adjusted the localtime_r() implementation a bit.)

4 years ago[doc] TODO.txt: Win32ImageVersionLinkerFlags.cmake was added.
David Korth [Wed, 2 Sep 2015 03:07:19 +0000 (23:07 -0400)] 
[doc] TODO.txt: Win32ImageVersionLinkerFlags.cmake was added.

Added in commit 9a9e00c8e75e99bc4b2f4b2b96db1cf7798636dc.
([cmake] Win32ImageVersionLinkerFlags.cmake: CMake macro for setting the Win32 image version.)

4 years agoc++11-compat.h: #error if compiling with gcc-4.7+ in C++ mode and C++ 2011 mode isn...
David Korth [Wed, 2 Sep 2015 02:53:46 +0000 (22:53 -0400)] 
c++11-compat.h: #error if compiling with gcc-4.7+ in C++ mode and C++ 2011 mode isn't enabled.

We can't check earlier versions because g++ wasn't setting the value of
__cplusplus correctly. g++ versions earlier than 4.7 set __cplusplus to 1
instead of the relevant standard version, i.e. 199711L for C++ 1998/2003
and 201103L for C++ 2011.
set to the C++ standard version.

4 years agoMerge branch 'feature/gens-sdl-autoPause'
David Korth [Wed, 2 Sep 2015 02:53:35 +0000 (22:53 -0400)] 
Merge branch 'feature/gens-sdl-autoPause'

4 years ago[gens-sdl] gens-sdl.cpp: Implemented auto-pause. feature/gens-sdl-autoPause github/feature/gens-sdl-autoPause
David Korth [Wed, 2 Sep 2015 02:53:18 +0000 (22:53 -0400)] 
[gens-sdl] gens-sdl.cpp: Implemented auto-pause.

Similar to the gens-qt4 implementation, I changed the 'paused' variable
to a struct containing a union of a bitfield and a uint8_t. This allows
us to easily set or unset both the "manual" and "auto" (called "focus"
because "auto" is a C keyword) paused bits, and to check if any of them
are set.

TODO: Write a popt-based command line parser with a struct containing
all of the options.

4 years ago[gens-sdl] gens-sdl.cpp: #include <cerrno>
David Korth [Wed, 2 Sep 2015 02:48:44 +0000 (22:48 -0400)] 
[gens-sdl] gens-sdl.cpp: #include <cerrno>

We're using POSIX error values here, and it's only explicitly included
if we're using -std=c++11 or -std=gnu++11. This might change in the
future, so explicitly #include <cerrno>.

4 years ago[doc] TODO.txt: GLEW and the Fast Blur shader have been ported from gens-qt4 to gens...
David Korth [Wed, 2 Sep 2015 01:41:45 +0000 (21:41 -0400)] 
[doc] TODO.txt: GLEW and the Fast Blur shader have been ported from gens-qt4 to gens-sdl.

GLEW doesn't support checking for GL_APPLE_packed_pixels for some reason,
but if your video card is old enough to not support OpenGL 1.2, chances
are it can't run Gens/GS II, either. (Well, either that or you're using
Remote Desktop, which has OpenGL 1.1 with GL_EXT_bgra and a few other
Microsoft-specific extensions.)

4 years agoMerge branch 'feature/gens-sdl-GLEW'
David Korth [Wed, 2 Sep 2015 01:34:51 +0000 (21:34 -0400)] 
Merge branch 'feature/gens-sdl-GLEW'

gens-sdl now has proper GL feature detection and an ARB fragment program
version of the Fast Blur effect. This code was mostly ported from the
gens-qt4 frontend, but with various improvements.

4 years ago[gens-sdl] GLShaderFastBlur.cpp: Removed an unnecessary include; updated the copyrigh... feature/gens-sdl-GLEW github/feature/gens-sdl-GLEW
David Korth [Wed, 2 Sep 2015 01:33:33 +0000 (21:33 -0400)] 
[gens-sdl] GLShaderFastBlur.cpp: Removed an unnecessary include; updated the copyright date.

Previously, strlen() was used to determine the length of the
ARB fragment program. Since the program was changed from
const char *const to const char[], strlen() is no longer needed,
since sizeof() works.

4 years ago[gens-sdl] GLShader: Split the GL_ATI_text_fragment_shader code into completely separ...
David Korth [Wed, 2 Sep 2015 01:31:13 +0000 (21:31 -0400)] 
[gens-sdl] GLShader: Split the GL_ATI_text_fragment_shader code into completely separate cases.

This significantly improves the code's readability.

4 years ago[gens-sdl] GLShaderFastBlur: Ported the Fast Blur shader from gens-qt4.
David Korth [Wed, 2 Sep 2015 01:26:52 +0000 (21:26 -0400)] 
[gens-sdl] GLShaderFastBlur: Ported the Fast Blur shader from gens-qt4.

This includes the GLShader base class.

There's a few differences between the gens-sdl version and the
original gens-qt4 version:

- GLEW is no longer conditional. There's no point in supporting
  a build without GLEW, since GLEW makes GL feature detection
  much easier.

- GLBackend handles the shaders directly, instead of using
  a separate GLShaderManager class.

- init() and end() return error codes, as do enable() and disable().

- The two shader name variables have been combined into a single
  variable, m_shaderName. Only one type of each shader can be in
  use at any given time, so there's no point in reserving memory
  for both the ARB fp name and the ATi fragment shader name.

- GLShaderFastBlur: The actual fragment program text is now stored
  in a private class, using const char[] instead of const char *const.
  This reduces memory usage by one pointer.

- sizeof() is used to determine the program size. Note that the NULL
  terminator should not be included. NVIDIA's Windows driver refuses
  to compile the shader if it is included; Mesa's r300g driver doesn't
  care if it is or not.

4 years ago[gens-sdl] Initialize and use GLEW.
David Korth [Wed, 2 Sep 2015 01:10:28 +0000 (21:10 -0400)] 
[gens-sdl] Initialize and use GLEW.

This lets us get rid of some hacks to work around MSVC's ancient
OpenGL headers, plus it lets us check if the GL implementation
actually supports certain functionality, e.g. packed pixels.

GLTex: TODO: Move internal variables to GLTexPrivate?

4 years ago[cmake] CheckOpenGL.cmake: Renamed GLEW_COMPILE_DEFINITIONS to GLEW_DEFINITIONS.
David Korth [Wed, 2 Sep 2015 00:52:06 +0000 (20:52 -0400)] 

This matches the other libraries.


4 years ago[gens-sdl] GLBackend: Don't memset() d->tex; it's a C++ class now.
David Korth [Wed, 2 Sep 2015 00:50:16 +0000 (20:50 -0400)] 
[gens-sdl] GLBackend: Don't memset() d->tex; it's a C++ class now.

GLTex was converted into a standard class in commit 34663496a5210a70a279375407117aceeee19629,
but I forgot to remove this memset().

Commit 34663496a5210a70a279375407117aceeee19629:
[gens-sdl] GLTex.cpp: Converted GLTex into a class.

4 years ago[gens-sdl] GLBackend: Moved the OpenGL includes from the header to the implementation...
David Korth [Wed, 2 Sep 2015 00:49:25 +0000 (20:49 -0400)] 
[gens-sdl] GLBackend: Moved the OpenGL includes from the header to the implementation file.

No need to expose the GL headers here, since all of the GL variables
are in a private class in GLBackend.cpp.

4 years ago[libgens] VdpDebug.cpp: The test register is uint16_t, not uint8_t.
David Korth [Wed, 2 Sep 2015 00:42:23 +0000 (20:42 -0400)] 
[libgens] VdpDebug.cpp: The test register is uint16_t, not uint8_t.

Not that it's being used for anything right now, but we should
use the correct data type anyway.

This fixes the following compiler warning on MSVC 2010:

src\libgens\Vdp\VdpDebug.cpp(144) : warning C4244: '=' : conversion from 'uint16_t' to 'uint8_t', possible loss of data

4 years ago[libgens/tests] AudioWriteTest_data.c: Ignore MSVC warning C4146.
David Korth [Wed, 2 Sep 2015 00:40:31 +0000 (20:40 -0400)] 
[libgens/tests] AudioWriteTest_data.c: Ignore MSVC warning C4146.

MSVC complains that some values have a negative sign but end up
overflowing the data type, e.g. -0x80000000. This is expected,
so disable the warning.

This fixes the following compiler warnings on MSVC 2010:

src\libgens\tests\sound\AudioWriteTest_data.c(33) : warning C4146: unary minus operator applied to unsigned type, result still unsigned
src\libgens\tests\sound\AudioWriteTest_data.c(236) : warning C4146: unary minus operator applied to unsigned type, result still unsigned

4 years ago[libgens/tests] EEPRomI2CTest: Cast the result of time() to unsigned int.
David Korth [Wed, 2 Sep 2015 00:36:18 +0000 (20:36 -0400)] 
[libgens/tests] EEPRomI2CTest: Cast the result of time() to unsigned int.

time() returns time_t, which is 64-bit on most 64-bit OSes and some
compilers on 32-bit OSes, including Mac OS X, MinGW-w64, and MSVC 2010.

This fixes a compiler warning on MSVC 2010:

src\libgens\tests\EEPRomI2CTest\EEPRomI2CTest.cpp(252) : warning C4244: 'initializing' : conversion from 'time_t' to 'unsigned int', possible loss of data

Interestingly, neither 64-bit Linux gcc nor MinGW-w64 complained about this.

Prefix the random number seed fprintf() with "0x" to make it more obvious
that it's a hexadecimal number, just in case the number happens to only
have digits between 0 and 9.

4 years ago[libgens] SRam.hpp: Switch back to bool for the internal SRAM flags.
David Korth [Wed, 2 Sep 2015 00:30:38 +0000 (20:30 -0400)] 
[libgens] SRam.hpp: Switch back to bool for the internal SRAM flags.

Updated the various inline functions to handle this such that MSVC
no longer complains about "performance" due to implicit bool to int