Página 1 de 2

paginación memoria 128k

Publicado: Mié Ene 25, 2017 8:42 pm
por Kodaly
Muy buenas. Sigo adelante con el juego que estoy desarrollando en ensamblador y me encuentro con la duda de si programarlo en 48k (que era lo que tenía previsto porque es lo primero que escribo en ensamblador) o pasar a los 128k.

He estado leyendo sobre la paginación de memoria en el curso de sromero y me queda claro el concepto. Sin embargo, no entiendo cómo se indica exactamente en el código a qué banco corresponden los datos, por ejemplo, que coloquemos a partir de $c000. Si pongo un org $c000 y a continuación datos de gráficos, etc...¿cómo indico que esos datos los quiero para el banco 1 por ejemplo? Luego tendría que hacer lo mismo pero asignando esa misma porción de memoria a otro banco. Otra cosa es luego leer esos datos con la rutina que cambia de banco, pero a la hora de escribirlos no encuentro información en ningún lado de cómo hacerlo.

¡Gracias de antemano!

Re: paginación memoria 128k

Publicado: Sab Ene 28, 2017 3:14 pm
por hikoki

Re: paginación memoria 128k

Publicado: Sab Ene 28, 2017 7:07 pm
por climacus
Hola. Ese es un problema con el que me encontré. Uso el ensamblador PASMO y buscaba alguna instrucción del mismo para indicar en qué banco metía los datos, pero no la hay. Desconozco si algún otro ensamblador lo hace. Yo, en los juegos que he hecho para 128kb, he metido los datos en cada banco "a mano". Pagino el banco que quiero, espero pulsar una tecla y meto el fichero bin que me interese. Así con todos los bancos.

Re: paginación memoria 128k

Publicado: Dom Ene 29, 2017 10:38 am
por Kodaly
Muchísimas gracias a los dos.

Hikoki, son muy interesantes los enlaces. Aportan mucho sobre el tema en general pero no veo al pronto la solución al problema en concreto. Tendré que leerlo todo con más detenimiento y descifrar bien esos códigos.

Climacus, ¿podrías explicar por favor con más detalle (en modo para torpes) tu técnica? Ya me has sacado de más de un apuro zetaochentero. ¡Confío en tu conocimiento!

Re: paginación memoria 128k

Publicado: Lun Ene 30, 2017 9:23 am
por climacus
Kodaly escribió:Muchísimas gracias a los dos.

Hikoki, son muy interesantes los enlaces. Aportan mucho sobre el tema en general pero no veo al pronto la solución al problema en concreto. Tendré que leerlo todo con más detenimiento y descifrar bien esos códigos.

Climacus, ¿podrías explicar por favor con más detalle (en modo para torpes) tu técnica? Ya me has sacado de más de un apuro zetaochentero. ¡Confío en tu conocimiento!
Te cuento cómo lo hago yo. Aunque seguro que hay otras maneras mucho mejores de hacerlo.
Como ensamblador uso PASMO, y para ejecutar el código, uso el Spectaculator, en el que es muy sencillo meter archivos .BIN en memoria.

Imagina que tienes toda la música del juego metida en el fichero MUSICA.BIN; tanto el reproductor como las canciones. Para que no te ocupen memoria, las quieres meter en el banco 3 y durante el juego lo vas usando como te interese.
El problema es cómo meter toda esa información en el banco 3.
Yo me creo un cargador que lo ejecuto al principio del juego. En este cargador cambio al banco 3. Uso una rutina que espera hasta que pulse una tecla. Cojo el archivo MUSICA.BIN y lo meto en el Spectaculator a partir de $C000. Así ya tengo mi reproductor y mis canciones en el banco 3. Una vez hecho esto, pulso la tecla y sigo con mi programa (cambio al banco que me interese, etc.).

Re: paginación memoria 128k

Publicado: Lun Ene 30, 2017 10:25 am
por utopian
Yo también utilizo Pasmo y un cargador a medida para meter los datos. La idea es:

1- Tienes que dividir el código en trozos de 16K, y las partes que vayan en páginas que no sean las "por defecto" las ensamblas con "org $c000", generándote cada una un archivo .bin (por ejemplo, ram3.bin, ram6.bin, etc).

2- Una vez tienes todos los bloques, yo utilizo mi herramienta (https://github.com/fjpena/zx-spectrum/t ... r/buildtzx) para crear un TZX que cargue todos los bloques en sus sitios correctos en memoria.

El principal problema de poner código en esos bancos de memoria es que si quieres llamar a código que esté en RAM3 desde la memoria principal, tienes que paginar ese banco primero, saber la dirección en la que tienes la rutina, y luego paginar de vuelta. Con Pasmo se hace un poco complicado, por lo que tiendo a dejar las páginas adicionales para datos o cosas muy autocontenidas, como el player de música con sus músicas correspondientes.

Re: paginación memoria 128k

Publicado: Lun Ene 30, 2017 11:48 am
por climacus
utopian escribió:Yo también utilizo Pasmo y un cargador a medida para meter los datos. La idea es:

1- Tienes que dividir el código en trozos de 16K, y las partes que vayan en páginas que no sean las "por defecto" las ensamblas con "org $c000", generándote cada una un archivo .bin (por ejemplo, ram3.bin, ram6.bin, etc).

2- Una vez tienes todos los bloques, yo utilizo mi herramienta (https://github.com/fjpena/zx-spectrum/t ... r/buildtzx) para crear un TZX que cargue todos los bloques en sus sitios correctos en memoria.

El principal problema de poner código en esos bancos de memoria es que si quieres llamar a código que esté en RAM3 desde la memoria principal, tienes que paginar ese banco primero, saber la dirección en la que tienes la rutina, y luego paginar de vuelta. Con Pasmo se hace un poco complicado, por lo que tiendo a dejar las páginas adicionales para datos o cosas muy autocontenidas, como el player de música con sus músicas correspondientes.
Ya sabía yo que tenía que haber una forma mejor de hacerlo... :)

Re: paginación memoria 128k

Publicado: Lun Ene 30, 2017 3:37 pm
por Kodaly
Mil gracias a utopian y a climacus. Voy a intentar lo que decís a ver si soy capaz de sacarlo adelante y si no, pues nada...este primer juego se escribe para 48k. No sabía que esto de la paginación fuese algo tan laborioso.

Re: paginación memoria 128k

Publicado: Mar Ene 31, 2017 12:31 am
por Ivanzx
Kodaly escribió:Mil gracias a utopian y a climacus. Voy a intentar lo que decís a ver si soy capaz de sacarlo adelante y si no, pues nada...este primer juego se escribe para 48k. No sabía que esto de la paginación fuese algo tan laborioso.
Por curiosidad, qué juego es? :) O qué tipo de juego?

Re: paginación memoria 128k

Publicado: Mar Ene 31, 2017 2:26 pm
por Kodaly
Ivanzx escribió:
Kodaly escribió:Mil gracias a utopian y a climacus. Voy a intentar lo que decís a ver si soy capaz de sacarlo adelante y si no, pues nada...este primer juego se escribe para 48k. No sabía que esto de la paginación fuese algo tan laborioso.
Por curiosidad, qué juego es? :) O qué tipo de juego?
Pues he denominado al proyecto "Survival Zx". Es un arcade de scroll horizontal (caracter a caracter) con algunos tintes de videoaventura en el que un superviviente realiza una serie de misiones en una ciudad infestada de zombis. Tengo ya dos fases. Los gráficos no son gran cosa, que nadie se emocione! :D Lo estoy desarrollando como ejercicio sin más ambición.

Re: paginación memoria 128k

Publicado: Dom Feb 05, 2017 2:06 am
por mcleod_ideafix
climacus escribió:Hola. Ese es un problema con el que me encontré. Uso el ensamblador PASMO y buscaba alguna instrucción del mismo para indicar en qué banco metía los datos, pero no la hay. Desconozco si algún otro ensamblador lo hace
Sí. SjAsmPlus permite especificar en qué banco de memoria de 128K va el código o los datos. Luego, en el programa, sigues necesitando las instrucciones OUT para seleccionar el banco en cuestión, pero ya sabes que el código o los datos, una vez hayas paginado el banco correspondiente, estarán ahí.

Para eso, al principio de tu cdigo fuente pones:

Código: Seleccionar todo

device zxspectrum128
Y a partir de ahí, cuando quieras indicar que algo va en tal o cuál página harías algo como (por ejemplo, para la página 0)

Código: Seleccionar todo

page 0
org 0c000h
Y ya lo que venga, se ensamblará en la posición 49152 de memoria y siguientes, pero del banco 0 de memoria.

Todo esto es posible porque SjAsmPlus no genera TAPs ni TZX, sino snapshots de 48K y 128K.

Re: paginación memoria 128k

Publicado: Vie Feb 17, 2017 10:10 pm
por Kodaly
Muy buenas. He estado retirado de la programación un tiempo pero vuelvo al tajo. Antes de nada, agradecer a McLeod su aportación.

Estoy probando con la solución que daba utopian pero me encuentro con un problema. Se supone que tendría que ensamblar aparte en un bin el bloque a partir de 24000 hasta que termina la memoria contenida. Luego el siguiente bloque de 16k hasta $c000 y los diferentes bancos que procedan. En el código hay llamadas a etiquetas que corresponden a datos que irían en $c000. Al ensamblar, Pasmo me da error ya que hay etiquetas que hacen referencia a gráficos sin declarar en esos bloques todavía. ¿Me podéis dar alguna idea?

Re: paginación memoria 128k

Publicado: Lun Feb 20, 2017 10:49 am
por utopian
Lo que suelo hacer en Pasmo es generar los ficheros de símbolos de los otros .asm (pasmo test.asm test.bin test.sym), y luego incluir ese .sym en el fichero en el que hago referencia a las etiquetas.

Re: paginación memoria 128k

Publicado: Lun Feb 20, 2017 6:37 pm
por Kodaly
utopian escribió:Lo que suelo hacer en Pasmo es generar los ficheros de símbolos de los otros .asm (pasmo test.asm test.bin test.sym), y luego incluir ese .sym en el fichero en el que hago referencia a las etiquetas.
Muchísimas gracias, utopian! Probaré lo que dices.

He estado trasteando con tu programa, en concreto probando a crear el tzx a partir de los archivos de ejemplo (betiled). El problema es que me sale al final el mensaje de "cannot read file". He descargado todos los archivos en una carpeta pero aunque me crea el tzx, me sale ese mensaje de error y el tzx no carga. Obviamente no será fallo del programa, algo habré hecho mal. Lo he ejecutado tal como indicabas en las instrucciones. Lo único es que en el "template" he puesto a 0 el compresor, porque tal como venía en el ejemplo me da error al no tener instalado el compresor.

Re: paginación memoria 128k

Publicado: Lun Feb 20, 2017 7:29 pm
por utopian
Kodaly escribió:He estado trasteando con tu programa, en concreto probando a crear el tzx a partir de los archivos de ejemplo (betiled). El problema es que me sale al final el mensaje de "cannot read file". He descargado todos los archivos en una carpeta pero aunque me crea el tzx, me sale ese mensaje de error y el tzx no carga. Obviamente no será fallo del programa, algo habré hecho mal. Lo he ejecutado tal como indicabas en las instrucciones. Lo único es que en el "template" he puesto a 0 el compresor, porque tal como venía en el ejemplo me da error al no tener instalado el compresor.
¿No te dice qué fichero no puede leer? Si es así, debe ser que tienes algún problema con los saltos de línea en el template.txt o also similar (yo creo los archivos desde Linux, que usa un formato diferente para los saltos de línea). Prueba a crear el fichero de nuevas desde un Notepad a ver qué tal.