Compresor de mapas

For all things Churrera. ¿Estás haciendo un juego? ¿quieres proponer un cambio? ¿tienes alguna duda? ¡Cuéntanoslo!

Moderador: na_th_an

antoniovillena
Mensajes: 494
Registrado: Jue, 24 Oct 2013, 15:52

Re: Compresor de mapas

Mensajepor antoniovillena » Mar, 05 Nov 2013, 17:57

Voy a explicar cómo funciona la rutina asm. Para ello he separado el descompresor (lo que hay que incrustar en la Churrera) del resto del código fuente.

Bájate estos archivos y te comento según números de línea.

El meollo está en la rutina del archivo descom.asm, que recibe un número de pantalla en el registro A y al salir genera la pantalla indicada en la zona de memoria $c001-$c096. Le he puesto una constante a esto, buffer, que vale $c000. El byte bajo de esta constante debe ser 00.

Las primeras 15 líneas calculan la posición del stream comprimido que hay que decodificar, haciendo un sumatorio de las longitudes de cada stream comprimido.

A partir de la línea 15 está el descompresor propiamente dicho. Éste recibe un stream comprimido desde la dirección HL y va escribiendo los datos descomprimidos en la dirección DE. El descompresor es backwards, así que en ambos casos los punteros van para atrás. Se empieza escribiendo en $c096 y se acaba escribiendo en $c001. Lo mismo para HL, va hacia atrás. No existe ningún patrón terminador, lo que se hace es comparar el byte bajo de DE (registro E) con 00 y si llegamos ahí paramos. Por eso es necesario que el buffer esté alineado a 256 bytes.

Se descomprime una pantalla del tirón, por lo que a la salida tenemos los 150 bytes de la pantalla listos en el buffer. Todas las pantallas descomprimen en el mismo buffer, por lo que hay que tratar es de hacer el pintado basándose en el contenido del buffer.

Na_th_an, ¿está disponible el buffer $5e01-$5e96?
Adjuntos
descompresor_aparte.zip
(1.63 KiB) Descargado 285 veces
Avatar de Usuario
na_th_an
Mensajes: 26413
Registrado: Vie, 09 Ene 2009, 12:18

Re: Compresor de mapas

Mensajepor na_th_an » Mar, 05 Nov 2013, 18:09

Justo debajo del binario principal tenéis sitio. Desde 24050 a 24199 tenéis 150 bytes para hacer cosas :)
Como diría Rorshach: "Urm..."
antoniovillena
Mensajes: 494
Registrado: Jue, 24 Oct 2013, 15:52

Re: Compresor de mapas

Mensajepor antoniovillena » Mar, 05 Nov 2013, 18:14

Si no me equivoco habría que cambiar ésto:

$this->bbcode_second_pass_code('', '
void __FASTCALL__ draw_scr_background (void) {
map_pointer = mapa + (n_pant * 150);
gpx = gpy = 0;

// Draw 150 tiles

for (gpit = 0; gpit < 150; gpit ++) {
// Mapa tipo UNPACKED
gpd = *map_pointer ++;
')

Por esto otro:

$this->bbcode_second_pass_code('', '
void __FASTCALL__ draw_scr_background (void) {
descomprimir(n_pant);
map_pointer = $c001;
gpx = gpy = 0;

// Draw 150 tiles

for (gpit = 0; gpit < 150; gpit ++) {
// Mapa tipo UNPACKED
gpd = *map_pointer ++;
')

A ver, tómate esto como pseudocódigo, no tengo ni idea de cómo se integra. Se supone que descomprimir(n_pant) hace una llamada a la rutina ensamblador metiendo a la entrada de la rutina la variable n_pant en el registro A.

map_pointer siempre va a tener el mismo valor fijo, le he puesto $c001 porque es el que yo uso en el ejemplo pero podría ser $5e01 ó $fd01 ó el buffer que decidamos. Sé que C el hexadecimal es 0x, es para entendernos.
antoniovillena
Mensajes: 494
Registrado: Jue, 24 Oct 2013, 15:52

Re: Compresor de mapas

Mensajepor antoniovillena » Mar, 05 Nov 2013, 18:17

$this->bbcode_second_pass_quote('na_th_an', 'J')usto debajo del binario principal tenéis sitio. Desde 24050 a 24199 tenéis 150 bytes para hacer cosas :)


¿Podría ser hasta 24214?