Página 1 de 1

BASIC: Reservando espacio para "bytes"

Publicado: Lun Ene 27, 2014 1:01 pm
por Hark0
Buenas!

Supongo que esta pregunta está más que contestada a lo largo y ancho de la red, pero necesito una aclaración ó explicación "para tontos"... tal que yo.

Estoy escribiendo un jueguecito en Basic standard, actualmente tengo los mapas y datos cargados como DATA, pero tengo la intención de al terminar el juego, pasarlas a bytes para leerlos con PEEK, más los gráficos de turno...

Osea, tengo:

- El listado Basic... que sigue creciendo...
- Los datos de los mapas etc, ahora como DATA, al final como bytes para PEEKearlos.
- Set UDG básico para el GUI.
- 2 Sets (o quizás más) de gráficos como "typos".

Entonces, como el listado Basic no es definitivo...

a) ¿a partir de que dirección de la RAM aconsejaríais alojar los "bytes"?
b) No acabo de comprender bien el funcionamiento de CLEAR ¿alguíen me lo explica para tontos?

Gracias anticipadas :wink:

Re: BASIC: Reservando espacio para "bytes"

Publicado: Lun Ene 27, 2014 1:27 pm
por antoniovillena
a) A partir del RAMTOP
b) CLEAR lo que hace precisamente es "bajar" dicha variable RAMTOP para alojar en la parte alta de RAM cosas ajenas al BASIC, como podrían ser rutinas en código máquina o datos genéricos (sería tu caso) que quieras cargar con LOAD""CODE y leer con PEEK

En resumen, RAMTOP es una variable de sistema que marca donde acaba BASIC y donde empieza la memoria reservada por el usuario.

Re: BASIC: Reservando espacio para "bytes"

Publicado: Lun Ene 27, 2014 1:31 pm
por zup
Empecemos con el CLEAR. CLEAR hace unas cuantas cosas, y tienes que tenerlas en cuenta todas antes de usarlo.

- Borra todas las variables.
- Borra la pantalla.
- Restaura la posición de PLOT.
- Hace un RESTORE.
- Borra la pila de GO SUB y la pone bajo el CLEAR.
- Modifica la variable RAMTOP.

El efecto global es que, si haces un clear 50000, el BASIC del Spectrum no utilizará nada por encima de 50000. Si necesita más memoria, te soltará un error Out of Memory.

El resto de efectos es que te deja el entorno del BASIC "limpio". Si habías definido alguna variable antes del CLEAR, ya no estará definida. Lo mismo para PLOT y DRAW, el cursor se vuelve al origen, si usado READ te va a volver al primer DATA del programa... en general todos estos efectos hacen que no sea buena idea jugar con CLEAR. Simplemente, usas el CLEAR al principio del programa y no lo vuelves a mover.

¿Dónde poner los gráficos? Pues inmediatamente después de RAMTOP (donde has puesto el CLEAR). Si lo pones en cualquier otro sitio, estará amenazado por el BASIC y las variables (por debajo) y por el stack (por encima). Si una de las dos cosas crece lo suficiente, te los machacará.

Volviendo al tema del CLEAR, en el hilo de los cargadores raros para BASIC comenté que hay un par de variables (STKEND, K_CUR) que te pueden servir para averiguar dónde acaba tu BASIC. A eso le añades suficiente espacio para tus variables y la pila, y ya tendrás la dirección más baja donde poner ese CLEAR (una opción es ejecutar el juego un rato, hacer un BREAK y mirar por donde anda STKEND... como ya tendrás las variables en su sitio, ya sabrás la longitud de tu BASIC).

Sabiendo esto, ahora tienes dos opciones:
a) Calcular el espacio que te van a ocupar los gráficos y poner CLEAR 65535-longitud (como siempre, aconsejo dejar un palmo más por si las moscas).
b) Calcular el espacio que te ocupa el BASIC y poner el CLEAR algo por encima (problema: si lo pones muy pegado luego no tendrás sitio para modificar el programa).

Ahora bien, tu programa puede ser algo engañoso. Si tu intención es guardar los gráficos y luego cargarlos como CODE, te aconsejo que partas tu programa en dos trozos desde ahora. Uno de ellos se dedicará únicamente a generar los gráficos y grabarlos a cinta; el otro será el juego. Si (aunque sea temporalmente) los dejas unidos, vas a ocupar mucha memoria en el Spectrum y quizás no puedas hacer el CLEAR tan bajo como te gustaría.

Re: BASIC: Reservando espacio para "bytes"

Publicado: Lun Ene 27, 2014 1:43 pm
por Hark0
antoniovillena escribió:a) A partir del RAMTOP
b) CLEAR lo que hace precisamente es "bajar" dicha variable RAMTOP para alojar en la parte alta de RAM cosas ajenas al BASIC, como podrían ser rutinas en código máquina o datos genéricos (sería tu caso) que quieras cargar con LOAD""CODE y leer con PEEK

En resumen, RAMTOP es una variable de sistema que marca donde acaba BASIC y donde empieza la memoria reservada por el usuario.



Siempre que leo bajar nos referimos a que RAMTOP inicialmente apunta más "arriba"... más cerca de los 65535...?

RAMTOP= PEEK 23730+ 256 * PEEK 23731

correcto?

Re: BASIC: Reservando espacio para "bytes"

Publicado: Lun Ene 27, 2014 1:46 pm
por Hark0
zup escribió:Empecemos con el CLEAR. CLEAR hace unas cuantas cosas, y tienes que tenerlas en cuenta todas antes de usarlo.

- Borra todas las variables.
- Borra la pantalla.
- Restaura la posición de PLOT.
- Hace un RESTORE.
- Borra la pila de GO SUB y la pone bajo el CLEAR.
- Modifica la variable RAMTOP.

El efecto global es que, si haces un clear 50000, el BASIC del Spectrum no utilizará nada por encima de 50000. Si necesita más memoria, te soltará un error Out of Memory.

El resto de efectos es que te deja el entorno del BASIC "limpio". Si habías definido alguna variable antes del CLEAR, ya no estará definida. Lo mismo para PLOT y DRAW, el cursor se vuelve al origen, si usado READ te va a volver al primer DATA del programa... en general todos estos efectos hacen que no sea buena idea jugar con CLEAR. Simplemente, usas el CLEAR al principio del programa y no lo vuelves a mover.

¿Dónde poner los gráficos? Pues inmediatamente después de RAMTOP (donde has puesto el CLEAR). Si lo pones en cualquier otro sitio, estará amenazado por el BASIC y las variables (por debajo) y por el stack (por encima). Si una de las dos cosas crece lo suficiente, te los machacará.

Volviendo al tema del CLEAR, en el hilo de los cargadores raros para BASIC comenté que hay un par de variables (STKEND, K_CUR) que te pueden servir para averiguar dónde acaba tu BASIC. A eso le añades suficiente espacio para tus variables y la pila, y ya tendrás la dirección más baja donde poner ese CLEAR (una opción es ejecutar el juego un rato, hacer un BREAK y mirar por donde anda STKEND... como ya tendrás las variables en su sitio, ya sabrás la longitud de tu BASIC).

Sabiendo esto, ahora tienes dos opciones:
a) Calcular el espacio que te van a ocupar los gráficos y poner CLEAR 65535-longitud (como siempre, aconsejo dejar un palmo más por si las moscas).
b) Calcular el espacio que te ocupa el BASIC y poner el CLEAR algo por encima (problema: si lo pones muy pegado luego no tendrás sitio para modificar el programa).

Ahora bien, tu programa puede ser algo engañoso. Si tu intención es guardar los gráficos y luego cargarlos como CODE, te aconsejo que partas tu programa en dos trozos desde ahora. Uno de ellos se dedicará únicamente a generar los gráficos y grabarlos a cinta; el otro será el juego. Si (aunque sea temporalmente) los dejas unidos, vas a ocupar mucha memoria en el Spectrum y quizás no puedas hacer el CLEAR tan bajo como te gustaría.


Ok, creo que lo he entendido... muchisimas gracias por una información tan detallada... de hecho me surgió al leer lo de las cargas marcianas.

Supongo que CLEAR debería ser la primera instrucción...

Lo que quiero cargar como bytes son los datos de los mapas en sí, no los gráficos de los mismos...

Re: BASIC: Reservando espacio para "bytes"

Publicado: Lun Ene 27, 2014 2:11 pm
por zup
Muchos cargadores de programas utilizan CLEAR como primera instrucción.

Yo prefiero meterla detrás de los BORDER, PAPER e INK. La razón es que si pones el CLEAR, ya no pones el CLS (y te ahorras algunos bytes).

La regla de oro es más simple: no metas un CLEAR en medio de un programa ya que te vas a cargar todas las variables. Como toda regla se puede romper, pero necesitarías un motivo poderoso para hacerlo (y sería raro).

En cuanto a lo de los gráficos... los UDG van por encima del CLEAR, y nada te impide grabarlos o cargarlos con CODE. Habitualmente, definir el juego completo de UDG en BASIC te ocupa más de los 168 bytes que tendrías que cargar desde cinta; si tu programa se está volviendo muy "hermosote" te vendrán bien todos esos bytes extra que conseguirás al eliminar los DATA.

Re: BASIC: Reservando espacio para "bytes"

Publicado: Lun Ene 27, 2014 6:06 pm
por Hark0
Ok, ya había pensado en cambiar el CLS por el CLEAR... al inicio, no tengo intención de ponerlo a posteriori.

Los gráficos tengo intención de diseñarlos a pelo, y cargarlos a mano en una dirección X de la RAM, para luego hacer un SAVE a la dirección final...

Lo mismo para los bytes de los mapas, que los prepararé con un cargador aparte, para luego volcar solo la ristra que necesitaré...

;)

Preguntaba lo de CLEAR y ubicación de bytes porque en función de eso, me caben más o menos mapas... :P