Ahorrar memoria en BASIC Spectrum (se aceptan sugerencias)

El espacio para hablar de las nuevas producciones para los viejos ordenadores || The space to talk about old computer's new productions

Moderadores: Neville, CEZ

Responder
Zael
16 bits
16 bits
Mensajes: 55
Registrado: 12 Mar 2006 22:53

Ahorrar memoria en BASIC Spectrum (se aceptan sugerencias)

Mensaje por Zael »

Hola a todos. Ya estoy otra vez dando la "brasa" con mis dudas :lol:

Estoy haciendo un juego tipo "aventura conversacional" para Spectrum 48k con el BASin.

Me sorprende mucho la cantidad de memoria que "traga" cuando escribo texto. Si escribo un par de párrafos y poco más ya me ha quitado 500bytes.

Actualmente me quedan sólo 14K disponibles (según me indica en BASin) y no es suficiente para desarrollar la trama del juego que falta.

¿Hay alguna forma de ahorrar memoria? ¿Tiene el BASin algún método para depurar el código o algo que ahorre memoria?

Si no fuera así, ¿me podeís recomendar algún "truco"?

Yo por ejemplo en una frase que utilizaba mucho ("Pulse C para continuar") le he asignado LET A$="Pulse C para continuar" y he ahorrado casi 1k con todas las veces que se repetía.

Si finalmente no me cabe en 48k lo haré en 128k pero me haría ilusión que cupiera ya que el ZX Spectrum que tengo para testearlo cuando lo tenga acabado es un 48k.

Gracias. Un saludo.
Avatar de Usuario
na_th_an
256 bits
256 bits
Mensajes: 11874
Registrado: 22 Abr 2005 13:25
Contactar:

Mensaje por na_th_an »

Hay varios "trucos", pero el mejor que existe (y siento decir esto) es planificar antes de empezar. No sé cómo habrás montado tu aventura, pero si lo has hecho programando cada localización por separado es normal que te hayas quedado sin memoria. Lo suyo sería montar un programa que leyese la localización, la mostrase, y luego ejecutase el parser global a todo el juego, tal y como hace PAWs por ejemplo.

Lo strucos para ahorrar memoria te pueden salvar el peyejo cuando necesitas unos bytes más, pero no son ninguna fórmula mágica. Cada número que aparece en tu programa toma 5 bytes más el número de carácteres que ocupe, o sea, si tienes puesto "LET a = 38223" ese número que aparece ahí ocupa 5+5 = 10 bytes en el listado del juego. Esto es porque los números en Sinclair BASIC ocupan 5 bytes pero además se guarda su representación "humana", que como ocupa 5 dígitos serán otros 5 bytes. La forma de ahorrar con esto es usando VAL. Con LET a = VAL "38223" estás ahorrándote unos bytes pues sólo guardará la cadena y obtendrá su valor en tiempo de ejecución... El problema de esto es que ralentizará tu programa.

Para el 0 puedes usar NOT PI, INT RND y otras que se te ocurran (operaciones que valgan 0), y para 1 cosas como SGN PI (operaciones que valgan 1). Ocupan sólo 2 bytes pero la asignación es mucho más lenta, no es lo mismo LET a = 0 que LET a = NOT PI, ya que en la primera ocupa 6 bytes con el número pero no tiene que hacer ninguna operación, mientras que en la segunda ocuparía dos pero tendría que calcular "NOT PI".

Por cierto, en 128 BASIC sigues teniendo sólo 41K para BASIC, al igual que en 48 BASIC. El resto de memoria sólo puede accederse paginando y ésto no puede hacerse con trozos de programa BASIC (o sea, no puedes paginar una página de RAM con un trozo de programa BASIC y ejecutarlo a menos que este esté compilado y, por tanto, ya no sea un trozo de programa BASIC sino un trozo de programa C/M).
Avatar de Usuario
Beyker
128 bits
128 bits
Mensajes: 2204
Registrado: 24 Dic 2004 01:49
Ubicación: La vile du Barcelona
Contactar:

Mensaje por Beyker »

Bueno, hay un truquito con MERGE sobre el disco RAM que si se puede entender como hacer trozos de programa,pero tienes que controlar mucho el numero de lineas que usas para que al "MERGEAR" sustituya solo las que tu quieres.
Por ejemplo:
Si la descripcion de la localidad la hace en la linea 100 del programa principal,podrias guardar en el disco RAM todas las descripciones por separado y todas con el numero 100 de linea.Luego con MERGE sustituyes la linea 100 de tu programa por la que necesites en la descripcion y asi sucesivamente con todas las localidades.
Esto lo puedes usar para graficos,textos y demas,pero controlando siempre que lineas se van a cambiar y no tocando nunca el motor que se encarga de ir haciendo los cambios en el listado.
Responder