BASIC: Reservando espacio para "bytes"

Todo sobre la creación, diseño y programación de nuevo software para
nuestro Spectrum

Moderador: Sir Cilve Sinclair

Responder
Avatar de Usuario
Hark0
Freddy Hardest
Mensajes: 545
Registrado: Mar Nov 13, 2012 12:42 pm
Ubicación: Cornella de Llobregat - Barcelona
Contactar:

BASIC: Reservando espacio para "bytes"

Mensaje por Hark0 » Lun Ene 27, 2014 1:01 pm

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:
litiopixel.blogspot.com - Desarrollo videojuegos Indie · Pixel-Art · Retroinformática · Electrónica

Avatar de Usuario
antoniovillena
Nonamed
Mensajes: 1164
Registrado: Dom Ene 09, 2011 8:55 am

Re: BASIC: Reservando espacio para "bytes"

Mensaje por antoniovillena » Lun Ene 27, 2014 1:27 pm

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.
Imagen

zup
Freddy Hardest
Mensajes: 666
Registrado: Vie Ago 15, 2008 2:43 pm

Re: BASIC: Reservando espacio para "bytes"

Mensaje por zup » Lun Ene 27, 2014 1:31 pm

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.
I have traveled across the universe and through the years to find Her. Sometimes going all the way is just a start...

Avatar de Usuario
Hark0
Freddy Hardest
Mensajes: 545
Registrado: Mar Nov 13, 2012 12:42 pm
Ubicación: Cornella de Llobregat - Barcelona
Contactar:

Re: BASIC: Reservando espacio para "bytes"

Mensaje por Hark0 » Lun Ene 27, 2014 1:43 pm

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?
litiopixel.blogspot.com - Desarrollo videojuegos Indie · Pixel-Art · Retroinformática · Electrónica

Avatar de Usuario
Hark0
Freddy Hardest
Mensajes: 545
Registrado: Mar Nov 13, 2012 12:42 pm
Ubicación: Cornella de Llobregat - Barcelona
Contactar:

Re: BASIC: Reservando espacio para "bytes"

Mensaje por Hark0 » Lun Ene 27, 2014 1:46 pm

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...
litiopixel.blogspot.com - Desarrollo videojuegos Indie · Pixel-Art · Retroinformática · Electrónica

zup
Freddy Hardest
Mensajes: 666
Registrado: Vie Ago 15, 2008 2:43 pm

Re: BASIC: Reservando espacio para "bytes"

Mensaje por zup » Lun Ene 27, 2014 2:11 pm

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.
I have traveled across the universe and through the years to find Her. Sometimes going all the way is just a start...

Avatar de Usuario
Hark0
Freddy Hardest
Mensajes: 545
Registrado: Mar Nov 13, 2012 12:42 pm
Ubicación: Cornella de Llobregat - Barcelona
Contactar:

Re: BASIC: Reservando espacio para "bytes"

Mensaje por Hark0 » Lun Ene 27, 2014 6:06 pm

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
litiopixel.blogspot.com - Desarrollo videojuegos Indie · Pixel-Art · Retroinformática · Electrónica

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: Google [Bot] y 27 invitados