Busco imagen con atributos numerados

Avatar de Usuario
elfoscuro
Mensajes: 1267
Registrado: 01 Jun 2012 20:46
Agradecimiento recibido: 26 veces
Contactar:

Re: Busco imagen con atributos numerados

Mensajepor elfoscuro » 13 Sep 2017 08:25

Último mensaje de la página anterior:

Vale... es que yo de pantalla MSX ni papa, pero si que me parece recordar que hay varios modos de pantalla, y el de "modo pixel" existe también. Busca info por ahí, por si es el problema.

Por otro lado, si que me gustaría recordarte lo "peculiar" de la memoria de video del spectrum:

- La pantalla está dividida en tres bloques para los pixels, y una adicional para el color.
- Cada tercio de pantalla se dibuja poniendo scan por scan a pixel por cada caracter. Primero 32 bytes para la primera fila de pixels y así con todos los del tercio, luego 32 para la segunda fila... No es un bloque de 6144 bytes para toda la memoria seguida (tipo BMP, PNG... ), es mucho más rara. Imagino que en MSX será más tipo BMP, PNG, es decir, cada pixel en órden.
- Sin embargo, los atributos, que van por otro lado, si van en órden de la pantalla, empezando por 0,0 y acabando por 32,24. Los atributos van en "modo carácter" de 8x8 pixels.

Te quiero decir con esto que no vale con descomprimir tal cual, si no que hay que ir pegando saltos en la RAM como un loco. Esos saltos los pega el Spectrum solito, sin nada más, pero el MSX imagino que espera la información ordenada. De ahí el descontrol (imagino, claro, sin ver lo que hace tu código fuente, sólo puedo apostar ;-) ).

Un saludo.

Avatar de Usuario
overCLK
Mensajes: 167
Registrado: 26 Ene 2017 12:26
Agradecido : 39 veces
Agradecimiento recibido: 52 veces

Re: Busco imagen con atributos numerados

Mensajepor overCLK » 13 Sep 2017 09:02

Mi opinión es que no puedes asumir que la pantalla que intentas comprimir está en modo "bitmap", es decir, que las tablas de offsets contienen (0, 1, ..., 255) como sucede cuando cambias a SCREEN 2 desde BASIC. Parece razonable que para ahorrar transferencia de bytes a la pantalla se optimice organizándola a modo de tiles y repitiendo las referencias a aquellas que también repiten en la pantalla. Eso podría explicar que te encuentres basura en algunas posiciones.

Sobre el tema de los colores, ten en cuenta que la tabla de offsets (o Name Table en el argot de Texas Instruments) también referencia los atributos a utilizar en el tile en cuestión. Esto parece estar también mal en la pantalla descomprimida. Si no tienes bien esta referencia, muchas veces obtendrás colores incorrectos o incluso nada en pantalla (si todos los atributos están a cero, por ejemplo). Por ejemplo: si en la posición 1800H tienes un 3, significa que el bitmap para el primer tile de 8x8 se coge de la posición de VRAM 0000H + (18H, ... 1FH), pero que los colores para cada una de las líneas de ese tile se cogen de los bytes en 2000H + (18H, ... 1FH) para cada una de las 8 líneas del tile (ya que en este modo, cada sprite de 8x8 puede tener dos colores por línea y cada color se codifica con 4 bits), y esto asumiendo que las tablas estén en sus ubicaciones por defecto, como explico a continuación.

Por último, y aunque quizá no sea el caso, ten en cuenta que las posiciones de la tabla de offsets (Name Table), de bitmaps (Pattern Generator Table) y de color (Color Table) no tienen posiciones fijas en el TMS9918. En cada modo gráfico y hasta cierto punto, se pueden modificar con los registros de configuración. Podría suceder que el juego cambie el valor de estos registros y las diferentes tablas no estén donde esperas.

Incluso hay modos "especiales" o no documentados que utilizan de una forma especial las diferentes tablas, un poco a caballo entre mode1 y mode2, que algún juego podría haber utilizado, vete a saber por qué. -507

Este documento explica bastante bien y de manera compacta todas estas peculiaridades y más. También tienes el documento oficial de Texas Instruments del TMS9918A/TMS9928A/TMS9929A aquí

Creo que la idea es conocer todas las posibilidades y no dar nada por sentado. Yo empezaría por ver el valor de los registros en el VDP cuando carga la pantalla que quieres comprimir y a partir de eso sacar conclusiones de donde están colocadas las diferentes tablas.

Ánimo con ello y ya nos contarás. -thumbup
Imagen

BlackHole
Mensajes: 674
Registrado: 03 Ago 2011 23:07
Agradecimiento recibido: 30 veces

Re: Busco imagen con atributos numerados

Mensajepor BlackHole » 13 Sep 2017 14:40

overCLK: Gracias por tu respuesta. Conozco el documento. Estoy trabajando para MSX1 y SCREEN 2, con lo que la mitad de lo descrito no me es necesario ahora mismo. Lo primero que hago es cambiar a SCREEN 2 con una llamada a la rutina INIGRP que se supone que es la oficial. Después cargo la pantalla en RAM y pokeo en la memoria VRAM (vía puertos 98 y 99) desde 0000h a 17FFh los valores correctos que formarían el bitmap según la norma MSX (que se parece más a C64 que a Spectrum, esto ya lo tengo en mente). Antes de mi rutina, la tabla de offsets tiene los valores esperados desde 00 a FF. Acabo de grabar desde el debugger la VRAM completa y los resultados no tienen sentido alguno. El problema es que una vez que paso mi rutina, me encuentro con esto:

volcado_hexa.png
volcado_hexa.png (25.02 KiB) Visto 197 veces
Es decir, cada 64 bytes aparecen cambiados los valores. También hay un montón de ceros al final de la tabla de colores entre 2000h y 3800h, que corresponderían a esa parte negra que se ve en la imagen. Conscientemente no lo he hecho, pero está claro que mi rutina es la que está mal. Sigo mirando...

Avatar de Usuario
overCLK
Mensajes: 167
Registrado: 26 Ene 2017 12:26
Agradecido : 39 veces
Agradecimiento recibido: 52 veces

Re: Busco imagen con atributos numerados

Mensajepor overCLK » 13 Sep 2017 15:05

BlackHole escribió:Es decir, cada 64 bytes aparecen cambiados los valores. También hay un montón de ceros al final de la tabla de colores entre 2000h y 3800h, que corresponderían a esa parte negra que se ve en la imagen. Conscientemente no lo he hecho, pero está claro que mi rutina es la que está mal. Sigo mirando...


¿Has validado la rutina con la que escribes en la VRAM con una pantalla de referencia, que sepas que está bien?
A ver si va a ser un problema con eso. Puedes ponerla aquí y le echamos un vistazo.
Imagen

jltursan
Mensajes: 1852
Registrado: 20 Sep 2011 13:59
Agradecido : 45 veces
Agradecimiento recibido: 137 veces

Re: Busco imagen con atributos numerados

Mensajepor jltursan » 13 Sep 2017 15:29

La rutina de INIGRP es correcta, debería dejar SC2 ordenado y limpio. ¿Puedes replantear tu rutina de escritura para que en vez de acceder a la VRAM mediante OUTs lo hagas a través de WRTVRM (&H4D)?

BlackHole
Mensajes: 674
Registrado: 03 Ago 2011 23:07
Agradecimiento recibido: 30 veces

Re: Busco imagen con atributos numerados

Mensajepor BlackHole » 18 Sep 2017 03:47

Buenas. Por problemas de salud no he podido hacer pruebas hasta ahora. Ya he dado con el problema en mi código de MSX.

Resulta que anteriormente a enviar los datos a la VRAM, desactivo la pantalla para que no se vea cómo se dibujaba y quedase "feo".

Pues bien, para desactivarla escribía 00h en el registro R1 del VDP, cuando lo que debo hacer es escribir A0h. Creía que resetear todos los bits no iba a tener tantas consecuencias, porque las interrupciones estaban deshabilitadas, pero los efectos han sido caóticos. Lo difícil ha sido darme cuenta hasta que he debugeado todo paso a paso hasta límites absurdos.

jltursan: Para seguir tu consejo, hubiese tenido que reescribir todo el código, porque esa rutina WRTVRM modifica un solo byte cuya dirección debo pasársela en HL, mientras que usando OUTs aprovecho a que el puntero se autoincrementa al escribir y solo necesito fijar la dirección de inicio. Menos mal que no me tomé la molestia e investigué por otro lado.

Avatar de Usuario
overCLK
Mensajes: 167
Registrado: 26 Ene 2017 12:26
Agradecido : 39 veces
Agradecimiento recibido: 52 veces

Re: Busco imagen con atributos numerados

Mensajepor overCLK » 18 Sep 2017 08:36

BlackHole escribió:Buenas. Por problemas de salud no he podido hacer pruebas hasta ahora. Ya he dado con el problema en mi código de MSX.

Resulta que anteriormente a enviar los datos a la VRAM, desactivo la pantalla para que no se vea cómo se dibujaba y quedase "feo".

Pues bien, para desactivarla escribía 00h en el registro R1 del VDP, cuando lo que debo hacer es escribir A0h. Creía que resetear todos los bits no iba a tener tantas consecuencias, porque las interrupciones estaban deshabilitadas, pero los efectos han sido caóticos. Lo difícil ha sido darme cuenta hasta que he debugeado todo paso a paso hasta límites absurdos.

jltursan: Para seguir tu consejo, hubiese tenido que reescribir todo el código, porque esa rutina WRTVRM modifica un solo byte cuya dirección debo pasársela en HL, mientras que usando OUTs aprovecho a que el puntero se autoincrementa al escribir y solo necesito fijar la dirección de inicio. Menos mal que no me tomé la molestia e investigué por otro lado.


Me alegro de que estés mejor y de que hayas dado con el problema.
Sólo ten en cuenta que hay rutinas de la BIOS pensadas para copiar bloques, como LDIRMV, que se aprovecha de ese autoincremento que dices:

Código: Seleccionar todo

LDIRMV

Address  : #0059
Function : Block transfer to memory from VRAM
Input    : BC - blocklength
           DE - Start address of memory
           HL - Start address of VRAM
Registers: All
Imagen

BlackHole
Mensajes: 674
Registrado: 03 Ago 2011 23:07
Agradecimiento recibido: 30 veces

Re: Busco imagen con atributos numerados

Mensajepor BlackHole » 19 Sep 2017 07:25

Tanto como mejor. Lo hago en los ratos libres cuando no me estoy muriendo.

Lo "malo" de LDIRMV es que necesita un buffer adicional de 6144 bytes que son los que tengo que enviar al bitmap de la VRAM. En Spectrum no me queda más remedio, pues la posición de la pantalla es única y toma la memoria principal de la máquina. En Amstrad es mucho peor porque la pantalla son 16000 bytes, pero bueno, en ambos casos al ser una pantalla de carga siempre hay un hueco porque el juego todavía no se ha cargado. En MSX como tiene memoria de vídeo aparte, quería aprovechar que no necesito usar un buffer para hacer el descodificado a RAM y mover después el bloque: puedo descodificar directamente a VRAM sin problemas.

Como dije más arriba hace unos días, uso el programa que creé hace 10 años para codificar la imagen en varios patrones (jltursan se acordará que lo comenté en su día en casa de cpcmaniaco). A la hora de comprimir ahorro un huevo. Por ejemplo, la pantalla en su estado original ocupa comprimida 3898 bytes, mientras que simplemente por darle la vuelta se queda en 3408 bytes, casi 500 menos. El patrón usado con esta pantalla, crea un bitmap de 32 columnas de 192 pixels y para regenerar el formato de MSX uso la siguiente rutina:

Código: Seleccionar todo

decode_scr:  LD B,24
loop_1:      PUSH BC
             LD B,32
loop_2:      PUSH BC
             LD B,8
loop_3:      LD A,(HL)
             OUT ($98),A
             INC HL
             DJNZ loop_3
             LD BC,$00B8
             ADD HL,BC
             POP BC
             DJNZ loop_2
             LD BC,$E808
             ADD HL,BC
             POP BC
             DJNZ loop_1
Obviamente, los 28 bytes de la rutina compensan con creces el jaleo... ahora me queda hacer otra para convertir al vuelo los colores de los atributos de Spectrum.

BlackHole
Mensajes: 674
Registrado: 03 Ago 2011 23:07
Agradecimiento recibido: 30 veces

Re: Busco imagen con atributos numerados

Mensajepor BlackHole » 22 Sep 2017 15:15

Bueno, este es el resultado final. Sale la pantalla que debería haber salido en el principio, con la paleta de Spectrum transformada en la de MSX 1:

tlm_msx.png
tlm_msx.png (6.32 KiB) Visto 82 veces

Al final, como la rutina de conversión de color al vuelo me ocupaba demasiado espacio, he optado por hacer la conversión de los atributos aparte y cargar los datos desde cinta ya modificados. La pantalla no es para tirar cohetes, pero era lo que había por la época. Al menos esta versión incluye una pantalla mientras que la cinta original tal y como salió en MSX no traía ninguna. Adjunto aquí la versión en formato TSX y la versión en WAV por si queréis comprobarla.

The Last Mission (Turbopacked) [Opera Soft] [MCM] [1988].tsx.gz
The Last Mission - Turbopacked
(25.19 KiB) Descargado 1 vez

BH_TLM.WAV.gz
The Last Mission - Turbopacked - (WAV Version 2:48)
(58.86 KiB) Descargado 2 veces


Volver a “Software Spectrum”

¿Quién está conectado?

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