Karoshi MSX Community
05 de Julio de 2021, 03:38:36 pm *
Bienvenido(a), Visitante. Por favor, ingresa o regístrate.

Ingresar con nombre de usuario, contraseña y duración de la sesión
Noticias:
 
   Inicio   Ayuda Buscar Ingresar Registrarse  
Páginas: [1] 2
  Imprimir  
Autor Tema: leer el joystick  (Leído 11914 veces)
0 Usuarios y 1 Visitante están viendo este tema.
e_sedes
Karoshi Maniac
****
Mensajes: 442



Email
« : 11 de Mayo de 2006, 01:25:40 am »

Estoy intentando leer el joystick sin usar el GTSTCK, y lo que hago es leer el registro 14 del PSG con RDPSG. Pero siempre me da la lectura del segundo puerto, aunque ponga a 0 el bit 6 del reg. 15. Alguna alma caritativa me puede dar una pista de como hacer?... Huh

Las pruebas las hago en emulador, llamando desde BASIC a la rutinilla con un USR y leyendo lo que me da.

gracias. un saludo.
En línea

sempre fun un valente corredor
jltursan
Karoshi Forum's Guru
*******
Mensajes: 1516


¿Que es lo que has aprendido hoy?


WWW Email
« Respuesta #1 : 11 de Mayo de 2006, 09:32:24 am »

¡Uf!, ¡como nos estamos pasando últimamente con la BIOS!. No lo he hecho nunca; pero así a bote pronto igual sería una buena echarle un vistazo a la propia rutina de la BIOS, no debe de ser nada complicada.
En línea

Doom dee doom dee doom
e_sedes
Karoshi Maniac
****
Mensajes: 442



Email
« Respuesta #2 : 11 de Mayo de 2006, 10:13:11 am »

Es que la manera en que te da la lectura el GTSTCK es un coñazo. Yo solo quiero una forma simple de leer cada interruptor del joystick por separado. Me da cierto reparo mandar cosas al reg. 15, por si meto el zueco y achicharro algo  Undecided, ...
Si hubiera o hubiese alguna dirección en RAM donde el sistema guardase el byte que lee de cada joystick sería fantabuloso. Pero no se si hay de eso.

un saludo.
En línea

sempre fun un valente corredor
Jon_Cortazar
Administrator
Karoshi Forum's God
********
Mensajes: 2777



WWW Email
« Respuesta #3 : 11 de Mayo de 2006, 10:22:18 am »

Pero, ¿que es lo que no te mola de GTSTCK?. ¡Pero si es ultra cómoda  Shocked!. (Misa no entiende tusa Cheesy)
En línea

Jon Cortázar Abraido (aka El Viejo Archivero)
RELEVO Videogames
[Dioniso: La cafeína está haciendo su trabajo; yo espero hacer el mío.]
[pitpan: Me sigue pareciendo más productivo jugar al SNAIL MAZE que seguir esta discusión.]
pitpan
Karoshi Forum's Guru
*******
Mensajes: 1812


« Respuesta #4 : 11 de Mayo de 2006, 06:32:50 pm »

Pues a ese mismo problema me enfrenté yo. Y otra mucha gente, a juzgar por los problemas que ha tenido la lectura del joystick en algunos de los juegos de la última MSXdev'05.

Mi consejo es que uses la rutina de la BIOS o que la repliques, de forma simplificada, dentro de tu propio código. La lectura de joysticks tiene un problema de sincronización grande, ya que distintas máquinas requieren de distintos retardos. Por ello, la BIOS es una muy buena opción. No se necesita MÁS velocidad. Lo suyo es leer el joystick - como mucho - en cada v-blank una vez (una lectura por frame). Sólo se me ocurriría leerlo continuamente para el control de una pistola óptica, por ejemplo. Así tuve que hacerlo en su momento.

En cuanto al problema que dices, me topé con él durante el desarrollo del DUCK HUNT, que necesitaba realizar una lectura muy rápida de los bits de estado del PSG correspondientes al joystick. Mi diagnóstico es el siguiente: en cada interrupción v-blank, cuando el control pasa a la BIOS, en algún punto de ésta se reinicia el bit de selección. Me imagino que está relacionado con alguna de las rutinas de sistema, que lee sucesivamente ambos joysticks y por eso acaba apuntando al puerto 2.

Pero que me puedo estar equivocando, así que si alguien sabe algo más (hint: Dioniso), que lo comente aquí.
En línea
e_sedes
Karoshi Maniac
****
Mensajes: 442



Email
« Respuesta #5 : 11 de Mayo de 2006, 11:29:55 pm »

Lo que no me gusta de GTSTCK es el formato en que te entrega la lectura. No buscaba velocidad, sino ver si se podía leer de una manera más simple. Le he estado echando un vistazo al código desensamblado a ver que hacía y si dejaba la lectura directa por algún lado, pero creo que va a ser mejor no liarse demasiado. Usaré la rutina de la BIOS y listo.

P.D.: me mola esto de "aprofundarse" en el ensamblador... Cheesy
En línea

sempre fun un valente corredor
pitpan
Karoshi Forum's Guru
*******
Mensajes: 1812


« Respuesta #6 : 12 de Mayo de 2006, 08:55:23 am »

Podrías reconvertir el original sin muchos problemas para su tratamiento más sencillo:

LD A,1
CALL GTSTCK
LD HL,TABLA_JOYSTICK
LD C,A
LD B,0
ADD HL,BC
LD A,[HL]
...

TABLA_JOYSTICK:
db 0000b,0001b,0101b,0100b,0110b,0010b,1010b,1000b,1001b

De esta forma tendrás en el acumulador el campo siguiente:

bit 4 ---  bit 3 --- bit 2 --- bit 1
IZQ.      DER.     ABAJO  ARRIBA

Es una solución. El código es un poco chungo, especialmente el desplazamiento.

A ver qué tal.
En línea
SapphiRe
Visitante
« Respuesta #7 : 12 de Mayo de 2006, 10:33:53 am »

Podrías reconvertir el original sin muchos problemas para su tratamiento más sencillo:

LD A,1
CALL GTSTCK
LD HL,TABLA_JOYSTICK
LD C,A
LD B,0
ADD HL,BC
LD A,[HL]
...

TABLA_JOYSTICK:
db 0000b,0001b,0101b,0100b,0110b,0010b,1010b,1000b,1001b

De esta forma tendrás en el acumulador el campo siguiente:

bit 4 ---  bit 3 --- bit 2 --- bit 1
IZQ.      DER.     ABAJO  ARRIBA

Es una solución. El código es un poco chungo, especialmente el desplazamiento.

A ver qué tal.

Sería mejor

Código:
LD A,1
CALL GTSTCK
LD HL,TABLA_JOYSTICK
ADD A,L
JP NC,@@NOCARRY
INC H
@@NOCARRY:
LD L,A
LD A,[HL]

Aunque eso no evita el problema principal, que es que una configuración 1111 le daría 0 y sería indistinguible de una 0000 o una 1100.
« Última modificación: 12 de Mayo de 2006, 11:01:23 am por SapphiRe » En línea
e_sedes
Karoshi Maniac
****
Mensajes: 442



Email
« Respuesta #8 : 12 de Mayo de 2006, 10:35:29 am »

Si, algo así es lo que tenía pensado hacer. Es lo que hace la BIOS pero al reves. Eso y alguna ideilla más saqué de de revisar el código de GTSTCK.
Gracias.

Ya digo, esto del asm es más vicioso que los sudokus esos... Grin
En línea

sempre fun un valente corredor
e_sedes
Karoshi Maniac
****
Mensajes: 442



Email
« Respuesta #9 : 12 de Mayo de 2006, 10:43:58 am »

Citar
Sería mejor

Código:
LD A,1
CALL GTSTCK
LD HL,TABLA_JOYSTICK
ADD A,L
JP NC,@@NOCARRY
INC L
@@NOCARRY:
LD L,A
LD A,[HL]

Aunque eso no evita el problema principal, que es que una configuración 1111 le daría 0 y sería indistinguible de una 0000 o una 1100.

Hey, gracias. Para leer un joystick normal no creo se dé ese problema, pero está bien tener eso en cuenta para otras cosas.

un saludo.
En línea

sempre fun un valente corredor
e_sedes
Karoshi Maniac
****
Mensajes: 442



Email
« Respuesta #10 : 12 de Mayo de 2006, 10:54:09 am »

Sería mejor

Código:
LD A,1
CALL GTSTCK
LD HL,TABLA_JOYSTICK
ADD A,L
JP NC,@@NOCARRY
INC L
@@NOCARRY:
LD L,A
LD A,[HL]

Aunque eso no evita el problema principal, que es que una configuración 1111 le daría 0 y sería indistinguible de una 0000 o una 1100.

No habría que cambiar el INC L por INC H?
En línea

sempre fun un valente corredor
jltursan
Karoshi Forum's Guru
*******
Mensajes: 1516


¿Que es lo que has aprendido hoy?


WWW Email
« Respuesta #11 : 12 de Mayo de 2006, 10:57:58 am »

Citar
No habría que cambiar el INC L por INC H?

Sí  Wink
En línea

Doom dee doom dee doom
SapphiRe
Visitante
« Respuesta #12 : 12 de Mayo de 2006, 11:01:10 am »

Citar
No habría que cambiar el INC L por INC H?

Sí, lapsus calami...  Undecided problemas de escribir deprisa
En línea
pitpan
Karoshi Forum's Guru
*******
Mensajes: 1812


« Respuesta #13 : 12 de Mayo de 2006, 12:23:55 pm »

Sap: aceptamos barco, pero no sé en qué te basas para decir que es mejor.  Grin

La rutina que tú propones ocupa 15 bytes y la original sólo 13 (salvo error u omisión en mis cálculos mentales). Además, la solución es más lenta al tener saltos y ser más larga (más bytes que leer).
Si cambias el JP C,... por JR C,... ahorras 1 byte pero la ejecución se penaliza un poco más.

Por mi parte, prefiero hacer todo lo que puedo sin iterar/saltar.

En línea
e_sedes
Karoshi Maniac
****
Mensajes: 442



Email
« Respuesta #14 : 12 de Mayo de 2006, 12:31:19 pm »

Bien, pues mirando el código de GTSTCK vi que para tomar el resultado de la tabla al final hace algo así como:
Código:
LD HL,$1233
AND $0F
LD E,A
LD D,0
ADD HL,DE
LD A,[HL]
RET

A la salida resulta que ya tienes en E la lectura del joystick. Y sin los problemas de que sean datos no soportados por el sistema normal. Lo he probado en todas las configuraciones de BIOS del BlueMSX (menos CBios) y va perfectamente. ¿Creeis que puede dar problemas de compatibilidad con alguna máquina? ¿Será fiable?... Huh

Si vale lo flipo yo solo Grin
En línea

sempre fun un valente corredor
Páginas: [1] 2
  Imprimir  
 
Ir a:  

Impulsado por MySQL Impulsado por PHP Powered by SMF 1.1.21 | SMF © 2013, Simple Machines XHTML 1.0 válido! CSS válido!