Re: Solucionado - Problemas compresión de mapas al pasar a 128K
Publicado: Mar, 11 Mar 2014, 08:26
La idea es dejar el mapa comprimido en la RAM extra, y modificar el procedimiento de obtener una pantalla para que la pille directamente de ahí.
Se me ocurre que hagas lo siguiente:
1.- El mapa comprimido tal y como sale de las utilidades de Antonio no lo puedes comprimir más, además, como bien él dice, sería mala idea.
2.- Ahora bien, ese .bin lo puedes colocar en la lista de archivos que colocar en RAM extra, utilizando el librarian.
3.- Con esto consigues que el binario del mapa comprimido con las utilidades de Antonio esté en una página de RAM y una dirección fija. Estos valores los puedes sacar directamente de la estructura que se crea en librarian.h: la página será resources [res].ramPage y la dirección de inicio será resources [res].ramOffset.
4.- Cada vez que queramos obtener una nueva pantalla, habría que:
a) desactivar las interrupciones.
b) Cambiar a la página resources [res].ramPage
c) Descomprimir la pantalla.
d) Poner la página 0 de nuevo
e) habilitar las interrupciones.
5.- Efectivamente, habría que quitar
$this->bbcode_second_pass_code('', '.map BINARY "mapa_comprimido.bin" <--- y esta otra')
6.- Pero te conviene tener esto:
$this->bbcode_second_pass_code('', 'extern unsigned int map_address [0];
extern unsigned int map_fin [0];
#asm
._map_address defw 0
._map_fin defw 0
#endasm')
7.- Y cambiar el descompresor para que mire ahí la dirección:
Esto:
$this->bbcode_second_pass_code('', 'ld de, map <----- Esta línea
ld hl, fin-1')
Cambiarlo por esto (atención, la puedo estar cagando):
$this->bbcode_second_pass_code('', 'ld hl, (_map_address)
ex de, hl
ld hl, (_map_fin)')
8.- Y antes de empezar el nivel, hay que establecer el valor de esas dos variables. La primera dice el principio del mapa compilado, y la segunda dice donde acaba. Necesitamos siempre que haya un recurso más después del mapa para poder calcularlo así:
$this->bbcode_second_pass_code('', 'map_address [0] = resources [n].ramOffset;
map_fin [0] = resources [n + 1].ramOffset - 1;')
donde n es el número de recurso donde está el mapa.
9.- Así, antes de llamar al descompresor para obtener la pantalla actual, como dijimos antes, haríamos:
$this->bbcode_second_pass_code('', 'asm_number [0] = resources [n].ramPage
#asm
; Deshabilitar interrupciones
di
; Cambiar de página
ld a, (_asm_number)
ld b, a
call SetRAMBank
#endasm
// AQUÍ LLAMARÍAMOS AL DESCOMPRESOR
#asm
; Poner RAM 0 de nuevo
ld b, 0
call SetRAMBank
; Habilitar interrupciones
ei
#endasm')
Más o menos esta es la idea (es posible que haya metido alguna gamba ). Supongo que Antonio nos podrá ayudar más.
Se me ocurre que hagas lo siguiente:
1.- El mapa comprimido tal y como sale de las utilidades de Antonio no lo puedes comprimir más, además, como bien él dice, sería mala idea.
2.- Ahora bien, ese .bin lo puedes colocar en la lista de archivos que colocar en RAM extra, utilizando el librarian.
3.- Con esto consigues que el binario del mapa comprimido con las utilidades de Antonio esté en una página de RAM y una dirección fija. Estos valores los puedes sacar directamente de la estructura que se crea en librarian.h: la página será resources [res].ramPage y la dirección de inicio será resources [res].ramOffset.
4.- Cada vez que queramos obtener una nueva pantalla, habría que:
a) desactivar las interrupciones.
b) Cambiar a la página resources [res].ramPage
c) Descomprimir la pantalla.
d) Poner la página 0 de nuevo
e) habilitar las interrupciones.
5.- Efectivamente, habría que quitar
$this->bbcode_second_pass_code('', '.map BINARY "mapa_comprimido.bin" <--- y esta otra')
6.- Pero te conviene tener esto:
$this->bbcode_second_pass_code('', 'extern unsigned int map_address [0];
extern unsigned int map_fin [0];
#asm
._map_address defw 0
._map_fin defw 0
#endasm')
7.- Y cambiar el descompresor para que mire ahí la dirección:
Esto:
$this->bbcode_second_pass_code('', 'ld de, map <----- Esta línea
ld hl, fin-1')
Cambiarlo por esto (atención, la puedo estar cagando):
$this->bbcode_second_pass_code('', 'ld hl, (_map_address)
ex de, hl
ld hl, (_map_fin)')
8.- Y antes de empezar el nivel, hay que establecer el valor de esas dos variables. La primera dice el principio del mapa compilado, y la segunda dice donde acaba. Necesitamos siempre que haya un recurso más después del mapa para poder calcularlo así:
$this->bbcode_second_pass_code('', 'map_address [0] = resources [n].ramOffset;
map_fin [0] = resources [n + 1].ramOffset - 1;')
donde n es el número de recurso donde está el mapa.
9.- Así, antes de llamar al descompresor para obtener la pantalla actual, como dijimos antes, haríamos:
$this->bbcode_second_pass_code('', 'asm_number [0] = resources [n].ramPage
#asm
; Deshabilitar interrupciones
di
; Cambiar de página
ld a, (_asm_number)
ld b, a
call SetRAMBank
#endasm
// AQUÍ LLAMARÍAMOS AL DESCOMPRESOR
#asm
; Poner RAM 0 de nuevo
ld b, 0
call SetRAMBank
; Habilitar interrupciones
ei
#endasm')
Más o menos esta es la idea (es posible que haya metido alguna gamba ). Supongo que Antonio nos podrá ayudar más.