martes, 22 de septiembre de 2015

Avances en el AS Compiler for MSX-VR

Una de las herramientas en las que estoy trabajando dentro del MSX-VR, es el AS compiler/linker. Esta herramienta permite compilar código ASM o PI (Scripting orientado objetos), además de montar librerías, linkar módulos, generar ROMs, gestión de Bancos (Megaroms), etc.

Como estas cosas han de estar bien pulidas, la mejor forma de pulirlas es trabajando en algo complicado. Así que hace un par de semanas decidí portar el proyecto GAZZERU (SDCC) a este nuevo sistema para conseguir finalizarlo. La verdad es que el reto es importante, pero merece la pena y los avances son del todo emocionantes y maravillosos :)


Esta pantalla que muestro aquí, ya está generada con este sistema y que queréis que os diga, estoy súper contento de poder mostrarla :)

El proyecto lo estoy montando todo a base de scripting. El scripting permite meter código nativo al vuelo también. Así que las partes más delicadas en cuanto a rendimiento/velocidad/tamaño (como en el SDCC) las tengo en ASM Z80. La sintaxis del ASM es compatible con la que usa el SDCC, de hecho en el AS hay extras como los opcodes de los MUL del TurboR y también están los opcodes que hacen uso del HX y el LX.

Un ejemplillo ...

function VDP_FillVRAM (_begin : uint, _size : uint, _value : ubyte) : void
{
native
{
ld l, 4(ix)
ld h, 5(ix)
ld c, 6(ix)
ld b, 7(ix)
ld a, 8(ix)
call 0x0056
}
}

El resto del juego, lo que es la lógica de juego, está toda montada con un lenguaje script tipo C/C++. El mismo lenguaje con el que hacemos videojuegos de PC y móviles en Nerlaska.

Por ejemplo, un extracto del archivo "logo.pi" que es el muestra el logo inicial de Nerlaska Studio al comenzar nuestros juegos MSX:

#include "game.h"

#define RSC_LOGO_WIDTH      16
#define RSC_LOGO_HEIGHT     5

class Logo partial MSXLIB_H, Resources_H
{
function Logo_Init () : void
{
VDP_ScreenOff ();

Bitmap_Load (rsc_bmp_nlklogo, 0, VDP_BANK_ALL);

Screen_Clear (0);
Screen_Flush();

VDP_ScreenOn ();

_posY = ubyte(24-RSC_LOGO_HEIGHT);

_timer = GetTickCount();
_timer2 = _timer;

while (1)
{
Screen_DrawTile ((32-RSC_LOGO_WIDTH)/2, _posY, RSC_LOGO_WIDTH, RSC_LOGO_HEIGHT, 0, 16);
Screen_Flush();
   
if ((GetTickCount() - _timer) > 200 || PPI_IsKeyPressed (PPI_KEY_SPACE))
{
break;
}
else if ((GetTickCount() - _timer2) > 1)
            { 
             _timer2 = GetTickCount();
             if (_posY > 4) _posY--;
            }
        }
}
}

La forma de trabajar, desde la consola del MSXDOS del MSX3. Desde ahí, tengo un DOSScript (un MAKE) creado para la ocasión, donde exporto los gráficos, música, sprites, etc. y compilo todas clases maravillosamente. Eso me genera un GAME.ROM de 128Kb. Preparado para ser usado mediante un MAPPER ASCII8.

¿Como se depuran y prueban las cosas?

Pues por ejemplo con el comando:

C:> PLAY GAME.ROM /MAPPER ASCII8 /DEBUGBP Logo_Init

Esto arranca el virtualizador MSX con mi ROM y detiene su ejecución para mostrar el debugger (Work In Progress) con el que poder ver el código, ver la memoria, registros, etc. Hay mucho por mejorar pero ya se puede trabajar decentemente con esto.


El AS genera información (archivos) de depuración que luego el debugger es capaz de leer para mostrar cosas útiles.

El código que se genera del PI al ASM Z80 todavía es optimizable, vamos, una barbaridad mejorable. Lo bueno, es que va a ser relativamente fácil mejorarlo tal y como veo la forma en la que se genera. Pero vamos, es aceptable y como GAZZERU es un MEGAROM pues me da un poco igual si me acaba ocupando unos cuantos Kb de más. Pero habrá un peephole de esos :)

Bueno, ya me he quedado a gusto contando mis hazañas, jajajaja. Me hacía ilusión contar como van avanzando las cositas del MSX-VR. A tope pues!! Gracias por dedicarme un rato de vuestro tiempo :)

Saludos!