Karoshi MSX Community
05 de Julio de 2021, 11:59:55 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: Retrazado y color de borde  (Leído 7660 veces)
0 Usuarios y 1 Visitante están viendo este tema.
burguera
Visitante
« : 04 de Enero de 2011, 08:21:37 pm »

Hola de nuevo. Buscando en el foro me encuentro con que la técnica preferida de pitpan y Sapphire para ver si nos salimos del vblank con las transferencias a VRAM consiste en modificar el color del borde. El caso es que no acabo de entender la técnica. A ver, lo que yo hago es:

Código:
ld a, 00fh
out (099h), a
ld a, 087h
out (099h), a

justo después de que se produzca la interrupción HTIMI. Teóricamente en este momento empieza el vblank, ¿no?

Y al final de mis transferencias a VRAM hago esto:

Código:
ld a, 006h
out (099h), a
ld a, 087h
out (099h), a       

¿Exactamente qué es lo que debería ver que me sirviera de indicador de como de bien voy de tiempo en el vblank?

En teoría, si no me paso de ciclos, el primer cambio de color nunca se reflejará en pantalla por haberlo hecho dentro del retrazado de pantalla, ¿es así?

Por otra parte... ¿me puedo fiar de esta técnica sobre un emulador?
En línea
pitpan
Karoshi Forum's Guru
*******
Mensajes: 1812


« Respuesta #1 : 05 de Enero de 2011, 12:06:51 am »

Correcto el tema conceptual y la aplicación. Te puedes fiar bastante de cómo funciona en cuanto al tiempo consumido en los emuladores, se parecerá bastante al empleado en el hardware real.

PERO ten en cuenta lo siguiente:
1.- Estás asumiendo que el puerto correcto es el 99h - deberías leer de la BIOS la dirección correcta o usar la BIOS directamente con un hermosísimo WRTVDP
2.- El emulador te aguantará transferencias a VRAM sin apenas pausas, mientras que los MSX necesitarán retardos, especialmente los MSX1 y, sobre todo, porque algunos modelos necesitan aún más retardo.

Yo iría editando el hilo, porque como vean el código Armando o Sap te va a caer un paquete, Toni Wink

El punto 2, desde un punto de vista estadístico, es muchísimo más relevante que el 1. En cuanto a retardos, échale un vistazo a los documentos de desarrollo compatible que están en esta misma sección del foro.

Un saludo. Y mándame lo que sea por privado, que tengo mono ya de ver cositas tuyas (por pedir, que no quede).
En línea
burguera
Visitante
« Respuesta #2 : 05 de Enero de 2011, 08:34:53 pm »

Gracias Edu!

Sobre lo de usar directamente el puerto en lugar de consultar cual es, o usar la BIOS, soy consciente de ello.  Se trataba tan solo de una prueba rápida para ver qué pasaba. Y el caso es que aún no sé exactamente como interpretar lo que veo.

Sobre lo del tutorial en el foro, efectivamente, es un lujo tener toda esa información disponible. En particular, es muy útil el análisis de los ciclos disponibles dentro del vblank. Al final, seguramente lo que haré para cerciorarme de que todo está bien será contar los ciclos que ocupo dentro del vblank. Mis previsiones son transferir un máximo de 704 bytes a VRAM por vblank, que seguramente podré reducir, así que no debería tener problemas.

Sobre los retardos, también lo tengo en mente. En las pruebas que he hecho sobre un MSX real no hubo problemas. Pero, claro, es muy cómodo tener una referencia sobre el emulador para no tener que andar pasando la ROM de un sitio a otro cada dos por tres.

Ah, y gracias por tu ofrecimiento! Todavía tengo mi proyecto bastante verde. En cuanto lo tenga más avanzado te lo mando en privado a ver que te parece.

PS: Me he unido a la sociedad del netbook para programar MSX. En la de sitios rarunos que acaba uno programando con un cacharrico de estos ;-)

Saludos!
Toni
En línea
pitpan
Karoshi Forum's Guru
*******
Mensajes: 1812


« Respuesta #3 : 05 de Enero de 2011, 09:33:08 pm »

Lo de los netbooks es una bendición. Especialmente ahora que ya tenemos por fin procesadores un poco dignos, como el N550 o el D525, y hasta 2 GB de RAM DDR3 a 1066 MHz o más. Eso sí, te recomendaría que abandones Windows Vista/7 porque van muuuuuy mal. Estoy encantado con Ubuntu (Desktop) y Ubuntu Netbook Remix. Y si necesitas un asMSX para Linux, aquí lo tengo, calentito aún Wink
En línea
SapphiRe_MSX
Visitante
« Respuesta #4 : 06 de Enero de 2011, 01:40:05 pm »

Correcto el tema conceptual y la aplicación. Te puedes fiar bastante de cómo funciona en cuanto al tiempo consumido en los emuladores, se parecerá bastante al empleado en el hardware real.

Secundo la moción.

Citar
1.- Estás asumiendo que el puerto correcto es el 99h - deberías leer de la BIOS la dirección correcta o usar la BIOS directamente con un hermosísimo WRTVDP

Lee de la BIOS, es más rápido usar tus propias rutinas siempre que el tiempo sea algo crucial.

Citar
2.- El emulador te aguantará transferencias a VRAM sin apenas pausas, mientras que los MSX necesitarán retardos, especialmente los MSX1 y, sobre todo, porque algunos modelos necesitan aún más retardo.

Para eso lo mejor que he visto, aparte de las pruebas en un MSX real, es utilizar la versión "fast VRAM access" del Meisei. La puedes encontrar en http://home.kpn.nl/koele844/meisei_archive/ y te avisa de posibles volcados a VRAM demasiado rápidos. Es bastante acertada, ya que encontró los dos puntos en los que el QBIQS se iba de baretas...

Citar
Yo iría editando el hilo, porque como vean el código Armando o Sap te va a caer un paquete, Toni Wink

 Grin Grin Grin Grin Grin Grin Grin Grin Grin Grin Grin
En línea
j4mk3
Karoshi Maniac
****
Mensajes: 376


MSx Powa!


WWW Email
« Respuesta #5 : 07 de Enero de 2011, 12:44:17 am »

Ya se que en el manual del standard no dice que se tenga q usar el port 99h SIEMPRE para el VDP pero....
...
Tan tan tan tan tan raro es que no use un MSX el port 99h para el VDP ?  Huh Huh Huh
Que posibilidades hay que un juego creado usando sin preguntar a la BIOS el port 99h no funcione ? [No quiero pensar cual]  Sad
Que modelos se conocen que no use ese port para el VDP ?

fdo. un coder malo que no ha mirado WRTVDP  Huh

30 minutos despues...
EDIT: He leido en el tutorial de desarrollo lo siguiente: "Aunque en el 99,99% de los casos se trata de los puertos $98 y $99". Me quedo más tranquilo. jolin! es q me he hecho "caquita" por un momento. Tongue
« Última modificación: 07 de Enero de 2011, 12:50:12 am por j4mk3 » En línea

---  G Fan  ---  Galious & Gradius  & G Boys   ---
--- Play HANS' ADVENTURE, STAN, THE DREAMER & BITLOGIC ---
aorante
Karoshi Maniac
****
Mensajes: 451


nuTella Power!


WWW Email
« Respuesta #6 : 07 de Enero de 2011, 09:05:05 pm »

los megaroms pueden usar la bios?

es que del tema del mapeo no tengo ni idea...  Embarrassed
En línea

--------------------------------- ------ ----- --- -- -
aorante/303bcn
http://aorante.blogspot.com
http://twitter.com/#!/aorante
http://303bcn.wordpress.com/
--------------------------------- ------ ----- --- -- -
kabish
Karoshi Maniac
****
Mensajes: 470


caspaflims@hotmail.com
« Respuesta #7 : 07 de Enero de 2011, 11:07:02 pm »

los megaroms pueden usar la bios?

es que del tema del mapeo no tengo ni idea...  Embarrassed

Si. Otra cosa es que a ti te interese no usarla.

Un vistazo rapido a los mappers. Aqui.
http://bifi.msxnet.org/msxnet/tech/megaroms.html

En línea
SapphiRe_MSX
Visitante
« Respuesta #8 : 08 de Enero de 2011, 12:34:06 am »

Un vistazo rapido a los mappers. Aqui.
http://bifi.msxnet.org/msxnet/tech/megaroms.html
Mmmm... pues me se de un mapper que no está ahí, jijijijijijiji Ray - Qbiqs Glow - Qbiqs Beam - Qbiqs
En línea
burguera
Visitante
« Respuesta #9 : 09 de Enero de 2011, 10:30:27 pm »

Buenas!

Creo que ya tengo todo bastante claro. Muy interesante el "meisei fast vram". Tiene alguna cosilla curiosa, como que al arrancar me detecta accesos demasiado rápidos a VRAM de la propia C-BIOS. Y también me detecta accesos demasiado rápidos usando exclusivamente BIOS. Curioso.

Aún así, gracias al "meisei fast VRAM" y cambiando los colores del borde ya he conseguido mandar a VRAM todo lo que necesito en el vblank. Gracias Sapphire y Edu!

Anyway, tengo una nueva duda. Veréis, el núcleo de mi juego era tal que asín:

Código:
; Actualizar lógica del juego
ei
.WAIT: ld a, (ICNT)
or a
jr z, .WAIT
xor a
ld (ICNT), a
; Transferencias a VRAM

Y en la interrupción HTIMI básicamente hago

Código:
ld hl, ICNT
inc (hl)
call PLAY_MUSIC
            

El problema con que me encontré es que cuando se produce la interrupción, tras ejecutar mi código, ejecuta otras cosas de la BIOS, y, claro, me roba unos ciclos preciosos del vblank.

Mi solución fue meter las transferencias a VRAM dentro de mi rutina de servicio a la interrupción, así me aseguro que lo primero que se hace en el vblank es actualizar VRAM. Pero, claro, así se me puede colar una interrupción mientras estoy actualizando la lógica del juego y de vez en cuando me salta un frame mal actualizado.

De momento, uso un flag que impide actualizar VRAM si no he terminado con la lógica, pero no me acaba de convencer. ¿Hay alguna forma mejor de hacer que nada más entrar en el vblank se ejecute lo que yo quiera sin tener que esperar a que la BIOS termine sus cosas?

PS: Edu, sí, la verdad es que ya hay netbooks más que decentes. El mío es un Toshiba NB305 con una CPU N455 a 1.66GHz. Eso sí, tiro de Windows 7, y es una lástima, porque va más lento de lo que debería. Aún así, me da un poco de miedo meterle Linux. Según me han comentado puede dar problemas con la salida VGA, y también suelo usarlo para dar charlas con proyector.

PS2: La curiosidad me pudo, y decidí probar el sjasm, así que ahora mismo estoy con este en lugar de asMSX

PS3: No, no estoy preparando nada para la dev. Me puse con este proyecto en navidades, y apenas tengo nada aún.
En línea
j4mk3
Karoshi Maniac
****
Mensajes: 376


MSx Powa!


WWW Email
« Respuesta #10 : 11 de Enero de 2011, 11:46:18 am »

Spock,
No entiendido muy bien tu explicación de como te planteas el programa del juego.
Te explico lo que hago yo por si te es util.

Programa principal:
DI
-Inicio variables, arrays, limpio cosas, slots...
-Cargo Tiles a VRAM, cargo sprites.
-Inicio Buffer de video de RAM (copia del orden de tiles de VRAM)
-Inicio Buffer de sprites de RAM (copia de la tabla de sprites de VRAM Y,X,Patt y color)
-Inicio player de musica
EI
-un wait.
-Control por parte del usuario. Teclado, joystick, mouse.
-Logica del juego. colisiones. cambios en variables, en el Buffer de Video y sprites en RAM.
-Loop hacia el wait.

Interrupción
DI
-Pillo el Bit de colision
-Volcado de tabla de sprites RAM a VRAM (x,y,Patt,color)
-Volcado de Buffer de video RAM a VRAM (32x24)
-Leo teclado,joystick, mouse.
-Actualizo el player si se tercia.
RETI
En línea

---  G Fan  ---  Galious & Gradius  & G Boys   ---
--- Play HANS' ADVENTURE, STAN, THE DREAMER & BITLOGIC ---
burguera
Visitante
« Respuesta #11 : 11 de Enero de 2011, 02:31:26 pm »

Supongo que hacemos algo parecido. Lo que hacía yo antes tras la lógica del juego era esperar a que se activara un flag. Y el flag se activaba dentro de la interrupción. Así me sincronizaba con la interrupción. Algo así como un EI HALT.

El tema es que no me gusta meter mucho código dentro de la rutina de servicio a la interrupción, pero supongo que no hay más remedio.

Saludos!
Toni
En línea
SapphiRe_MSX
Visitante
« Respuesta #12 : 11 de Enero de 2011, 07:08:12 pm »

Yo en lugar de usar HALT en el cuerpo principal del programa espero la activación de un flag que sólo se activa en una interrupción VBLANK (que en MSX2 hay otras). Todas las transferencias a VRAM, actualización de los registros del PSG y tal lo hago fuera de la rutina de interrupción, que es muy sencillita...
En línea
burguera
Visitante
« Respuesta #13 : 11 de Enero de 2011, 09:06:07 pm »

Yo en lugar de usar HALT en el cuerpo principal del programa espero la activación de un flag que sólo se activa en una interrupción VBLANK (que en MSX2 hay otras). Todas las transferencias a VRAM, actualización de los registros del PSG y tal lo hago fuera de la rutina de interrupción, que es muy sencillita...

Hmmm... supongo que con la depre post-navidades no me he explicado bien Smiley A ver...

Yo no uso un halt, sólo comenté lo del halt como ejemplo. Lo que hacía antes era lo mismo que dices tú, Sapphire: en el cuerpo principal esperaba un flag que activaba en la rutina de interrupción. Y dentro de la rutina, además de activar el flag, llamaba al replayer musical. La ventaja de esto respecto al EI HALT es que la música siempre suena perfecta aunque en algún ciclo el cuerpo del programa tarde mucho (por ejemplo, en situaciones especiales en que tengo que descomprimir datos).

El problema que me encontré es que la rutina de interrupción, tras ejecutar mi código (flag + música) ejecutaba otras cosas de la BIOS. Con lo cual, no volvía al cuerpo del programa hasta que la BIOS hubiera terminado, y se me comía unos ciclos preciosos de vblank que necesito para transferencias a VRAM.

Mi pregunta era: si quiero que mis transferencias a VRAM empiecen justo en el VBLANK, sin tener que esperar a que la BIOS haga sus cosas, ¿cómo lo hago? ¿no tengo más remedio que meterlas en la rutina de interrupción?

Espero haberme explicado Tongue
En línea
SapphiRe_MSX
Visitante
« Respuesta #14 : 11 de Enero de 2011, 09:26:51 pm »

Y dentro de la rutina, además de activar el flag, llamaba al replayer musical. La ventaja de esto respecto al EI HALT es que la música siempre suena perfecta

No se va a notar lo más mínimo si no lo haces así. De todas formas, ¿llamas al replayer musical completo? ¿No sería mejor simplemente volcar los datos producidos por el replayer (un coste muchísimo menor) y después de todas las transferencias a VRAM ya llamar al replayer musical que produzca los datos para el siguiente frame?

Citar
Mi pregunta era: si quiero que mis transferencias a VRAM empiecen justo en el VBLANK, sin tener que esperar a que la BIOS haga sus cosas, ¿cómo lo hago? ¿no tengo más remedio que meterlas en la rutina de interrupción?

Para nada. Si te enganchas en FD9A y ahí lees el registro de estado del VDP estarás limpiando el bit de interrupción, con lo que al volver a la BIOS ésta se creerá que no es una interrupción de VBLANK y volverá tras restaurar los registros. Échale un vistazo al código que puse en snippets.
En línea
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!