Funcionamiento del lápiz óptico

No sé si alguna vez os habréis planteado cómo funciona un lápiz óptico, uno de esos dispositivos que se usaban en los 80 para pintar en pantalla.

Lápiz óptico

Es un periférico que siempre me ha llamado mucho la atención, porque nunca había tenido muy claro cómo funcionaba. Y no me refiero tanto desde el punto de vista electrónico (básicamente es un fototransistor), sino más bien desde el punto de vista de cómo el C64 podía determinar sobre qué posición X, Y de la pantalla estaba apoyado.

Recordemos que lo que había en los 80 eran televisiones de tubo de rayos catódicos (CRT), no pantallas táctiles como la que tenemos ahora…

La cosa parece magia, pero es más sencilla de lo que parece:

Ya sabemos lo que es el raster: el rayo con el que el VIC va actualizando la pantalla. Y ya sabemos, también, que la línea por la que va el raster se puede conocer con los registros SCROLY = $d011 (bit 7) y RASTER = $d012 (bits 0 a 7).

Pero es que el VIC no sólo conoce la línea que va actualizando (Y). También conoce la columna (X). Por tanto, ya tenemos todas las piezas del puzle:

  • El usuario conecta el lápiz al puerto de control #1.
  • El usuario pone el lápiz en una posición X, Y de la pantalla.
  • Cuando el raster o el rayo catódico pasa por la posición del lápiz (cosa que hace 60 veces / segundo) activa su fototransistor, que genera una señal al puerto de control #1.
  • La señal llega al VIC, que guarda en sus registros LPENX = $d013 y LPENY = $d014 la posición X, Y por la que iba el raster en el momento de recibir la señal.
  • La aplicación que usa el lápiz, lee de LPENX y LPENY las coordenadas X, Y del lápiz, y actúa en consecuencia, por ejemplo, pintando un pixel en esa posición.

¿¿No es curioso y astuto??

Otra curiosidad es que LPENX y LPENY son bytes. Por tanto, pueden tomar los valores 0 a 255. Sin embargo, sabemos que la resolución del VIC en modo bitmap estándar es de 200 x 320 pixels. Es decir, con un byte tenemos suficiente para la coordenada Y (200 filas), pero no tenemos suficiente para la coordenada X (320 columnas).

Por ello, la resolución con que se determina X es de dos pixels, y el valor que se almacena en LPENX (de 0 a 160) debe multiplicarse por dos para obtener la coordenada X del lápiz.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s