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?
Compresor de mapas
Moderador: na_th_an
-
- Mensajes: 494
- Registrado: Jue, 24 Oct 2013, 15:52
Re: Compresor de mapas
- Adjuntos
-
- descompresor_aparte.zip
- (1.63 KiB) Descargado 286 veces
Re: Compresor de mapas
Justo debajo del binario principal tenéis sitio. Desde 24050 a 24199 tenéis 150 bytes para hacer cosas
Como diría Rorshach: "Urm..."
-
- Mensajes: 494
- Registrado: Jue, 24 Oct 2013, 15:52
Re: Compresor de mapas
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.
$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.
-
- Mensajes: 494
- Registrado: Jue, 24 Oct 2013, 15:52
Re: Compresor de mapas
$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?