Páginas

31 diciembre 2013

MSX 2013 Christmastro (303bcn)

Esta simple Christmastro (Christmas + intro), tiene su historia, que voy a contar de forma resumida.

Empezó en el 2004 cuando comencé a dibujar un Papa Noel en formato MSX SC2 para utilizarlo como felicitación navideña. No pude acabarla y quedo parado hasta el 2008 donde pude terminarla.



En el 2011 quise hacer una intro utilizando la imagen. Le quite la nieve para sustituirla por una animación de sprites y la mejoré un poco. También programé una rutina en assembler de scroll (al pixel), que utilicé posteriormente en las invitros de las RUs. Entre que tenia algunos bugs y me faltaba la música, se me echo el tiempo encima y la tuve que aparcar.

En el 2012 me olvide de ella y este año la retomé después de la RU. Mejoré el código con todo lo aprendido en estos 2 años, y neuroflip aporto su música realizada con el tracker AHX de Amiga, utilizando instrumentos reproducibles en WYZplayer. La pasé utilizando WYZtracker, la añadí al proyecto, desarrollado con SDCC y aquí esta:



Nota: Fuera de las opiniones que tenga cada uno de las ideologías que puedan haber detrás de esta tradición, solo hay el deseo de que podamos hacer una tregua a los problemas de la vida y ser felices con nuestros familiares y amigos.

Merry Christmas · Feliz Navidad · Bon Nadal! :-D

Ficha técnica:

  • MSX 2013 CHRISTMASTRO (303bcn)
  • Programación & gráficos:  mvac7 
  • Música: Snow White Cold by neuroflip
  • Music player: WYZPROPLAYER by Iggy Rock 
  • Fichero: SNOW2013.ROM (MSX ROM 32k)
  • Herramientas de desarrollo: Photoshop Elements 2, SDCC, PSPad, nMSXtiles, AHX, WYZtracker y BlueMSX.

21 octubre 2013

ideas disparatadas

"La principal regla del método es aplazar el juicio, ya que en un principio toda idea es válida y ninguna debe ser rechazada. Habitualmente, en una reunión para la resolución de problemas, muchas ideas tal vez aprovechables mueren precozmente ante una observación "juiciosa" sobre su inutilidad o carácter disparatado. De ese modo se impide que las ideas generen, por analogía, más ideas, y además se inhibe la creatividad de los participantes."

18 junio 2013

amiVJing v0.8b


El sábado 8 de Junio, 303bcn participo en el Festival de Música Electrónica ArteNou(2) con una fantástica sesión de chiptune de neuroflip con AHX, donde utilizamos 3 ordenadores Amiga 1200: 2 para música y uno para las visuales.

A la nueva versión del soft de vjing le he dado un buen empujón. En la anterior (0.7b), incorporé el sistema de multicarga de contenidos, que permite cambiar los gráficos para ajustarlos a la temática de cada canción y  la nueva incorpora el estado inicial para después de la carga (primer plano, fondo y sprites) y la animación de sprites multidireccional (hasta ahora solo tenia una única dirección :P ), entre otras cosas.


Quizás el cambio más importante, es que ha pasado de un dual-playfield de 8+8 colores a uno de 16+16 colores (8 bitplanos), aunque con algunos problemas. El caso es que para poder trabajar en este modo con 7 sprites (para poder usar 8 me encontraba con el mismo problema), el AGA no tiene suficiente potencia y se pierden sprites. Para solucionarlo he tenido que recortar 32 pixels el tamaño horizontal, quedando la pantalla en 288x256 desplazada 32 puntos a la derecha, pero ahora puedo visualizar 8 sprites. Aun con la perdida de resolución, la mejora gráfica es considerable.


A nivel de efectos, he incorporado al primer plano, un FX de distorsión ondulatoria y al fondo dos efectos de ciclo de paleta para crear en las imágenes efecto de animación. Uno afecta a todos los colores menos el primero y el segundo solo afecta al último color.

La sesión musical se componía de 12 canciones, por lo que preparé con ayuda de God/Ozone, los sets gráficos, formado por más de 100 imágenes!! Para agilizar la carga, copie todo a la RAM, pero aun así se pierden unos 4 segundos en el proceso.


Aunque aún le falta disponer de más efectos, incluir diferentes estados para tener más control de la visualización de los contenidos (ya hay una parte implementada) y optimizar el código, en esta última versión he notado que puedo interpretar una sesión más a gusto sin mostrar contenidos repetitivos.

Cuando tenga bien definido el funcionamiento podré pasar a la penúltima fase: el desarrollo de una aplicación de escritorio para generar un proyecto y definir sus contenidos y estados.

Aprovecho para agradecer a Zener y 007, por su ayuda para resolver problemas técnicos y a God por sus ideas y la creación de contenidos.

08 mayo 2013

sprites del V9938 (2 de 2). OR de colores.

Como explicaba en la primera parte, el V9938, permite dibujar un color por cada linea del sprite, pero esto no soluciona mucho el trabajo de los grafistas. Por suerte el chip guarda un As en la manga: la superposición de sprites.

Dentro del valor de cada color, disponemos del bit 6 que indica si esa linea la fusionaremos con el color del plano anterior. Esto nos ofrece 3 colores o más por linea, ya que permite superponer varios sprites como si fueran bitplanos.

Ahora ya podemos representar nuestras figuras móviles con más detalle, pero el sistema tiene dos problemas:
  1. Gastamos 2 o más sprites. Si utilizamos esta medida para todas nuestras figuras, perdemos la ventaja de poder visualizar 8 sprites por linea.
  2. El calculo del color resultante se realiza mediante OR. Esto nos obliga a jugar con colores muy determinados, por lo que limita el uso de los colores y complica la tarea del grafista. 
El primer problema no es algo excesivamente importante. Tendremos que diseñar nuestros juegos adaptados a esta limitación. Si por ejemplo, nuestro juego es un shoot'em up, para los disparos podemos usar solo un sprite. La superposición es un sistema totalmente combinable que podemos utilizar cuando creamos necesario.

El segundo problema, se puede solucionar modificando la paleta con el orden que cuadre con los cálculos de OR que nos interese.

Recomendación: A la hora de diseñar una fase de un juego, es mejor empezar por definir los colores de los sprites y luego los que necesitemos para los gráficos, donde también podremos aprovechar los de los sprites.

A continuación muestro un ejemplo de una de las tablas más útiles, ya que seguramente uno de los colores que más usaremos será el negro (1) . Con esta, dispondremos de acceso a varias combinaciones de tonos de colores:


Nota: En la wiki de la MRC, hay un artículo que analiza muy bien el funcionamiento del color OR, donde se muestran varias tablas y casos de uso de juegos de Konami (The OR Color).


Como funciona?

Para el caso de 3 colores por línea, necesitaremos definir dos sprites que se situarán en planos consecutivos. En el sprite situado en el plano superior, en la información de los colores, el bit de OR, lo pondremos a 0 y en el de plano inferior lo pondremos a 1 (activo). A la hora de dibujar los sprites, los puntos que coincidan en los dos, se mostrarán con el color resultante del OR de los dos colores asignados a la línea de cada sprite.



A la hora de visualizarlos, tendremos que procurar que siempre estén colocados en la misma posición, escribiendo las mismas coordenadas en los atributos de los dos sprites, excepto en Basic como ahora veremos.


Facilidades en Basic

La versión 2 del MSX Basic, proporciona algunas facilidades frente a otros lenguajes (C o ASM), gracias al comando PUT SPRITE, que nos simplificará algunas tareas con relación a la superposición de colores. 

Lo primero que nos encontramos es su parámetro de color, que escribe el valor asignado a las 16 líneas de la tabla de colores de los sprites, situada en la VRAM (h1C00 en screen4). Es una ventaja si vamos a usar solo 3 colores para el diseño de nuestra figura, ya que nos ahorraremos de escribir esos datos para cada plano (16B por sprite).
60 PUT SPRITE 2,(100,130),&H1,2
70 PUT SPRITE 3,(100,130),&H42,3 -- Activamos el bit de OR (h40) y asignamos el color 2.

Obtendremos un sprite con los colores 1, 2 y como extra el 3 (donde se solapen los dos sprites).

La segunda facilidad, es que podemos controlar la posición de los 2 sprites únicamente accediendo al que se encuentra en el plano superior.
100 PUT SPRITE 2,(100,Y(i)+20),&H1,2 -- movemos los planos 2 y 3 (OR) solo cambiando la posición del sprite 0.

Ejemplo (bajar):
10 DEFINT A-Z
12 DIM Y(100)
14 COLOR 15,14,14:SCREEN 4,2
16 RESTORE 10540:GOSUB 1030:rem palette
20 RESTORE 10020:HL=BASE(24):GOSUB 1010:rem patrones sprites
30 RESTORE 11010:FOR I=0 to 99:READ A:Y(I)=A:NEXT
40 PUT SPRITE 0,(180,100),0,0
50 PUT SPRITE 1,(180,100),0,1:rem los colores se asignan a la vram (linea 80)
60 PUT SPRITE 2,(100,130),&H1,2
70 PUT SPRITE 3,(100,130),&H42,3:rem los colores se asignan desde putsprite
80 RESTORE 10350:HL=&H1C00:GOSUB 1010:rem colores sprites
90 FOR I=0 to 99
100 PUT SPRITE 2,(100,Y(i)+20),&H1,2
110 IF INKEY$="" THEN NEXT ELSE END
120 GOTO 90
1000 REM -- LOAD DATA based on the function from Rafael Jannone
1010 READ R$: IF R$="*" THEN RETURN ELSE VPOKE HL,VAL("&H"+R$):HL=HL+1:GOTO 1010
1020 rem Set Palette
1030 FOR C=1 TO 15:READ R,G,B:COLOR=(C,R,G,B):NEXT
1040 RETURN
10000 REM colorOR
10010 REM SPRITE DATA
10020 DATA 07,0F,7F,7F,7F,1F,1F,0F,0F,17,17,1F,07,0F,1F,0F
10030 DATA E0,10,88,88,C8,C8,88,10,E0,B0,B8,B8,F8,B0,F8,F0
10040 DATA 00,07,0F,3F,0D,0D,0F,06,00,0B,0B,03,00,03,03,00
10050 DATA 00,E0,F0,F0,B0,B0,F0,E0,00,C0,D0,D0,00,40,00,00
10060 DATA 07,1F,3F,7F,7F,FF,FF,FF,FF,FF,FF,7F,7F,3F,1F,07
10070 DATA E0,18,C4,E2,E2,F1,F1,F1,F1,F1,F1,E2,E2,C4,18,E0
10080 DATA 00,07,1F,3F,3F,7F,7F,7F,7F,7F,7F,3F,3F,1F,07,00
10090 DATA 00,E0,F8,FC,FC,FE,FE,FE,FE,FE,FE,FC,FC,F8,E0,00
10330 DATA *
10340 REM COLOR MODE2 DATA
10350 DATA 01,01,01,01,01,01,01,01,01,01,01,01,01,01,01,01
10360 DATA 48,48,48,48,4A,4A,4A,4A,4A,42,42,42,42,44,44,44
10500 DATA *
10510 REM MSX2_Palette
10520 REM Red, Green, Blue
10540 DATA 0,0,0
10550 DATA 1,5,1
10560 DATA 3,6,3
10570 DATA 2,2,5
10580 DATA 3,3,7
10590 DATA 5,2,1
10600 DATA 2,6,7
10610 DATA 6,2,2
10620 DATA 7,0,0
10630 DATA 6,6,3
10640 DATA 7,7,0
10650 DATA 1,4,1
10660 DATA 7,3,0
10670 DATA 6,6,6
10680 DATA 7,7,7
11000 REM sinus 0 -140 (100)
11010 DATA 70,65,61,56,52,48,43,39,35,32,28,25,21,18,15,12
11020 DATA 10,8,6,4,3,1,1,0,0,0,0,0,1,2,3,5
11030 DATA 7,9,11,14,17,20,23,26,30,34,37,41,46,50,54,58
11040 DATA 63,67,72,76,81,85,89,93,98,102,105,109,113,116,119,122
11050 DATA 125,128,130,132,134,136,137,138,139,139,139,139,139,138,138,136
11060 DATA 135,133,131,129,127,124,121,118,114,111,107,104,100,96,91,87
11070 DATA 83,78,74,70

Referencias:

03 mayo 2013

Publicada devtool BytesGen!

Acabo de publicar una pequeña herramienta para generar tablas de senos, cosenos, números aleatorios o a partir de ficheros binarios. La salida puede ser en código Basic, C, Ensamblador y Ensamblador de SDCC.

La opción de ficheros binarios, permite añadirle un valor para indicar el inicio de los datos y poder saltar cabeceras como en el caso de los ficheros binarios del MSX Basic (ejem: SC2).

Esta desarrollado en Microsoft Visual Basic 2008 Express. Proporciono los fuentes por si alguien lo quiere adaptar a sus necesidades o mejorarlo.



05 abril 2013

sprites del V9938 (1 de 2)


Con motivo del testeo de la aplicación spriteSX, me he metido a aprender el funcionamiento de los sprites del V9938 (MSX2), a nivel práctico (una asignatura pendiente que tenia desde hace tiempo), y he decidido realizar este post como apunte, que espero que sea útil para quien en algún momento pueda necesitarlo.

Empezaremos viendo las características de los sprites del V9938:
  • 256 patrones de 8x8 o 64 patrones de 16x16
  • visualización normal o modo zoom (x2), (para todos los sprites).
  • 32 planos
  • hasta 8 por línea.
  • un color por línea del patrón.
  • colisión ajustable a nivel de línea.
  • se pueden crear sprites con 3 colores por linea (o más), superponiendo varios sprites y utilizando el bit de OR.
Prácticamente son las mismas que en el TMS9918 pero incluye mejoras en la representación gráfica con más colores y se ha duplicado la cantidad de sprites que se pueden visualizar en una linea.

En la memoria de vídeo, se disponemos de las tablas de patrones y de atributos de sprites (OAM), aunque en esta última, el Byte asignado al color no tiene efecto ya que se ha añadido una nueva tabla exclusiva para los colores de los 32 planos de sprites. Es importante tener en cuenta que cada plano dispone de 16 valores independientemente de si los sprites son de 8 o 16 pixels.

Posiciones de las tablas de sprites en la VRAM (screen 4, 5,6 y 7):
  • sprite pattern table - 3800h
  • sprite attribute table - 1E00h
  • sprite color table - 1C00h
Podemos definir hasta 64 patrones de sprite de 16x16 y utilizarlos en los 32 planos que disponemos, pero a la hora de asignar sus colores, tendremos que copiarlos en su correspondiente posición de la tabla de colores.

Opinión: Esto puede ser algo molesto, ya que si realizamos un juego en el que vamos cambiando los sprites de forma dinámica o utilizamos el mismo patrón en diferentes planos, tendremos que volcar su información de color para cada plano.

En cada valor de color, no solo tenemos el código de color, también podemos habilitar algunas funciones: (info via Portar)
Bit 0-3 - Código de color (0-15)
Bit 4 - No se usa.
Bit 5 - Ignora las colisiones con otros sprites. (1=Ignora)
Bit 6 - Mix de color con el siguiente sprite de prioridad más alta.
Bit 7 - Early clock (cambia la línea 32 píxeles a la izquierda)
El bit de Early clock, se utiliza para cuando necesitemos que el sprite aparezca/desaparezca de forma gradual, por el borde izquierdo de la pantalla. El echo de que se pueda hacer a nivel de línea, lo deja abierto a nuestra creatividad. :P

Como en el TMS9918, también disponemos de una posición Y mágica, que oculta el sprite y todos los siguientes situados en planos inferiores, pero su valor ha de ser el 216.

La activación de los modos de sprite (tamaño y zoom), tanto en Basic con la instrucción SCREEN, como directamente desde los registros del VDP, son exactamente igual que en el TMS9918.

Idea: Una forma de mejorar nuestros juegos diseñados para ordenadores de primera generación cuando se ejecuten en ordenadores con el V9938, es usar el modo G3 (screen 4). Es igual al G2 (screen 2), pero con las ventajas de los sprites avanzados y la posibilidad de ajustar nuestra paleta de colores. Para identificar el modelo de ordenador, disponemos de una variable de sistema llamada MSXVER que se encuentra en la dirección 002Dh. Si nos da diferente a 0 es que tenemos un MSX2 o superior.

A continuación teneis un ejemplo (descargar), que he utilizado como prueba de la salida de datos a Basic de la aplicación spriteSX.

10 DEFINT A-Z
12 COLOR 15,4,4:SCREEN 4,2
14 RESTORE 10540:GOSUB 1030
20 RESTORE 10020:HL=BASE(9):GOSUB 1010
30 N=7:X=0:Y=0
40 for i=0 to N
50 PUT SPRITE I,(X*16,Y*16),15,I
60 X=X+1:IF X=8 THEN X=0:Y=Y+1
70 NEXT
72 RESTORE 10350:HL=&H1C00:GOSUB 1010
80 IF INKEY$="" THEN 80 ELSE END
1000 REM -- LOAD SPRITES by Rafael Jannone
1010 READ R$: IF R$="*" THEN RETURN ELSE VPOKE HL,VAL("&H"+R$):HL=HL+1:GOTO 1010
1020 rem Set Palette
1030 FOR C=1 TO 15:READ R,G,B:COLOR=(C,R,G,B):NEXT
1040 RETURN
10000 REM Frutas 16x color
10010 REM SPRITE DATA
10020 DATA 0F,1F,3D,3F,7B,7C,BF,BF,9F,EF,6F,1F,0F,05,05,1D
10030 DATA C0,E0,60,C0,40,80,80,84,86,DE,C0,C0,80,00,00,C0
10040 DATA 03,07,4F,CF,4D,4F,2C,1E,3F,3F,3F,3F,1F,02,02,06
10050 DATA C0,E2,E6,E2,A2,F4,38,7C,FE,FE,FE,FC,F8,40,40,60
10060 DATA 05,07,1A,2E,6F,5B,5C,5B,5F,58,6F,2D,16,02,02,06
10070 DATA 40,C0,B8,D4,D4,6A,EA,6A,EA,6A,D4,D4,F8,40,40,60
10080 DATA 05,07,1F,3F,7F,7F,7F,7D,7F,7F,78,3F,1F,04,04,0C
10090 DATA 40,C0,F0,F8,FC,FC,FC,7C,FC,FC,3C,F8,F0,40,40,60
10100 DATA 07,1F,3F,3F,7F,71,7F,7F,7F,7E,3E,3F,1F,07,02,06
10110 DATA E0,F8,FC,FC,FE,8E,FE,FE,FE,7E,7C,FC,F8,E0,40,60
10120 DATA 00,07,1F,3F,7F,71,FF,FF,7B,7C,3F,1F,07,02,02,06
10130 DATA 00,E0,F8,FC,FE,8E,FF,FF,DE,3E,FC,F8,E0,40,40,60
10140 DATA 05,1E,3F,6F,57,6E,3F,00,07,05,07,04,06,03,02,06
10150 DATA 60,F8,F4,EA,76,BE,7C,00,E0,60,E0,20,60,C0,40,60
10160 DATA 05,1E,3F,6F,57,6E,3F,07,07,05,07,04,06,03,02,06
10170 DATA 60,F8,F4,EA,76,BE,7C,E0,E0,60,E0,20,60,C0,40,60
10180 DATA *
10340 REM COLOR MODE2 DATA
10350 DATA 0C,0C,0C,0C,02,02,03,03,03,03,03,02,0C,0F,0F,07
10360 DATA 0C,02,02,02,0C,02,02,02,02,02,02,02,0C,0E,0E,05
10370 DATA 0A,0A,0B,0B,0B,0B,0B,0B,0B,0B,0B,0B,0B,0E,0E,05
10380 DATA 0C,0C,09,09,09,09,09,09,09,09,09,09,09,05,0F,07
10390 DATA 0D,0D,0D,0D,0D,0D,0D,0D,0D,0D,0D,0D,0D,0D,07,07
10400 DATA 0D,0A,0B,0B,0B,0B,0B,0B,0B,0B,0B,0B,0A,0E,05,05
10410 DATA 08,09,09,09,09,09,08,0E,0D,0D,0D,0D,0D,0D,0E,0E
10420 DATA 0A,0E,0A,0E,0A,0E,0A,05,0F,0F,0F,0F,0F,0F,0E,0E
10430 DATA *
10510 REM MSX2_Palette
10520 REM Red, Green, Blue
10540 DATA 0,0,0
10550 DATA 1,5,1
10560 DATA 3,6,3
10570 DATA 2,2,5
10580 DATA 3,3,7
10590 DATA 5,2,1
10600 DATA 2,6,7
10610 DATA 6,2,2
10620 DATA 7,0,0
10630 DATA 6,6,3
10640 DATA 7,7,0
10650 DATA 1,4,1
10660 DATA 7,3,0
10670 DATA 6,6,6
10680 DATA 7,7,7

Ver segunda parte: Sprites del V9938 (2 de 2). OR de Colores

Disponéis de más información en:

24 febrero 2013

veejingSX v0.9.9.6b automatic control


Con motivo de la celebración del evento chiptune stage V6 (celebrado este pasado sábado 23 de febrero y organizado por el club sprite), he realizado una versión con un cambio menor, de la funcionalidad. He eliminado el modo selectivo (la activación de los diferentes contenidos con las teclas numéricas), para añadir un modo automático de disparar contenidos aleatorios. Este se activa mediante los números, siendo el 1, la más rápida y el 9 la más lenta. El 0 se utiliza para desactivar este modo.

También he sustituido las teclas usadas para lanzar algunos contenidos de forma aleatoria por las usadas por el modo selectivo, que son más accesibles (tab, shift y ctrl).

Podéis bajarlo desde la WEB del proyecto.

27 enero 2013

dibujo LSDJboy (v2)


A finales del 2012 participé en la compo del segundo aniversario de CulturaChip [II CUMPLE CC], en la categoría de Composición Gráfica, consiguiendo el segundo puesto! :D

La imagen esta realizada utilizando Photoshop Elements v2, con las limitaciones gráficas del modo de pantalla screen 2, de los ordenadores MSX (TMS9918). Para conseguir más colores en determinados sitios (la cara, gameboy y el cable), utilicé sprites de 16x16 x 1 color, que dibujé en una capa a parte. También le he añadido tramas (no muchas) y donde me ha sido posible, algún punto para crear efecto de antialiasing.

Más tarde me ha apetecido hacer una versión (v2), mejorando alguna cosa y añadiendo el altavoz, donde dibujé unos textos.

Para crear el SC2, he utilizado la WEB tool, MSX Screen conversor de Jannone, del dibujo sin la parte de los sprites. Para estos, los he dibujado utilizando una aplicación que estoy desarrollando (spriteSX), y los he volcado en código Basic, donde más tarde los he juntado con la imagen y guardado el resultado (VRAM), en un fichero binario [ bsave"fichero.sc2",0,16383,S].
  • Podéis descargar el fichero en formato SC2 nativo de MSX.
  • Para ver y escuchar el resto de participaciones podéis ir a la siguiente WEB.

05 enero 2013

Revista Super Juegos

Hace unos días me encontré en el armario, el número 3 de la revista Super Juegos. Esta publicación de la editorial Manhattan Transfer, trataba de juegos en general (tablero, cartas, etc) y videojuegos. Fue la precursora de la MSX Extra, ya que publico 2 números "extra" Ordenadores MSX y que luego paso a ser independiente.