RetroArch 1.8.6 released!


RetroArch 1.8.6 has just been released.

Grab it here.

We will release a Cores Progress report soon going over all the core changes that have happened since the last report. It’s an exhaustive list, and especially the older consoles will receive a lot of new cores and improvements.

Remember that this project exists for the benefit of our users, and that we wouldn’t keep doing this were it not for spreading the love with our users. This project exists because of your support and belief in us to keep going doing great things. If you’d like to show your support, consider donating to us. Check here in order to learn more. In addition to being able to support us on Patreon, there is now also the option to sponsor us on Github Sponsors! You can also help us out by buying some of our merch on our Teespring store!

Highlights

There are many things this release post will not touch upon, such as all the extra cores that have been added to the various console platforms. We’ll spend some more time on that in a future Cores Progress Report post. We’ll go over some of the other highlights instead.

PSL1GHT PlayStation3 port

A new port of RetroArch to the PSL1GHT toolchain has been made for PlayStation3.

Right now there are no automated nightly builds for this, but you can download our experimental stable for it instead.

Working:

  • packaging
  • running cores
  • switching cores
  • gamepad including axis
  • RGUI menu driver
  • audio
  • video
  • cores: 2048, ecwolf, freechaf

Not working:

  • OSD
  • Menus other than RGUI
  • Shaders
  • Graphical acceleration
  • Proper signing
  • ODE build
  • Rumble
  • mouse

iOS/tvOS – Fix audio getting cut off on interruption

While using RetroArch, if you playback audio content (such as via the Control Center) or if you are interrupted by a phone call, the audio in RetroArch would stop entirely.

Changed to set the audio session category to “ambient” so that you can playback other audio sources and have sounds in RA at the same time.

Also, took out the bit to save the config when the app loses focus – it became too much of a distraction (the notification is distracting – this was not working previously anyway).

OpenGL Core – Slang shader improvements

Before, the OpenGL Core shader driver did not correctly initialise loaded textures. The texture filtering and wrap mode are forced on texture creation, but these settings were not recorded – subsequent updates would set garbage values, that then resolved to linear filtering OFF and wrap mode = CLAMP_TO_EDGE.

The wrap mode seemed to work regardless – perhaps once this is set the first time, it cannot change? (I don’t understand the inner workings of OpenGL…) But the texture filtering was certainly wrong. For example, this is what a background image with linear filtering enabled looks like:

…what you actually get is nearest neighbour.

This PR fixes texture initialisation so the filtering and wrap mode are recorded correctly. A linear filtered background image now looks like this:

Only write config files to disk when parameters change

We’ve been looking at ways to reduce disk I/O overhead, since it tends to be a big bottleneck on slower platforms.

Before, RetroArch would continuously overwrite its configuration files:

  • retroarch.cfg is written every time content is closed, and when closing RetroArch itself
  • Core options are written every time content is closed

This represents a large amount of unnecessary disk access, which is quite slow (and also causes wear on solid state drives!)

With 1.8.6, configuration files are only written to disk when the content actually changes.

All types of configuration file should now be ‘well behaved’ – with the exception of cheat files. These are still overwritten when closing content, since reusing old parameters may cause issues (and since I don’t use cheats at all, I didn’t feel confident enough to dabble with this)

While making these changes, we also discovered and fixed a number of bugs:

  • RetroArch no longer crashes when attempting to save a config file after ‘unsetting’ a parameter (currently, this can be triggered quite easily by manipulating input remaps)
  • When using Material UI, RetroArch no longer modifies the wrong setting (or segfaults…) when tapping entries in the Quick Menu > Controls input remapping submenu
  • Quite a few real and potential memory leaks have been fixed.

Playlist compression

There’s a new Compress playlists option under Settings > Playlists. When enabled, playlists are stored in an archived format (using the new rzip_stream interface).

The obvious benefit is that playlist file size is reduced by ~90%, with a corresponding reduction in disk wear on solid state drives (playlists are rewritten to disk quite frequently!).

Given the small size of playlist files, these saving aren’t hugely significant – but of more interest is the fact that on one of our development machines (Linux + mechanical HDD), loading a compressed playlist takes ~20% less time than an uncompressed one (despite the extra zlib overheads). This produces noticeably smoother scrolling when switching playlists in XMB. This improvement is most likely platform-dependent, but on devices where storage speed is a real issue (e.g. 3DS, UWP) the difference in playlist loading times should be quite pronounced.

We’ve also fixed some small playlist-related bugs/issues:

  • When saving playlists using the old format, default core association is now written correctly (not sure when this regression happened…)
  • When saving playlists using the old format, per-playlist sort mode is now recorded (I miscounted the number of available metadata ‘slots’ in the old format files – there was in fact just enough room for this one extra setting)
  • Whenever a playlist is cached by the menu (i.e. when a playlist is opened for display), RetroArch will check the format of the playlist (old/new) and its compression state – if either differ from the current user-set values, the file will be updated. This ensures playlists remain in sync with menu settings. (Previously, toggling the ‘use old format’ setting would do nothing unless the playlist was subsequently modified – this has long been an annoyance for me, since it meant ‘fully populated’ playlists languished in whatever state they were originally created)

It goes without saying that RetroArch will automatically detect whether or not a playlist is compressed and handle it appropriately.

If a playlist has been compressed and a user subsequently wants to edit it by hand, they can simply toggle Compress playlists off and then view the playlist via the menu – it will automatically be decompressed to plain text/JSON.

In addition to this, since human readability is not a factor when compressing playlists, we now omit all whitespace (newlines/indentation) when writing compressed JSON.

This reduces performance overheads when reading compressed JSON playlists by ~16% (!)

SRAM Compression

This is a minor follow-up to PR #10454. It adds a new SaveRAM Compression option under Settings > Saving. When enabled, SRAM save files are written to disk as compressed archives.

While SRAM saves are generally quite small, this can still yield a not insignificant space saving on storage-starved devices (e.g. the SNES/NES Classic consoles). Moreover, it reduces wear on solid state drives when SaveRAM Autosave Interval is set (in the worst case, this can write a couple of MB to disk per minute – vs. a few kB when compression is enabled).

Actual compression ratios will vary greatly depending upon core and loaded content. Here are a few examples of SRAM save sizes for random cores/games:

Core Uncompressed Compressed
Gambatte 32 kB 178 B
Genesis Plus GX 32 kB 83 B
mGBA 64 kB 1.1 kB
Mupen64Plus-Next OpenGL 290 kB 736 B
PCSX-ReARMed 128 kB 605 B
Snes9x 8.0 kB 183 B

In many cases, the actual on-disk save size can be reduced to almost nothing.

Notes:

  • As with save states, RetroArch will automatically detect whether SRAM saves are compressed and handle them appropriately (SaveRAM Compression can be toggled at any time).
  • This only works with cores that use the libretro SRAM interface for saving games. Many (most?) do, but there are some exceptions – e.g. Flycast writes save files directly, and so to does Beetle PSX depending on core settings.

Savestate compression

There’s a new Savestate Compression option under Settings > Saving. When enabled, save state files are written to disk as compressed archives. This both saves a substantial amount of disk space and reduces wear on solid state drives.

Actual compression ratios will vary depending upon core and loaded content. Here are a few examples of save state sizes for random cores/games:

Core Compression OFF Compression ON
Beetle PSX HW 16 MB 1.5 MB
Flycast 27 MB 8.9 MB
Genesis Plus GX 1012 kB 47 kB
mGBA 453 kB 45 kB
Mupen64Plus-Next OpenGL 17 MB 1.5 MB
PPSSPP 40 MB 9.3 MB
PCSX-ReARMed 4.3 MB 2.3 MB
PUAE 11 MB 793 kB
Snes9x 421 kB 82 kB

Notes:

  • RetroArch will automatically detect whether state files are compressed or not, and load them approriately – i.e. Savestate Compression can be toggled at any time, and everything will Just Work (TM)
  • We now have a new file stream for reading/writing archived data: rzip_stream. This can be used to handle any compressed data writing tasks we might have in the future

(Manual content scanner/playlist cleaner) Prevent redundant playlist entries when handling M3U content

Before, when the manual content scanner was used to scan content that includes M3U files, redundant playlist entries were created. For example, content like this:

  • Panzer Dragoon Saga CD1 (Saturn) (U).cue
  • Panzer Dragoon Saga CD2 (Saturn) (U).cue
  • Panzer Dragoon Saga CD3 (Saturn) (U).cue
  • Panzer Dragoon Saga CD4 (Saturn) (U).cue
  • Panzer Dragoon Saga (Saturn) (U).m3u

(where the .m3u references all the .cue files) would generate playlist entries for both the .m3u file and each of the .cue files. This is annoying, since the latter are pointless, and must be removed manually by the user.

1.8.6 adds M3U ‘awareness’ to the manual content scanner. Now whenever M3U files are encountered, they are parsed, and anything they reference internally is removed/omitted from the output playlist.

This functionality has also been added to the Playlist Management Clean Playlist task, so these redundant entries can be removed easily from existing playlists.

(Side note: 1.8.6 also adds a simple but feature complete M3U handling library – this may have additional use if someone wants to add the ability to generate M3U files for existing content…)

Improved handling of ‘broken’ playlists

RetroArch previously would fall apart when handling ‘broken’ playlists – i.e. when playlist entries have missing or invalid path/core path/core name fields. 1.8.6 should fix the most significant issues:

  • RetroArch will no longer segfault when attempting to run content via a playlist entry with missing path or core path fields.
  • When a playlist entry has either core path and/or core name set to NULL, DETECT or an empty string, attempting to load content will fallback to the normal ‘core selection’ code (currently this happens only if both core path and core name are DETECT – this is wholly inadequate!)
  • RetroArch will no longer segfault when attempting to fetch content runtime information when core path is NULL
  • Core name + runtime info will only be displayed on playlists and in the Information submenu if both the core path and core name fields are ‘valid’ (i.e. not NULL or DETECT)
  • When handling entries with missing path fields, the menu sorting order now matches that of the playlist sorting order (at present, everything goes out of sync when paths are empty). Moreover, entries with missing path fields can now be ‘selected’, so users can remove them (currently, hitting A on such an entry immediately tries – and fails – to load the content, so the only way to remove the broken entry is via the Playlist Management > Clean Playlist feature)

(Playlist Management) Add optional per-playlist alphabetical sorting

At present, RetroArch offers a global Sort playlists alphabetically option – but several users have requested more fine grained control. i.e. Users with highly customised setups might want a number of ‘hand-crafted’ playlists with specific ordering (release date, games in a particular series, etc.) without losing the ability to automatically sort their other conventional platform-based playlists.

1.8.6 adds a new Sorting Method option to the Playlist Management interface. This allows the sorting method to be overridden on a per-playlist basis. Available values are System Default (reflects Sort playlists alphabetically setting), Alphabetical and None.

Notes:

  • Content history playlists are excluded – they are never sorted (this has always been the case!)
  • This option is only available when using the ‘new’ format playlists (i.e. Save playlists using old format = OFF). There’s just not enough room in the old-style playlists for additional metadata. Since pretty much everyone uses the new format (by default), I don’t think this is an issue.
  • 1.8.6 also tweaks the way that the displayed menu entries are handled – previously, it would go as follows:

    Sort playlist
    Loop through playlist and generate menu entries
    Sort menu entries

…not only did this duplicate effort, but it meant there was a chance of the playlist and menu going out of sync – especially when using the Label Display Mode feature, which could lead to a different alphabetical ordering when processing the generated menu entries. As of 1.8.6, only the playlist is ever sorted, and menu entries are listed in exactly the same order.

Ozone

Before, Ozone can display either one thumbnail + content metadata or two thumbnails (with content metadata fallback when one image is missing) for each playlist entry.

With 1.8.6, if two thumbnails are enabled then the user can toggle between the second thumbnail and content metadata by pressing RetroPad ‘select’. When metadata is shown in this way, an image icon is displayed to indicate that a second thumbnail is available. The toggle may also be performed with a mouse/touchscreen by clicking/tapping the thumbnail sidebar.

Ozone menu – Mouse/Touch input fixes

  • Pointer input is now correctly disabled when message boxes are displayed
  • It turns out that Windows reports negative pointer coordinates when the mouse cursor goes beyond the left hand edge of the RetroArch window (this doesn’t happen on Linux, so I never encountered this issue before!). As a result, if Ozone is currently not showing the sidebar (menu depth > 1), moving the cursor off the left edge of the window generates a false positive ‘cursor in sidebar’ event – which breaks menu navigation, as described in #10419. With this PR, we now handle ‘cursor in sidebar’ status correctly in all cases.

(RGUI) Enable automatic menu size reduction when running at low resolutions (down to 256×192)

Before, on all platforms other than the Wii/NGC, RGUI had a fixed frame buffer size of [320-426]x240 (width takes one of three values depending upon current menu aspect ratio).

In most cases this is fine, with an important exception: when running content at its native resolution (usually when connected to a CRT), the display size is often smaller than 320×240. For example, SNES titles run at 256×224; master system titles at 256×192. In these cases, RGUI gets ‘squished’ – there are not enough scanlines on the screen, so rows of menu pixels get dropped (or blurred together if bilinear filtering is enabled). This makes the menu difficult to read/use.

This PR modifies RGUI such that its frame buffer dimensions are automatically reduced when running at low resolutions. The minimum nominal menu size is 256×192, which should enable content for almost all TV-connected consoles to be run at native resolution while maintaining pixel perfect menu scaling.

(Unfortunately, going any smaller than this breaks RGUI – so for handheld systems it’s still best to run at higher resolutions with a shader or video filter)

While implementing this, narrowed down the detection of when the aspect ratio lock should be disabled: currently, RGUI’s aspect ratio lock ‘turns off’ when accessing the video settings menu – this now only happens when accessing the video scaling submenu, since this is the only section that can cause conflicts with the aspect lock method. (Note that the old behaviour is maintained for the Wii port, because it has special requirements relating to resolution changes)

Menu – widget and font improvements

  • The font ascender/descender metrics are now used to achieve ‘pixel perfect’ vertical text alignment
  • Message queue text now uses its own dedicated font. Previously, a single (larger) font was used for all active widgets, and this was scaled down for message queue items. This ‘squished’ the text a little; more importantly, when using the stb font renderers (on Android. etc.) it caused ugly artefacts around the edges of glyphs due to pixel interpolation errors. Now that a correctly sized font is used, the message queue is always rendered cleanly.
  • Previously, each widget font was ‘flushed’ (font_driver_flush()) at least once a frame. This is quite a slow operation. Now we only flush fonts if they have actually been used.

Content scanner was unable to identify games from CHD images on Android builds

The content scanner was unable to identify games from CHD images on Android builds (same files that are being properly identified on Windows builds).

It was discovered that both the extracted magic number and CRC hash differed on both builds. This should now be resolved.

Changelog

What you’ve read above is just a small sampling of what 1.8.6 has to offer. There might be things that we forgot to list in the changelog listed below, but here it is for your perusal regardless.

1.8.6

  • 3DS: Add IDs for UZEM, TGB Dual, and NeoCD
  • 3DS: Fix font driver horizontal text alignment
  • 3DS: Allow button presses up to INPUT_MAX_USERS – this enables the 3DS to bind and use buttons and axis for users up to the maximum set by ‘Max Users’ in the input settings menu.
  • 3DS: Disable video filter if upscaled resolution exceeds hardware limits. The 3DS has a maximum video buffer size of 2048×2048. This is sufficient for every core that it supports, but when using software video filters the core output resolution is doubled. This is made worse by the fact that the video filter upscaling buffer size is dependent upon the maximum output resolution of the core – which in some cases is very large indeed (e.g. pcsx-rearmed sets a maximum width of 1024, for enhanced resolution support). The 3DS has very limited ‘linear memory’ for graphics buffer purposes, and a large base core buffer + video filter buffer can easily exceed this – which may also disable video output, or cause a crash. This PR very simply adds a 3DS-specific check to the video filter initialisation: if the resultant upscaling buffer exceeds the hardware limitation, then the filter is automatically disabled.
  • 3DS/FONT/BUGFIX: Text colour was wrong: the RGBA channels were muddled, and R was always set to 255
  • 3DS/FONT/BUGFIX: When drawing multiline strings, the line spacing was completely incorrect
  • 3DS/FONT: Improves the appearance of the drop shadow effect on notification text.
  • 3DS/ARCHIVE/7Z: Re-enable 7zip support.
  • ARCHIVE/ZIP: Expand functionality of ‘rzip_stream’ interface. This PR expands the functionality of the new rzip_stream archived stream interface such that it now has almost complete feature parity with the standard file_stream interface, and can therefore be used as a drop-in replacement in most situations
  • AI SERVICE: Hide redundant entries when service is disabled
  • AI SERVICE: Added in auto-translate support
  • AI SERVICE: support for NVDA and SAPI narration
  • AUTOCONFIG: Use correct port index in input device configured/disconnected notifications
  • BUGFIX: Fix race condition where task could momentarily not be in the queue when reordering
  • CHEEVOS/BUGFIX: Prevent null reference rendering achievement list while closing application
  • CHEEVOS/BUGFIX: Report non-memorymap GBA cores as unsupported
  • COMMANDLINE: Advise against using -s and -S variables on the command line.
  • CONFIG FILE: Only write config files to disk when parameters change
  • CONFIG FILE/BUGFIX: RetroArch no longer crashes when attempting to save a config file after ‘unsetting’ a parameter (currently, this can be triggered quite easily by manipulating input remaps)
  • CONFIG FILE/BUGFIX: When using Material UI, RetroArch no longer modifies the wrong setting (or segfaults…) when tapping entries in the Quick Menu > Controls input remapping submenu
  • CONFIG FILE/BUGFIX: Quite a few real and potential memory leaks have been fixed.
  • CHD: Fixes a crash caused by ignoring the return value from one of the CHD library functions
    FASTFORWARDING: A new Mute When Fast-Forwarding option has been added under Settings > Audio. When enabled, users can fast forward without having to listen to distorted audio.
  • GLCORE/SLANG: Set filter and wrap mode correctly when intialising shader textures. Before, the glcore shader driver did not correctly initialise loaded textures. The texture filtering and wrap mode were forced on texture creation, but these settings were not recorded – subsequent updates would set garbage values, that would resolve to linear filtering OFF and wrap mode = CLAMP_TO_EDGE.
  • LOCALIZATION: Update Japanese translation
  • LOCALIZATION: Update Spanish translation
  • LOCALIZATION: Update Portuguese Brazilian translation
  • IOS: Set audio session category to ambient so sound does not get cut off on interruption (phone call/playing back audio)
    MAC/IOHIDMANAGER/BUGFIX: Fix for Mayflash N64 adapter. In case last hatswitch does not match cookie. For the mayflash N64 adapter, I was getting a BAD EXC ADDRESS (in mac OS 10.13) for this line (tmp was NULL). Retroarch would crash in the gui if I pressed a button from the DPAD on controller 2. With this change, it no longer crashes in the gui and still registers the button push.
  • MAC/COCOA: Fix mouse input – this brings back two lines of code that have been removed over time but appear to be required in order for mouse input to work on macOS
  • METAL/BUGFIX: GPU capture on Metal/OSX/NVidia could crash
  • METAL/BUGFIX: Taking screenshots could capture black frames. Resulting PNG screenshots were black.
  • METAL/BUGFIX: Corrupted image due to incorrect viewport copy when taking screenshot
  • MENU: Prevent font-related segfaults when using extremely small scales/window sizes
  • MENU: Fix ‘gfx_display_draw_texture_slice()’
  • MENU/FONT: Enable correct vertical alignment of text (+ font rendering fixes)
  • MENU/RGUI: Enable automatic menu size reduction when running at low resolutions (down to 256×192)
  • MENU/OZONE: Update timedate style options for Last Played sublabel metadata
  • MENU/OZONE: Hide ‘Menu Color Theme’ setting when ‘Use preferred system color theme’ is enabled
  • MENU/OZONE: Fix thumbnail switching via ‘scan’ button functionality
  • MENU/OZONE: Prevent glitches when rendering Ozone’s selection cursor
  • MENU/OZONE: Enable proper vertical text alignment + thumbnail display improvements
  • MENU/OZONE: Enable second thumbnail/content metadata toggle using RetroPad ‘select’
  • MENU/OZONE: Refactor footer display
  • MENU/OZONE: Hide thumbnail button hints when viewing file browser lists
  • MENU/OZONE/INPUT/BUGFIX: Fix undefined behaviour when using touch screen to change input remaps
  • MENU/OZONE/INPUT/BUGFIX: It turns out that Windows reports negative pointer coordinates when the mouse cursor goes beyond the left hand edge of the RetroArch window (this doesn’t happen on Linux, so I never encountered this issue before!). As a result, if Ozone is currently not showing the sidebar (menu depth > 1), moving the cursor off the left edge of the window generates a false positive ‘cursor in sidebar’ event – which breaks menu navigation, as described in #10419. With this PR, we now handle ‘cursor in sidebar’ status correctly in all cases
  • MENU/OZONE/INPUT/BUGFIX: Pointer input is now correctly disabled when message boxes are displayed
  • MENU/XMB: Fix thumbnail switching via ‘scan’ button functionality
  • ODROID GO ADVANCE: Add DRM HW context driver
  • PSL1GHT: Initial port
  • PSL1GHT/KEYBOARD: Implement PSL1GHT keyboard
  • PLAYLIST/BUGFIX: Improve handling of ‘broken’ playlists – RetroArch will no longer segfault when attempting to run content via a playlist entry with missing path or core path fields.
  • PLAYLIST/BUGFIX: Improve handling of ‘broken’ playlists – when a playlist entry has either core path and/or core name set to NULL, DETECT or an empty string, attempting to load content will fallback to the normal ‘core selection’ code (currently this happens only if both core path and core name are DETECT – this is wholly inadequate!)
  • PLAYLIST/BUGFIX: RetroArch will no longer segfault when attempting to fetch content runtime information when core path is NULL
  • PLAYLIST/BUGFIX: Core name + runtime info will only be displayed on playlists and in the Information submenu if both the core path and core name fields are ‘valid’ (i.e. not NULL or DETECT)
  • PLAYLIST/BUGFIX: When handling entries with missing path fields, the menu sorting order now matches that of the playlist sorting order (at present, everything goes out of sync when paths are empty). Moreover, entries with missing path fields can now be ‘selected’, so users can remove them (currently, hitting A on such an entry immediately tries – and fails – to load the content, so the only way to remove the broken entry is via the Playlist Management > Clean Playlist feature)
  • PLAYLIST: Add optional per-playlist alphabetical sorting
  • PLAYLIST: Omit whitespace when writing compressed JSON format playlists
  • PLAYLIST: Add optional playlist compression
  • QNX: Support analog sticks
  • SAVESTATES: Add optional save state compression (enabled by default now)
  • SRAM: Add optional save (SRAM) file compression
  • SCANNER: Prevent redundant playlist entries when handling M3U content
  • SCANNER/ANDROID: Fix content scanner being unable to identify certain games from CHD images (raw data sector/subcode)
  • TASKS/BUGFIX: Fix task deadlocks
  • TASKS/SCREENSHOT/BUGFIX: Fix heap-use-after-free error when widgets are disabled
  • TVOS: Disable overlays for tvOS, fix app icon
  • VIDEO/WIDGETS/BUGFIX: The font ascender/descender metrics added in #10375 are now used to achieve ‘pixel perfect’ vertical text alignment
  • VIDEO/WIDGETS/BUGFIX: Message queue text now uses its own dedicated font. Previously, a single (larger) font was used for all active widgets, and this was scaled down for message queue items. This ‘squished’ the text a little; more importantly, when using the stb font renderers (on Android. etc.) it caused ugly artefacts around the edges of glyphs due to pixel interpolation errors. Now that a correctly sized font is used, the message queue is always rendered cleanly.
    VIDEO/WIDGETS/BUGFIX: Previously, each widget font was ‘flushed’ (font_driver_flush()) at least once a frame. This is quite a slow operation. Now we only flush fonts if they have actually been used.
  • VULKAN/BUGFIX: Fix display of statistics text
  • UNIX/BUGFIX: Fix overflow when computing total memory on i386
  • WIIU/BUGFIX: Fix font driver horizontal text alignment
  • WIIU/BUGFIX: Fix non-vertex coordinates in draws using tex shader
  • WIIU/BUGFIX: Update and fix meta.xml file for the WiiU release. This change makes it so the information from the meta.xml file parsed for the WiiU’s Homebrew Launcher is displayed properly.

Kronos 2.1.2 progress report (Sega Saturn emulator)

It has been some time since the last report, let’s try to go a bit more in-depth this time.

The OpenGL CS video renderer

The Saturn is a beast. It features 8 processors, among them are 2 custom graphics processors called VDP1 and VDP2. The VDP2 handled backgrounds, while the VDP1 handled sprites, textures and polygons.

The VDP1 was rendering “quads” line per line, the general idea was to interpolate endpoints along the horizontal edges, then to draw textured lines between those endpoints. It had to draw the lines with an extra pixel where the slope changed, so all of the pixels had a neighbor to the left, right, top, or bottom. They did this to prevent gaps between the lines.

A modern graphics APIs like OpenGL doesn’t know how to do that, because its rendering pipeline is based on triangle geometry, so basically it can’t reproduce VDP1 behavior. There are tricks like tesselation, but ultimately they are just workarounds for specific issues and not all-in-one solutions for this. Here is some good news though : with OpenGL 4.3, a new feature called compute shaders was introduced, you might have heard about it through Flycast’s order independent transparency, or N64’s parallel, this new component gives lots of flexibility to OpenGL, and allows the implementation of routines to render quads line per line. It is what this renderer is about : reproducing VDP1 behavior accurately.

Let’s do some comparison, from first to last, those images were shot from console, Mednafen/beetle, Kronos (OpenGL CS renderer), Kronos (the old OpenGL renderer, based on YabaSanshiro’s). There are 2 things noticeable related to this VDP1 behavior in those :

  • border of the road : on console, Mednafen and Kronos’s new renderer, if you zoom in, you’ll notice it’s not a smooth line, there are dots, this is the accurate behavior; the last screen, while the smooth line might look better, is actually inaccurate.
  • holes everywhere : if you zoom in on the last screenshot, you’ll notice some holes here and there, on the top of the hills, on the road in the back, those holes don’t exist on the other screenshots.

It’s possible to workaround those holes with the OpenGL renderer, but at the end of the day you end up creating other issues in the process. Until recently we used such workaround but, in the case of Sega Rally, it was magnifying the dots on the border of the road.

The only known downside of this new renderer is that it will require a fairly good GPU!

ST-V support was improved

While still a bit preliminary, some major rework was done recently on ST-V support :

  • You can now set your favorite bios region (NB : it will be ignored if the game doesn’t support that region though)
  • The EEPROM is now properly saved and loaded
  • ROM loading mechanism was fixed, there should be no more messages of the ST-V bios telling you there is something wrong with the game you are trying to launch
  • Lots of input issues, going from the lack of kick harness (used for 5th & 6th buttons on some games) to the inputs not responding at all, were fixed

Improvements on the Libretro port

There were some long-term issues with the Libretro implementation, but a lot of improvements were done about them :

  • Resolution switching, which is something that happens every few seconds on saturn, was somehow wrong, one of the worst side effect was artifacts especially visible in “mesh” (if you don’t use the “improved mesh” core option), it was fixed
  • Toggling between fullscreen and windowed was causing issues from glitches to crashes, it has been mostly fixed
  • While the saturn framerate should be 50 or 60 fps depending on the region, sometimes it’s not rendering anything because the Saturn is actually shutting down its video output, kronos is trying to have an accurate behavior for this too, which is a bit of a headache for the libretro ecosystem which is expecting a more linear framerate. A better way of handling this was implemented.

Also, here is a summary of this core’s options :

  • Force HLE BIOS : it will ignore your bios file and use the old HLE bios from yabause instead, this function is unmaintained and is mainly there for debugging purpose (there is at least one known case where it’s unlocking the game though : Astal, for some reason the real bios is shutting down the video output), don’t report issues if you enabled this option.
  • Video format : will force format to PAL or NTSC, default is auto
  • Frameskip : will skip rendering at a fixed rate, it can improve playability dramatically on lower end devices
  • SH-2 cpu core : default is “kronos”, our cross-platform cached interpreter, the other one is the unmaintained yabause SH-2 interpreter, we got the same policy than the HLE bios about it.
  • OpenGL version : this option was introduced as a workaround for setups giving false positive when asking if a specific OpenGL version was supported (it happened…), set this to the highest version your gpu support.
  • Video renderer : to enable the new renderer, default is the old one for compatibility reasons
  • Share saves with beetle : will share save paths with beetle-saturn, allowing you to use the same savefiles.
  • Addon cartridge : to change cartridge, default is auto, it is recommended to let the default except if you intend to play heart of darkness, a prototype requiring the 16M extended RAM.
  • 6Player Adaptor on Port 1 : self explanatory
  • 6Player Adaptor on Port 2 : same, one word of warning though, enabling the second multitap is known for causing a weird autofire behavior.
  • Internal Resolution : self explanatory
  • Polygon Mode : works with the default OpenGL renderer, used to fix wobbling textures issues, OpenGL CS doesn’t need this, default is cpu tesselation but gpu tesselation is recommended if your gpu supports it (OpenGL 4.2), perspective correction is more cpu friendly but heavily glitched.
  • Improved mesh : will replace fake transparency (mesh) by real transparency, default is disabled
  • RBG Compute shaders : will use compute shaders to rotate background, it is recommended if your gpu supports it, default is disabled
  • Wireframe mode : self-explanatory ? It works only with OpenGL CS, mostly for debugging but can be a fun feature, give it a try for curiosity !
  • ST-V Service/Test Buttons : enable buttons to access service menu in ST-V game, default is disabled to avoid misspress
  • ST-V Favorite Region : select your region for ST-V, default is EU for censorship and language reasons.

On a sidenote, lots of other things were fixed/improved since my last report, but nothing seemed major so we decided to skip them. If you want to know more about this emulator, you can check the youtube channel, or join us on discord.

Libretro Cores Progress Report – April 2, 2020

Our last core progress report was on February 29, 2020. Below we detail the most significant changes to all the Libretro cores we and/or upstream partners maintain. We are listing changes that have happened since then.

How to update your cores in RetroArch

There are two ways to update your cores:

a – If you have already installed the core before, you can go to Online Updater and select ‘Update Installed Cores’.

b – If you haven’t installed the core yet, go to Online Updater, ‘Core Updater’, and select the core from the list that you want to install.

Final Burn Neo

Description: Multi-system arcade emulator

  • Latest updates from upstream

blueMSX

Description: Home computer MSX emulator

  • Fix not smooth scroll in PAL 50Hz
  • Buildfix for libnx (Switch)
  • Buildfix for 3DS

Beetle PSX

Description: Sony PlayStation emulator

  • Added “fast PAL” hack to allow PAL games to play at NTSC framerates
  • Added Force NTSC aspect ratio
  • Vulkan: Disable adaptive smoothing by default

    This should be disabled by default like the other Vulkan-exclusive
    enhancements so as to better match stock settings

  • Hide scanline core options based on content region
  • Refactor memory card core options logic

    Get rid of confusing check_variables() memcard startup logic and
    corresponding redundant variables, and update core option
    labels/sublabels to match actual core functionality.

  • Implement aspect ratio core option (psx.correct_aspect equivalent)

    Beetle PSX implementation of “psx.correct_aspect” introduced in Mednafen
    1.24.0-UNSTABLE (no relevant code backported from upstream).
    Additionally fixes aspect ratio scaling issues when cropping overscan or
    adjusting visible scanlines. “Force 4:3” is left as a legacy option for
    users preferring the old inaccurate behavior.

  • Add option for setting core-reported FPS timing
  • WIP: increase RAM to 8MB instead of the default 2
  • Improve internal FPS detection

Vitaquake 2

Description: Quake 2 game engine core

Vitaquake 2 is now available for the first time on Emscripten.

Hatari

Description: Atari ST/STE/TT/Falcon emulator

  • Port: Ported Hatari to PS Vita

Atari 800

Description:

  • Port: Ported Atari 800 to 3DS

Dosbox core

Description: MS-DOS home computer emulator

  • Latest updates from Github

Dosbox SVN

Description: MS-DOS home computer emulator

  • Latest updates from Github
  • Make 16MB RAM default, change default cycle mode to “fixed” and “10000”

    Max and auto modes are broken on some systems.

LRMAME

Description: Multi-system arcade emulator

  • Updated to version 0.219

ECWolf

Description: Wolfenstein 3D game engine core

  • Latest updates (TODO/FIXME)

Flycast

Description: Sega Dreamcast emulator

  • fix alignment issues reported by ubsan on x64
  • Fix chd lzma and zlib buffers alignment
  • Fix rec/x64 block check alignment
  • Fix ChannelEx struct alignment
  • nvmem: generate console ID at startup. rec-x64: Call stack alignment

    Generate console ID in dc_nvmem.bin if blank. Used by chuchu rocket
    login.
    Align stack to 16-byte when calling function from x64 rec

  • (NAOMI) add sfz3ugd button labels
  • (NAOMI) Alien Front Naomi needs DIV matching disabled
  • (NAOMI) VMU support (vonot, sf3zu). Fix otrigger inputs.
  • input: only use R2/L2 for trigger input even with digital triggers
  • renderer: generate mipmaps for custom textures
  • custom texture: stop loader thread before loading state
  • renderer: decrease MipmapD bias – fixes street lights in Sonic Adventure 1
  • gdrom: don’t resume CDDA if not playing. stop if cur > end – implement ATA_IDENTIFY
  • Protect RAM and VRAM when VMEM is disabled
  • (Switch) Initial Port
  • ta: defer index building and strip merging, filter out infinite vertices
  • pvr: reserve more opaque polys. Don’t crash on TA overrun
  • vmem: unprotect vram when releasing memory if NO_VMEM
  • (Switch) Iterate each Page for Permission set
  • Use -O2 for YUV_Block8x8 due to UB
  • pvr: don’t reset tile clipping value on each frame – Fixes Irides – master of blocks
  • support multi-session cue/bin. mipmap D-adjust only to increase LoD
  • limit maple schedule time
  • allow VRAM 8-bit reads
  • gl: use common ReadFramebuffer() func
  • sort triangles even with 1 polygon – fixes missing Naomi boot logo and vtennis2 black frame during replay
  • fix crash when TR poly count is 0

ChaiLove

  • Port: Ported ChaiLove core to 3DS
  • Port: Ported ChaiLove core to Android

HBMAME

Description: Emulator of homebrew and hacked games for arcade hardware

  • New core

VICE

Description: Commodore 64 home computer emulator

  • Split “Paddles” joyport type to first two RetroPads:
    Player1 vertical axis = Player2 horizontal axis
    Player1 2nd button = Player2 1st button
    Add speed modifier hotkeys (slower+faster) for paddles/mouse

    Because “Paddles” is in fact 2 controllers in one joyport, and currently it is read like a mouse with 2 axis and 2 buttons, this is not convenient for 2 player games, like Panic Analogue, which use paddles as 2 separate entities with one axis and one button.

  • Fixes for JiffyDOS, Disk Control & Statusbar –

    To evade JiffyDOS incompatibilities with CRTs, PRGs & TAPs, the allowance method is changed from whitelist to blacklist.
    Also M3U playlists of D64 images will allow, and playlists of TAP images will not
    Fixed not being able to insert disks at all when starting without content
    Drive type defaults to 1541, as in inserting D81s will not work for now, because drive type autodetection happens only on autostart
    Finetuned statusbar

  • Turbofire & JiffyDOS fix –
    Minor fixes:

    Turbofire pulse was off (value 2 was actually 4)
    No reason to allow JiffyDOS core option with anything other than D64 & D81, or is there..?

  • Remove Nuklear GUI, Add VKBD touch control –
    Replaced bloaty Nuklear with the lightweight VKBD from PUAE

    No drawbacks, only benefits: Touch control, better performance, simpler maintenance

  • Port: Fixed VICE core Android build
  • Port: Ported VICE core to 3DS
  • Port: Ported VICE core to Emscripten
  • Add support for disk control interface v1 (disk display labels)
  • x64: Exclude vicii-clock-stretch.c – vicii-clock-stretch.c is not really used on x64, it’s only for x128
  • Disable cpmcart on x128 –
    Both x128 and cpmcart have z80 cpu and both have z80_regs symbols.
    On platforms other than emscripten those symbols end up being aliased
    due to “-fcommon” behaviour. This would lead to very weird results if they
    would ever be used together.

    On real hw cpmcart is unnecessarry due to integrated CP/M mode

    In the emulator cpmcart is runtime-enable only on x64 and x64sc but
    the relevant code is still compiled-in.

    So just remove cpmcart.c and #ifndef to avoid references

  • Core option for disabling autostart joined with autostart warp
  • Statusbar improvements, VKBD transparency core option

GME

Description: Game Music Emulator core

  • Port: Ported GME core to PSL1GHT (PS3)
  • Port: Ported GME core to 3DS

prBoom

Description: Doom 1/2 game engine core

  • retro_run: Don’t attempt to run domm lop after exit – This fixes crash on exit on 3DS
  • Port: Added PSL1GHT port (PS3)

MelonDS

Description: Nintendo DS emulator

  • (Switch) Latest updates

P-UAE

Description: Commodore Amiga emulator

  • VKBD updates, CD turbo speed backport
  • WHDLoad changes (button overrides)
  • VKBD touch control –
    Only tested with Windows and mouse, since RETRO_DEVICE_POINTER also reacts with it. Hence also disabled real mouse control while VKBD is visible.
  • Port: Ported P-UAE to PSVita
  • Minor save state improvements
  • Extended ZIP support

ScummVM

  • Update to ScummVM 2.1.1
  • Allow launching games directly from game files

Mr. Boom

Description:

  • Port: Ported Mr. Boom to 3DS
  • Port: Ported Mr. Boom to Emscripten
  • Port: Ported Mr. Boom to PSP
  • Port: Ported Mr. Boom to PS Vita
  • Port: Ported Mr. Boom to Apple tvOS
  • Fix unaligned casts

FCEUmm

Description: NES emulator core

  • Fix unable to load some unif carts
  • M274 update
  • Add 42-in-80000 multicart (m380)
  • Add mapper 389 (Caltron 9-in-1)
  • BMCFK23C – update
  • Fix default palette
  • Add Mortal Kombat Trilogy – 8 People (M1274) (Ch) [!].nes to ines-cor…
  • Merge unif board BMC-Super24in1SC03 to BMC-FK23C
  • M176: Minor tweak to chr mixed ram/rom logic check and others
  • Simplify dipswitch options for Nintendo World Championships 1990 cart
  • MMC3: Make sure to free any allocated memory when using MMC3 as an external module
  • Misc mapper updates
  • m269: Move chr unscrambling to mapper init
  • Unif: Show raw values for prg/chr rom size in logs
  • Remove unneeded code in BMC-Super24in1SC03
  • Remove duplicate code in bmc-fk23c
  • Rewrite BMC-FK23C/A (m176) based on updated notes and testing
  • Fix incompatible pointer type warning
  • Add 168-in-1 New Contra Function 16 to ines-correct.h
  • unif.c: Align board map struct
  • ines.c: Cleanup mapper struct and iNESLoad()
  • Fix unterminated savestate struct
  • Update mapper 79
  • vrc2and4: Fix mapper 22 games not working (regression) and refactoring
  • Update ines-correct.h

The Powder Toy

Description: Game engine core

  • Port: Ported The Powder Toy to 3DS

PocketCDG

Description: MP3 Karaoke audio player

  • Eliminate too verbose output – On 3DS stderr is printed on lower screen and is slow. This messes up the
    performance completely.

Picodrive

Description: Sega Megadrive/Genesis/32X/CD emulator

  • Add option to change sound quality – Even with the fast renderer (#116), the framerate on the PSP slows down at some points in some games. Reducing the sound rate can help increase the framerate in these cases.

    It’s not ideal but it’s better than frame skipping. [bmaupin]

VBA-M

Description: Game Boy Advance emulator

  • Fix Save Failed error for Super Monkey Ball Jr.

gpSP

Description: Game Boy Advance emulator

  • [3DS] Fix dynarec prefetch aborts
  • Add automatic frame skipping

Frodo

Description: Commodore 64 emulator

  • Support running without ROM

PX68K

Description: Sharp X68000 Emulator

  • Prevent simultaneous up+down / left+right button presses

Lutro

Lutro now runs on the 3DS.

Snake runs at 60 fps
Platformer runs at 20 fps

  • (3DS) Fix build
  • (Switch) Fix build

RetroArch 1.8.5 released!


RetroArch 1.8.5 has just been released.

Grab it here.

We will release a Cores Progress report soon going over all the core changes that have happened since the last report. It’s an exhaustive list, and especially the older consoles will receive a lot of new cores and improvements.

Remember that this project exists for the benefit of our users, and that we wouldn’t keep doing this were it not for spreading the love with our users. This project exists because of your support and belief in us to keep going doing great things. If you’d like to show your support, consider donating to us. Check here in order to learn more. In addition to being able to support us on Patreon, there is now also the option to sponsor us on Github Sponsors! You can also help us out by buying some of our merch on our Teespring store!

What’s changed?

New default menu – Ozone

Based on the results of a popular vote poll we held on Twitter, Ozone is now the default menu driver moving forward for RetroArch. If you still would like to use the previous menu (XMB), you can still do that – just go to Settings, Drivers, change Menu to ‘xmb’, and restart RetroArch.

There are also some important changes made to the scaling of the Ozone menu. It now scales based on DPI, and you are also able to configure the scaling to whatever suits your preferences. The widgets/notifications are now also scaled appropriately.

Do note that Lakka will stay with the XMB menu as the default menu, but you will definitely be able to switch to Ozone there as an optional feature.

There have also been plenty of important Quality of life improvements made to the menu. To learn more about this, see the section ‘Changelog’.

Important bugfix/crash fixes

An important bug has been fixed which would prevent RetroArch from launching on 64-bit x86 Chromebook hardware.

The threaded video driver on Linux was previously very unstable with OpenGL. We have managed to fix the majority of these issues.

Changelog

1.8.5

  • 3DS: Keep the bottom screen hidden on sleep/wakeup. When the 3DS wakes back up after being closed, the bottom screen needs to be reinitialized. Adding the condition here will cause the screen to be turned on or off based on the state of ctr_bottom_screen_enabled, as you’d expect
  • ANDROID/CHROMEBOOK/CRASH: Fix Chromebook crashes (on x86 x64) when touching the screen
  • BUGFIX: Prevent double input when using ‘return’ key (hardware) to close on-screen keyboard
  • BUGFIX: Fix mouse capture hotkey not working
  • BUGFIX: Avoid overflow when calculating multiplying performance counter
  • BUGFIX: Retroarch overlay displaying “Game remap file loaded.” on the overlay instead of “Core remap file loaded.” when only a core remap file is present
  • CHEEVOS/BUGFIX: Achievement triggers could cause Retroarch to Crash
  • CHEEVOS: Don’t block Sameboy core because it only exposes some memory
  • CHEEVOS: Support for extended Sega CD memory
  • CHEEVOS: Show RetroAchievements Hash in content information list
  • CHEEVOS: If the core says it’s exposing SYSTEM_RAM, give it the benefit of the doubt
  • CHEEVOS: RetroAchievements rich presence for RA.org website/Discord
  • CHEEVOS: Reset token when username or password changes
  • CHEEVOS: Display measured progress on locked achievements
  • CHEEVOS: Queue multiple popups
  • CHEEVOS: Add delay retries to leaderboard submits
  • CHEEVOS: Prevent buffer overflow when encountering an unknown macro
  • CORE UPDATER: Prevent hang when fetching core list if HTTP transfer fails
  • DISK CONTROL: Add disk labels to ‘disk inserted’ notifications
  • EMSCRIPTEN: Recreate input event listeners properly
  • FFMPEG CORE: Fix crash on seeking when using HW decoding in some cases
  • LIBRETRO: Add disk control interface API extension
  • LINUX: Avoid possible crash when running retroarch at startup
  • LINUX/GLX: Fix threaded video crashes/instability because of GLX OML sync callbacks
  • LOCALIZATION: Update French translation
  • LOCALIZATION: Update Korean translation
  • LOCALIZATION: Update Polish translation
  • LOCALIZATION: Update Spanish translation
  • LOCALIZATION: Update Portuguese Brazilian translation
  • MENU: Add Menu Scroll Acceleration option
  • MENU: Automatically select currently checked item when opening drop-down lists
  • MENU: Fix smooth (vertical) line ticker scroll speed
  • MENU: Don’t flush on override/remap messages
  • MENU/DATETIME: Adds some new timedate styles that follow the DD/MM/YYYY format, found in several European countries
  • MENU/DATETIME: Modifies the existing translation files in order to accommodate the new options that are now available
  • MENU/DATETIME: Reorders the timedate view options based on a decreasing order of the quantity of information displayed, so that they are more convenient to switch around and easily categorized
  • MENU/BUGFIX: Fix bug – if you were in XMB and you would set menu driver to RGUI, you could no longer go to the left or right tab
  • MENU/MATERIALUI: Add option to remove navigation bar
  • MENU/OZONE: Add DPI-based scaling
  • MENU/OZONE: Add rudimentary pointer support
  • MENU/OZONE: Add ‘Nord’ and ‘Gruvbox Dark’ themes
  • MENU/OZONE/POINTER: Pointer can be used to switch between sidebar and entries list
  • MENU/OZONE/POINTER: Pointer can be used to select sidebar and entries list items
  • MENU/OZONE/POINTER: Both sidebar and entries list can be scrolled by dragging
  • MENU/OZONE/POINTER: Clicking/pressing the header or footer produces a ‘cancel’ action
  • MENU/OZONE/POINTER: Cursor focus follows mouse pointer from sidebar to entries list (and vice versa)
  • MENU/OZONE/POINTER: In entries list, item under cursor is automatically selected (with some fudging to ensure this doesn’t break mouse wheel scrolling)
  • MENU/OZONE/POINTER: In sidebar, item under cursor is not automatically selected (this is too jarring)
  • MENU/RGUI: Add ‘Flux’ theme
  • MENU/XMB: New color themes ‘Cube Purple’, ‘Family Red’, etc
  • NETPLAY/MENU/BUGFIX: Fix Netplay Stateless Mode doesn’t save. Affects other netplay settings which can be overridden by commandline option
  • ODROID GO ADVANCE: Rotation support
  • NETPLAY/ROOMS/BUGFIX: Prevent out-of-bounds array indexing when displaying/selecting netplay rooms in menus
  • SCANNER: Add ‘Arcade DAT Filter’ Option
  • SCANNER: Add scanning Korea and Asia PS1 discs
  • SCANNER: Add support for scanning PSP Korean
  • VIDEO: Set hardware ‘Bilinear filtering’ off by default
  • VIDEO/WIDGETS: Widgets are now menu-independent
  • VIDEO/WIDGETS: Allow notifications to use full screen width when not displaying menu
  • VIDEO/WIDGETS: DPI-based scaling
  • VIDEO/WIDGETS: Fix volume widget scaling
  • VIDEO/WIDGETS: Add independent widget scale override settings for fullscreen/windowed modes
  • VIDEO/WIDGETS/BUGFIX: Prevent improper display of (old style) OSD text when widgets are enabled
  • VIDEO/WIDGETS/THREADED/BUGFIX: Fix issue – corruption of menu widgets when running some cores (e.g. VICE) with threaded video enabled
  • WIFI/CONNMANCTL: Display more characters from SSID

Final Burn Neo Progress Report

A lot happened since my last progress report, so it might be a good time to keep you updated about FBNeo progress.

NES/FDS support

I see most of you saying “Isn’t FBNeo an arcade emulator ?”. Well, not exactly, we do some console emulation too, i already mentioned it in my last post. You might think there is nothing exciting about having a new NES/FDS emulator, but here is the deal : it’s probably one of the best ones available, we have yet to find glitches, even on games known for glitching on pretty much every other NES/FDS emulators. The downside is that, since it’s accuracy oriented, it won’t run that well on low-end devices. The emulator was written from scratch, mainly by reading nesdev, dink worked on it for 7 months, getting tons of help/testing/code/imagery from team 🙂

If you try to find another emulator that will render the following screen without any kind of glitch, you might be in a pinch, codemasters games are generally the bane of nes emulation.

As usual, usage of specific romsets is required (dat files are available at the usual place), it’s mostly based on No-Intro dumps. If your favorite NES/FDS game (even hacks or unofficial translations) is missing, you can request support on our forum. Currently we support around 1300 games.

New arcade games

I’ll probably forget some :

  • Rabbit : a fighting game from 1997, one of the only Electronic Arts arcade games
  • Express Raider : a beat’em’up from 1987
  • Super Dodge Ball : a dodgeball game from 1987
  • Tom Tom Magic : a flipper game from 1997
  • Thief : a maze game from 1982
  • Shark Attack : a game where you are a great white shark who attacks divers, from 1981
  • NATO Defense : another maze game from 1982
  • Victory : a shooter game where you defend an island, from 1982
  • Sega System 24 : a Sega arcade hardware from early 90s, you can see the list of games here
  • Akka Arrh : a space shooter from 1982
  • Alien Rescue : a homebrew from monstersgoboom.itch.io, running on pacman hardware
  • Magic Purple : a platform game from 1996
  • King of Boxer : a boxing game from 1985
  • Dead Angle : a shooter game from 1988
  • Buggy Challenge : a racing game from 1985
  • Denjin Makai : a beat’em’up from 1995
  • Godzilla : a fighting game from 1993
  • Heated Barrel : a run’n’gun from 1992
  • Legionnaire : a beat’em’up from 1992
  • SD Gundam Sangokushi Rainbow Tairiku Senki : a run’n’gun from 1993
  • Pitpat Puzzle : a puzzle game from 1997
  • Berzerk : a maze/shooter game from 1980
  • Frenzy : follow up of berzerk, from 1982

Here is a screenshot of rabbit

New hacks

  • Final Fight 30th Anniversary Edition : an advanced hack of Final Fight, among other features/improvements it supports 3 players
  • Otto Project PZ : do you know about crazy otto ? if not you might want to read this. This hack is an attempt to reproduce this game which was a prototype of ms pacman.
  • Lots and lots of hacks of many popular games and systems, including neogeo, cps, donkey kong and mortal kombat

Here is a screenshot of Otto Project PZ

Improvements and fixes

There are hundreds of them so i’ll just mention the latest improvement i did : i added a Hires 1080p mode to every vector games, you can enable it through dipswitches (in core options)

You can find more about what was fixed by looking at our issue tracker

Improvements and fixes specific to the libretro port

  • fixed a crash that would happen when switching neogeo bios while using readahead
  • prevent user from using incompatible neogeo bios with specific games
  • improved default mapping for many games, including the usage of analog triggers as default to accelerate and brake in many racing games
  • added an alternative way to load subsystems, more friendly with devices using static linking like android (more details in my FAQ)
  • improved & sanitized core options, one thing worth mentioning is the CPU clock feature that got fixed (previously the values displayed were different from what was actually applied) and now allows to underclock too (which can be useful to reproduce slowdowns from original hardware, or to lower hardware requirements)