Páginas

15 junio 2016

Sprites MSX · Desaparece por la izquierda (Early Clock)

En un post anterior comenté como ocultar un sprite o grupo de sprites (ocúltate en la 208), pero en esta ocasión vamos a tratar el como hacer desaparecer un sprite por los bordes laterales de la pantalla.

Si mostramos un sprite en la posición 0,0 se situaría en la esquina superior izquierda de la pantalla y si lo movemos hacia la derecha llegaría un momento en el que empezaría a desaparecer por el borde derecho de la pantalla. Esta posición empieza en la coordenada 241 y va hasta la 255, pero en esta última posición no se acaba de ocultar todo el sprite ya que se mostraría la primera linea, por lo que el siguiente paso seria sacarlo de la pantalla, por ejemplo posicionandolo en la coordenada Y = 209.

Pero... ¿como hacemos que desaparezca por el lado izquierdo?

Las figuras móviles (sprites), disponen de un byte para el valor de posicionamiento horizontal, dentro de la tabla de atributos (OAM/Object Atribute Memory), por lo que queda limitado a 256 posiciones, las mismas que el ancho de la pantalla. Para poder desplazar 16 pixels más, necesitaríamos un bit más pero nuestro VDP solo dispone de registros de 8bits. Por suerte el TMS9918 ha solucionado el problema utilizando un bit de otro atributo.

Este bit es el llamado Early Clock y lo tenemos dentro del valor de color del sprite. Como para el color solo es necesario de 4 bits el VDP aprovecha uno de los sobrantes para este menester, en concreto el número 7.

¿Que pasa si ponemos a 1 este bit?
Es muy simple. Desplaza 32 pixels a la izquierda la posición que tengamos marcada en la coordenada X. Eso quiere decir, que si tenemos el sprite en la posición 0, al activar el bit de Early Clock (EC) desaparecerá completamente de la pantalla ya que se encontrará oculto en la coordenada -32 de la pantalla. Para que nuestra figura desaparezca como es debido tendremos que controlar la coordenada X, por lo que si nuestro sprite queremos situarlo en la posición -1, le tendremos que dar el valor 31.

Una forma de ilustrar como se programaría, en Basic seria de la siguiente manera:
vramaddr = tablaOAM+(planosprite*4)
VPOKE vramaddr+3 , 128+color
VPOKE vramaddr+1 , 24:REM coordenada X=-8
La dirección en la VRAM de la tabla OAM es la misma en screen 1 y 2 y se sitúa en la posición 1B00h.

Ejemplo:
10 SCREEN 1,2
20 FOR i=14336 TO 14367:VPOKE i,255:NEXT
30 PUT SPRITE 0,(0,88),7,0
40 PUT SPRITE 1,(24,104),3,0
50 v=BASE(18):REM direccion tabla OAM
60 VPOKE v+3,128+7:REM activa bit EC + color
70 VPOKE v+1,32-8:REM coordenada X
Nota: Una vez ejecutado este ejemplo puedes probar a cambiar la coordenada X escribiendo con VPOKE en la dirección 6913 (equivale al valor de X para el plano de sprite 0).


En el ejemplo podemos ver como dos sprites colocados en la misma posición horizontal (el del plano 0 le hemos dado el valor 24 en la línea 70), el de colo cían se muestra en la posición -8, gracias a la activación del bit EC (línea 60).

Si programas en MSX Basic la forma del ejemplo anterior no es necesaria ya que utilizando la instrucción Put Sprite, ya lo hace todo por nosotros. Solo tendrás que introducir el valor negativo de desplazamiento para la coordenada X y ya esta!

Ejemplo:
PUT SPRITE 0,(-8,88),7,0

¿Y en el V9938?
Ya que estamos, vamos a ver como ha evolucionado este concepto en el VDP de los MSX2.

Este video procesador ademas de la OAM, contiene una nueva tabla para los colores de los sprites, que ahora permite asignar un color por linea y como en el TMS9918, aprovecha los bits libres para añadir más funcionalidad. El Early clock también se encuentra en el bit 7 y de igual modo generará un desplazamiento de 32 pixels hacia la izquierda, pero en este caso se tendrá que modificar en los valores de todas las lineas. Personalmente no se me ocurre una idea práctica para querer desplazar diferentes partes de un sprite, pero la posibilidad ahí esta para aquellos que lo necesiten.

En screen 5 y 6, la tabla de colores de los sprites se encuentra en la posición 7400h, mientras que en screen 7 la tenemos en F800h.


Referencias:

14 abril 2016

Mapas de memoria del TMS9918

He creado 4 mapas de memoria correspondientes a los modos de pantalla del TMS9918 en las configuraciones estándar utilizadas en los MSX. En el modo G2 (screen 2), he aprovechado y le he añadido las tablas correspondientes al modo G3 (screen 4) del V9938.

Utilizo colores para identificar los diferentes tipos de datos e indico la dirección en la VRAM y el tamaño de la tabla. 

Tenéis completa libertad sobre ellos. Podéis imprimirlos o publicarlos en vuestros documentos, ya sean impresos o electrónicos. 

Adjunto los documentos en formato SVG por si queréis modificarlos. Para su creación, he utilizado inkscape
  • Modo T1 (screen0) (PNG) (SVG)
  • Modo G1 (screen1) (PNG) (SVG)
  • Modo G2/G3 (screen2 y screen4) (PNG) (SVG)
  • Modo MC (screen3) (PNG) (SVG)

08 julio 2015

Proyectos en verano del 2015

Empezó el verano y estamos atravesando una cadena de olas de calor. En mi caso, me deja bastante chafado con ganas de meterme en una cámara de hibernación programada para despertar en septiembre. Como esto ahora mismo no es posible, intentaremos pasarlo lo mejor posible.

Los que seguís mis proyectos, los he tenido parados por mi contribución en las pasadas Commodore Explora y la 47 RU de MSX de la AAMSX, pero sigo con ellos, aunque sea en los ratos en los que la cafeína me produce su mayor efecto. En los otros me podéis encontrar de veraneo virtual en Los Santos como multivac7 (GTAV online) ;P

Tengo pendiente publicar una primera versión del AmiVJing. La Commodore Explora me motivo bastante para ponerme a programar con el Amiga y quise añadir unos cambios pero los resultados no han sido los esperados. Después de pelearme más de una semana con varios problemas, me he quemado un poco y lo he dejado descansar. Seguramente tendré que echar atrás la versión.

En estos momentos estoy resolviendo funcionalidades del tMSgfX. Aunque sea poquito lo que le dedique al día a la larga formará un mucho. Ahora mismo el editor de mapas esta bastante avanzado. Le he añadido una herramienta de selección de un área que realiza un copy y luego permite plasmarlo como una herramienta de dibujo. También hay la opción para crear un nuevo mapa a partir del área copiada. Otra de las funcionalidades acabadas es la de la ventana de salida a código, además de otras funcionalidades internas.



Iré contando mis avances en este blog o en mi cuenta de twitter: @aorante

Saludos y feliz verano!

06 mayo 2015

MSX devtools >> tMSgfX

El año pasado, después de publicar varias versiones de spriteSX y de MSX tiles devtool, empecé una nueva versión de esta última aplicación a la cual añadí bastante funcionalidad. Permitía trabajar (dentro de sus posibilidades), con toda la información que abarca el chip de vídeo del TMS9918, por lo que añadí al control visual que emula este VDP, la visualización de sprites y la representación del modo de texto screen 0 y el modo gráfico 1.

Debería haber publicado una versión, pero me entusiasme añadiendo el editor de sprites (spriteSX), y al final salte directamente a la idea que me rondaba desde hace un año: crear una aplicación completa para la edición gráfica cruzada del TMS9918, a la cual he bautizado como tMSgfX.


Ventana principal de la aplicación


Lo anuncié a principios de este año por twitter y se hizo eco en algunos medios de la escena MSXera, lo cual agradezco, ya que anima a seguir adelante.

Ahora que se encuentra en un estado avanzado de desarrollo, toca anunciarlo en mi blog, el cual tengo bastante abandonado últimamente.

El proyecto ya tiene un editor de tiles y de mapas, bastante avanzados (en otro post entraré en detalles de sus características), a demás del editor de sprites: spriteSX, el cual se ha beneficiado del know how que he adquirido durante este tiempo, con mejoras que se podrán ver en una próxima versión que estará disponible para la 47RU de MSX (mi deadline es el 13 de junio! :P ). Intentaré hacerme un hueco en la zona de desarrolladores de la RU para poder mostrar un prototipo del tMSgfX.


Estado actual del editor de tiles.


Además de lo dicho, quiero añadirle un editor de OAM (Object Atribute Memory), para el posicionamiento de sprites en una pantalla, pensando inicialmente en composiciones gráficas que utilicen sprites. No creo que este para la primera versión del tMSgfX, para no alargarlo mucho en el tiempo.

También informo que el proyecto que estaba bajo el sello de 303bcn, pasa ahora a depender de la asociación gatAtac! Quiero aprovechar la plataforma de gestión de proyectos de esta, para el desarrollo de las MSX devtools y utilizar 303bcn para temas más creativos (VJ, música y demoscene).

Estado actual del editor de Mapas.


Nota: Las imágenes son capturas del estado actual de las aplicaciones. La versión final puede ser muy diferente.

26 agosto 2014

spriteSX devtool v0.9.4b


En estos días de verano, a pensar del aletargamiento por el calor, he sacado algunas horas para hacer algo de provecho y ha salido esta versión del spriteSX con algunas herramientas que creo interesantes para los que dibujéis figuras móviles para el TMS9918 y V9938.

Ahora dispone de herramientas tipo Paint, para hacer líneas, rectángulos, circunferencias y rellenado. Todas pueden actuar en positivo o negativo según el botón del ratón que pulsemos y los rectángulos y circunferencias pueden ser con o sin relleno. En una versión próxima quiero sustituir la herramienta de circunferencia por elipses.

Quizás estas herramientas no sean muy interesantes, sobretodo en el caso de una figura de solo 8x8, pero nadie me negará que la siguiente funcionalidad es de lo más útil. Para que podáis echar atrás algún paso que no os guste como os ha quedado, le he añadido un Undo/Redo de 16 pasos.

Otra funcionalidad que he añadido, son atajos de teclado, para los que prefiráis esta forma de acceder a las funcionalidades de la aplicación.

También he corregido un par de bugs y le he añadido ejemplos en ensamblador.

Aprovecho para agradecer la ayuda de Fubu y JamQue, que en una merienda de colas y sandwiches de nocilla, me echaron una mano en el desarrollo de dos de las herramientas de esta versión. :)

  • Podéis descargarlo en la WEB del proyecto spriteSX devtool.
  • Tenéis más información de la versión en el Readme.

05 julio 2014

MSX tiles devtool v0.9b


Hoy toca publicar la primera versión del MSX tiles devtool. Se trata de una aplicación para trabajar con imágenes en el modo gráfico 2 del VDP TMS9918 y obtener un volcado a diferentes formatos de código (Ensamblador, C o Basic).

Esta herramienta nació hace unos años para convertir los proyectos del nMSXtiles de Pentacour a C, además de la necesidad de algunas herramientas para poder desarrollar el software PSGed.

Además de la entrada de proyectos del nMSXtiles dispone de un formato propio, y de formatos gráficos como el SC2 (Binario del MSX Basic) y bitmap GIF/PNG.

Incluye algunas herramientas como un optimizador de los datos para mejorar la compresión y otras para cambiar colores o tiles. La salida a código podremos hacerla con compresión RLE o RLE WB (comentado en este blog).

También disponemos de un editor de la paleta del V9938 o superiores. Además disponemos de un visor donde podremos ver el mapa o los tres bancos de tilesets de nuestra imagen.

Podéis descargarlo en la WEB del proyecto MSX tiles devtool.

04 julio 2014

spriteSX devtool v0.9.3b


Acabo de publicar una versión del SpriteSX con nueva funcionalidad que espero que os sea útil.

El primer cambio lo encontraremos en el nombre: pasa de spriteSX ED a spriteSX devtool, para englobarlo dentro de la serie de aplicaciones que estoy creando pensadas para el desarrollo cruzado para MSX, aunque también útil para otras plataformas que utilicen el mismo hardware.

Dentro de los cambios de funcionalidad, le he añadido gestión de datos de proyecto, para poder organizarnos mejor. Disponemos de una ventana donde podremos indicar: nombre, autor, grupo y descripción, y desde donde también sabremos la fecha de inicio y de última modificación.

Posiblemente lo más interesante sea la ventana para cargar o guardar un bitmap o binario SC2 (MSX Basic), que entre otras cosas, nos permitirá editar los sprites desde una aplicación gráfica y generar nuestros sprites a código con spriteSX.

Internamente he añadido un gestor de los directorios de los diferentes formatos de archivo, pensado para facilitar el acceso a estos.

Aun queda mucho que hacer, pero poco a poco lo vamos a ir mejorando.

Podéis descargarlo en la WEB del proyecto spriteSX devtool.