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--;
}
}
}
}
¿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!
No hay comentarios:
Publicar un comentario