Página 2 de 4

Re: Problemas con compresión de mapas al pasar a 128K

Publicado: Lun, 10 Mar 2014, 13:53
por elborra
$this->bbcode_second_pass_quote('antoniovillena', 'P')uedes guardar snapshots (.z80 ó .sna) donde se vean esas 3 pantallas corruptas y subirlos por aquí. A lo mejor así damos con el error.
Si por mi fuera..pero lamentablemente no puedo...

En cualquier caso puedo preparar una demo con el dogmole que preparaste como ejemplo, adaptar los cambios para 128K y enviarla (porque el bug/fallo/loquesea) aparece igual. Ya tenía esto preparado cuando me he dado cuenta que lo que estaba modificando era el Dogmole de Jarlaxe ^x^ y no es plan.

Así que vuelvo a hacer los cambios, os los detallo y a ver si encontramos el problema. Mientras tanto añado información de mi problema concreto:
- Por aclarar el fallo visual, las pantallas "corruptas" muestran bien una serie de tiles (tanto de diseño como de atributos), pero no son ni los tiles correctos ni su posición.
- El binario principal (churromain.bin) contiene el mapa correctamente (comprobado hexadecimalmente)
- Una vez iniciado el juego (pantalla de título), guardo la imagen del binario en memoria, buscando el mapa_comprimido, compruebo que hay 45 bytes cambiados respecto al mapa_comprimido.bin original.
He realizado esto 3 veces: pantalla de titulo y en 2 pantallas del juego distintas. Y el contenido correspondiente al mapa binario (esos 45 bytes diferentes) es siempre el mismo.

A mi lo que me suena es que se está machacando justo esa zona de la memoria desde algún lado :?

En fin, me pongo a hacer lo del dogmole y lo subo.

Igualmente, muchas gracias una vez más por aguantar mis dudas :P

Re: Problemas con compresión de mapas al pasar a 128K

Publicado: Lun, 10 Mar 2014, 14:20
por na_th_an
O sea, ¿los bytes diferentes están dentro del binario compilado? Hostias, pues entonces hay algo que no está escribiendo donde debiera.

Re: Problemas con compresión de mapas al pasar a 128K

Publicado: Lun, 10 Mar 2014, 15:40
por elborra
$this->bbcode_second_pass_quote('na_th_an', 'O') sea, ¿los bytes diferentes están dentro del binario compilado? Hostias, pues entonces hay algo que no está escribiendo donde debiera.


no, no... lo que sería churromain.bin está perfecto y presupongo que en el tap final (loader+screen+reubica+main+ram extras...) también estará correcto (no se si se puede comprobar de alguna manera)

Cuando cambia parece ser que es ya en tiempo de ejectución ya que desde el emulador exporto en un fichero lo que hay en memoria y en este fichero, una vez localizado el mapa, es donde compruebo los 45 bytes cambiados.

Re: Problemas con compresión de mapas al pasar a 128K

Publicado: Lun, 10 Mar 2014, 15:42
por na_th_an
Sí, me refiero que esta dentro de lo que se supone que se compila. Que no es que la pila esté sobrescribiendo un buffer externo, es que hay algo escribiendo donde no debe.

Re: Problemas con compresión de mapas al pasar a 128K

Publicado: Lun, 10 Mar 2014, 16:26
por elborra
Bueno, al final probando, probando, me he dado cuenta (inútil de mi) que los 45 bytes diferentes no son más que el contenido de reubica.bin. Es decir que el problema es que reubica.bin machaca parte del binario principal.

Yo he usado básicamente el make.bat de la carpeta spare (ejemplo goku mal) donde tenemos $this->bbcode_second_pass_code('', 'echo -------------------------------------------------------------------------------
echo ### CONSTRUYENDO CINTA ###
..\utils\bas2tap -a10 -sLOADER loader.bas loader.tap
..\utils\bin2tap -o reubica.tap -a 25000 reubica.bin
..\utils\bin2tap -o ram1.tap -a 32768 ram1.bin
..\utils\bin2tap -o ram3.tap -a 32768 ram3.bin
..\utils\bin2tap -o ram4.tap -a 32768 ram4.bin
..\utils\bin2tap -o ram6.tap -a 32768 ram6.bin
..\utils\bin2tap -o screen.tap -a 16384 loading.bin
..\utils\bin2tap -o main.tap -a 24200 gokumal.bin
copy /b loader.tap + screen.tap + reubica.tap + ram1.tap + ram3.tap + ram4.tap + ram6.tap + main.tap gokumal.tap
echo -------------------------------------------------------------------------------')
reubica se coloca en la dirección 25000, que al final resulta ser la dirección de los bytes sobreescritos del mapa en el fichero churromain.bin (la 61A8)....

El fichero reubica.asm no lo toqué del original, lo que si cambié fue el 128k.h a $this->bbcode_second_pass_code('', 'void SetRAMBank(void) {
#asm
.SetRAMBank
ld a, 16
or b
ld bc, $7ffd
out (C), a
#endasm
}')

En make.bat realmente se ve este "fallo" a simple vista (si es que lo es... yo siempre desde mi desconocimiento) pero eso de:
..\utils\bin2tap -o reubica.tap -a 25000 reubica.bin y ..\utils\bin2tap -o main.tap -a 24200 gokumal.bin estamos metiendo precisamente reubica dentro de parte del main (lo que no se es como no casca goku mal ¿? y por eso no le habia hechado cuentas)

En definitiva, una posible solución sería desplazar el binario principal del juego de 24200 a 25048 (por poner) y cambiar make.bat y el loader. Que no se si es la unica, o la mejor forma. Como creo haber detectado el fallo (ahora probaré si lo que propongo como solución corrige el error) ya no subiré el test con dogmole.

Re: Problemas con compresión de mapas al pasar a 128K

Publicado: Lun, 10 Mar 2014, 16:31
por na_th_an
Um Qué raro.

No puedo mirar con detalle, pero lo suyo es cargar el bloque de juego AL FINAL, para que sobrescriba todo, reubica.bin incluido. O sea, no pasa nada si hay solapamiento. Reubica se utiliza solo durante la carga. Se coloca en 25000 y se ejecuta tras cada bloque de RAM extra para moverlo a su sitio. Luego se carga el binario del juego, que lo sobrescribe todo.

Algo raro tienes que estar haciendo para que reubica termine SOBRE el binario del juego. No tiene sentido, debería estar sobrescrito.

Re: Problemas con compresión de mapas al pasar a 128K

Publicado: Lun, 10 Mar 2014, 18:34
por elborra
$this->bbcode_second_pass_quote('na_th_an', 'A')lgo raro tienes que estar haciendo para que reubica termine SOBRE el binario del juego. No tiene sentido, debería estar sobrescrito.
Pues sí. Resulta que el loader.bas seguía haciendo referencia a ram4 y ram 6, cuando de momento no los uso. En su momento no le di importancia porque en make.bat no hacía referencia a esas 2 páginas extras y el compilador no me generaba ningún aviso.

En cuanto leí tu post volví a bajarme los fuentes de goku mal para comprobar que el binario en memoria del emulador efectivamente no contenía a reubica.bin. Y así fué... como realmente ya había revisado todo lo demás se me encendió (tardíamente) la bombilla y abrí el loader.bas (que tenía olvidado) y recordé como lo había dejado. Seguramente lo que estaba haciendo era meter churromain.bin en 23739 ¿no? (creo, porque no me queda muy claro la instrucción BASIC del loader XD)
En fin. que he hecho las correciones y ya funciona como debería ^_ ^ Gracias por la ayuda :corchoneta:

Re: Solucionado - Problemas compresión de mapas al pasar a 128K

Publicado: Lun, 10 Mar 2014, 22:11
por elborra
Sigo por aquí por no saturar y por llevar relación con el nombre del hilo.

Bien, una vez todo funcionando en modo128K y mapas comprimidos he vuelto a poner lo que yo pensaba necesario para mover el mapa_comprimido.bin a memoria extra y poder usar varios mapas comprimidos con tmxcompress.

El problema que me surge es la integración de las funciones get_resource (unsigned char res, unsigned int dest) de la churrera y descomprimir_map( unsigned char pantalla) de antonio. No debería de ser nada complicado pero me pierdo con la nomenclatura. Paso a resumir lo que me haria falta (na_th_an, verás que es un proceso muy similar al que usais para los compressed_levels):

La función de antonio en la parte en ensamblador$this->bbcode_second_pass_code('', ' and a
ld b, h
ld c, h
ld de, map <----- Esta línea
ld hl, fin-1
...
...
...
.map BINARY "mapa_comprimido.bin" <--- y esta otra')carga en el registro de la direccón de memoria donde comienza el binario (con esto ya es suficiente para que gestione que pantalla descomprimir). Obviamente el mapa ya no lo queremos en el binario principal con lo que esa última línea iría fuera.

El tema es ahora descomprimir el mapa_comprimidoc.bin en una dirección fija - notese la "c" ya que aparte de estar comprimido previamento con tmxcompress hay que pasarle apack para el proceso de librarian.exe- con get_resource (unsigned char res, unsigned int dest). En mi caso el mapa el el recurso 27.

Tal y como se hace con los compressed_levels (intentando copiar) defino una variable con un tamaño de 2000 bytes (partiendo de la base de que ningun mapa ocupe descomprimido con depack más de 2000 bytes, es decir que los mapas generados por la utilidad de antonio ocupen siempre menos que esa cifra). Esto lo hago así:
$this->bbcode_second_pass_code('', 'extern unsigned char mimapa;
#asm
.mimapa defs 2000
#endasm')Luego en la rutina de antonio cambio ld de, map por ld de, mimapa. Sin embargo al hacer la llamada a get_resource(27, (unsigned int) (mimapa) )ya empieza a dar problemas de compilación. Está claro que otra vez estoy mezclando punteros con arrays o cosas que no debería. A ver si me podeis echar una mano.

Re: Solucionado - Problemas compresión de mapas al pasar a 128K

Publicado: Lun, 10 Mar 2014, 23:08
por na_th_an
Mañana lo leo más despacio, que ahora tengo mucho sueño, y te digo algo :D

Re: Solucionado - Problemas compresión de mapas al pasar a 128K

Publicado: Lun, 10 Mar 2014, 23:33
por antoniovillena
No es necesario que vuelvas a comprimir con apack los mapas, ya están comprimidos con tmxcompress. Es muy probable que el stream comprimido resultante ocupe más que el stream sin comprimir por el apack, vamos que es contraproducente.

En resumen, sáltate en este paso la compresión. Supongo que tienes todo el nivel en una estructura de datos, pues separa dicha estructura en dos partes: mapa por un lado y todo lo demás por otro, aplica compresión a lo otro y lo concatenas al mapa. La clave está en no comprimir dos veces lo mismo.