The core is replaced by dosbox-core as of libretro/dosbox-core d38fcb50 (its
history is in that repository), with the following on top:
- Frontend VFS for mounted drives (libretro/dosbox-core#11): Android content://
and saf:// content works.
- Built as dosbox_libretro and called DOSBox, so it installs next to
dosbox-core without sharing its options, saves directory or config file.
Option keys keep their dosbox_core_ prefix.
- ZIP files as content, from DOSBox Pure (Bernhard Schelling): its zipDrive,
unionDrive and memoryDrive, and the helpers they share (drive_dbp.cpp). The
archive is mounted as C: without being extracted and the game's changes go
to <name>.save.zip in the saves directory. DOS_Drive and DOS_File get the
few members those drives need, with defaults.
- The game in a ZIP is started when there is nothing to choose: the single
program in the root, or in the one folder the root holds, leaving setup and
install programs aside.
- Disk images inside a ZIP: CD images (cue sheets with data and audio tracks,
or ISOs) as D:, floppy images as A:, hard disk images as E: and on. Files on
emulated drives can be named "$C:\PATH" as in DOSBox Pure; host_stat,
fopen_wrap, the CD image reader and the audio track decoder open them
through the drive, finding files by their long names. CDs and floppies go
to RetroArch's disc control.
- A start menu after DOSBox Pure's when a ZIP leaves a choice: it lists the
programs on C: and on the mounted images, starts the one picked, can make it
start on its own next time (kept in C:\DOSBOX.RUN, in the save file), and
comes back when the program exits. Keyboard and gamepad; it can be turned
off in the core options.
- Automatic gamepad mapping from DOSBox Pure's Keyb2Joypad database (original
data by Jemy Murphy and bigjim, used by DOSBox Pure with permission): a game
the database knows, as a ZIP or from a directory, gets its keys, mouse and
joystick actions on the first gamepad instead of the DOS joystick, with the
action names shown in RetroArch. It can be turned off.
- The CPU speed from the game's year, from its name or the database, as in
DOSBox Pure; it can be turned off.
- Roland SC-55 MIDI with Nuked-SC55 (nukeykt), from DOSBox Pure, as a new MIDI
driver taking the module's ROMs from the system directory.
The two 32-bit Android ABIs were commented out because the NDK's clang
rejects both of their dynarecs: the ARM one writes to r7 from inline asm,
which is reserved as the frame pointer, and the x86 one is not position
independent. That is a reason not to build those two dynarecs, not a reason
not to build the core - dosbox has an interpreter, and every other ABI-less
target here already uses it. jni/Android.mk now leaves WITH_DYNAREC empty
for everything except x86_64, and all four ABIs are built.
webOS is the same makefile as Linux with the SDK's toolchain, so it needs
nothing new - except that on platform=unix the makefile guesses the dynarec
from `uname -m`, which on a cross build is the host. The job names the
target's own instead, and the ARM dynarec does build with GCC; it is only
the NDK's clang that refuses it.
Both checked with the same commands the templates run: armeabi-v7a and x86
through ndk-build (failing with the dynarec, building without it), and an
arm-linux-gnueabihf cross build standing in for the webOS SDK's
arm-webos-linux-gnueabi toolchain, with and without WITH_DYNAREC=arm.
Both were failing on every pipeline since the CI landed.
The Android jobs never got as far as compiling. `.core-defs` set
`JNI_PATH: jni`, but the android-jni template appends `/jni` to that itself
(`ndk-build -C $JNI_PATH/jni`), so it went looking for `jni/jni`. The
default is `.`, which is what this repository wants.
macOS stopped on the first `noexcept` in include/setup.h:
./include/setup.h:94:27: error: expected ';' at end of declaration list
Value& operator= (Hex in) noexcept(false) { ... }
^
Nothing tells the compiler which C++ standard this is, and clang on macOS
answers gnu++98. The code needs at least C++11 for `noexcept`, and at most
C++14, because the dynarec headers still say `register`, which C++17
removed - which is why jni/Application.mk already pins gnu++14 for the NDK.
So the makefile now says gnu++14 too, unless the platform block above it has
already chosen a standard (libnx picks gnu++11).
Built on aarch64 Linux, and the macOS arm64 job reproduced on an Apple
Silicon runner before and after.
Build linux-x64/i686/aarch64, windows-x64, osx-arm64 and the four Android
ABIs. Two notes carried in the file: the makefile knows platform=win rather
than win64 and cannot guess a dynarec when cross compiled, and aarch64 has
no dynarec backend in this fork.
Application.mk pins gnu++14: dosbox still uses `register`, which the NDK's
default C++17 rejects.
The core fails to compile due to the struct `retro_midi_interface` being defined twice in the file libretro.h. Removing one of the structs allows the core to compile correctly.