Vircon32 joins libretro/RetroArch

Written by: Carra

Hi! I’m Carra and I created Vircon32, a new game console. My Vircon32 core was recently integrated into RetroArch, so I thought this could be a good opportunity to talk about both the console itself and my overall experience creating a Libretro core.

What is Vircon32?

Vircon32 is a 32-bit virtual console that I designed from scratch. This console has been designed to be as simple as possible (to keep it accessible), but retaining enough features to allow for interesting games to play.

It is based on the 32-bit generation of home consoles (PSX, N64 and Saturn) but it has some modern “quality of life” features, like a 16:9 screen. In terms of power you could roughly think of Vircon32 as a PSX, but with no 3D capabilities. This console focuses on 2D instead, since even a minimal 3D engine would add too much complexity for a simplified machine like this.

If you are wondering how Vircon32 games look like, here are some screenshots.

Game screenshots from Vircon32

Game screenshots from Vircon32

Why did I do this?

Classic consoles are quite convenient to play: just insert the game! I’d love to have more new, retro-style games, but making games for old consoles can be quite challenging. This is because even something as basic as an NES is actually quite more complex than we think (and way more complex than Vircon32!).

Another option would be “fantasy consoles”. There are quite a few, but sadly most of these get abandoned early or have no games. And the most successful ones (Pico-8 and TIC-80) are too retro for the taste of most players. In my case I’d rather have polished, full-fledged games than experiment with 8-bit restrictions.

Game screenshots from Pico-8 (left) and TIC-80 (right)

Game screenshots from Pico-8 (left) and TIC-80 (right)

Libretro: Going universal

I’d like Vircon32 and its games to be enjoyed by as many people as possible. To this end the console and its games are free and open source. But this is not enough: getting to play Vircon32 should be easy. And for that I need it to be playable in as many platforms as possible.

I was able to make my emulator work in Windows, Linux and Mac. But not everyone will use a PC. What about smartphones and tablets? What about emulation handhelds? For that type of compatibility the easiest way was to develop a Libretro core.

What Libretro can do for you

Libretro is a programming interface. Its overall concept is simple: there is a front-end acting as a manager that will load and run “apps” called cores. Each core is a back-end that will exchange a series of messages with that front-end. Front-ends will take care of most system-specific tasks (initialization, timing, event handling…) and that makes cores much more platform-independent than regular programs.

There are several widely used systems with Libretro front-ends: RetroArch, Kodi, EmuVR… and they usually work on a wide range of platforms. This means that just having a Libretro core can make your content available in many different systems. And from a user’s perspective you also gain the benefit of convenience, since they can access tons of content all from the same place.

Last but not least, working as a Libretro core can give you access to several extended features. Some of them, like screen filters, come totally free. And with relatively low extra effort you can add things like savestates, rewind or netplay.

Vircon32 integrated in EmulationStation

Vircon32 integrated in EmulationStation

How hard is it to make a core?

This may vary for everyone, so I will write about my own experience. I believe that if you have some experience in programming, especially games, you should not find it hard to understand the Libretro API and the concepts is uses. However, be warned that the learning curve can get steep at the beginning until you find out where to start and get the general idea of how a core works.

There does not seem to be any good introductory guide showing a general explanation of how a core works, and the basic flow of messages for a minimal core. Other than a couple of samples at Github, most API features are only explained on the code comments in libretro.h. But of course libretro.h is huge, so all that info can be relatively useless for you until you know what to look for.

Also, keep in mind that many of those comments explain the feature but don’t tell how a core is supposed to use it. You will be expected to look at other cores and “reverse-engineer” what you need to do. Know, however, that most cores are quite complex. It won’t easy to isolate what you are looking for, and you can never be sure if a particular core is doing things the intended way, or using a weird hack.

Getting integrated in RetroArch

Creating a core is useful, but most users won’t actively go find and download your core. They expect to either have the cores they need preinstalled, or be able to download them automatically within RetroArch. You can have that getting your core integrated into RetroArch repositories. But know that this can take a substantial amount of extra work and time.

First you will need to have an online code repository that can be mirrored. You will also have to adapt your build system and learn about the YAML templates that libretro uses. After that, get ready for a good amount of testing. How much will depend on how many different systems you want your core to support. You will also need to prepare a core info file and get it merged. Along the process you may be talking with a few different people for each part of the process, but you can get help from them as well.

In my case, integration was a harder process than usual because I was not trying to integrate a new core for an existing console (like say, some new Game Boy core). Instead I wanted to add a whole new game system to RetroArch, and this involves some extra steps: a game database, thumbnails, the bios when needed, etc.

Build process for RetroArch’s cores: the Libretro Buildbot

Build process for RetroArch’s cores: the Libretro Buildbot

Road for the future

The current Vircon32 core is already compatible with all console games, but in terms of features it is still pretty basic. In time I plan to add a few more advanced features to it. Must haves for me are frameskipping and savestates. Eventually, if possible, it would be nice to also have rewinding and netplay.

About the console itself, the most important areas are already finished: the design is final, it is fully documented and there are working emulators and development tools. Even if all of these can be expanded and improved, the most clear path for Vircon32 to improve is to have more games, and better games!

Also on Steam

The core is also available on Steam here.

Geolith emulator ported to libretro

We have the pleasure of announcing a great new emulator core, the Neo Geo emulator Geolith. The upstream author of the Jolly Good Emulation project broke out this core and ported it to libretro to make it available to as many users as possible, and we’re happy to welcome it into the fold.

Historically, Neo Geo emulation has fallen under the general ‘arcade’ umbrella and has been handled very capably by FBNeo and MAME. However, arcade emulation is significantly more complex than the console emulation that most users are accustomed to (with ever-changing ROMsets consisting of many tiny files in strangely named zip files to keep up with; specific jargon, like “parent ROMs” and “non-merged sets”; and additional files that sometimes go alongside the game ROMs and sometimes need to live in other places), and this added complexity can be enough of a hurdle that some users struggle to have a good experience with all of the bells and whistles they have come to expect.

This is exactly where Geolith stands out, as it uses static, one-file-equals-one-game ROMsets in the .NEO format developed for the NeoSD, and also used by the FPGA-based MiSTer Neo Geo core (note: Geolith is NOT compatible with ROMs in the MAME/FBNeo zip format). So, if you have dumped your games to be compatible with those devices, they should benefit from full libretro database support and all that entails. That is, simple, one-click scan-and-import into a properly named playlist (with properly named games; you’ll see ‘Art of Fighting’ instead of ‘aof’ without any esoteric fiddling with DATs and so forth), with appropriate icons and boxart/thumbnails automatically applied. This separate, dedicated database and playlist makes it easier to find the games you want to play with less time devoted to setup.

Users who cleared the complexity hurdle of arcade emulation have grown accustomed to FBNeo’s tight and feature-filled libretro integration, which sets a very high bar for Neo Geo emulation by providing for a fast, accurate and bug-free experience with full support for some of RetroArch’s more finicky but high-value features, such as rollback-based netplay and runahead/preemptive-frames. Geolith’s author has put in the effort to provide a comparable, robust experience, so users don’t have to compromise when using this new core.

We’re still polishing up a few rough edges on the database (about 20% of games don’t pull thumbnails yet). Just make sure you stop by the online updater and update your core info files and databases before you get started, since Geolith uses some stuff that was added after RetroArch’s 1.17.0 stable release.

UPDATE: Geolith core is now available on Steam too!