Bank switching en Z88DK

Si tienes alguna duda y crees que alguien podría resolverla, ponla aquí. || If you have any doubt about programming, post it here.

Moderador: CEZ

Responder
OscarBraindeaD
8 bits
8 bits
Mensajes: 35
Registrado: 05 Feb 2007 19:08
Ubicación: MadriZ

Bank switching en Z88DK

Mensaje por OscarBraindeaD »

Hola a todos,
estoy empezando a cacharrear con el Z88dk y quería saber cómo se pueden usar los bancos de memoria, para poder usar más allá de los 48kbs. He mirado el código de phantomasa2 y cannon bubble (que ambos lo usan) pero no me ha quedado claro... sí, soy un poco ](*,) No sé cómo colocar las funciones en cada banco, para luego cambiar de uno a otro y llamar a la función en cuestión...
Alguno podría explicarlo para que hasta yo lo entendiese :lol:

Muchas gracias,
Salud
El pasado ha pasado y por él nada hay que hacer, el presente es un fracaso y el futuro no se ve. (Eskorbuto/Cerebros destruidos)
Avatar de Usuario
Benway
Site Admin
Site Admin
Mensajes: 9241
Registrado: 24 Dic 2005 10:18
Ubicación: Madrid
Contactar:

Re: Bank switching en Z88DK

Mensaje por Benway »

Hola, Óscar.

Te cuento cómo lo hago yo, por ejemplo en BeTiled!, cuyo código también está liberado e incluido en el .zip del juego ;)

Primero, tengo esta función, que coloco al principio del todo del código (luego te cuento por qué ;) ):

Código: Seleccionar todo

void SetRAMBank()
{
#asm	
    .SetRAMBank
	ld  A, ($5B5C)
	and F8h
	or  B
	ld  BC, $7FFD
	ld  ($5B5C), A
	out (C), A
#endasm
}
Y luego, cuando quiero cambiar de página, lo hago así:

Código: Seleccionar todo

#asm
ld b, BANCO_A_ACTIVAR
call SetRAMBanck
#endasm
Cosas a tener en cuenta:
  • El banco que cambias se activa desde $c000 a $ffff, luego si la llamada a la función SetRAMBank (o la función en sí), están más alla de $c000, al cambiar de página lo más probable es que te encuentres con un estupendo cuelgue del sistema, porque resulta que el código cambia "de repente", ya que se pone a ejecutar lo que haya en SP ... ¡pero del banco que acabas de activar!
  • Ubica la pila por debajo de $c000, porque si no estamos en las mismas ;)
  • La tabla de interrupciones de la SpritePack está, por defecto, por encima de $c000 ... así que, si usas SpritePack, o la recompilas para cambiar la tabla de interrupciones, o inhabilitas las interrupciones mientras estás en una página distinta de la 0.
Espero que te haya sido de ayuda... si no... ya sabes dónde estamos ;) ... ah! Y ya nos contarás en qué andas liado ;)
Un saludo.
Imagen - Imagen - Imagen
OscarBraindeaD
8 bits
8 bits
Mensajes: 35
Registrado: 05 Feb 2007 19:08
Ubicación: MadriZ

Re: Bank switching en Z88DK

Mensaje por OscarBraindeaD »

Muchas gracias por tu respuesta!!!

Ya he bajado tu BeTiled! y veo muy útil el mapa de memoria que incluyes, a ver si soy capaz de entender la movida de los bancos... con lo fácil que eran de usar en la gameboy color...
En realidad lo que tengo planeado es una especie de hack n slash muy simple (y cuando digo simple es pero que muy simple), que creo cabría en 48ks, pero por si acaso. La rutinilla que muestra el mapa y el monigote moviéndose y colisionando ya está hecha -pese a mis rústicos conocimientos de C-. Intentaré ir haciendolo poquito a poco, ya os contaré y os brasearé con mis dudas...

Muchas gracias
Salud
El pasado ha pasado y por él nada hay que hacer, el presente es un fracaso y el futuro no se ve. (Eskorbuto/Cerebros destruidos)
Avatar de Usuario
Benway
Site Admin
Site Admin
Mensajes: 9241
Registrado: 24 Dic 2005 10:18
Ubicación: Madrid
Contactar:

Re: Bank switching en Z88DK

Mensaje por Benway »

Me alegro que te hayan sido útiles (el código del BeTiled! con el mapa y la respuesta) :D

En realidad, lo del cambio de bancos es más complejo, porque en el +2A y el +3 no estás ceñido a poner los bancos desde $c000, pero haciéndolo así te aseguras compatibilidad con todos los modelos de 128k.

Me alegro mucho de que andes liado haciendo cosas para Speccy :) y, permíteme insistir: Si necesitas alguna cosilla... ya sabes dónde estamos :)

¡Ánimo con ese Hack'n'Slash! :D
Un saludo.
Imagen - Imagen - Imagen
Avatar de Usuario
utopian
128 bits
128 bits
Mensajes: 1692
Registrado: 15 Sep 2005 07:24
Ubicación: Leganés, Madrid, Spain

Re: Bank switching en Z88DK

Mensaje por utopian »

Más cositas al respecto: en los bancos que no están "por defecto" en la RAM (2-5-0) no te será posible meter código C compilado con el z88dk, a no ser que seas capaz de hacer unas ñapas que por aquí no hemos conseguido :mrgreen:

Sí que puedes meter sin problemas pantallas, datos, código ensamblador... lo que quieras.
OscarBraindeaD
8 bits
8 bits
Mensajes: 35
Registrado: 05 Feb 2007 19:08
Ubicación: MadriZ

Re: Bank switching en Z88DK

Mensaje por OscarBraindeaD »

Hola a todos,
de nuevo gracias por la ayuda, vais a lamentar saber de esto, jejeje.
Después de mirado el código de BeTiled! me han surgido bastantes dudas... algunas serán, para los ya iniciado, una memez... pero, ahí van.

-cómo creo una pantalla comprimida?
-cómo indico en qué dirección empieza?
-en lugar de una pantalla o un sonido, cómo puedo meter funciones C/código C en un banco?
-si es posible lo anterior... este código, "ve" la ram -las variables- del banco principal (0)?
-en el addmemory de la spritelib hay que indicar 3 bloques de 14 bytes por cada tile de sprite.
En tu juego hay 10 tiles de sprites, porqué en vez de 30 bloques reservas sólo 24?
-Cuando te refieres a página, en el mapa de memoria de betiled!, es un banco en realidad?

He buscado documentos que lo expliquen, pero no he encontrado nada...
Lamento ser tan brasas...

Muchas gracias,
Salud
El pasado ha pasado y por él nada hay que hacer, el presente es un fracaso y el futuro no se ve. (Eskorbuto/Cerebros destruidos)
Avatar de Usuario
Benway
Site Admin
Site Admin
Mensajes: 9241
Registrado: 24 Dic 2005 10:18
Ubicación: Madrid
Contactar:

Re: Bank switching en Z88DK

Mensaje por Benway »

OscarBraindeaD escribió:-cómo creo una pantalla comprimida?
Hay varios compresores / decompresores para z80. Yo, en BeTiled!, usé pucrunch. De aquí puedes sacar la versión de z80 del decompresor, y el ejecutable para consola de windows del compresor. Te genera un binario que luego importas con el emulador.
-cómo indico en qué dirección empieza?
Las vas poniendo donde quieras, normalmente todas seguidas, y luego, simplemente, le indicas al decompresor dónde empieza y dónde descomprimirla.

Si te fijas en el código del uncrunch, al principio te dice que...

Código: Seleccionar todo

;## Decompress a pucrunched file.
;## In      : HL = source address
;##           DE = destination address
;## Destroy : AF, BC, DE, HL, AF', BC', DE', HL'
Así que eso, lo llamas teniendo en HL el origen y en DE el destino.
-en lugar de una pantalla o un sonido, cómo puedo meter funciones C/código C en un banco?
No sé cómo, porque no lo he hecho nunca... Código ASM sería muy fácil, compilándolo a partir de $c000 y llamando al sitio que fuese. A ver si Utopian, Nath, o alguno de estos fieras te puede ayudar con eso.
-si es posible lo anterior... este código, "ve" la ram -las variables- del banco principal (0)?
Sí, mientras estén ubicadas antes de $c000.
-en el addmemory de la spritelib hay que indicar 3 bloques de 14 bytes por cada tile de sprite.
En tu juego hay 10 tiles de sprites, porqué en vez de 30 bloques reservas sólo 24?
En realidad, está mal, pero no por reservar poco... ¡sino por reservar demasiado! ... Según la doc de SpritePack...
Many of SP's functions allocate memory behind the scenes. For example, the creation of a sprite requires the allocation of R*C+1 fourteen byte blocks where R=row size of the sprite in characters and C=column size of the sprite in characters. Each item added to a linked list managed by the linked list data type involves the allocation of a 6-byte node descriptor. This memory allocation occurs without your program's explicitly calling for it to happen. This behind-the-scenes memory allocation is performed through the functions pointed at by "void *u_malloc" and "void *u_free". These function pointers must be declared by your program so that this behind-the-scenes memory allocation can be performed.
Así que, no son 3 bloques, sino uno... y, como tú dijiste, contando la fila y la columna "extra", 3 * 3 + 1 = 10 ... con reservar 10 bloques sería suficiente.

¿Por qué puse 24? ... :-k ... pues porque al principio metí otros sprites más para hacer una cosilla, pero luego cambie de idea y lo hice de otra manera... pero... ¡se me olvidó cambiarlo! :lol:
-Cuando te refieres a página, en el mapa de memoria de betiled!, es un banco en realidad?
Sips :? que me hacía / hago un poco de lío con los dos conceptos... Me refiero a Banco siempre.
Lamento ser tan brasas...
De brasas nada, tío... que, de veras, para eso estamos ;)
Un saludo.
Imagen - Imagen - Imagen
OscarBraindeaD
8 bits
8 bits
Mensajes: 35
Registrado: 05 Feb 2007 19:08
Ubicación: MadriZ

Re: Bank switching en Z88DK

Mensaje por OscarBraindeaD »

Muchísimas gracias a ambos!!!
Más o menos me ha quedado claro... aunque no hay que subestimar el ilimitado poder de mi torpeza.
No obstante, seguramente sólo lo use para meter pantallicas puesto que el código espero que quepa en la 48kbs básicas.
A ver si en poco tiempo tengo alguna pruebecilla para enseñar.
De nuevo, muchas gracias!!!!
El pasado ha pasado y por él nada hay que hacer, el presente es un fracaso y el futuro no se ve. (Eskorbuto/Cerebros destruidos)
Avatar de Usuario
Benway
Site Admin
Site Admin
Mensajes: 9241
Registrado: 24 Dic 2005 10:18
Ubicación: Madrid
Contactar:

Re: Bank switching en Z88DK

Mensaje por Benway »

Jajajaja... qué exagerado eres! :lol:

Muchas de nada, jolín! ;)
Un saludo.
Imagen - Imagen - Imagen
Responder