baa0341bd5
- Allow key shortcuts to run with loaded game. For example, when we set `CTRL+A` for `load most recent save state` and use `A` for some input command, holding `CTRL` and then pressing `A` will not execute the shortcut. Instead, the key press `A` will be used only as the input and nothing else. With this, we use both the input and shortcut key. - Isolate function to get keyboard key codes. As explained on [1]: "Using `GetUnicodeKey()` is in general the right thing to do if you are interested in the characters typed by the user, `GetKeyCode()` should be only used for special keys (for which `GetUnicodeKey()` returns `WXK_NONE`)." We also allow special keys to be mapped, hence the requirement of using both functions. [1] https://docs.wxwidgets.org/3.1/classwx_key_event.html - Allow use of unicode keys for input and shortcut. Use format `KeyCode:Modifier` for saving/loading unicode keys. `WxWidgets=3.{0,1}` does not create an accelerator from strings with unicode keys such as `ç` (`FromString` function). It fails with an assertion error and stops execution. At the same time, we use the keys' strings that are known for WxWidgets, such as `A`, `CTRL+O`, `PAGEUP` etc. Use both `EVT_KEY_DOWN` and `EVT_CHAR`. `EVT_CHAR` is better than `EVT_KEY_DOWN` here because it is where the raw key events will have been cooked using whatever recipes are in effect from the os, locale, international keyboard settings, etc. - Enable SDL joysticks input as key shortcuts. Start/Stop polling joysticks on Unload/load game. Our main loop already polls the joystick, we don't need the timer while a game is running. - Create function `str_split_with_sep` and use it. For when we parse strings that may include the sep string, such as game input and key shortcuts. |
||
---|---|---|
.github | ||
.tx | ||
cmake | ||
data | ||
dependencies@605765f55d | ||
doc | ||
fex | ||
headers/stb | ||
po | ||
src | ||
tools | ||
.appveyor.yml | ||
.gitignore | ||
.gitmodules | ||
.travis.yml | ||
CHANGELOG.md | ||
CMakeLists.txt | ||
CMakeSettings.json | ||
DEVELOPER-MANUAL.md | ||
README.md | ||
installdeps | ||
snapcraft.yaml | ||
todo.md |
README.md
Visual Boy Advance - M
Game Boy and Game Boy Advance Emulator
The forums are here.
Windows and Mac builds are in the releases tab.
Nightly builds are here.
Your distribution may have packages available as well, search for
visualboyadvance-m
or vbam
.
It is also generally very easy to build from source, see below.
If you are using the windows binary release and you need localization, unzip
the translations.zip
to the same directory as the executable.
If you are having issues, try resetting the config file first, go to Help -> Factory Reset
.
Building
The basic formula to build vba-m is:
cd ~ && mkdir src && cd src
git clone https://github.com/visualboyadvance-m/visualboyadvance-m.git
cd visualboyadvance-m
./installdeps
# ./installdeps will give you build instructions, which will be similar to:
mkdir build && cd build
cmake .. -G Ninja
ninja
./installdeps
is supported on MSys2, Linux (Debian/Ubuntu, Fedora, Arch,
Solus, OpenSUSE, Gentoo and RHEL/CentOS) and Mac OS X (homebrew, macports or
fink.)
Building a Libretro core
Clone this repo and then,
cd src/libretro
make -j`nproc`
Copy vbam_libretro.so to your RetroArch cores directory.
Visual Studio Support
For visual studio, dependency management is handled automatically with vcpkg, From the Visual Studio GUI, just clone the repository with git and build with the cmake configurations provided.
If the GUI does not detect cmake, go to File -> Open -> CMake
and open the
CMakeLists.txt
.
If you are using 2017, make sure you have all the latest updates, some issues with cmake projects in the GUI have been fixed.
You can also build from the developer command prompt or powershell with the environment loaded.
Using your own user-wide installation of vcpkg is supported, just make sure the
environment variable VCPKG_ROOT
is set.
To build in the visual studio command prompt, use something like this:
mkdir build
cd build
cmake .. -DVCPKG_TARGET_TRIPLET=x64-windows-static -DCMAKE_BUILD_TYPE=Debug -G Ninja
ninja
Dependencies
If your OS is not supported, you will need the following:
And the following development libraries:
- zlib (required)
- mesa (if using X11 or any OpenGL otherwise)
- ffmpeg (optional, at least version
4.0.4
, for game recording) - gettext and gettext-tools (optional, with ENABLE_NLS)
- SDL2 (required)
- SFML (optional, for link)
- OpenAL or openal-soft (optional, a sound interface)
- wxWidgets (required for GUI, 2.8 and non-stl builds are no longer supported)
On Linux and similar, you also need the version of GTK your wxWidgets is linked to (usually 2 or 3) and the xorg development libraries.
Support for more OSes/distributions for ./installdeps
is planned.
Cross compiling for 32 bit on a 64 bit host
./installdeps m32
will set things up to build a 32 bit binary.
This is supported on Fedora, Arch, Solus and MSYS2.
Cross Compiling for Win32
./installdeps
takes one optional parameter for cross-compiling target, which
may be win32
which is an alias for mingw-w64-i686
to target 32 bit Windows,
or mingw-gw64-x86_64
for 64 bit Windows targets.
The target is implicit on MSys2 depending on which MINGW shell you started (the
value of $MSYSTEM
.)
On Debian/Ubuntu this uses the MXE apt repository and works quite well.
On Fedora it can build using the Fedora MinGW packages, albeit with wx 2.8, no OpenGL support, and no Link support for lack of SFML.
On Arch it currently doesn't work at all because the AUR stuff is completely broken, I will at some point redo the arch stuff to use MXE as well.
CMake Options
The CMake code tries to guess reasonable defaults for options, but you can override them, for example:
cmake .. -DENABLE_LINK=NO -G Ninja
Of particular interest is making Release or Debug builds, the default mode is Release, to make a Debug build use something like:
cmake .. -DCMAKE_BUILD_TYPE=Debug -G Ninja
Here is the complete list:
CMake Option | What it Does | Defaults |
---|---|---|
ENABLE_SDL | Build the SDL port | OFF |
ENABLE_WX | Build the wxWidgets port | ON |
ENABLE_DEBUGGER | Enable the debugger | ON |
ENABLE_NLS | Enable translations | ON |
ENABLE_ASM_CORE | Enable x86 ASM CPU cores (BUGGY AND DANGEROUS) | OFF |
ENABLE_ASM | Enable the following two ASM options | ON for 32 bit builds |
ENABLE_ASM_SCALERS | Enable x86 ASM graphic filters | ON for 32 bit builds |
ENABLE_MMX | Enable MMX | ON for 32 bit builds |
ENABLE_LINK | Enable GBA linking functionality (requires SFML) | AUTO |
ENABLE_LIRC | Enable LIRC support | OFF |
ENABLE_FFMPEG | Enable ffmpeg A/V recording | AUTO |
ENABLE_ONLINEUPDATES | Enable online update checks | ON |
ENABLE_LTO | Compile with Link Time Optimization (gcc and clang only) | ON for release build |
ENABLE_GBA_LOGGING | Enable extended GBA logging | ON |
ENABLE_DIRECT3D | Direct3D rendering for wxWidgets (Windows, NOT IMPLEMENTED!!!) | ON |
ENABLE_XAUDIO2 | Enable xaudio2 sound output for wxWidgets (Windows only) | ON |
ENABLE_OPENAL | Enable OpenAL for the wxWidgets port | AUTO |
ENABLE_SSP | Enable gcc stack protector support (gcc only) | OFF |
ENABLE_ASAN | Enable libasan sanitizers (by default address, only in debug mode) | OFF |
UPSTREAM_RELEASE | Do some release tasks, like codesigning, making zip and gpg sigs. | OFF |
VBAM_STATIC | Try link all libs statically (the following are set to ON if ON) | OFF |
SDL2_STATIC | Try to link static SDL2 libraries | OFF |
SFML_STATIC_LIBRARIES | Try to link static SFML libraries | OFF |
FFMPEG_STATIC | Try to link static ffmpeg libraries | OFF |
SSP_STATIC | Try to link static gcc stack protector library (gcc only) | OFF except Win32 |
OPENAL_STATIC | Try to link static OpenAL libraries | OFF |
SSP_STATIC | Link gcc stack protecter libssp statically (gcc, with ENABLE_SSP) | OFF |
Note for distro packagers, we use the CMake module GNUInstallDirs to configure installation directories.
On Unix to use a different version of wxWidgets, set
wxWidgets_CONFIG_EXECUTABLE
to the path to the wx-config
script you want to
use.
MSys2 Notes
To run the resulting binary, you can simply type:
./visualboyadvance-m
in the shell where you built it.
If you built with -DCMAKE_BUILD_TYPE=Debug
, you will get a console app and
will see debug messages, even in mintty.
If you want to start the binary from e.g. a shortcut or Explorer, you will need
to put c:\msys64\mingw32\bin
for 32 bit builds and c:\msys64\mingw64\bin
for 64 bit builds in your PATH (to edit system PATH, go to Control Panel ->
System -> Advanced system settings -> Environment Variables.)
If you want to package the binary, you will need to include the MinGW DLLs it depends on, they can install to the same directory as the binary.
Our own builds are static.
Debug Messages
We have an override for wxLogDebug()
to make it work even in non-debug builds
of wx and on windows, even in mintty.
It works like printf()
, e.g.:
int foo = 42;
wxLogDebug(wxT("the value of foo = %d"), foo);
From the core etc. the usual:
fprintf(stderr, "...", ...);
will work fine.
You need a debug build for this to work or to even have a console on Windows.
Pass -DCMAKE_BUILD_TYPE=Debug
to cmake.
Reporting Crash Bugs
If the emulator crashes and you wish to report the bug, a backtrace made with debug symbols would be immensely helpful.
To generate one (on Linux and MSYS2) first build in debug mode by invoking
cmake
as:
cmake .. -DCMAKE_BUILD_TYPE=Debug
After you've reproduced the crash, you need the core dump file, you may need to do something such as:
ulimit -c unlimited
in your shell to enable coredump files.
This post explains how to retrieve core dump on Fedora Linux (and possibly other distributions.)
Once you have the core dump file, open it with gdb
, for example:
gdb -c core ./visualboyadvance-m
In the gdb
shell, to print the backtrace, type:
bt
This may be a bit of a hassle, but it helps us out immensely.
Contributing
See the Developer Manual.