Friday, December 02, 2005

Port de la mayhem a Windows (1/2)

De vez en cuando, me gusta volver a los "origenes" y pelearme con pixels, ensamblador y codigo de bajo nivel, para recordar como antes todo era mucho mas simple.

Esta vez le tocó a la Mayhem/Incognita, una de las demos que vi al principio de meterme en todo este mundillo de la demoscene. La verdad es que me decidí por dos cosas: tenia parte del codigo publicado (faltaban todas las librerias basicas) y es bastante dificil ejecutarla hoy dia.

Voy a intentar explicar en un estilo parecido a un diario, como se desarrollo:


Domingo, 20 de Noviembre del 2005
---------------------------------------------

Tomo la decisión de empezar el port, primero intento verla en DosBox o cualquier otro emulador que tenga a mano, sin muchos resultados. Me leo otra vez el .nfo para saber mas o menos que usaba, y reirme un rato sobre los comentarios.

Descomprimo el codigo que ya habia bajado en el pasado, y creo la carpeta "mayhem_w32", donde, al igual que en la requiem, copio el codigo original en \src y creo el proyecto. De momento, solo una consola de windows, ya habra tiempo para añadir el resto. Añado el Mayhem.cpp a la solucion, y me da un millón de errores, como esperaba. Comento todo el codigo, corrijo lo que creo necesario de las cabezeras, y dejo un bonito ejecutable, que solo dice que se esta iniciando la demo. Ya es un principio.

Me preocupo de ponerme en contacto con los coders de Incognita, para ver si me pueden pasar el codigo original.


Lunes, 21 de Noviembre de 2005
-----------------------------------------

Hago algo de ingenieria inversa del mayhem.dat. Primero, intento usar el muti-ripper con el data, pero consigo "solo" dos .xm, lo cual ya es una referencia. Me pongo los .xm a reproducir en el winamp, y abro el data en el UltraEdit, para empezar mirar como funciona (a pesar de eso, podria haber esperado a si los Incognita me pasaban el codigo, pero tenia demasiadas ganas de ver algo en pantalla). A primer vista, veo algo q parece una cabezera, algo de texto, y el principio de un .xm, asi que cambio al visual, le enchufo el fmod al proyecto, cargo todo el mayhem.dat en memoria, y reproduzco el track diciendole al fmod que me cargue desde memoria desde el offset que conozco del .xm. Tengo que mirar el tamaño del .xm que me ha sacado el multi-ripper, pero a la segunda tira. Ya tengo una consola de texto que dice que inicia la demo y el sonido, y hasta hace lo segundo!

Una vez hecho esto, cambio otra vez al UltraEdit, y busco por la extension .xm, en ASCII. Me imagino, que como el muti-ripper solo me ha sacado dos archivos, el resto tendran algun tipo de compresión, asi que no esperaba encontrar mas referencia en el dat, pero encuentro una ristra de datos al final del data, con nombres de archivo, y unos 32-40 bytes, despues de cada string. Comparando los valores de despues, descubro que uno es el tamaño de archivo, otro el offset, y dos valores que parecen double words, que desconozco de momento que son.

Hago mas pruebas, exportando por los tamaños que encontré antes a ficheros. Me escribe 50 ficheros, algunos de ellos tga, de los cuales solo uno es leible. Descubro, pues, que algunos ficheros tienen algun tipo de compresion, y que en cada directorio de estos (formados, a grandes rasgos, por un string, y 4 valores int32), uno de los valores es el tamaño comprimido, otro el tamaño real, otro el offset, y un ultimo que parecen los flags, este ultimo siendo 0 para los datos no comprimidos.
Una vez descubierto esto, tengo dos opciones: debuggear el ejecutable original y intener copiar el esquema de compresion, o esperar a ver si me pasan los sources.


Viernes, 25 de Noviembre del 2005
-------------------------------------------

Despues de 3 dias debuggeando el ejecutable original, intentando sacar el esquema sin muchos resultados, y por supuesto, sabiendo los tamaños de algunos tga y algunos de los valores estandar (la cabezera), intentar "descubrirlo", descubro a las 9 de la mañana, que Ent, despues de 3 dias sin poder encontrarnos para que me pasara los sources que encontró, ha decidido de forma inteligente, mandarmelos por mail.

Mirando por encima, hay el codigo fuente de la libreria (para windows, no para ms-dos/vesa) que es compatible con la mayhem, almenos en gran parte, y un pack de todo lo de la mayhem, menos las librerias, es decir, codigo+datos sin comprimir.

Decido tomarme el dia libre, y dedicarme al port...


Pero eso lo explicaré en el siguiente post :)