e_sedes
|
|
« : 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?... 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
|
|
« 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
|
|
« 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 , ... 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
|
|
« 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 !. (Misa no entiende tusa )
|
|
|
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
|
|
« 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
|
|
« 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...
|
|
|
En línea
|
sempre fun un valente corredor
|
|
|
pitpan
|
|
« 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 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
|
|
« 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...
|
|
|
En línea
|
sempre fun un valente corredor
|
|
|
e_sedes
|
|
« Respuesta #9 : 12 de Mayo de 2006, 10:43:58 am » |
|
Sería mejor 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
|
|
« Respuesta #10 : 12 de Mayo de 2006, 10:54:09 am » |
|
Sería mejor 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
|
|
« Respuesta #11 : 12 de Mayo de 2006, 10:57:58 am » |
|
No habría que cambiar el INC L por INC H? Sí
|
|
|
En línea
|
Doom dee doom dee doom
|
|
|
SapphiRe
Visitante
|
|
« Respuesta #12 : 12 de Mayo de 2006, 11:01:10 am » |
|
No habría que cambiar el INC L por INC H?
Sí, lapsus calami... problemas de escribir deprisa
|
|
|
En línea
|
|
|
|
pitpan
|
|
« 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. 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
|
|
« 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: 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?... Si vale lo flipo yo solo
|
|
|
En línea
|
sempre fun un valente corredor
|
|
|
|