3 years ago [libgens] VdpPrivate::T_DMA_Loop<>(): Fix a crash on Vectorman 2's first level. bugfix/vectorman-2-lv1-crash-no-emulation github/bugfix/vectorman-2-lv1-crash-no-emulation
David Korth [Sun, 3 Jan 2016 19:19:13 +0000 (14:19 -0500)] 
 [libgens] VdpPrivate::T_DMA_Loop<>(): Fix a crash on Vectorman 2's first level.

main68k_releaseCycles() previously used the value of %eax instead of
the actual argument. %eax was set to the return value of the previous
function, which was q->updateDMA().

Instead of passing q->DMAT_Length to M68K::ReleaseCycles(), pass the
return value of q->updateDMA().

This bug was reported by Alfonso on the Sega Retro wiki:

This is a regression from commit 1a8b524d901c9934d2fa572cc29fc93adc2a112d.
(Initial support for no-emulation builds on non-x86_32 platforms.)

3 years ago[libgens] Make sure all files that use GENS_ENABLE_EMULATION #include <config.libgens.h>.
David Korth [Sun, 3 Jan 2016 17:06:12 +0000 (12:06 -0500)] 
[libgens] Make sure all files that use GENS_ENABLE_EMULATION #include <config.libgens.h>.

Vectorman 2 crashes on the first level. I bisected this to commit

Initial support for no-emulation builds on non-x86_32 platforms.

Adding the #includes didn't seem to fix it, so there's some other issue
with the changes that causes it to crash.

M68K.hpp, Z80.hpp: Move the inline functions out of the class definition.

3 years ago[libpng] Updated the internal libpng to version 1.6.20.
David Korth [Wed, 30 Dec 2015 05:06:26 +0000 (00:06 -0500)] 
[libpng] Updated the internal libpng to version 1.6.20.

3 years ago[libgens] IoPico: New function picoReadIO().
David Korth [Wed, 30 Dec 2015 04:47:00 +0000 (23:47 -0500)] 
[libgens] IoPico: New function picoReadIO().

This function reads a controller I/O port for buttons, pen position,
and current page.

IoManager: Added a picoReadIO() wrapper function.

M68K_Mem::M68K_Read_Byte_Pico_IO(): Use IoManager::picoReadIO().

3 years ago[libgens] IoManager: Preliminary Pico tablet support.
David Korth [Wed, 30 Dec 2015 04:31:20 +0000 (23:31 -0500)] 
[libgens] IoManager: Preliminary Pico tablet support.

This commit adds absolute coordinates to the Device class, plus functions
to update the coordinates. The coordinates must be scaled to 1280x240.

1280 was chosen as the horizontal width in order to support 320px devices
as well as 256px devices. There were a few graphics tablets for the
Sega Master System that had a 256px width, so this will help to support
those devices later.

TODO: Get the mouse input from the UI and forward it to libgenskeys,
which will need to be updated to support absolute coordinates in
addition to buttons.

3 years ago[libcompat] W32U_argv.c: Use CommandLineToArgvW() if compiling with MSVC 2015.
David Korth [Wed, 30 Dec 2015 04:10:02 +0000 (23:10 -0500)] 
[libcompat] W32U_argv.c: Use CommandLineToArgvW() if compiling with MSVC 2015.

MSVC 2015's C runtime removed __wgetmainargs() and __getmainargs().
Since MSVC 2015 only targets Windows XP and later, we're guaranteed
to have access to the Unicode functions, so use CommandLineToArgvW()
to convert GetCommandLineW() to argc/argv instead.

Similarly, use GetEnvironmentStringsW() to get envp. Note that this
function was added in Windows XP.

3 years ago[libpng] Updated the internal libpng to version 1.6.19.
David Korth [Sun, 22 Nov 2015 21:16:39 +0000 (16:16 -0500)] 
[libpng] Updated the internal libpng to version 1.6.19.

3 years ago[libgens] Vdp::vdpDataWrite_int(): Don't wrap around when doing CRAM writes.
David Korth [Sun, 8 Nov 2015 20:23:54 +0000 (15:23 -0500)] 
[libgens] Vdp::vdpDataWrite_int(): Don't wrap around when doing CRAM writes.

"The Adventures of Batman and Robin" has problems if the address
wraps around. Ignore addresses over 0x80 for now.

I suspect this is a general DMA timing issue, which I can't fix
at the moment, since it requires a full rewrite.

Note that this breaks a test in VDPFIFOTesting:
Test #22. DMA Transfer to CRAM Wrapping

This bug was reported by gold_lightning.

3 years ago[gens-sdl] gens-sdl.cpp: Copied SetSecurityOptions() from gens-qt4.
David Korth [Sun, 11 Oct 2015 23:00:06 +0000 (19:00 -0400)] 
[gens-sdl] gens-sdl.cpp: Copied SetSecurityOptions() from gens-qt4.

3 years ago[gens-qt4] GensQApplication_win32.cpp: Added some more braces.
David Korth [Sun, 11 Oct 2015 22:53:18 +0000 (18:53 -0400)] 
[gens-qt4] GensQApplication_win32.cpp: Added some more braces.

3 years ago[gens-qt4] GensQApplication_win32.cpp: Cal SetDllDirectoryW().
David Korth [Sun, 11 Oct 2015 22:50:52 +0000 (18:50 -0400)] 
[gens-qt4] GensQApplication_win32.cpp: Cal SetDllDirectoryW().

This function was added in XP SP1. It's not present in any ANSI-only
versions of Windows, so we might as well use the Unicode version in
order to avoid string conversion overhead.

3 years ago[libgens] Vdp::readVCounter(): Fixed H32/H40 swap.
David Korth [Sat, 3 Oct 2015 21:13:17 +0000 (17:13 -0400)] 
[libgens] Vdp::readVCounter(): Fixed H32/H40 swap.

H32 is H_Counter_Table[x][0]; H40 is H_Counter_Table[x][1].

This error occurred when converting from the original asm to C in Gens/GS r7+.
gens.git commit 815caa7573c4c9c557bdf74bdc3cca0464382ebb
(vdp_io.c: Ported Read_VDP_H_Counter() and Read_VDP_V_Counter() to C.)

3 years ago[libgens] VdpReg.hpp: Improved descriptions of some "unused" bits.
David Korth [Sun, 27 Sep 2015 01:41:49 +0000 (21:41 -0400)] 
[libgens] VdpReg.hpp: Improved descriptions of some "unused" bits.

A few of these "unused" bits are actually used on some Sega arcade boards,
e.g. Sega System C2. Others aren't useful for much of anything.

3 years ago[gens-qt4] GensWindow: Prepend the system abbreviation to the window title.
David Korth [Sat, 26 Sep 2015 23:51:26 +0000 (19:51 -0400)] 
[gens-qt4] GensWindow: Prepend the system abbreviation to the window title.

EmuManager::sysAbbrev(): New function to get the system abbreviation
for the active ROM.

3 years ago[gens-sdl] EventLoop: Prefix the window title with "[NO-EMU]" in no-emulation builds.
David Korth [Sat, 26 Sep 2015 23:47:31 +0000 (19:47 -0400)] 
[gens-sdl] EventLoop: Prefix the window title with "[NO-EMU]" in no-emulation builds.

gens-qt4 already does this.

3 years ago[gens-qt4] RecentRomsMenu: Use EmuManager::SysAbbrev().
David Korth [Sat, 26 Sep 2015 23:40:56 +0000 (19:40 -0400)] 
[gens-qt4] RecentRomsMenu: Use EmuManager::SysAbbrev().

3 years ago[gens-qt4] EmuManager: New function SysAbbrev().
David Korth [Sat, 26 Sep 2015 23:40:27 +0000 (19:40 -0400)] 
[gens-qt4] EmuManager: New function SysAbbrev().

This function returns the abbreviation for the specified system ID.

TODO: Localized/unlocalized functions like SysName() and SysName_l()?

3 years ago[gens-sdl] EmuLoop: Use "MCD,32X" instead of "MCD32X".
David Korth [Sat, 26 Sep 2015 23:31:39 +0000 (19:31 -0400)] 
[gens-sdl] EmuLoop: Use "MCD,32X" instead of "MCD32X".

This matches gens-qt4's RecentRomsMenu.

3 years ago[gens-sdl] EmuLoop: Prepend the system abbreviation to the window title.
David Korth [Sat, 26 Sep 2015 23:29:13 +0000 (19:29 -0400)] 
[gens-sdl] EmuLoop: Prepend the system abbreviation to the window title.

I thought I did this in gens-qt4, but apparently I didn't. Anyways, it
should be done in order to make it more obvious what system is being
emulated for the loaded ROM.

4 years ago[libgens] Vdp: Shadow/Highlight operators mask all sprites.
David Korth [Sat, 19 Sep 2015 14:23:51 +0000 (10:23 -0400)] 
[libgens] Vdp: Shadow/Highlight operators mask all sprites.

In addition to masking the sprite pixel the S/H operator belongs to,
they also mask all other sprites at the same position. This was
verified on hardware, Kega Fusion, and Regen.

Test ROMs were provided by flamewing and Jorge.

4 years ago[doc] TODO.txt: Added some more entries.
David Korth [Sat, 19 Sep 2015 13:20:11 +0000 (09:20 -0400)] 
[doc] TODO.txt: Added some more entries.

4 years ago[libcompat] cpuflags.h: Use unsigned shifts, e.g. (1U << 31).
David Korth [Sat, 19 Sep 2015 13:19:16 +0000 (09:19 -0400)] 
[libcompat] cpuflags.h: Use unsigned shifts, e.g. (1U << 31).

- http://source.winehq.org/git/wine.git/commit/509d0f06cece4668a04f35f0ca6e924947673c31
- http://source.winehq.org/git/wine.git/commit/d04324f0fa449947743e8f00bee0267ba988f93d

4 years agoMerge branch 'feature/gens-sdl-popt'
David Korth [Sat, 12 Sep 2015 16:53:09 +0000 (12:53 -0400)] 
Merge branch 'feature/gens-sdl-popt'

Note that the --fps option doesn't do anything, since gens-sdl's OSD
doesn't have an FPS counter yet. (The title bar FPS counter will be
removed once that's implemented.)

4 years ago[gens-sdl] EmuLoop: Minor cleanup for option handling. feature/gens-sdl-popt github/feature/gens-sdl-popt
David Korth [Sat, 12 Sep 2015 16:52:47 +0000 (12:52 -0400)] 
[gens-sdl] EmuLoop: Minor cleanup for option handling.

4 years ago[libzomg] Metadata_*.cpp: Removed old CPU information TODOs.
David Korth [Sat, 12 Sep 2015 16:46:51 +0000 (12:46 -0400)] 
[libzomg] Metadata_*.cpp: Removed old CPU information TODOs.

This is now handled by Metadata.cpp using libcompat's cpuflags.h.

4 years agoc99-compat.msvcrt.h: New compatibility header for some MSVCRT functions.
David Korth [Sat, 12 Sep 2015 16:45:20 +0000 (12:45 -0400)] 
c99-compat.msvcrt.h: New compatibility header for some MSVCRT functions.

This is specifically for snprintf() and vsnprintf(). Other C99 functions
that have different names in MSVC are handled by MinGW-w64's headers
with no overhead, so those remain in c++11-compat.msvc.h.

The specific issue is how _snprintf() handles truncation and NULL termination.
If the string fits the buffer exactly, _snprintf() will return size, but the
buffer will NOT be NULL-terminated. If the string is over the size of the
buffer, _snprintf() will return -1, and the buffer may or may not be blank.
(MSVCRT 2010 blanks the buffer by setting str[0] = 0; not sure about the
system MSVCRT.DLL, so I'm clearing it manually in the inline function.)

If using MinGW-w64 and __USE_MINGW_ANSI_STDIO is defined, MinGW-w64 will
provide its own snprintf() and vsnprintf() functions that are C99 compatible.
I'm not defining this, since those functions take up extra space, and we
don't strictly need full C99 compatibility.

4 years ago[libzomg] Fixed build issues when a system libpng isn't present.
David Korth [Sat, 12 Sep 2015 16:11:21 +0000 (12:11 -0400)] 
[libzomg] Fixed build issues when a system libpng isn't present.

Define the PNG typedefs like before, but only if PNG_H isn't defined,
i.e. png.h hasn't been included.

Note that this means that if you #include "Metadata.hpp" and <png.h>
in the same file, you *must* #include <png.h> first.

4 years ago[libzomg] Fix build with libpng versions older than 1.5.0.
David Korth [Thu, 10 Sep 2015 02:21:37 +0000 (22:21 -0400)] 
[libzomg] Fix build with libpng versions older than 1.5.0.

Debian-based distributions still ship with libpng-1.2, so we need
to maintain compatibility. The biggest change in libpng-1.5.0 was
the constification of pointer arguments. To work around this,
we'll cast the pointers to non-const when compiling with older
versions of libpng.

libpng doesn't actually modify the contents of the data, so it's
effectively const anyway.

Also, libpng-1.4.0 changed the definition of png_uint_32 to
unsigned int. Previously, it was unsigned long, which is the same
as unsigned int on most 32-bit systems, but is 64-bit on most
64-bit systems (other than Windows).

4 years ago[gens-sdl] Options.cpp: Use '\0' instead of 0 for NULL character values.
David Korth [Tue, 8 Sep 2015 05:08:29 +0000 (01:08 -0400)] 
[gens-sdl] Options.cpp: Use '\0' instead of 0 for NULL character values.

This makes it more obvious that it's a character constant
instead of an integer value.

4 years ago[gens-sdl] Connected the '--frequency', '--stereo', and '--mono' options.
David Korth [Tue, 8 Sep 2015 05:02:30 +0000 (01:02 -0400)] 
[gens-sdl] Connected the '--frequency', '--stereo', and '--mono' options.

EventLoop::run() now takes an Options object as a parameter.
This is used to get the audio frequency and stereo value,
which are passed to SdlHandler::init_audio().

SdlHandler::init_audio(): Added frequency and stereo parameters.

Options: Added an alias "--freq" for "--frequency".

4 years ago[gens-sdl] EmuLoop: Show the ROM name in the window title.
David Korth [Tue, 8 Sep 2015 04:48:31 +0000 (00:48 -0400)] 
[gens-sdl] EmuLoop: Show the ROM name in the window title.

updateRomName() gets the ROM names from the EmuContext and, depending
on region codes, sets the window title to the appropriate ROM name.

EventLoop: New function updateWindowTitle(). This sets the window title,
sans paused and fps indicators. It's used by EmuLoop's updateRomName()
function to set the window title to the ROM name.

FIXME: On my XP VM, there's a slight pause while loading where it shows
"Gens/GS II [SDL]", then it gets changed to the ROM name.

4 years agoMerge branch 'bugfix/popt-1.16-apply-patches'
David Korth [Mon, 7 Sep 2015 21:20:22 +0000 (17:20 -0400)] 
Merge branch 'bugfix/popt-1.16-apply-patches'

These patches from Fedora and openSUSE fix a few issues, including
alignment checks and exec alias failures, plus various documentation

There's also some fixes for glibc-2.17's secure_getenv() that I already
applied myself, but this brings it closer to upstream, and adds a wrapper
version for platforms that don't have secure_getenv(), e.g. Windows and
all non-GNU systems like Mac OS X.

Sidenote: The strerror_r() patch was NOT applied, since it's incorrect.
See commit cadb3760858182897c0d94785d6de7e53b4c984e for more information.
([popt] Partially applied patches/popt-1.16-28.19.suse/popt-libc-updates.patch.)

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[gens-sdl] EmuLoop: If a TMSS ROM filename is specified, set it.
David Korth [Mon, 7 Sep 2015 16:33:45 +0000 (12:33 -0400)] 
[gens-sdl] EmuLoop: If a TMSS ROM filename is specified, set it.

If EmuMD can load the TMSS ROM can be loaded, TMSS will be enabled.

4 years ago[gens-sdl] EmuLoop: Clarify the short string buffer issues.
David Korth [Mon, 7 Sep 2015 16:30:11 +0000 (12:30 -0400)] 
[gens-sdl] EmuLoop: Clarify the short string buffer issues.

4 years ago[gens-sdl] EmuLoop: Set auto-fix-checksum and sprite-limits properties.
David Korth [Mon, 7 Sep 2015 16:29:08 +0000 (12:29 -0400)] 
[gens-sdl] EmuLoop: Set auto-fix-checksum and sprite-limits properties.

4 years ago[gens-sdl] EmuLoop: Save the rom_filename string directly instead of using c_str().
David Korth [Mon, 7 Sep 2015 16:24:22 +0000 (12:24 -0400)] 
[gens-sdl] EmuLoop: Save the rom_filename string directly instead of using c_str().

It seems that with gcc-5.x's "short string optimization", storing the
C string pointer instead of the entire C++ string causes random
corruption with filenames longer than the short string buffer.
It makes no sense, since both the rom_filename and c_str() values
show the same pointer, but rom_filename shows corruption while a
direct access to c_str() does not.

4 years ago[gens-sdl] VBackend: Removed the bpp parameter from the constructor.
David Korth [Mon, 7 Sep 2015 16:12:57 +0000 (12:12 -0400)] 
[gens-sdl] VBackend: Removed the bpp parameter from the constructor.

- Reinitialize the texture if the framebuffer's color depth changes.
  If m_fb is nullptr, the texture won't be initialized. update() won't
  use the texture if m_fb is nullptr.
- Moved internal variables into a private class.

- Use SdlGLBackend instead of SdlSWBackend. SdlSWBackend was enabled
  for testing purposes, but I accidentally committed it in
  commit f6343b63e7ecf254ed74cdceaab4004c6e16cff8.
  ([gens-sdl] Make use of the bpp command line parameter.)

4 years ago[gens-sdl] SdlGLBackend: Always set the GL color depth to 888 (32).
David Korth [Mon, 7 Sep 2015 15:54:34 +0000 (11:54 -0400)] 
[gens-sdl] SdlGLBackend: Always set the GL color depth to 888 (32).

Modern video cards prefer this to lower color depths. Also, SDL can't
change these values unless it closes and re-creates the window.

4 years ago[gens-sdl] Make use of the bpp command line parameter.
David Korth [Mon, 7 Sep 2015 15:52:09 +0000 (11:52 -0400)] 
[gens-sdl] Make use of the bpp command line parameter.

Options::bpp() now returns an MdFb::ColorDepth value.

TODO: Remove the bpp value from VBackend's constructor.
This will require re-creating the texture whenever the MdFb's
color depth changes.

4 years ago[libgens] MdFb: Added convenience functions to convert between ColorDepth and bpp...
David Korth [Mon, 7 Sep 2015 15:33:09 +0000 (11:33 -0400)] 
[libgens] MdFb: Added convenience functions to convert between ColorDepth and bpp values.

4 years ago[gens-sdl] Options: Moved variables to a private class.
David Korth [Mon, 7 Sep 2015 15:27:53 +0000 (11:27 -0400)] 
[gens-sdl] Options: Moved variables to a private class.

Added accessors for the internal variables.

Validate the color depth option. If it isn't 15, 16, or 32,
show an error and exit.

Sidenote: run_crazy_effect *was* handled in the previous commit,
even though I didn't mention it in the commit notes.

4 years ago[gens-sdl] Options: Initial command line option parser.
David Korth [Mon, 7 Sep 2015 15:22:30 +0000 (11:22 -0400)] 
[gens-sdl] Options: Initial command line option parser.

Several options are present, but currently only the ROM filename,
auto-pause, and paused-effect are used.

TODO: Rewrite Options to use accessors instead of publicly exposing
options, and store the actual options in a private class.

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.