MiSTer FPGA · Volume 3

Arcade Cores and the Second Gun

The handful of MiSTer arcade cores that take a light gun, official and third-party, how each reads it, why the second player's gun must be a joystick, and how to keep player 1 and player 2 from swapping

3.1 Few arcade gun games, and why

MAME plays hundreds of light-gun games (PC (Windows), Volume 2). On MiSTer, as of 24 October 2026, a light gun works in fewer than a dozen arcade titles. Three things explain the gap:

  1. The big gun boards are beyond the DE10-Nano. The classic gun games of the 1990s and later ran on 3D hardware (Namco System 22 and 23, Sega Model 2 and 3, the PC-based boards) that no MiSTer core implements.
  2. Each arcade gun is its own interface. A console gun plugs into a standard port, so one light-gun module per console covers its whole library. An arcade board’s gun input is whatever that board’s designers built: optical sensors latched by board-specific logic, or potentiometers on a mounted gun (Arcade Light Guns, Volume 1 sorts them). Each core has to implement that board’s input by hand.
  3. Arcade cores are mostly written for joysticks first. Light-gun support in an arcade core is an extra, and only some authors have added it.

What the arcade cores have in common with the console cores is the input: the aim arrives as an analog stick (or, in some cores, a PS/2 mouse) from Main, so a gun that works in the console cores works in these.

3.2 Jotego’s cores: Operation Wolf, Laser Ghost and the Taito shooters

Jotego’s framework, JTFRAME, has light-gun support as a build option. Its documentation lists the macros (read 24 October 2026):

Table 1 — Jotego's framework, JTFRAME, has light-gun support as a build option. Its documentation lists the macros (read 24 October 2026)

MacroWhat it does
JTFRAME_LIGHTGUN”Enables the crosshair overlay” (and the gun input path)
JTFRAME_LIGHTGUN_ON”forces crosshair overlay onscreen”
JTFRAME_LIGHTGUN_XOFFSET, _YOFFSET”adds a 9 bit correction value to lightgun X coordinate sent to core” (and Y)

A scan of the macros.def of all 91 cores in the jtcores repository on 20 October 2026 found JTFRAME_LIGHTGUN in three:

  • flstory (Taito’s Fairyland Story hardware family): N.Y. Captor, Cycle Shooting, Bronx and Colt. The core’s README: “there is support for a light gun on the board”.
  • rastan (Taito’s Rastan hardware family): Operation Wolf, World revision 2 set 1 and alternates, with per-set gun offsets taken from MAME’s init_opwolf. Operation Wolf’s mounted Uzi is optical, not a potentiometer gun, despite the common belief (Arcade Light Guns, Volume 1, section 1.4); on MiSTer that does not matter, because the core takes coordinates either way.
  • s18 (Sega System 18): Laser Ghost (World, US and Japan). The core’s notes: “Laser Ghost uses light-gun inputs plus a special weapon button.”

The released MRA files for these titles were present in jtbin on 20 October 2026. The XOFFSET and YOFFSET macros are compile-time constants, so if a core’s aim is offset, the fix is the F10 calibration in Main (Volume 5) or a request to the author, not a menu setting.

3.3 Third-party cores: Namco System 11, Sega System 32, Taito

Three newer cores, all outside the MiSTer-devel organisation and none in the default distribution, add gun games. All three were created between July and August 2026, and their repositories had 0 to 8 stars on 24 October 2026; they are young and may change quickly.

Namco System 11 (misteraddons/SYSTEM11_MiSTer, created 29 July 2026, last pushed 22 August 2026). Point Blank 2 (World, US and alternates) and Gunbarl (its Japanese release) are listed as “Playable (light gun)”. The README: “The System 11 GUN I/F register block is implemented for USB mouse/light-gun axes or real GunCon 1 controllers through either PSX SNAC port.” The source is chosen under OSD, Controllers, P1/P2 Input: Mouse, GunCon “for a USB light gun exposing absolute axes”, or SNAC Port 1/2 for a native GunCon. “A physical GunCon’s trigger fires, A is Start, and B inserts Coin. Native GunCon aiming requires a compatible 15 kHz” display. The crosshair is optional and off by default, because “the real cabinet draws no crosshair”. This is the only arcade core found that accepts an original light gun (a GunCon 1 through SNAC, on a CRT).

Sega System 32 (gmcnaught/s32, created 24 August 2026, last pushed 8 September 2026). Alien3: The Gun (World, US Rev A, Japan) and Jurassic Park (four sets) through “the generic MiSTer/JTFRAME positional-gun input”: signed analog reports, PS/2 mouse packets or the D-pad, with a crosshair overlay drawn by the core. Jurassic Park “additionally supports GunCon 2 over SNAC”. Both games used potentiometer guns on the real cabinet (Arcade Light Guns, Volume 3), so an absolute USB gun is a closer match to the original than a mouse.

Taito (jlrh/taito-fpga, created 18 July 2026, last pushed 4 October 2026): a collection installed through its own Downloader database, which includes Operation Wolf (1987). Its gun handling was not read for this dive; the System 32 core’s README credits it as a reference for the “core-side gun_1p_x/gun_1p_y contract”.

3.4 Arcade “gun” games with no gun path

Being in a “gun” category does not mean a core reads a gun. The MiSTer distribution’s Turkey Shoot core (by darfpga) is categorised “Shooter - Gun”, but its MRA defines an 8-way joystick, so it plays with a stick, not a gun (read 20 October 2026). Any arcade core should be checked for a light-gun or crosshair item in its OSD before buying a gun for it.

3.5 The second gun

Figure 1 — Two panels. On the left, both guns presented as mice: each sends relative motion, Main merges all mice into one PS/2 stream, and the core receives one mouse, so both guns move one cursor, and relat…
Figure 1 — Two panels. On the left, both guns presented as mice: each sends relative motion, Main merges all mice into one PS/2 stream, and the core receives one mouse, so both guns move one cursor, and relative motion drifts from where an absolute gun points. On the right, both guns presented as joysticks: each sends absolute X and Y, Main treats them as player 1 and player 2 with their own calibrations, and the core reads them as the Joy1 and Joy2 sticks, so the guns are independent; calibration files are per core and per vendor and product ID, so the two guns need different product IDs, such as OpenFIRE's P1 and P2 presets. Below, the player-order rule: MiSTer loads the first joystick used in a core as player 1. Own-work diagram.

Every two-player gun game on MiSTer needs both guns to arrive as joysticks, never as mice. The System 11 core’s README puts it plainly: both guns previously shared one source because “MiSTer exposes a single merged PS/2 mouse stream, so a second mouse is not reachable from a core”, and its fix moved player 2 to the analog stick or D-pad. The console cores show the same design: “Gun Control” offers Joy1 and Joy2 as separate sources, but only one “Mouse”.

Three practical rules follow:

  1. Use the gun’s gamepad mode. OpenFIRE’s MiSTer mode (Volume 6) does this automatically. GUN4IR, Blamcon and Sinden have joystick modes that must be enabled (Sinden’s MiSTer README: “enable joystick mode”). Retroshooter and X-Gunner are recognised with a mouse quirk (Volume 5), which still delivers absolute axes to the joystick path.
  2. Give the two guns different product IDs. Calibration files are saved per core and per vendor and product ID (Volume 1, section 1.3), so two guns with the same IDs would share one calibration. OpenFIRE’s P1 to P4 presets give each gun its own product ID (Open-Source Firmware, Volume 6, section 6.6).
  3. Set Gun Control for each player. In a console core, player 1’s gun is “Joy1” and player 2’s is “Joy2” (or, in the Saturn core, LGun P1 and LGun P2 each with their own XY source).

3.6 Keeping player 1 as player 1

Which gun becomes player 1 is decided by Main, not by the gun. Sinden’s README describes the default: “MiSTer loads the first joystick used in a core as Player1”, and advises pressing a button on the intended player 1 gun first. That is fragile for a two-gun set-up.

MiSTer.ini offers a fixed assignment. Its comments (read 24 October 2026) describe player_1_controller= to player_4_controller=, matched against part of a device’s unique identifier, including a form VID_PID (“warning, it will assign all input devices with these VID:PID to same player!”) and a form VID_PID_HASH. For two OpenFIRE guns using the P1 and P2 presets, which differ in product ID, the VID_PID form should pin each gun to its player:

player_1_controller=f143_0001
player_2_controller=f143_0002

The form follows the .ini file’s own example (1915_0040). In input.cpp the match is a case-insensitive substring search against the device’s identifier, its sysfs path and a vid_pid_hash string built as four hex digits, an underscore and four more, and it is applied when the device’s first button is pressed. The product IDs 0x0001 and 0x0002 are the App’s P1 and P2 presets (PC (Windows), Volume 1). This is read from the configuration file and the source and has not been tried with a gun. A gun with a custom product ID would need its own line.

3.7 Arcade cores on one page

Table 2 — 3.7 Arcade cores on one page

CoreGamesGun inputOriginal gunStatus
jtcores flstoryN.Y. Captor, Cycle Shooting, Bronx, ColtJTFRAME light gun (stick or mouse)—Released MRAs in jtbin
jtcores rastanOperation WolfJTFRAME light gun, per-set offsets—Released
jtcores s18Laser GhostJTFRAME light gun plus special-weapon button—Released
SYSTEM11_MiSTer (misteraddons)Point Blank 2, GunbarlUSB absolute gun (“GunCon”), mouse, or SNACGunCon 1 via SNAC, 15 kHz CRTThird-party, since July 2026
s32 (gmcnaught)Alien3: The Gun, Jurassic ParkSigned analog, mouse or D-padGunCon 2 over SNAC (Jurassic Park)Third-party, since August 2026
taito-fpga (jlrh)Operation WolfNot read—Third-party, own database
Turkey Shoot (darfpga)Turkey ShootJoystick only—No gun path

3.8 What could not be verified

  • That the three jtcores titles work with an absolute USB gun in practice; read from the framework’s macros and the cores’ notes.
  • The gun handling of jlrh/taito-fpga.
  • The player_N_controller lines for OpenFIRE guns.
  • Whether the System 32 core’s GunCon 2 over SNAC is the USB GunCon 2’s own protocol or a converter; the README says “SNAC serial pins”.
  • That no other arcade core has gun support: the search covered jtcores and the third-party repositories found by name, not every MiSTer arcade core.

Sources

  1. jotego, jtcores, modules/jtframe/doc/macros.md, read 2026-10-24; scan of cores’ macros.def and READMEs, read 2026-10-20. https://github.com/jotego/jtcores
  2. jotego, jtbin (released MRA files), read 2026-10-20. https://github.com/jotego/jtbin
  3. misteraddons, SYSTEM11_MiSTer, README, read 2026-10-24 (repository created 2026-07-29, pushed 2026-08-22). https://github.com/misteraddons/SYSTEM11_MiSTer
  4. gmcnaught, s32, README, read 2026-10-24 (created 2026-08-24, pushed 2026-09-08). https://github.com/gmcnaught/s32
  5. jlrh, taito-fpga, README, read 2026-10-24 (created 2026-07-18, pushed 2026-10-04). https://github.com/jlrh/taito-fpga
  6. MiSTer-devel, Distribution, _Arcade Turkey Shoot MRA, read 2026-10-20.
  7. MiSTer-devel, Main_MiSTer, MiSTer.ini and input.cpp, master, read 2026-10-24.
  8. MrLightgun, “MiSTerSindenDriver”, README, read 2026-10-20. https://github.com/MrLightgun/MiSTerSindenDriver

Comments (0)

  1. Loading…

Comments are held for moderation — nothing appears until approved.