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:
- 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.
- 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.
- 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)
| Macro | What 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

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:
- 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.
- 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).
- 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
| Core | Games | Gun input | Original gun | Status |
|---|---|---|---|---|
| jtcores flstory | N.Y. Captor, Cycle Shooting, Bronx, Colt | JTFRAME light gun (stick or mouse) | — | Released MRAs in jtbin |
| jtcores rastan | Operation Wolf | JTFRAME light gun, per-set offsets | — | Released |
| jtcores s18 | Laser Ghost | JTFRAME light gun plus special-weapon button | — | Released |
| SYSTEM11_MiSTer (misteraddons) | Point Blank 2, Gunbarl | USB absolute gun (“GunCon”), mouse, or SNAC | GunCon 1 via SNAC, 15 kHz CRT | Third-party, since July 2026 |
| s32 (gmcnaught) | Alien3: The Gun, Jurassic Park | Signed analog, mouse or D-pad | GunCon 2 over SNAC (Jurassic Park) | Third-party, since August 2026 |
| taito-fpga (jlrh) | Operation Wolf | Not read | — | Third-party, own database |
| Turkey Shoot (darfpga) | Turkey Shoot | Joystick 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_controllerlines 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
jtcoresand the third-party repositories found by name, not every MiSTer arcade core.
Sources
- jotego,
jtcores,modules/jtframe/doc/macros.md, read 2026-10-24; scan of cores’macros.defand READMEs, read 2026-10-20. https://github.com/jotego/jtcores - jotego,
jtbin(released MRA files), read 2026-10-20. https://github.com/jotego/jtbin - misteraddons,
SYSTEM11_MiSTer, README, read 2026-10-24 (repository created 2026-07-29, pushed 2026-08-22). https://github.com/misteraddons/SYSTEM11_MiSTer - gmcnaught,
s32, README, read 2026-10-24 (created 2026-08-24, pushed 2026-09-08). https://github.com/gmcnaught/s32 - jlrh,
taito-fpga, README, read 2026-10-24 (created 2026-07-18, pushed 2026-10-04). https://github.com/jlrh/taito-fpga - MiSTer-devel, Distribution,
_ArcadeTurkey Shoot MRA, read 2026-10-20. - MiSTer-devel,
Main_MiSTer,MiSTer.iniandinput.cpp, master, read 2026-10-24. - MrLightgun, “MiSTerSindenDriver”, README, read 2026-10-20. https://github.com/MrLightgun/MiSTerSindenDriver
Comments (0)