j4mk3
|
|
« : 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 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) 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. 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
|
|
« 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
|
-- 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
|
|
|
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. 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)). 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.
|
|
|
En línea
|
|
|
|
Mortimer
|
|
« 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 , 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 Este es el fragmento de la BIOS oficial de la zona de la que hablamos: 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 Si lo puede hacer el VDP, mejor que lo haga él que no el Z80 ¡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?
|
|
|
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 , 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 Es que mi frase siempre ha sido cierta. Yo hablaba de máquinas MSX *reales*. 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.
|
|
|
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? 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
|
|
« 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... 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. 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 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. 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 Pues adelante.
|
|
|
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 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 Además, le robo unos cuantos ciclos a la BIOS, lo cual no está nada mal para según que casos
|
|
|
En línea
|
|
|
|
j4mk3
|
|
« Respuesta #13 : 11 de Abril de 2010, 03:33:52 pm » |
|
Señores....señoras ninguna 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 !!! 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 !!! Madonna, quitate el sombrero
|
|
|
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 ¡Felicidades! Me quito la boina verde 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 Eso te eleva a la categoría de gente como "EL ÚLTIMO SUPERVIVIENTE" *** BEHIND THE MUSGO ***
|
|
|
En línea
|
|
|
|
|