Karoshi MSX Community
06 de Julio de 2021, 12:50:49 am *
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: Sobre VBLANK  (Leído 6888 veces)
0 Usuarios y 1 Visitante están viendo este tema.
pentacour
Karoshi Lover
***
Mensajes: 177


mgalious@hotmail.com
WWW Email
« : 04 de Febrero de 2011, 03:03:52 pm »

Buenas!
Estaba leyendo en otro hilo el tema de los frames por segundo y me he preguntado ¿cómo puedo saber yo a los fps que va lo que estoy haciendo? Esto me ha llevado a las interrupciones, al VBLANK, etc.

De lo poco que he hecho en MSX, he vivido muy bien con solo saber que con un HALT sincronizo mi juego. Miro cosas, hago cálculos y preparo lo que quiero escribir a pantalla. Me espero pacientemente con un HALT y mediante la BIOS envío datos a VRAM y vuelvo a empezar.

Pero, si los cálculos son muchos, seguramente entre mis HALT's hayan más interrupciones. Entonces he pensado: pues en vez de con HALTS (que he leído a jltursan -que por cierto, ¿qué fue de él? daba gusto leerle- que es más "sucio" a parte de que si se mete un dispositivo externo que envíe interrupciones ya no es tan simple) hago mi rutina de servicio de interrupción. Vale, y eso me ha llevado al concepto de VBLANK, que salta en la línea 192 (MSX2) o 193 (MSX1), que si tengo tiempo a enviar según el caso unos 800 bytes y luego esperar 28 ciclos entre cada uno para que no se corrompa... Y digo yo, ¿cómo he vivido hasta ahora sin saber nada de esto?

Tengo tal batiburrillo que intentaré poner preguntas concretas:

- ¿Cuál es la definición de VBLANK y por qué es tan importante?
- Si envío datos a VRAM por BIOS me da un poco igual,¿no? (Aunque sospecho que el timing del juego lo dominaré mejor conociendo ésto)

Y no pongo más preguntas porque quizás si entiendo el concepto de VBLANK pueda empezar a atar cabos y encajar el puzzle que ahora tengo en la cabeza.

Saludos y gracias!
En línea
burguera
Visitante
« Respuesta #1 : 04 de Febrero de 2011, 07:50:12 pm »

Buenas!
Estaba leyendo en otro hilo el tema de los frames por segundo y me he preguntado ¿cómo puedo saber yo a los fps que va lo que estoy haciendo? Esto me ha llevado a las interrupciones, al VBLANK, etc.

Si sincronizas con el VBLANK y en cada ciclo eres capaz de actualizar toda la lógica del juego y actualizar pantalla, vas a 60FPS (o 50 según la máquina sea a 50 o 60Hz)... Hmmm... acabo de soltar una perogrullada 8P

Pero, si los cálculos son muchos, seguramente entre mis HALT's hayan más interrupciones.

Mi experiencia (que es más bien poca ;-) me dice que tienes que hacer muchisimos cálculos para pasarte una interrupción. Lo que puede provocartelo, según mi experiencia, más que cálculos o la lógica del juego, son transferencias a saco en RAM, tipo actualizar la pantalla en RAM para un scroll antes de transferir a VRAM. Anyway, sí, puede pasar: te puedes saltar una int.

digo yo, ¿cómo he vivido hasta ahora sin saber nada de esto?

Juas! XDDDD


Tengo tal batiburrillo que intentaré poner preguntas concretas:

- ¿Cuál es la definición de VBLANK y por qué es tan importante?

Pues yo lo definiría como el intervalo de tiempo en que se dibuja el borde inferior de la pantalla, se produce el retrazado vertical del CRT y se dibuja el borde superior.

- Si envío datos a VRAM por BIOS me da un poco igual,¿no? (Aunque sospecho que el timing del juego lo dominaré mejor conociendo ésto)

Sí y no. Durante el VBLANK hay dos aspectos a tener en cuenta:

  • No se pinta nada en pantalla (salvo el color de borde). Por lo tanto, si consigues enviar todos los datos de un frame a VRAM dentro del VBLANK, tienes la garantía de que ese frame se va a visualizar completo. Es decir, si envías datos fuera del VBLANK puede que parte de la pantalla se pinte actualizada y parte sin actualizar (con datos del frame anterior). Seguro que este efecto tiene un nombre.
  • El VDP va más descansado y se le pueden enviar datos más rápidamente. Vamos, que dentro del VBLANK puedes poner OUTI a saco sin problemas. En cambio si mandas datos con OUTIs a saco fuera del VBLANK, se pueden corromper.

Si usas la BIOS, lo segundo no importa: la BIOS ya manda los datos lentamente para asegurarte que todo va bien. Mandes los datos dentro o fuera del VBLANK, la BIOS te los manda bien. Peeero, los manda muy lentamente. Así que si tienes que transferir mucha información, lo mejor es prescindir de la BIOS y asegurarte que lo haces todo dentro del VBLANK.

Eso sí, aunque uses la BIOS, si mandas fuera del VBLANK se puede producir el primer efecto que comentaba.

Y no pongo más preguntas porque quizás si entiendo el concepto de VBLANK pueda empezar a atar cabos y encajar el puzzle que ahora tengo en la cabeza.

Yo también tenía una idea bastante intuitiva del VBLANK cuando hice el Caos. Ahí en cada frame sólo se mandaba a VRAM la tabla de atributos de sprites, y la pantalla cuando se cambiaba. En lo que estoy intentando hacer ahora hay más "berenjenal" y era aprovechar a fondo el VBLANK o abandonar Tongue

Un consejo: si quieres aprovechar el VBLANK, no te fies de los emuladores. Si por lo que fuera te salieras del VBLANK y mandaras datos demasiado rápido al VDP, el emulador se lo tragaría sin problemas pero el MSX real petaría.

Echa un vistazo al hilo "desarrollo compatible". Ahí hay información muy útil. Y en el hilo de "retrazado vertical" (y en algún otro) se comenta el tema de como ver fácilmente si te pasas del VBLANK o no.
En línea
pentacour
Karoshi Lover
***
Mensajes: 177


mgalious@hotmail.com
WWW Email
« Respuesta #2 : 04 de Febrero de 2011, 08:48:46 pm »

Gracias MrSpock! Ahora tengo claro lo que es el VBLANK y el por qué aprovechar ese intervalo de tiempo. Luego me volveré a leer el hilo que abriste sobre el retrazado a ver si ahora lo entiendo mejor y me acaban de encajar las piezas del todo.

Cita de: MrSpock
Yo también tenía una idea bastante intuitiva del VBLANK cuando hice el Caos.
Para ser solo intuitiva le sacaste bastante provecho Wink . Un juegazo, creo que ya te lo comenté en su día.

Ahora salgo a cenar. Espero no quedarme ausente ensimismado encajando piezas porque a ver como lo explico...  Cheesy

Saludos!
En línea
aorante
Karoshi Maniac
****
Mensajes: 451


nuTella Power!


WWW Email
« Respuesta #3 : 08 de Febrero de 2011, 11:28:58 am »

Esta muy interesante el tema. Supongo que es algo que ira surgiendo continuamente en estos foros, a medida que nos vayamos sumando más en la programación...   Smiley
Veo que tenia una idea equivocada de lo que es el Vblank, y me surgen dudas:  Huh
Yo pensaba que la interrupción del VBlank se disparaba cuando el vdp terminaba de dibujar la pantalla.
@MrSpock, a que te refieres con estar dentro o fuera del VBlank?
Estoy buscando una rutina rápida de volcado de ram a vram, para sustituir a la de la bios.
Se ha publicado alguna en los foros?
Saludos!
En línea

--------------------------------- ------ ----- --- -- -
aorante/303bcn
http://aorante.blogspot.com
http://twitter.com/#!/aorante
http://303bcn.wordpress.com/
--------------------------------- ------ ----- --- -- -
burguera
Visitante
« Respuesta #4 : 08 de Febrero de 2011, 12:25:44 pm »

Yo pensaba que la interrupción del VBlank se disparaba cuando el vdp terminaba de dibujar la pantalla.

Y así es, se da cuando se termina de dibujar la parte "útil" de la pantalla y se empieza con bordes y retrazado vertical.

@MrSpock, a que te refieres con estar dentro o fuera del VBlank?

A que el VDP esté dibujando bordes o haciendo el retrazado. En "esos momentos" el VDP está más "receptivo" ;-)
En realidad la idea es simple: si empiezas a mandar datos justo cuando se produce la interrupción, estás mandando dentro del VBLANK. Eso sí, debes cuidar de no mandar demasiados datos o te pasarás del VBLANK. Hay un analisis bastante detallado del tema en el hilo de desarrollo compatible.

Estoy buscando una rutina rápida de volcado de ram a vram, para sustituir a la de la bios.
Se ha publicado alguna en los foros?

Ahora no tengo código a mano, pero es muy simple. Lo que tienes que hacer para mandar datos a VRAM cuando estás en el VBLANK es:

  • Deshabilitar interrupciones
  • Preparar el VDP para escribir a VRAM e indicar la primera dirección de destino. Meter la dirección origen de RAM en HL (creo que es HL)
  • Hacer un OUTI para cada byte a escribir. Eso significa que si quieres transmitir 200 bytes, tienes que escribir 200 OUTIs uno detrás de otro, para no desperdiciar ni un ciclo haciendo un bucle.
  • Habilitar interrupciones

Ten en cuenta que esto sólo es válido dentro del VBLANK. Fuera te va a corromper los gráficos.

Lo de preparar el VDP para escribir en VRAM lo encontrarás descrito en el RedBook.
En línea
SapphiRe_MSX
Visitante
« Respuesta #5 : 08 de Febrero de 2011, 01:07:55 pm »

Vamos a intentar explicarlo de forma sencilla, aunque con algunas reservas que comentaré al final.

Empecemos desde el principio: el VDP es el encargado de dibujar la pantalla, para ésto lo que hace es leer la VRAM a partir de las direcciones que tenga configuradas en sus registros. Mientras el VDP realiza esta tarea, si queremos que haga otra tarea, como escribir en VRAM, el VDP no da para tanto y si le enviamos datos demasiado deprisa, se arma un lío y hace mal su trabajo, lo que se manifiesta con glitches visibles en la pantalla.

El VBLANK (ese gran desconocido) es el periodo que va desde que el VDP termina de dibujar la última línea con gráficos de la pantalla (proceso que, recordemos, implica una lectura contínua de la VRAM) hasta que empieza a dibujar la primera línea con gráficos de la pantalla en el siguiente frame. Durante ese período de tiempo, el VDP no necesita leer la VRAM para crear la pantalla visible, ya que sólo se visualiza el color de fondo (vale, sí, puede cambiar, pero el susodicho color está en un registro del VDP y no hay que leer en VRAM).

Así pues el concepto de "transferencias dentro del VBLANK" se refiere a todas aquellas transferencias a (o desde) VRAM que se realizan dentro del periodo del VBLANK. En este proceso, ya que el VDP no necesita acceder a la VRAM, podemos realizar transferencias al VDP a toda velocidad, sin esperas entre una y otra.

Por el contrario, el concepto de "transferencias fuera del VBLANK" hace referencia a todas aquellas transferencias a (o desde) VRAM que se realizan FUERA del periodo del VBLANK, es decir, mientras el VDP está pintando la pantalla (leyendo, para ello, el contenido de la VRAM). Como el VDP está ya accediendo constantemente a VRAM, es necesario realizar una pausa entre cada dos transferencias. Normalmente un par de NOPs son suficientes, aunque mejor que NOPs, si podéis realizar otros cálculos, aprovecharéis estos ciclos "muertos" para ir adelantando trabajo (ojo, no siempre será posible o fácil de hacer, pero si lo conseguís os sentiréis muy satisfechos).

Esa es, básicamente, la diferencia entre realizar transferencias dentro o fuera del VBLANK.

Las reservas a las que me refería al principio son los sprites. Si pensamos un poco más, si la pantalla utiliza sprites el VDP debe leer al mismo tiempo VARIAS direcciones de VRAM, ya que para saber el color de un pixel deberá leer la tabla de patrones, colores, sprites... vamos, un montón de lecturas. Si mal no recuerdo, si se desactivan los sprites las transferencias se pueden realizar a toda velocidad.

Otra cuestión es que si se desactiva la visualización de la pantalla, se pueden también realizar transferencias a toda pastilla, ya que el VDP sólo necesita pintar el color de fondo.

Así que básicamente esas son las cuestiones que hay que tener en cuenta a la hora de realizar transferencias a VRAM. La BIOS se cura en salud y siempre mete pausas entre una transferencia y otra, ese es el motivo por el cual las transferencias usando la BIOS son lentas.

En cuanto a la rutina rápida de transferencia, luego publico en Snippets la que uso yo.
En línea
pitpan
Karoshi Forum's Guru
*******
Mensajes: 1812


« Respuesta #6 : 08 de Febrero de 2011, 01:39:32 pm »

Para completar la excelente explicación de Sap, sólo queda indicar que si se modifica la VRAM fuera del VBLANK puede suceder que la imagen de ese frame recoja parte del estado anterior a la modificación y parte del estado actualizado. Es decir, que puede haber cambios que se vean en el frame actual y otros que no se verán hasta el próximo frame debido a que la VDP ya los ha "pintado" en su estado anterior dentro de este mismo frame.

Por lo tanto, salvo que estéis muy seguros de lo que hacéis, en vuestros primeros pasos os recomiendo que TODAS las transferencias a VRAM se hagan durante del VBLANK. Y leed concienzudamente el artículo sobre timing de VDP/VRAM de jltursan en el hilo de desarrollo compatible. IMPRESCINDIBLE ENTENDERLO BIEN. Y si no lo entendéis de momento, limitaos a usar la BIOS y ser precavidos.
En línea
burguera
Visitante
« Respuesta #7 : 08 de Febrero de 2011, 01:49:15 pm »

Para completar la excelente explicación de Sap,

Indeed, "peaso" explicación ;-)
Sólo he echado en falta una introducción en plan "Sea V el conjunto de posiciones de la VRAM y R un conjunto de registros. Definimos el VDP como una función f:VxR->VxR tal que bla bla bla" XDD

sólo queda indicar que si se modifica la VRAM fuera del VBLANK puede suceder que la imagen de ese frame recoja parte del estado anterior a la modificación y parte del estado actualizado. Es decir, que puede haber cambios que se vean en el frame actual y otros que no se verán hasta el próximo frame debido a que la VDP ya los ha "pintado" en su estado anterior dentro de este mismo frame.

Exacto, tal y como comenté en mi primer post.

Por lo tanto, salvo que estéis muy seguros de lo que hacéis, en vuestros primeros pasos os recomiendo que TODAS las transferencias a VRAM se hagan durante del VBLANK. Y leed concienzudamente el artículo sobre timing de VDP/VRAM de jltursan en el hilo de desarrollo compatible. IMPRESCINDIBLE ENTENDERLO BIEN. Y si no lo entendéis de momento, limitaos a usar la BIOS y ser precavidos.

Ese hilo es una joya. Lo tengo al lado del RedBook y del listado de instrucciones del Z80.
En línea
pitpan
Karoshi Forum's Guru
*******
Mensajes: 1812


« Respuesta #8 : 08 de Febrero de 2011, 02:12:10 pm »

Casi coincidimos en cuanto a materiales, Mr. Spock. Yo trabajo con el Undocumented Z80 y el Red Book (que tengo también en edición física original, aunque tiro de él en formato electrónico) como referencias, además del gedit, asMSX y openmsx para Linux, que es mi entorno de desarrollo actual.
En línea
SapphiRe_MSX
Visitante
« Respuesta #9 : 08 de Febrero de 2011, 03:36:17 pm »

Sólo he echado en falta una introducción en plan "Sea V el conjunto de posiciones de la VRAM y R un conjunto de registros. Definimos el VDP como una función f:VxR->VxR tal que bla bla bla" XDD

No es tan simple, porque (al menos) el codominio de la función debería multiplicarse por un conjunto P de píxeles que representan la visualización de la pantalla... Sería divertido formalizar el VDP, pero creo que saldría demasiado complejo Tongue
En línea
pitpan
Karoshi Forum's Guru
*******
Mensajes: 1812


« Respuesta #10 : 08 de Febrero de 2011, 04:46:28 pm »

Sólo he echado en falta una introducción en plan "Sea V el conjunto de posiciones de la VRAM y R un conjunto de registros. Definimos el VDP como una función f:VxR->VxR tal que bla bla bla" XDD

No es tan simple, porque (al menos) el codominio de la función debería multiplicarse por un conjunto P de píxeles que representan la visualización de la pantalla... Sería divertido formalizar el VDP, pero creo que saldría demasiado complejo Tongue


... y totalmente inútil. Cheesy
En línea
aorante
Karoshi Maniac
****
Mensajes: 451


nuTella Power!


WWW Email
« Respuesta #11 : 08 de Febrero de 2011, 05:05:06 pm »

Gracias a todos!  Cheesy
aunque me queda un pregunta por hacer:
que tiempo dura el VBlank?
Si no he entendido mal, es el tiempo que dura desde que termina el trazado, marcado por la interrupción, hasta que empieza de nuevo a dibujar la pantalla, no?

y hay más tipos de interrupciones en el MSX?
creo que el z80 tiene varios modos de interrupciones y me pareció leer que los msx con controladora de disco, tenían una interrupción del reloj.
Es eso cierto?
En línea

--------------------------------- ------ ----- --- -- -
aorante/303bcn
http://aorante.blogspot.com
http://twitter.com/#!/aorante
http://303bcn.wordpress.com/
--------------------------------- ------ ----- --- -- -
Mortimer
Karoshi Lover
***
Mensajes: 216


WWW
« Respuesta #12 : 08 de Febrero de 2011, 05:53:37 pm »

Gracias a todos!  Cheesy
aunque me queda un pregunta por hacer:
que tiempo dura el VBlank?
Si no he entendido mal, es el tiempo que dura desde que termina el trazado, marcado por la interrupción, hasta que empieza de nuevo a dibujar la pantalla, no?

y hay más tipos de interrupciones en el MSX?
creo que el z80 tiene varios modos de interrupciones y me pareció leer que los msx con controladora de disco, tenían una interrupción del reloj.
Es eso cierto?

En este hilo se explica con precisión de nanosegundos los timings: http://karoshi.auic.es/index.php?topic=668.0

Después, en el MSX sólo hay un tipo de interrupción, porque la interrupción no enmascarable o NMI que también soporta el Z80 no está soportada por el hardware del MSX, así que sólo nos queda la interrupción enmascara¡ble (Es decir, desabilitable por software), pero lo que sí podemos elegir es tres formas de gestionarla, IM0: No aplicable al MSX, IM1: El modo por defecto y el que se usa habitualmente, y IM2: que funciona pero no al 100%, pero aún así se puede usar de forma limitada si quieres que el servicio de interrupción no esté en la posición por defecto de IM1.

Sí, algunos dispositivos también generan interrupciones, lo que hacen es que también se engachan en el vector para ser atendidas, y una vez que la interrupción es activada se averigua que dispositivo la ha generado para ser atentida.



« Última modificación: 08 de Febrero de 2011, 05:55:19 pm por Mortimer » En línea
SapphiRe_MSX
Visitante
« Respuesta #13 : 08 de Febrero de 2011, 05:55:12 pm »

aunque me queda un pregunta por hacer:
que tiempo dura el VBlank?
Si no he entendido mal, es el tiempo que dura desde que termina el trazado, marcado por la interrupción, hasta que empieza de nuevo a dibujar la pantalla, no?

Correcto.

Citar
y hay más tipos de interrupciones en el MSX?

En un MSX normal y corriente, sin ninguna tarjeta pinchada, las únicas interrupciones son las generadas por el VDP. En los MSX1 los VDP sólo generan las interrupciones de VBLANK, mientras que en los MSX2 o superior, también hay interrupciones por línea (que se aprovechan para los famosos screen split.

Citar
creo que el z80 tiene varios modos de interrupciones

Que sólo controlan la forma en la que el Z80 responde a las interrupciones que lleguen. El problema es que TODAS las interrupciones han de ser controladas por la misma rutina de interrupciones, lo que obliga a discernir el tipo de interrupción y eso es costoso.

Existen tarjetas que generan sus propias interrupciones, el software que las utilice ya deberá tenerlas en cuenta. ¿Un ejemplo sencillo? La Franky/Playsoniq, que produce interrupciones generadas por el VDP de la SMS Tongue
En línea
aorante
Karoshi Maniac
****
Mensajes: 451


nuTella Power!


WWW Email
« Respuesta #14 : 10 de Febrero de 2011, 10:44:27 am »

Gracias de nuevo!   Smiley

ya tengo más claro el tema.

Me interesa el control de interrupciones para temas musicales, ya que la interrupción del VBlank, no permite un buen control del tempo (que yo sepa)...
En línea

--------------------------------- ------ ----- --- -- -
aorante/303bcn
http://aorante.blogspot.com
http://twitter.com/#!/aorante
http://303bcn.wordpress.com/
--------------------------------- ------ ----- --- -- -
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!