Original Consoles · Volume 5

The Project's Gun on Original Hardware — A Console Box, a Console Mode, the Licences and a Bench Plan

Why the project's OpenFIRE gun is a better input for a console translator than a Sinden; a proposed RP2040 console box that reads the gun over USB and answers a PlayStation, a PlayStation 2 and later the latch consoles; the in-gun GunCon 2 mode and why it stays on the bench; calibrating without a cursor; which open code can and cannot go into a kit; and the order of work

5.1 Where this sits in the project

The project’s gun is a Raspberry Pi Pico (decision D2) running a private fork of OpenFIRE (D10), an infrared camera aiming at emitters round the screen, and a regulated 24 V solenoid (D13, D14), with the first build a printed MP7 (D35) played on a Windows PC (PC (Windows)). Original consoles are not on that path. This volume sets out how the same gun could play them later, what it would cost in firmware and hardware, and what must be settled first, so that nothing done now closes the door.

What the fork itself is and how it is run belongs to Our Firmware; this volume names only what a console route would ask of it.

5.2 What the gun already gives a translator

Everything a family-1 translator needs (Volume 1, §1.4) is already in the gun’s ordinary USB output:

  • A position, computed in the gun. The absolute mouse reports 0 to 32767 on each axis at a 1 ms polling interval (Open-Source Firmware, Volume 6, §6.2). A Sinden, by contrast, sends camera images to a host driver, which is why SindenPS needs a Raspberry Pi (Volume 2, §2.8). An OpenFIRE gun needs no host: a microcontroller that can read a USB mouse can translate it.
  • Full resolution. Sixteen-bit coordinates, against the eight bits SindenPS passes to its PlayStation dongle (Volume 2, §2.3). The console’s own units are coarser than either (the GunCon’s 384 X counts), so the translation never limits the aim.
  • An off-screen signal. OpenFIRE pins the cursor at the screen edge rather than reporting a position off the screen, and maps the trigger to a different button when the camera loses the emitters (Open-Source Firmware, Volume 6, §6.3; the consequences on Windows are in PC (Windows), Volume 2). A translator turns that button into the console’s “no light”.
  • Its own recoil. The gun fires its solenoid on the trigger by itself when no host drives it, which is the only recoil any original console can have (§5.8).

So the cleanest design leaves the gun’s firmware exactly as it is and puts all the console knowledge in a separate box.

5.3 Route A: a console box

Figure 1 — Two ways to put the project's gun on an original console. Route A, proposed first: a console box. The project's gun, on stock firmware, is read over USB as an absolute mouse with an off-screen butt…
Figure 1 — Two ways to put the project's gun on an original console. Route A, proposed first: a console box. The project's gun, on stock firmware, is read over USB as an absolute mouse with an off-screen button by an RP2040's PIO USB host; the box holds per-console and per-game profiles, translates the screen fraction into the console gun's units with a calibration-shot button, and answers through a PIO PlayStation port responder (G-Con 45), the native USB port as a GunCon 2 or Xbox gun, and later a PIO pulse locked to a sync separator (LMH1981) with a white-level gate for the latch consoles, which alone need the console's composite video. Two guns use two host ports through a hub and two console outputs; recoil stays in the gun. Route B, bench only: a GunCon 2 mode in the private fork, entered by holding the trigger at plug-in so the gun enumerates as 0B9A:016A on a PlayStation 2's USB port; for, one cable and no box, as the 2021 SAMCO fork shows; against, Namco's vendor ID in the project's firmware, PlayStation 2 only, per-game scale and the calibration shot in the gun, and a second identity to maintain beside the MiSTer identity rules. Never in kit firmware. Own-work diagram.

The box takes the shape Light Gun Commando proved and SindenPS made practical (Volume 3, §3.6; Volume 2, §2.8), with the host computer replaced by a microcontroller:

  1. Gun side. A USB host port reads the gun as a HID mouse. One gun per port, two through a small hub.
  2. The translation. Screen fraction (0 to 32767) to the console gun’s units, through a per-console window (§5.6) and a per-game scale and centre (PCSX2’s table in Volume 2, §2.6 is the starting data for the PlayStation 2).
  3. Console side, in this order:
    • PlayStation, as a G-Con 45. A PIO state machine answering the controller port: wait for attention, shift bytes in and out on the console’s clock, pulse acknowledge, reply with the nine bytes of Volume 2, §2.2. Written fresh from PSX-SPX, not copied from the SindenPS sketch (§5.9), and without its off-by-one.
    • PlayStation 2, as a GunCon 2. The RP2040’s native USB port as a TinyUSB vendor-class device (Volume 2, §2.4), with the failing SET_INTERFACE, the class request 0x09 honoured, and the calibration-shot sequence (§2.5) on a dedicated button.
    • Later, the Xbox on the same native USB port with an Xbox controller plug (Volume 4, §4.2).
    • Later, the latch consoles. A sync separator on the console’s composite video and a PIO state machine that waits for sync, counts lines and cycles, and drives an open-collector output on the console’s gun line, with a white-level comparator for the NES (Volume 3, §3.2–3.4). One console cable each, identified to the box as Light Gun Commando’s cables were.
  4. A small interface. A button for the calibration shot, a profile selector and a status LED; or, as SindenPS does, a web page, which an RP2040 without a radio cannot serve, so buttons and an optional OLED (the gun already has the OLED driver code, D37).

Nothing in the gun changes for route A. The private fork (D10) and the public firmware are equally usable, a Sinden or GUN4IR would also work if they present an absolute mouse, and a kit buyer who never owns a console never pays for any of it.

5.4 The box’s parts, and why

Table 1 — 5.4 The box's parts, and why

PartPickWhy, and why not the others
MicrocontrollerRP2040, on a board with a USB-A host port: Adafruit Feather RP2040 with USB Type A Host (5723), $17.50, in stock (Adafruit, read 2026-10-24)Same chip family as the gun (D2, D19), so one toolchain. PIO does three jobs that would otherwise need dedicated hardware: the USB host (Pico-PIO-USB, the library Adafruit’s board and MukiEX’s GunCon 3 adapter both use), the PlayStation port responder, and the sync-locked pulse. The board has a 5 V boost for the host port (TPS61023, 1 A peak, 500 mA resettable fuse) and host D+/D− on GPIO 16 and 17. Not an ESP32: both timing boxes used one for Bluetooth Wii Remotes, which a wired USB gun does not need. Not a Raspberry Pi: needed only when the gun’s position is computed on a host (Sinden). Not an AVR as in SindenPS’s dongles: no USB host, no PIO, and one dongle per console per player
Alternative boardWaveshare RP2350-USB-ARP2350 with a USB-A port on GPIO 12 and 13 through PIO (the board MukiEX targets). Smaller and cheaper by retailer listings; no seller page price was read. The Feather wins on the documented 5 V supply for the gun’s host port
Sync separator (latch consoles only)TI LMH1981Active part, 3.3 V to 5 V supply so it can sit on the RP2040’s 3.3 V logic, composite, horizontal and vertical sync outputs, and 480p as well as 480i and 576i (ti.com, read 2026-10-24). Not the LM1881 Light Gun Commando used: TI marks it Last Time Buy. Not the Renesas EL4581: obsolete. TI’s page does not mention 240p; that the LMH1981 locks to the consoles’ non-interlaced 240p must be checked on the bench
PlayStation plugA controller-port plug on a short lead, or a small PCB with a right-angle connector (SindenPS’s approach)Any PlayStation extension lead can be cut; SindenPS’s guide notes its own PCB removed “the old crimping method”
Console-side USBThe RP2040’s native USB port, on a USB-A plug lead for the PlayStation 2The PlayStation 2 is the host; the box is the device

Electrical levels on the PlayStation port and the latch consoles’ gun lines are not settled here; each must be read from the console’s own documentation or measured before the box is connected (§5.10).

5.5 Route B: a GunCon 2 mode in the fork

The 2021 SAMCO fork shows the other way: hold the trigger while plugging in, and the gun enumerates as a GunCon 2 instead of a mouse (Volume 2, §2.9). OpenFIRE builds on Adafruit’s TinyUSB for the RP2040 (Open-Source Firmware, Volume 7), the same stack the SAMCO fork used, so the technique carries over: a boot-time choice between the normal composite device and a single vendor-class interface.

It is attractive because the gun’s one cable (USB and 24 V in one plug, D31) would go straight to the console’s USB port, with no box. It is not recommended beyond the bench:

  • It puts Namco’s vendor ID in the project’s firmware. 0x0B9A belongs to Namco. A gun on a bench is one thing; firmware in a kit that identifies itself as another company’s product is not (§5.9; decision D24 and FW-7 settle the project’s own ID).
  • PlayStation 2 only. The PlayStation needs a different plug and protocol; the latch consoles need video.
  • The console knowledge moves into the gun. Per-game scales, the calibration-shot sequence and the console’s 4:3 window would all have to live in the fork, beside the MiSTer identity rules the fork already has to keep (MS-1).
  • A second USB identity to keep working through every upstream merge (Our Firmware, Volume 4).

As a one-evening experiment on the GunCon 2 fallback gun (MC-1, a GunCon 2 shell with a Pico inside), it would be the quickest possible proof that the project’s camera, calibration and trigger play Time Crisis II on a real PlayStation 2. That is the use proposed (OC-3).

5.6 Calibrating without a cursor

OpenFIRE’s calibration is done against the host’s picture: the App draws targets, or the on-gun routine moves the mouse cursor to each edge for the player to shoot (Open-Source Firmware, Volume 5, §5.3). A console draws neither. Two layers solve it:

  1. Calibrate the gun to the screen on a PC first. Same television, same seat, same emitters; save the profile in the gun. The gun then reports where it points on the panel, whatever is plugged in.
  2. Map the panel to the console’s picture in the box. The console’s 4:3 picture sits inside the panel with its own overscan and pillarbox. The box needs a per-console window (left, right, top, bottom as fractions of the panel), set once per television and console with the game’s own calibration or test screen on display, which is what SindenPS’s offsets page is for (Volume 2, §2.3). OpenFIRE’s own display-ratio setting does part of this (Open-Source Firmware, Volume 5, §5.5), but it applies to every host, so the window belongs in the box.

The games’ calibration screens then take up the rest: the offsets for the PlayStations, and the console gun’s own delay for the latch consoles (Volume 3, §3.8).

5.7 Off-screen, reload and the pedal

  • Reload. The gun’s off-screen button becomes the console’s “no light”: X 0001h, Y 000Ah on the PlayStation; X 0, Y 0 on the PlayStation 2; position 0, 0 with the flag cleared on the Xbox; no pulse at all on a latch console.
  • Cover. In Time Crisis, cover is a pedal, and on the GunCon it is a button. Light Gun Commando’s trick of holding A whenever the camera sees the emitters (Volume 2, §2.9) makes pointing away the way to take cover; a pedal input on the box (SindenPS’s PJ-320A) is the alternative, per game.
  • Calibration shot. A dedicated button on the box, never automatic (Volume 2, §2.5).

5.8 Recoil, power and two guns

  • Recoil is gun-driven only. No original console sends game events, so the solenoid fires on the trigger, single shot by default, under the gun’s own protections (D13), exactly as on MiSTer (MS-5). The ejection-port and recoil stages still never fire together (D16).
  • Power. The gun’s 24 V comes from its own brick through the one GX plug (D31) and does not pass through the box or the console. The box draws its own few hundred milliamps from USB; the gun’s logic is powered by the box’s host port. Whether the Feather’s 500 mA host-port fuse covers the gun’s logic, camera and emitters-off current must be measured.
  • Two guns. Two host ports through a hub and two console outputs: two PlayStation port responders, or the second USB port’s device on a second RP2040 (one native USB device per chip). For the PlayStation 2 that means two boxes or a dual-chip box.

5.9 Licences and the vendor ID

What open code can go into something that is later sold (decision D11, Licensing, IP and Kits):

Table 2 — What open code can go into something that is later sold (decision D11, [Licensing, IP and Kits](/light-guns/law-and-licensing/licensing-ip-and-kits/))

SourceLicenceUsable in a sold box?
LightGunVerter (all files)CC BY-NC 3.0No: “you can make your own but you can’t make them and sell them”
SindenPS, including its PlayStation sketchSindenPS Fair Use Licence (personal, educational, non-commercial) and, for the sketch, CC BY-NC 3.0No
88hcsif SAMCO fork, GunCon 2 driverLGPL-2.1Yes, with the LGPL’s obligations
PCSX2 guncon2.cppGPL-3.0Only in GPL-3.0 firmware
RPCS3 GunCon3.cppGPL-2.0Only in GPL-2.0 firmware
PSX-SPX, Ben Ryves’s journalDocumentationFacts to implement from; no code

The practical rule, on this reading (not legal advice): write the box’s firmware fresh from the documented protocol facts (PSX-SPX, the descriptor values, the report layouts) and read the licensed code only to check behaviour. That keeps the box’s own licence the project’s choice, which matters because a console box is a natural thing to offer beside a kit.

The vendor ID. A box that answers a PlayStation 2 as a GunCon 2 must enumerate as 0B9A:016A, because that is what the games look for; there is no alternative ID it could use. That is acceptable in a personal device. Whether a sold accessory may do it is a question for Licensing, IP and Kits, not settled here; the Time Breaker gun (Volume 2, §2.10) presumably faces the same question and its answer is not public. Until it is settled, the PlayStation 2 output stays a personal-build feature (OC-5). The gun’s own ID (D24, FW-7) is untouched by route A, because the box, not the gun, presents the console identity.

5.10 A bench plan

In order, each step gated on the one before:

  1. Bench reference (optional, one evening). If an original PlayStation, a GunCon and a CRT are to hand: capture the real GunCon’s poll on the ADP3450 (Volume 2 FIGURE SLOT) to have real bytes and timing to match.
  2. Route B proof on the fallback gun (OC-3). GunCon 2 mode in a bench build of the fork, on the GunCon 2 shell gun (MC-1), Time Crisis II on a real PlayStation 2 and the household panel. Proves aim, calibration, the black-frame trick and latency feel, with no new hardware.
  3. Box, PlayStation 2 output. Feather RP2040 USB Host reading the stock gun; native USB as GunCon 2. Same game; compare with step 2.
  4. Box, PlayStation output. PIO responder; Time Crisis and Point Blank. Logic-analyser capture of one poll against step 1.
  5. Latch consoles (only if wanted). LMH1981 on the console’s composite video, PIO pulse; Master System first (the simplest latch, and Light Gun Commando’s first test), then Saturn, then the NES with the white-level gate. Capture sync, pulse and jitter as in Volume 3, §3.8.

5.11 Proposed decisions, and why not the alternatives

Table 3 — 5.11 Proposed decisions, and why not the alternatives

#AreaProposalWhy, and why not the alternatives
OC-1ArchitectureA separate console box (route A); no console code in the gun’s release firmwareKeeps the gun’s firmware and identity (D10, D24, MS-1) untouched; one box serves any absolute-mouse gun; the console knowledge (profiles, windows, calibration shot) lives where it can be changed without reflashing guns. Not route B for general use (Namco’s ID in the fork, PlayStation 2 only)
OC-2Box hardwareRP2040 with a USB-A host port (Adafruit Feather RP2040 USB Host, 5723); TI LMH1981 for the latch consolesSame chip family as the gun; PIO covers USB host, PlayStation port and timed pulse. Not ESP32 (Bluetooth not needed), not a Pi (only needed for host-computed guns), not LM1881 (Last Time Buy) or EL4581 (obsolete)
OC-3Fastest proofA bench-only GunCon 2 mode in a private build of the fork, on the GunCon 2 fallback gun (MC-1), never merged to release buildsOne evening, no new hardware, proves the gun on a real PlayStation 2; the SAMCO fork shows the technique on the same USB stack
OC-4Order of consolesPlayStation 2 and PlayStation first; Xbox, then latch consoles (Master System, Saturn, NES) only if wantedFamily 1 needs no video and has the best-documented protocols and the most games; latch consoles need a sync separator and per-console tuning
OC-5Licences and IDsWrite the box firmware fresh from protocol facts; do not copy LightGunVerter or SindenPS code; keep the PlayStation 2 output a personal-build feature until Licensing, IP and Kits rules on presenting Namco’s vendor IDBoth complete open designs are non-commercial; GPL code would decide the box’s licence; the ID question is unsettled
OC-6GunCon 2 calibrationA dedicated calibration-shot button, reproducing PCSX2’s 12-report sequence (7 held, 5 at 0, 0)A camera gun cannot see Time Crisis’s black frame; automatic detection would need to know the game is calibrating
OC-7Recoil on consolesGun-driven only, as MS-5No console sends game events; D13’s protections stay in the gun

5.12 What could not be verified

  • Nothing here has been built.
  • The PlayStation controller port’s and the latch consoles’ electrical levels; not read from a primary source for this volume.
  • Whether the LMH1981 locks to the consoles’ 240p and gives a clean composite sync from a Master System, Saturn or NES.
  • Whether a PlayStation 2 accepts a GunCon 2 imitation on the RP2040’s native USB with TinyUSB’s vendor class exactly as the SAMCO fork’s SAMD51 build did.
  • The gun’s current draw from a host port, against the Feather’s 500 mA fuse.
  • Whether a sold accessory may enumerate with Namco’s vendor ID.
  • Whether OpenFIRE’s off-screen button mapping reaches a HID host exactly as on Windows (the box would read the same report).

Sources

  1. TeamOpenFIRE, OpenFIRE-Firmware, issue tracker, read 2026-10-24; and this category’s Open-Source Firmware dive, Volumes 5, 6 and 7. https://github.com/TeamOpenFIRE/OpenFIRE-Firmware
  2. 88hcsif, IR-Light-Gun, README and Guncon/, LGPL-2.1, 2021, read 2026-10-24. https://github.com/88hcsif/IR-Light-Gun
  3. Adafruit, “Adafruit Feather RP2040 with USB Type A Host” (product 5723), read 2026-10-24. https://www.adafruit.com/product/5723
  4. Texas Instruments, LM1881 product page (“Last Time Buy”) and LMH1981 product page (“Active”), read 2026-10-24. https://www.ti.com/product/LM1881 ; https://www.ti.com/product/LMH1981
  5. Renesas, EL4581 product page (“Obsolete”), read 2026-10-24. https://www.renesas.com/en/products/el4581
  6. CNX Software, “RP2350-USB-A”, 3 February 2025 (via search listing). https://www.cnx-software.com/2025/02/03/rp2350-usb-a-raspberry-pi-rp2350-board-usb-type-a-port-pio-implementation/
  7. sekigon-gonnoc, Pico-PIO-USB (as cited by Adafruit and MukiEX). https://github.com/sekigon-gonnoc/Pico-PIO-USB
  8. Licences as declared in each repository, read 2026-10-24: charcole/LCDZapper (CC BY-NC 3.0), th3drk0ne/sindenps (SindenPS Fair Use Licence), PCSX2/pcsx2 (GPL-3.0), RPCS3/rpcs3 (GPL-2.0), 88hcsif/IR-Light-Gun (LGPL-2.1).
  9. This category’s decisions log, DECISIONS.md (D2, D10–D14, D16, D19, D24, D31, D35, D37, FW-7, MC-1, MS-1, MS-5), read 2026-10-24.

Comments (0)

  1. Loading…

Comments are held for moderation — nothing appears until approved.