Aprendiendo a manejar el chip de video V9958

Avatar de Usuario
pser1
Mensajes: 2712
Registrado: 08 Dic 2012 18:34
Agradecido : 561 veces
Agradecimiento recibido: 687 veces

Aprendiendo a manejar el chip de video V9958

Mensajepor pser1 » 12 Feb 2020 19:23

Buenas tardes,
ahora que ya controlamos el modo gráfico 7 (256x212 a 256 colores) y podemos aplicar comandos ...
Estamos intentando hacer pruebas con el modo gráfico 6 (512x212 a 16 colores)
El problema es que definiendo los 16 colores de la paleta empezando desde palette register #0 hasta el #15
con números que van desde el 000-000-000 para #0 hasta el 111-111-111 para el #15
Cuando se asignan códigos de color a la memoria, aparecen todos los colres excepto el primero que en mi caso
es el color negro. En su lugar me pinta el color definido como color para el borde de pantalla en el R#7
¿Alguien me podría indicar como aprovechar *todos* los 16 colores sin perder ninguno?
muchas gracias!
saludos
pere

jltursan
Mensajes: 2759
Registrado: 20 Sep 2011 13:59
Agradecido : 201 veces
Agradecimiento recibido: 592 veces

Re: Aprendiendo a manejar el chip de video V9958

Mensajepor jltursan » 12 Feb 2020 19:28

Con el bit TP del registro de control 8 a 1 podrás redefinir el color 0 con uno de paleta en lugar de que sea transparente.

Avatar de Usuario
pser1
Mensajes: 2712
Registrado: 08 Dic 2012 18:34
Agradecido : 561 veces
Agradecimiento recibido: 687 veces

Re: Aprendiendo a manejar el chip de video V9958

Mensajepor pser1 » 12 Feb 2020 19:48

Muchas gracias!!!!
De momento me había definido el color de borde como '0' de forma que ya podía emplear los 16 colores pero a costa de
no poder variar el color del borde de pantalla, no siempre algo tan grave ...
saludos

Avatar de Usuario
pser1
Mensajes: 2712
Registrado: 08 Dic 2012 18:34
Agradecido : 561 veces
Agradecimiento recibido: 687 veces

Re: Aprendiendo a manejar el chip de video V9958

Mensajepor pser1 » 19 Feb 2020 22:49

Otro problema/duda.
Estoy intentando mezclar dos imágenes, mostrándolas alternativamente cambiando a cada retrazado vertical,
lo que equivale a 25/30 fps según se haga en PAL/NTSC. Estoy usando modo Gráfico 6 (512x192 a 16 colores)
Estoy aplicando el método de habilitar en el V9958 la interrupción de retrazado vertical, poniendo a 1 el bit5 de R#1 (IE0)
He creado una rutina de servicio a la interrupción NMI que es la que recibe Dragón desde el puerto de cartuchos y esta rutina se limita a
ir cambiando de página cada vez que es llamada.
El cambio lo hace enviando $1f o bien $3f al R#2 (haciendo que A16 sea 0 bien 1)
Además está enviando $00 ó $04 al R#14 seguido de $00,$40 (dirección $00000 ó $10000)
También envía $00 al R#9 para asegurar que no haya entrelazado.
Al principio lee el S#0 para borrar el flag de interrupción.
A pesar de todas estas precauciones, en pantalla se superponen las dos imágenes (barras verticales y barras horizontales)
formando rectángulos que deberían ser la mezcla de los colores de cada página, pero resulta que los muestra entrelazados,
una línea de cada una de las imágenes, doblando la resolución vertical. ¿Cómo le he pedido ésto?
Para probar, he añadido un contador en dicha rutina para que solo cambie de página cada 2 interrupciones y de esta manera
los colores NO se entrelazan sinó que se mezclan netamente, pero debido a la baja velocidad (12,5/15 fps) se nota parapadeo :-(

Agradeceré si alguien me pudiera orientar para conseguir que no apareciera el maldito entrelazado
muchas gracias anticipadamente
pere

Avatar de Usuario
ron
Mensajes: 18687
Registrado: 28 Oct 2010 14:20
Ubicación: retrocrypta
Agradecido : 1793 veces
Agradecimiento recibido: 1545 veces

Re: Aprendiendo a manejar el chip de video V9958

Mensajepor ron » 20 Feb 2020 20:44

Buenas, Pser !!
A ver si este Technical Data Book te ayuda, http://map.grauw.nl/resources/video/yamaha_v9958.pdf

Y referencias al entrelazado: https://www.msx.org/wiki/Yamaha_V9958

Avatar de Usuario
pser1
Mensajes: 2712
Registrado: 08 Dic 2012 18:34
Agradecido : 561 veces
Agradecimiento recibido: 687 veces

Re: Aprendiendo a manejar el chip de video V9958

Mensajepor pser1 » 20 Feb 2020 21:36

muchas gracias, Rodrigo.
Tengo ambos y un buen puñado de links a páginas especializadas, pero me temo que mi duda/problema es muy concreto
y solo afectará a quien quiera hacer un programa para cargar fotos en dos imágenes para después 'mezclarlas' de forma que
si cada una tiene una paleta de 16 colores distintos, se podrían llegar a obtener 256 colores en G6 ...
No tiene aplicación alguna en juegos, así que me temo que pocos van a poder echarme un cable :-(
saludos
pere

Avatar de Usuario
pser1
Mensajes: 2712
Registrado: 08 Dic 2012 18:34
Agradecido : 561 veces
Agradecimiento recibido: 687 veces

Re: Aprendiendo a manejar el chip de video V9958

Mensajepor pser1 » 21 Feb 2020 09:27

jltursan escribió:Con el bit TP del registro de control 8 a 1 podrás redefinir el color 0 con uno de paleta en lugar de que sea transparente.

Hola José Luis,
Esto me ha funcionado bien para el modo G6 que emplea la paleta de 16 posiciones para definir los colores a utilizar, pero
al entrar en el modo Texto1 que también usa colores, me encuentro que el color en la paleta[0] es transparente por mas que
cambie el bit TP en R#8.
En este modo T1 no se puede cambiar el color de margen, que siempre hereda el color definido como fondo en R#7
No sé si existe algún truco que permita usar los 16 colores como en el modo G6, o tal vez estoy olvidando hacer algún otro
cambio en la configuración ...
Cualquier ayuda será bien recibida!
pere

Avatar de Usuario
pser1
Mensajes: 2712
Registrado: 08 Dic 2012 18:34
Agradecido : 561 veces
Agradecimiento recibido: 687 veces

Re: Aprendiendo a manejar el chip de video V9958

Mensajepor pser1 » 21 Feb 2020 09:30

por cierto, ¿Hay ficheros 'compartidos por ahí que contengan fuentes de caracteres 'libres' para ser utilizados?
De momento estoy empleando los de Spectrum que utilicé para mi conversión del Hobbit, pero solamente
hay 96 mientras que el V98x8 permite hasta 256 ...
Gracias anticipadamente por cualquier link o fichero subido ;-)
saludos
pere

jltursan
Mensajes: 2759
Registrado: 20 Sep 2011 13:59
Agradecido : 201 veces
Agradecimiento recibido: 592 veces

Re: Aprendiendo a manejar el chip de video V9958

Mensajepor jltursan » 21 Feb 2020 20:24

Madre mía, te estás metiendo hasta las trancas -grin

Ando falto de tiempo; pero por aclarar el tema inicial. Lo que quieres es intercambiar en el vblank las páginas de video para dar la impresión de que en vez de 16 colores hay más (que no 256, menos de la mitad de esa cantidad ¿106?, no me acuerdo). ¿Dominas el cambio de página?, te lo digo porque si eso funciona, obviamente el problema lo tenéis en la detección del vblank, que en el caso de los MSX es "casi" trivial dado que genera una interrupción igada al IM1 del procesador.

Luego amplío...

Avatar de Usuario
pser1
Mensajes: 2712
Registrado: 08 Dic 2012 18:34
Agradecido : 561 veces
Agradecimiento recibido: 687 veces

Re: Aprendiendo a manejar el chip de video V9958

Mensajepor pser1 » 22 Feb 2020 14:50

Hola José Luis,
arremangarse y sufrir. Es la forma de aprender, me guste o no ;-)
Veamos, efectivamente ya que el modo G6 dispone de 16 colores, usando dos imágenes y alternándolas a 60fps
resulta en una imagen fija que se repite a 30fps. El tema colores, al no haber interacción (artefactos) efectivamente
se reducirá a la mitad, como máximo: 16x16/2 = 128 que no estaría mal con la resolución de 512x212
La detección del VBlank la hago pasando IEO a 1 en el R#1 y funciona porqué incluyendo un contador para que el cambio de
página (imágen) se produzca cada 'n' interrupciones hace que se vea el parpadeo, pero curiosamente los colores se mezclan bien
y no se aprecia el entrelazado de las dos imágenes.
Parece como si el chip reconociera que está cambiando a 60fps y entonces aplica su 'algoritmo' interno que utiliza alternadamente
una linea de cada imagen para aumentar la definición vertical al doble (424), creo que hay un apartado para este efecto en la doc en línea.
Si no se puede solucionar, se me ocurre utilizar esta función para cargar una imágen que se habrá preparado en el PC duplicando
la definición verticalmente y creando dos ficheros, el de lineas impares y el de pares, que serán mostrados entrelazados y por tanto
recuperando el formato original (3:4 -> 512x212), pero esto son elucubraciones mías ...
saludos
pere

jltursan
Mensajes: 2759
Registrado: 20 Sep 2011 13:59
Agradecido : 201 veces
Agradecimiento recibido: 592 veces

Re: Aprendiendo a manejar el chip de video V9958

Mensajepor jltursan » 23 Feb 2020 10:28

La detección del VBlank la hago pasando IEO a 1 en el R#1 y funciona porqué incluyendo un contador para que el cambio de
página (imágen) se produzca cada 'n' interrupciones hace que se vea el parpadeo, pero curiosamente los colores se mezclan bien
y no se aprecia el entrelazado de las dos imágenes.


Y es correcto, con esa inicialización, cada vez que se produzca un vblank se pondrá a 1 el bit 6 de S#2. Consultando continuamente el estado de ese bit podrás controlar cuando comienza el retrazado y en ese preciso instante conmutar las dos únicas páginas del modo con el bit 6 de R#2.
Entiendo que tienes el control absoluto del VDP; en MSX, si se mantienen las interrupciones activas, la BIOS consume el evento de retrazado al ejecutar el ISR y hace que el mecanismo no funcione si no se desactivan la interrupciones durante las consultas. Si sabes que nadie te va a robar el estado, puedes liarte a consultar y esperar tal cual.

Avatar de Usuario
pser1
Mensajes: 2712
Registrado: 08 Dic 2012 18:34
Agradecido : 561 veces
Agradecimiento recibido: 687 veces

Re: Aprendiendo a manejar el chip de video V9958

Mensajepor pser1 » 23 Feb 2020 11:05

Hola José Luis,
gracias por confirmarme que el método de habilitar la interrupción de retrazado vertical es correcta.
En Dragón, lo que hago para evitar estar verificando continuamente si hay interrupción o no, es modificar la dirección
de la rutina de servicio pare el NMI (not maskable interrupt) ya que los cartuchos de Dragon al generar un IRQ lo envían, por diseño,
a la entrada NMI de la CPU. Quiero decir que yo me guardo la dirección estándar del sistema y le pongo la dirección de 'mi' rutina
que contiene el contador y hace el cambio de páginas. Al finalizar llama a la rutina del sistema, por si las moscas.
Este método me permite 'olvidarme' de las interrupciones ya que son procesadas justo en el momento en que se producen sin tener
que ir mirando continuamente en bucle o cada 'n' lineas de código que sería un peñazo!
Supongo que en el MSX habrá un método parecido al que he comentado ...
saludos
pere

Pd. Referente a archivos de fuentes de caracteres, ¿Tienes alguna referencia a sitios donde se puedan encontrar?
Estaba pensando en los fuentes de AGD, pero habría que buscar alguno que no estuviera muy 'marraneado' ... es otra opción
que tengo pero exige trabajo. Qué raro, ¿No?

jltursan
Mensajes: 2759
Registrado: 20 Sep 2011 13:59
Agradecido : 201 veces
Agradecimiento recibido: 592 veces

Re: Aprendiendo a manejar el chip de video V9958

Mensajepor jltursan » 23 Feb 2020 17:59

Si te has familiarizado con los archivos .CHR del AGD (que circunstancialmente también son los .CHR del Spectrum tal como los que encuentras aquí: https://damieng.com/typography/zx-origins/), en mi distribución del AGD MSX he incluido un conversor de fuentes C64 a CHR y con eso vas a tener ingentes cantidades de fonts para escoger (mira por ejemplo http://kofler.dot.at/c64/).

En MSX la ISR se encarga efectivamente de "masticar" las interrupciones y dejarlas más comestibles para el programador. Dado que pueden existir muchos tipos de IRQ, la del VDP se detecta de forma especial y así se hacen unas cosas u otras. El precio a pagar es que como decía, la ISR al leer el registro S#0, consume los eventos y por tanto hay que tener muy en cuenta si vamos a querer trabajar codo a codo con la ISR de la BIOS o bien tomar el control absoluto nosotros.
Normalmente, si respetas la BIOS, lo más sencillo es aprovechar que la ISR al detectar una IRQ del VDP (que la envía al comienzo del VBLANK) incrementa un contador que sirve de temporizador del sistema y luego continua con otras cosillas. Si nuestro programa se detiene chequeando ese contador hasta que cambie a un nuevo "frame", estaremos al comienzo del VBLANK. Económico e infalible.

En tu caso, ¿haces alguna lectura de S#0 en tu ISR?, ¿la del VDP es la única interrupción que recibes? si es así, tendrás que tenerlo en cuenta...

Avatar de Usuario
pser1
Mensajes: 2712
Registrado: 08 Dic 2012 18:34
Agradecido : 561 veces
Agradecimiento recibido: 687 veces

Re: Aprendiendo a manejar el chip de video V9958

Mensajepor pser1 » 24 Feb 2020 12:38

Hola José Luis,
muchas gracias por la perfecta explicación que me has dado sobre las interrupciones en MSX.
En mi caso, al estar en un Dragón, las interrupciones del V9958 se reciben via NMI por lo que no interfieren con las
habituales de las PIAS que generan IRQs o incluso FIRQs.
El programa que muestra imágenes deshabilita las interrupciones de las demás fuentes, luego solo recibe las del V9958
La 'nueva' rutina de servicio a la interrupción, la primera cosa que hace es leer el S#0 para desmarcar el flag de interrupción
y por tanto habilitar nuevas interrupciones. La duración del código de la nueva rutina es por supuesto lo mas breve posible.
No tengo que preocuparme de nada ya que el V9958 solicita la interrupción a cada inicio de VBlank y la rutina hace su trabajo
mientras el programa puede estar haciendo otras tareas ...
saludos

Ps voy a descargarme tu conversor y algunas fuentes solo para hacer pruebas. Usando las del Hobbit (Spectrum) me sirve por ahora.

jltursan
Mensajes: 2759
Registrado: 20 Sep 2011 13:59
Agradecido : 201 veces
Agradecimiento recibido: 592 veces

Re: Aprendiendo a manejar el chip de video V9958

Mensajepor jltursan » 24 Feb 2020 19:09

Pues todo lo que cuentas parece correcto. Yo empezaría revisando la inicialización del modo G6 (de la que ya hablamos de los registro implicados) y el cambio de página fuera de la interrupción, por ejemplo cada vez que pulses una tecla. Si puedes visualizar una imagen correctamente y luego cambiar a otra página para ver la otra, enganchar eso a la interrupción exclusiva que has hecho parece trivial...

¡Ánimo!

Avatar de Usuario
pser1
Mensajes: 2712
Registrado: 08 Dic 2012 18:34
Agradecido : 561 veces
Agradecimiento recibido: 687 veces

Re: Aprendiendo a manejar el chip de video V9958

Mensajepor pser1 » 24 Feb 2020 19:53

jltursan escribió:Pues todo lo que cuentas parece correcto. Yo empezaría revisando la inicialización del modo G6 (de la que ya hablamos de los registro implicados) y el cambio de página fuera de la interrupción, por ejemplo cada vez que pulses una tecla. Si puedes visualizar una imagen correctamente y luego cambiar a otra página para ver la otra, enganchar eso a la interrupción exclusiva que has hecho parece trivial...
¡Ánimo!

Veamos, mi programa carga una imagen en la página 0 que se ve en pantalla, luego carga otra imagen en la pagina 1 y al
mismo tiempo se ve en pantalla. Si pongo un contador y cambio cada 120 interrupciones, por decir algo, se ven las pantallas alternadas
y de forma correcta, cambiando cada dos segundos.
Mirando la doc del V9938 yo creo que el modo automático de alternado a 60fps *dobla* la resolución vertical y para ello alterna una linea
de cada imagen. Me temo que es así aunque a mi no me guste/interese :-(
saludos
pere

Pd Si se te ocurre alguna otra prueba o configuración distinta ... la probaré en cuanto me sea posible!


Volver a “Software MSX”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado