A nivel técnico, el funcionamiento de las pistolas ópticas , hay de dos tipos:

1) La pistola detecta una zona brillante en pantalla (típicamente color blanco) y activa un bit del puerto de entrada. Este es el método con el que funciona la Gunstick . Es el mas fácil de emular.

2) La pistola detecta una zona brillante en pantalla pero además tiene que pasar el electrón de la TV en ese momento. Aunque apunte a una zona brillante, si en ese momento no está pasando el electrón, no se activa el bit del puerto. Realmente tiene algo de persistencia, si lees el bit cuando ha pasado poco tiempo del refresco+color brillante, se lee. Yo haciendo pruebas he determinado que el tiempo con el que funcionan el máximo de juegos es el de duración de un scanline (64 microsegundos). Este es el método que usan la Magnum y la Light Stack Rifle.

De juegos de la 1) Gunstick, para saber a qué enemigo apuntas, se basan en algo muy simple: van iluminando y apagando enemigos a cada frame de video, cuando pulsas el disparo. Cuando digo iluminar, me refiero a que el sprite del enemigo se transforma en un cuadrado de su tamaño, de color blanco o negro. Así, si hay 3 enemigos y pulsas disparo, en el primer frame de video se ilumina el primer enemigo y se apagan el resto. Al siguiente frame se apaga ese primer enemigo. Al siguiente frame se ilumina el segundo enemigo, al siguiente frame se apaga, etc.
Sabiendo qué enemigo tienes activado y lo que retorna la pistola (luz o no luz) sabes a donde apunta.

El método 2 es algo mas complicado: tiene una rutina que, mediante un bucle que dura todo un scanline, primero hace una aproximación de la coordenada Y donde apunta. Para ello se ilumina toda la pantalla en blanco. Y va leyendo el bit de luz de la pistola, para saber cuando coincide el electrón con la pistola. Piensa que el bit solo se activa cuando se cumplan las dos condiciones: que esté blanca la pantalla y además pase el electrón en ese momento por ahí
con esa primera aproximación determina en qué coordenada Y está la pistola, con un margen de error de 1 scanline aprox.

Luego viene la aproximación de la coordenada X: se generan dos cuadrados grandes, adyacentes, en la pantalla. uno es de color blanco, que ocupa horizontalmente desde el borde izquierdo de la pantalla hasta la mitad en ancho de pantalla. El siguiente es un cuadrado negro, que va a continuación del blanco, y llega hasta la parte derecha de la pantalla. Tiene unos 40 píxeles de alto, y está centrado verticalmente en la coordenada Y de la pistola (la coordenada obtenida en el paso anterior).
En ese frame de video , mediante un método similar al anterior, va leyendo el bit de luz de la pistola durante el frame, pero ese algoritmo va saltando los canlines hasta llegar a la coordenada Y aproximada, sin leer el bit de luz. A continuación lee el bit de luz: Si detecta color blanco, sabe que la pistola está en la mitad izquierda de pantalla. Si detecta color negro, sabe que está en la mitad derecha. Con esa primera aproximación de la coordenada X, sabe si está entre las coordenadas 0...127 o 128..255.
Luego vuelve a generar cuadrados de color adyacentes, pero en ese caso tienen 64 pixeles de ancho (la mitad que antes). El alto no cambia. Y se generan en la zona donde ha determinado que está la pistola: si por ejemplo determina que está en la zona izquierda, se generarán dos cuadrados: uno ocupa desde coordenada X=0 hasta X=63, y el otro desde X=64 hasta 127. De manera similar a la iteración anterior, determinará si la pistola está entre 0..63 o 64...127.
Y se repite el mismo método en los siguientes frames, se van dibujando en pantalla cuadrados de menor ancho en la zona donde determina que se encuentra la pistola. Así puede determinar la coordenada X con una precisión casi de pixel

Puedes ver un video demostrativo aquí: https://youtu.be/DxAFCwwNxGM
