24
Retrogamedev: Creando un traductor de IL a Game Boy C @r2d2rigo http://english.r2d2rigo.es/

Retrogamedev: Creando un traductor de IL a Game Boy C

Embed Size (px)

Citation preview

Retrogamedev:Creando un traductor de IL a Game Boy C@r2d2rigo

http://english.r2d2rigo.es/

Motivación Aprender sobre el hardware/software de la Game Boy.

Aprender más sobre IL.

Usar una tecnología moderna para algo que no fue pensada.

Probar Roslyn.

Primer intento: Roslyn

Segundo intento: transformaciones de sintaxis

Parsear código de C# y generarárbol.

Recorrerlo aplicando reglas de transformación.

Generar ficheros .h y .c

Decisión: Mono.Cecil Más versátil que System.Reflection.

Permite cargar ensamblados ya compilados y ver su IL.

Aprovechar la potencia/optimización del compilador de C#.

C# -> .EXE -> .C -> .GB

Herramientas

GBDK Librerías + compilador de C para Z80/LR35902.

Pros: más productivo que ASM.

Contras: poco optimizado, poca documentación.

http://gbdk.sourceforge.net/

IL2C Traductor de IL a C.

Traduce ejecutable y referencias.

Modular: soporta distintos front ends.

C#, LINQ y Mono.Cecil.

Carga .EXE

Procesado

front-end

Dialecto

de C

GBSharp “Wrapper” en C# de GBDK + front end para IL2C.

Librería managed para hacer el juego en C#.

Librería nativa con las llamadas a las APIs de GBDK.

Walkthrough

El programa más simple

Stack primitiva en C Vamos a imitar la funcionalidadde IL haciendo una stack.

Tamaño máximo de tipo de datos es 16 bits.

Cada instrucción IL se corresponderá con una funciónen C.

IL traducido Headers por defecto.

Declaración de variables en mismoorden que .locals.

Front end decide qué tipo nativo usary qué función representa cada opcode.

Hello World Imprimir un número por pantalla.

Parece trivial pero hay que llamara función nativa.

NativeMethodAttribute.

NativeMethodAttribute Atributo para etiquetarfunciones.

Si IL2C encuentra una llamada a una función con ella, la sustituyepor la función nativa equivalente.

La función nativa debe desapilarlos parámetros que necesite.

IL traducido

Game Loop Comparación.

Etiquetas/branching.

Ajustes a variables autogeneradas.

IL traducido

Input Funciones no void.

No retornar valor, sino apilarlo.

Sucesivas llamadas desapilan el resultado.

IL traducido

Dibujado ¿Cómo podemos cargar bitmaps/tiles?

Const: no válido para arrays.

Static: demasiado complejo.

Solución: embedded resources.

Dibujado Crear gráficos con Gameboy Tile Designer.

Exportar como *.bin.

Añadir como resource.

Autogenerar código.

Demo: Flappy Boy

¿Preguntas?@r2d2rigo

http://english.r2d2rigo.es/