Karoshi MSX Community
05 de Julio de 2021, 07:36:05 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 3
  Imprimir  
Autor Tema: Capturar el Bit de Sprite Colision en .ROM  (Leído 13408 veces)
0 Usuarios y 1 Visitante están viendo este tema.
j4mk3
Karoshi Maniac
****
Mensajes: 376


MSx Powa!


WWW Email
« : 22 de Noviembre de 2009, 04:14:22 pm »

Bueeenas,

Vamos a ver me ha surgido una duda sobre la lectura del registro del VDP de MSX1.

Escape from the dwarves goldmine está siendo programado en .COM, osea...todo RAM para mi Smiley lo chulipitiflautico seria que sea un .ROM de 32 ks maximo. Esto hace que me plantee varios cambios, sobre todo por el tema interrupcion VDP y tal.

Ahora toco las posiciones 38-39-3A y pongo ahi el salto a mi rutina que vuelve con un RETI. Como bien sabemos todos, en .ROM ahí hay BIOS y esto no vale. Ya se que hay que hacer un enganche en FD9A y volver con un RET. Hasta ahi todo comtrolado.

EL PROBLEMA me viene al hacer la lectura del registro del VDP para coger la colision de SPRITE.
Ahora lo hago así :
(cachito del principio de mi rutina de Interrupción)
Código:
TIMER_R:
push AF
push BC
push DE
push HL
push IX
push IY

in A,[99h] ; acknowledge?
; Lectura de SPRITE COLISION
and 00100000b
srl A
srl A
srl A
srl A
srl A
ld [TIM_SPC],A   ; Guardo si ha habido colision o no

Según tengo entendido al leer el 99h se borra su contenido y cambia.
Claro...investigando veo que la rutina de interrupcion de la BIOS ya lee ese 99...tonces...
...si lo que tengo entendido es cierto
¿Cuando y como debo leer ese puñetero bit al hacer una ROM ?

Agradezco ayuda y sugerencias. Wink

P.D: Si no resuelvo esto , en la RU os presento el juego en .COM (y a cagar a la playa) XD
En línea

---  G Fan  ---  Galious & Gradius  & G Boys   ---
--- Play HANS' ADVENTURE, STAN, THE DREAMER & BITLOGIC ---
MsxKun
Karoshi Forum's Guru
*******
Mensajes: 1554


Kimochi-ii


WWW Email
« Respuesta #1 : 22 de Noviembre de 2009, 04:32:18 pm »

Nunca he usado ese bit, pq parece que es problematico...

De todas formas, podria ser esto?

Handbuc:

STATFL (F3E7H, 1)
initial value:  0
contents:   stores VDP status (contents of status register 0, in MSX2)

ahi tienes en RAM el contenido del registro de estado del vdp, prueba a ver.
En línea

--

Cindy Lauper She Bops!
SapphiRe_MSX
Visitante
« Respuesta #2 : 23 de Noviembre de 2009, 03:24:44 pm »

A ver... todo depende de dónde enganches la rutina de interrupción.

Hay dos ganchos a los que llama la BIOS, uno al que salta en todas las interrupciones y otro al que salta sólo en las interrupciones del VBLANK. La diferencia es que si enganchas en este último, la BIOS ya ha leído el registro de estado del VDP (lógico porque ha tenido que discriminar si la interrupción ha sido provocada por el VBLANK) y al leerlo se ha borrado. Eso sí, como te ha dicho Kun, la BIOS no es tonta y lo guarda en la RAM.

Si enganchases al otro gancho, la BIOS aún no ha leído el registro de estado y es ahí cuando tendrías que leerlo.

De todas formas (y como comentarios a tu rutina de interrupción):

-La BIOS ya guarda todos los registros antes de llamar a los ganchos, no te hacen falta los PUSH (y POP que tendrás detrás).
-Si vas a usar la variable TIM_SPC como booleano, te puedes ahorrar los srl a, ya que con el AND que haces ya tendrías un valor de cero si el bit está apagado y un valor distinto de cero si el bit está encendido. ¿Para qué moverlo al bit 0?

Échale un vistazo a la última versión de la rutina FD9APATCH que puedes encontrar en el subforo de snippets: http://karoshi.auic.es/index.php?topic=212.msg13860#msg13860 quizá te de ideas Cheesy
En línea
Ramones
Visitante
« Respuesta #3 : 25 de Noviembre de 2009, 09:00:30 am »

P.D: Si no resuelvo esto , en la RU os presento el juego en .COM (y a cagar a la playa) XD

Venga, que hoy estoy "escritor". xD Te explico.

Si te enganchas a H.TIMI (0FD9Fh), te sobra código en tu rutina de interrupción. Smiley

Para empezar SOLO tienes que guardar AF. ¿Por qué? Pues porque la BIOS ya ha hecho ese trabajo de guardar por tí todos los registros (debuggear un poco cualquier BIOS en la dirección 038h).

Así que con:

interrupt:

push af
....
pop af
ret

Te sobra.

Y sobre el "maldito" registro de estado 0, pues casi que igual o más fácil. Mira:

push af
ld (registro0vdp),a
....
pop af

Si si... cuando la BIOS salta a H.TIMI te pasa en AF el valor que ha leído en 038h (vamos lo tú haces en MSXDOS con el in a,(099h)). Smiley

Si utilizases la variable que comenta Sapphire tendrías un problema: Que leerías lo del FRAME ANTERIOR. ¿Por qué? Pues porque ese valor se guarda en la variable de sistema, precisamente, después de retornar de H.TIMI.

Por eso el solo guardar AF y el usarlo tal cual viene como parámetro.

Lo se lo se... no hay ninguna referencia escrita a que esto es así como lo cuento. Y es cierto, no he encontrado ningún libro, documento o similar donde me diga que lo que llega en AF en H.TIMI es el registro de estado del VDP. Pero después de leer todas las BIOS que han pasado por mis manos, TODAS hacen lo que te dicho, de una manera o de otra.

Yo he usado la rutina de interrupción así en todas las ROMs que he hecho... y todavía no conozco ningún problema con ellas y esto. Wink




En línea
Mortimer
Karoshi Lover
***
Mensajes: 216


WWW
« Respuesta #4 : 25 de Noviembre de 2009, 10:40:39 am »

Ramones, dices eso acerca de las BIOS porque aún no ha pasado por tus manos mi reimplementación en Java de la misma que tengo hecha para el emulador Shocked, en la que como no tenía ni idea de esto de que en A vaya el estado del VDP pues no lo hacía, pero como ya lo he arreglado tu frase vuelve a ser cierta, y por tanto tus juegos podrán funcionar sin problemas Cheesy

Este es el fragmento de la BIOS oficial de la zona de la que hablamos:

Código:
PUSH HL
PUSH DE
PUSH BC
PUSH AF
EXX
EX   AF,AF'
PUSH HL
PUSH DE
PUSH BC
PUSH AF
PUSH IY
PUSH IX
CALL H.KEYI
IN   A,(VDP.SR)
AND  A
JP   P,INTRET
CALL H.TIMI
EI
LD   (STATFL),A
AND  ' '
...

No les hubiera costado nada guardar la variable antes de llamar a H.TIMI, o hacer oficial y documentar que el valor ya va en el registro A...


En línea
Madonna Mk 2
Visitante
« Respuesta #5 : 25 de Noviembre de 2009, 10:46:26 am »

EL PROBLEMA me viene al hacer la lectura del registro del VDP para coger la colision de SPRITE.

Si al final usas satisfactoriamente ese bit, me quitaré sinceramente el sombrero. No conozco a nadie en ninguna plataforma equipada con detección de colisiones por hardware que haya tenido la bravura de utilizarla de un modo coherente, ya que la colisión por bit es demasiado estricta (tocas un sólo pixel y mueres, LOL!) y usarlo como filtro para una 2ª rutina de detección por áreas conlleva un ahorro de ciclos que al final no sirve para nada cuando se produce el peor caso de colisión posible.

De todas maneras, desconozco el desarrollo de tu juego, al igual te va bien ese tipo de colisión. Y decirte que tienes mi apoyo y admiración por usar las maravillas intrínsecas del hardware de la máquina Smiley

Si lo puede hacer el VDP, mejor que lo haga él que no el Z80 Wink

¡Al hierro!

En línea
Ramones
Visitante
« Respuesta #6 : 25 de Noviembre de 2009, 01:48:59 pm »

Si al final usas satisfactoriamente ese bit, me quitaré sinceramente el sombrero.

Totalmente de acuerdo. Para MSX1 es que lo veo casi imposible (sacarle partido). Y para MSX2 complejo (aunque el MSX2 si disponga de su bit por linea de patron de sprite especificando si se controla o no la colisión. Aunque se de uno que hace poco me comentaba que si le puede sacar partido... ¿verdad Fernando? Tongue

En línea
Ramones
Visitante
« Respuesta #7 : 25 de Noviembre de 2009, 01:53:08 pm »

Ramones, dices eso acerca de las BIOS porque aún no ha pasado por tus manos mi reimplementación en Java de la misma que tengo hecha para el emulador Shocked, en la que como no tenía ni idea de esto de que en A vaya el estado del VDP pues no lo hacía, pero como ya lo he arreglado tu frase vuelve a ser cierta, y por tanto tus juegos podrán funcionar sin problemas Cheesy

Es que mi frase siempre ha sido cierta. Yo hablaba de máquinas MSX *reales*. Tongue Y tu me hablas de un emulador. Me alegra que lo hayas subsanado a raíz de esta conversación.
Lo que no entiendo (porque no tengo ni idea de como implementar un emulador) es por qué no lo tenías "implementado". Si tu emulador emula el MSX, emulará la BIOS y con ella... el código de 038h... ¿cómo es que no lo tenías implementado? De verdad, me gustaría conocer la respuesta porque soy muy torpe con eso de emuladores. Igual es que hablas de un simulador del MSX en java, no de un emulador... entonces lo entendería...

Y bueno, espero que no te siente mal, pero es que nunca me he preocupado porque mis programas funcionen en los emuladores, sino en las máquinas reales. Wink


En línea
SapphiRe_MSX
Visitante
« Respuesta #8 : 25 de Noviembre de 2009, 04:14:49 pm »

Si al final usas satisfactoriamente ese bit, me quitaré sinceramente el sombrero.

Totalmente de acuerdo. Para MSX1 es que lo veo casi imposible (sacarle partido). Y para MSX2 complejo (aunque el MSX2 si disponga de su bit por linea de patron de sprite especificando si se controla o no la colisión. Aunque se de uno que hace poco me comentaba que si le puede sacar partido... ¿verdad Fernando? Tongue

Sip, en la RU te lo cuento en detalle. Verás que es bastante simple lo que necesito y con el uso de ese bit me sobra.

Si utilizases la variable que comenta Sapphire tendrías un problema: Que leerías lo del FRAME ANTERIOR. ¿Por qué? Pues porque ese valor se guarda en la variable de sistema, precisamente, después de retornar de H.TIMI.

Aps, interesante es saberlo.

Yo lo que hago es engancharme en FD9A y leo directamente el registro de estado del VDP en mi rutina. Así, al volver a la BIOS, ella lo vuelve a leer y como ya ha sido leído se ha desactivado el bit de la interrupción y piensa que no es una interrupción del VDP con lo que no llama a FD9F y vuelve directamente.

¿Ves algo mal hecho en ese procedimiento?
En línea
Mortimer
Karoshi Lover
***
Mensajes: 216


WWW
« Respuesta #9 : 25 de Noviembre de 2009, 06:42:24 pm »

Lo que no entiendo (porque no tengo ni idea de como implementar un emulador) es por qué no lo tenías "implementado". Si tu emulador emula el MSX, emulará la BIOS y con ella... el código de 038h... ¿cómo es que no lo tenías implementado? De verdad, me gustaría conocer la respuesta porque soy muy torpe con eso de emuladores. Igual es que hablas de un simulador del MSX en java, no de un emulador...  entonces lo entendería...

Pues te cuento, es que mi emulador es bastante particular en muchos aspectos, porque si recordáis fue un proyecto que nació de la idea un poco nebulosa de crear una plataforma mixta Java+MSX para desarrollo de bocetos, pero después se redefinió para crear un emulador MSX orientado a web y en un futuro espero no muy lejano a plataformas móviles. Y puesto que estos dispositivos son relativamente limitados en recursos, uno de los objetivos prioritario de diseño es la eficiencia: Cada bytecode Java ahorrado acerca el emulador a móviles más modestos además de bajar el consumo.

Así que, uno de los sitios dónde se podría ahorrar bastante era alrededor del BIOS: 32KB de memoria para almacenarla, quizás puertos de I/O, en algunos casos la necesidad de un mapper... Y además también podía ahorrar que se ejecutara tanto código Z80 emulado, relativamente lento, ya que podía utilizar los 'atajos' que ya tenía creados del enfoque original y atacarlos directamente con Java.

Es decir, que como comentas, en un emulador con un enfoque tradicional, se emula todo el hardware, y sobre él correrá la BIOS original (O equivalente), si esta BIOS dejaba en A un valor antes de saltar a algún sitio, ahí estará en la emulación. Pero en el caso de mi enjendro no, ante cada llamada al BIOS 'simulo' más que 'emulo' que el efecto documentado sobre el estado de la máquina es el mismo que si hubiera ejecutado la llamada original, pero salvo que los cree expresamente este tipo de efectos laterales no estarán (O habrá otros disintos).

Así que bueno, no sé si lo que estoy haciendo es un emulador, un simulador, o algo intemedio, la idea es que ni el usuario ni el software vean la direfencia...  Wink

Espero que te haya disipado las dudas...

Y bueno, espero que no te siente mal, pero es que nunca me he preocupado porque mis programas funcionen en los emuladores, sino en las máquinas reales. Wink

Claro que no me lo tomo a mal, obviamente son los emuladores los que tienen que adaptase a los juegos, aunque bueno, ya sacaré este tema más adelante porque me afecta de forma directa  Roll Eyes

Saludos
En línea
Ramones
Visitante
« Respuesta #10 : 26 de Noviembre de 2009, 08:01:52 am »

Yo lo que hago es engancharme en FD9A y leo directamente el registro de estado del VDP en mi rutina. Así, al volver a la BIOS, ella lo vuelve a leer y como ya ha sido leído se ha desactivado el bit de la interrupción y piensa que no es una interrupción del VDP con lo que no llama a FD9F y vuelve directamente.
¿Ves algo mal hecho en ese procedimiento?

¿Además de usar las cosas para lo que no son? XDDDD Entiendo que al leer el bit de interrupción chequeas si es o no una interrupción para procesarla o no. Si haces eso.. pues no se... no creo que te pase nada.  Lo que pasa es que H.KEY recibe TODAS las interrupciones por eso hay que filtrar cuál quieres. Por ejemplo el MIDI del Turbo R también activa interrupciones cuando está funcionando que saltan ahí. Y las interrupciones de linea en MSX2 si no recuerdo mal también saltan ahí.

Pero ya te digo si lo tienes controlado, no creo que te pase nada. Ahora mismo no se me ocurre nada. Pero claro son las 8 de la mañana.... xDD


En línea
Ramones
Visitante
« Respuesta #11 : 26 de Noviembre de 2009, 08:03:03 am »


Espero que te haya disipado las dudas...

Totalmente. Smiley Gracias.


Claro que no me lo tomo a mal, obviamente son los emuladores los que tienen que adaptase a los juegos, aunque bueno, ya sacaré este tema más adelante porque me afecta de forma directa  Roll Eyes


Pues adelante. Wink

En línea
SapphiRe_MSX
Visitante
« Respuesta #12 : 26 de Noviembre de 2009, 08:08:43 am »

¿Además de usar las cosas para lo que no son? XDDDD

Bueno, aprovecho y genero el siguiente número pseudoaleatorio de la secuencia. Así meto un poco más de aleatoriedad en el juego Grin Grin

Citar
Entiendo que al leer el bit de interrupción chequeas si es o no una interrupción para procesarla o no. Si haces eso.. pues no se... no creo que te pase nada.

Sip, lo que hago ahora es una espera activa que apaga un flag propio y sólo sale cuando se enciende... Y sólo lo enciendo si detecto que es una interrupción de VBLANK. Pero como ya te he dicho, en toda interrupción calculo un número aleatorio... así aprovecho las interrupciones un poquito más Tongue

Además, le robo unos cuantos ciclos a la BIOS, lo cual no está nada mal para según que casos Grin Grin Grin
En línea
j4mk3
Karoshi Maniac
****
Mensajes: 376


MSx Powa!


WWW Email
« Respuesta #13 : 11 de Abril de 2010, 03:33:52 pm »

Señores....señoras ninguna Smiley

Ya he hecho mi primera .ROM de 32ks, con el asMSX, el .SEARCH que incorpora para la page2, con la lectura del AF para pillar el bit de colision (y si funciona) y enganchando la Interrupcion al 0FD9Fh.

Gracias a todos, Saphire, Ramones,

SIIIIIIIII !!!  Grin Grin Grin Grin

Pronto os pongo un video de como va el juego.

Maki, ve poniendo ketchup o algún tipo de salsa al fichero de video de las jornadas en Calella si quieres que tenga buen sabor cuando te lo tragues !!! Wink

Madonna, quitate el sombrero Smiley
En línea

---  G Fan  ---  Galious & Gradius  & G Boys   ---
--- Play HANS' ADVENTURE, STAN, THE DREAMER & BITLOGIC ---
Madonna Mk 2
Visitante
« Respuesta #14 : 12 de Abril de 2010, 07:48:47 pm »

Madonna, quitate el sombrero Smiley

¡Felicidades! Grin Me quito la boina verde Cool

Ahora ya podré chulear de que conozco a alguien que usa el bit de colisión por hardware satisfactoriamente en un juego y no ha sucumbido en el intento Wink

Eso te eleva a la categoría de gente como "EL ÚLTIMO SUPERVIVIENTE" Cheesy *** BEHIND THE MUSGO ***

En línea
Páginas: [1] 2 3
  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!