Microrrebotes (esto va por Cañadul)

Todo sobre la creación, diseño y programación de nuevo software para
nuestro Spectrum

Moderador: Sir Cilve Sinclair

Responder
Avatar de Usuario
mcleod_ideafix
Johnny Jones
Mensajes: 3985
Registrado: Vie Sep 21, 2007 1:26 am
Ubicación: Jerez de la Frontera
Contactar:

Microrrebotes (esto va por Cañadul)

Mensaje por mcleod_ideafix » Mar Oct 30, 2007 10:25 pm

Después de jugar un poco al Astro 2008 tengo apuntadas varias de las claves para pasar pantalla. Pues bien, el otro día, para probar el adaptador de teclado, y aprovechando que ya podía cargar este juego en un Spectrum real a la antigua usanza, decidí seguir por donde lo dejé, pero sin emulador de por medio.

Cuál fue mi sorpresa cuando me di cuenta de que era imposible teclear la clave: cada vez que pulsaba una letra aparecía dos o tres veces, da igual lo breve que fuera la pulsación.

Esto me permitió encontrar un error muy sutil en el firmware del adaptador, pero también me ha permitido encontrar otro error, mucho más sutil, en el juego Astro 2008.

El comportamiento mencionado ocurre por causa de los microrrebotes del teclado. En un Spectrum de teclado de membrana original, las pulsaciones cierran un circuito que es lo que la ULA lee como 0 (pulsado) o 1 (no pulsado). Hasta ahí bien. La cosa es que las pulsaciones no son perfectas, y en realidad lo que se generan son un tren de pulsos 11111010101000000 (cuando se pulsa una tecla) o 00000101011111 (cuando se suelta). El intervalo de tiempo donde el valor fluctúa es donde actúan los microrrebotes de la membrana.

Cuando se usa el teclado para mover un personaje, lo que se busca es ver qué tecla se pulsa, y mientras esté pulsada se mueve en una determinada dirección. Si se suelta un momento pero después se vuelve a pulsar, el personaje se sigue moviendo, así que en este caso los microrrebotes parecen no afectar.

Otra cosa es cuando se usa el teclado para "teclear". En este caso la secuencia es: esperar a que se pulse una tecla, recoger qué tecla es, almacenarla, esperar a que se suelte, y volver al principio.

En este caso es cuando ocurre el problema: si el bucle que implementa el algoritmo anterior es muy rápido, es posible escanear el teclado cada pocos microsegundos. Si una trama de microrrebotes dura más que el tiempo entre escaneos de teclado, el programa puede detectar pulsaciones incorrectas, al estar leyendo datos que corresponden a un microrrebote. Dado que lo que buscamos son secuencias pulsado/no pulsado, estos microrrebotes se interpretarán erróneamente como pulsaciones y nos podemos encontrar con que lo que tecleamos aparece repetido dos o tres veces.

Código: Seleccionar todo

Bucle:
EsperaSoltar:   xor a
                in a,(254)
                and 00011111b
                cp 00011111b
                jr nz,EsperaSoltar

EsperaPulsar:   xor a
                in a,(254)
                and 00011111b
                cp 00011111b
                jr z,EsperaPulsar

                ;Se registra la pulsacion...
                jr Bucle


Un bucle así ejecutándose en un Spectrum real podría enfrentarse con la siguiente pulsación de teclado:

Código: Seleccionar todo

Teclado: 11111111111111111111111001011010000000000000000000000000
Lectura: ^   ^   ^   ^   ^   ^   ^   ^   ^   ^   ^   ^   ^   ^


Esto es lo que quería destacar: si el intervalo entre dos lecturas es menor que el tiempo que dura una trama de microrrebotes, se interpretarán como pulsaciones independientes. Aquí se comienza con la tecla soltada. En un determinado momento, el usuario la pulsa y genera la secuencia que se ve. El bucle de lectura detecta una pulsación dentro de la trama de microrrebotes, en la siguiente lectura detecta una no-pulsación, y en la siguiente, otra pulsación. El resultado final es que se almacenan dos pulsaciones de tecla en lugar de una.

La descripción técnica del Spectrum apunta a que la supresión de rebotes de teclado se hace por software, en la rutina de lectura de la ROM. Pero si no se usa dicha rutina y se lee el teclado directamente, hay que tener en cuenta esto.

En el caso del adaptador, me di cuenta porque por la propia naturaleza del mismo, no debe originar microrrebotes. Una vez corregido el firmware lo comparé con un Spectrum 48K teclado de goma, con membrana original.

Para ello usé el programa adjunto, que presenta una pantalla en blanco, con una plantilla para saber en qué columna estamos, y un cursor parpadeante que avanza una posición con cada pulsación de cualquier tecla.

Al probarlo en el Spectrum 48K la mayoría de las teclas no presentaban microrrebotes aparentes, excepto una o dos. Supongo que cuanto más gastada esté la membrana, más probabilidades de falsas pulsaciones pueden aparecer. No lo he probado, pero es posible que este comportamiento sea más acusado en el +2 y compañía, en donde el contacto de las teclas es metálico y por tanto más proclive a rebotes.

En electrónica estas cosas se arrreglan con monoestables, o en su versión barata, con un filtro pasa bajos que se "coma" esos transitorios. En software basta con insertar una pausa de 1ms en la que se ignora al teclado. 1 milisegundo cuando el teclado se usa no para mover un personaje en un arcade, sino para registrar entrada del usuario, no afecta a la respuesta del programa.

Algo así:

Código: Seleccionar todo

Bucle:
EsperaSoltar:   xor a
                in a,(254)
                and 00011111b
                cp 00011111b
                jr nz,EsperaSoltar

                ;Hacer pausa AQUI

EsperaPulsar:   xor a
                in a,(254)
                and 00011111b
                cp 00011111b
                jr z,EsperaPulsar

                ;Hacer pausa AQUI

                ;Se registra la pulsacion...
                jr Bucle


El efecto que esto tiene sobre el comportamiento de las lecturas es el siguiente:

Código: Seleccionar todo

Teclado: 11111111111111111111111001011010000000000000000000000000
Lectura: ^   ^   ^   ^   ^   ^   ^              ^   ^   ^   ^   ^


Cuando se detecta una pulsación (sea en medio de un microrrebote o no), el teclado deja de explorarse durante 1 ms (o quizás baste con menos). Al soltar también se generar microrrebotes, que se amortiguarían con la segunda pausa.

Y esta pausa es la que creo que le falta a Astro 2008 en la parte en la que se lee el teclado para obtener la clave de paso de pantalla. El programa original lee el teclado cada aproximadamente, 10,8 microsegundos. Leyéndolo una vez por cada 100 microsegundos, o una por cada milisegundo, sería más que suficiente para eliminar los microrrebotes y seguir funcionando correctamente.
Web: ZX Projects | Twitter: @zxprojects

Gandulf
Nonamed
Mensajes: 1067
Registrado: Lun May 07, 2007 10:06 pm

Mensaje por Gandulf » Mié Oct 31, 2007 12:59 am

Yo los rebotes los recuerdo de un teclado que teníamos que leer conectado a un 8255 en una tarjeta E/S, que ahí sí rebotaban de lo lindo las teclas. A nivel ordenador no recuerdo haberlo tenido en cuenta nunca.

Como bien dices, en la lectura de teclas "in-game" no importan, pero en las escrituras de letras (tabla de records, nombre del jugador, etc) sí. Yo en lo que he hecho recientemente (dos años vista) no me he encontrado ese problema, si bien es cierto que siempre que leeo el teclado con ese fin hago lo siguiente:

1- Espero a que no haya ninguna tecla pulsada
2- Espero a que se pulse una tecla y la guardo
3- Vuelta al 1

Este funcionamiento se vería alterado por los micro-rebotes, pero he mirado el código y da la casualidad de que siempre estoy tocando música AY (en el 48K tb pero la llamada no hace nada) y meto un HALT emtre el paso 2 y 3 para la pausa entre notas necesaria con el VT player. Por eso no me veo afectado.
Un saludo,

Gandulf

Avatar de Usuario
Ralphy
Freddy Hardest
Mensajes: 589
Registrado: Dom May 27, 2007 10:58 am
Ubicación: Lo 100 to picha, no tor mundo puehé DKI.

Re: Microrrebotes (esto va por Cañadul)

Mensaje por Ralphy » Vie Nov 02, 2007 10:37 pm

mcleod_ideafix escribió:Cuál fue mi sorpresa cuando me di cuenta de que era imposible teclear la clave: cada vez que pulsaba una letra aparecía dos o tres veces, da igual lo breve que fuera la pulsación.



Y tanto McLeod. Eso o algo parecido suele pasar en varios juegos. Por citar dos ejemplos, la 2ª fase de Mortadelo y Filemón (Si algún lector no lo sabe es "LOS MÁS BESUGOS"), pulso por ejemplo la "L" y aparece dos veces o bien tarda en aparecer y es entonces cuando aparece dos veces (o una vez si tienes suerte) o con otra tecla cualquiera, también ocurre con otro juego mencionado reciéntemente en otra parte del foro, el Game mix.

¿ Incómodo, verdad ? No es como la sentencia INPUT, ahí es comodísimo de pulsar la/s tecla/s deseada/s.

CHAU.
ADVERTENCIA: Las autoridades spectrumeras advierten que Ralphy desprotege sériamente sus juegos.

En el nombre del anime, del manga, y del espíritu otaku: Imagen ¡¡¡ A ni MÉN !!!

¡¡¡ OTAKUS AL PODER !!!

Gandulf
Nonamed
Mensajes: 1067
Registrado: Lun May 07, 2007 10:06 pm

Mensaje por Gandulf » Vie Nov 02, 2007 10:55 pm

La verdad es que el efecto de repetición es fácil de solucionar, yo creo que a veces estas cosas se pasan porque no se prueban mucho o se pasa por alto (y me refiero al mortadelo, seguramente el juego de Cañadul fue testeado en un emulador y en los emuladores no ocurre el rebote de tecla)
Un saludo,

Gandulf

Avatar de Usuario
mcleod_ideafix
Johnny Jones
Mensajes: 3985
Registrado: Vie Sep 21, 2007 1:26 am
Ubicación: Jerez de la Frontera
Contactar:

Mensaje por mcleod_ideafix » Sab Nov 03, 2007 1:17 am

Los de Cañadul han arreglado este problemilla: ahora los microrrebotes no afectan. Ya os lo contarán ellos con más detalle... :)
Web: ZX Projects | Twitter: @zxprojects

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: Bing [Bot] y 8 invitados