Ahorrar memoria en BASIC ZX Spectrum

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

Moderador: Sir Cilve Sinclair

Ahorrar memoria en BASIC ZX Spectrum

Notapor AncientBits el Vie Oct 13, 2017 11:32 am

Hola, estoy haciendo un juego con mucho texto para ZX48K en BASIC puro. Se trata de una aventura al estilo "Elige tu propia Aventura" (que es lo único que sé hacer) pero el texto me come mucha memoria.

En anteriores juegos que hice usé el truco de asignar con LET a$ y siguientes las frases o palabras largas que más se repetían en el juego. Por ejemplo...

LETa$ = "Pulsa X para continar"
LETb$ = "¿Qué camino vas a elegir"
LETc$ = Recuerdos de Constantinopla
Etc.

Eso me ahorra unos 700kb o así al final del juego, pero querría saber si hay más trucos o maneras de comprimir el texto en BASIC o similar.

Hace 10 años ya pregunté sobre este tema, así que imagino que no habrá mucho más que hacer pero por intentarlo... :roll:

http://computeremuzone.com/forum/viewtopic.php?t=2915


Gracias!
Imagen

Imagen

Imagen
Avatar de Usuario
AncientBits
rst 0
 
Mensajes: 9
Registrado: Sab Sep 30, 2017 10:50 am

Re: Ahorrar memoria en BASIC ZX Spectrum

Notapor Scooter el Vie Oct 13, 2017 4:40 pm

Pues si que hay sistemas pero no son sencillos.
Se me ocurre que pongas en un archivo de texto todos los mensajes de tu programa, con el buscador veas que palabras largas son las diez más repetidas y las sustituyas por ejemplo por %0, %1 etc...
Cuando "imprimas" la cadena tienes que buscar el símbolo % , leer el carácter que le sigue e imprimir la cadena(índice) de paso les añades los espacios de delante y detrás.

Así la cadena "Yo vivo en Constantinopla dos años" quedaría como "yo vivo en%3dos años" ahorrando 14 bytes por cada repetición a partir de la segunda aparición.
Si Constantinopla está cien veces ahorras 1400 bytes
Claro, eso consume CPU.
Obviamente no ganas nada si lo que cambias tiene dos o tres letras

Enviado desde mi 5056D mediante Tapatalk
Aquellos chalados en sus viejos cacharros...
Avatar de Usuario
Scooter
Freddy Hardest
 
Mensajes: 709
Registrado: Jue Nov 11, 2010 11:17 pm

Re: Ahorrar memoria en BASIC ZX Spectrum

Notapor zup el Vie Oct 13, 2017 4:48 pm

AncientBits escribió:Hola, estoy haciendo un juego con mucho texto para ZX48K en BASIC puro. Se trata de una aventura al estilo "Elige tu propia Aventura" (que es lo único que sé hacer) pero el texto me come mucha memoria.


Creo que hay algún programa para hacer ese tipo de juegos, que imagino comprimirá el texto. Los creadores de "visual novel" también te deberian ayudar.

AncientBits escribió:Eso me ahorra unos 700kb o así al final del juego, pero querría saber si hay más trucos o maneras de comprimir el texto en BASIC o similar.


700 kb. Eres mi héroe.

Scooter escribió:Así la cadena "Yo vivo en Constantinopla dos años" quedaría como "yo vivo en%3dos años" ahorrando 14 bytes por cada repetición a partir de la segunda aparición.


En BASIC podrías hacerlo con una matriz de cadenas con las palabras más frecuentes (p.ej.: p$) y la sentencia sería algo así como

Código: Seleccionar todo
PRINT "Yo vivo en ";p$(3);" dos años"


Esto tiene un pequeño problema y es que los números en el Spectrum ocupan 5 bytes. En realidad, p$(3) ocupa 10 bytes lo que ocupa más que la mayoría de palabras.

Muchas aventuras gráficas crean "diccionarios", de manera que cada palabra ocupa uno o dos bytes en memoria. Habría que hacer unos cuantos malabarismos, pero el ahorro de memoria sería brutal.
I have traveled across the universe and through the years to find Her. Sometimes going all the way is just a start...
zup
Freddy Hardest
 
Mensajes: 587
Registrado: Vie Ago 15, 2008 2:43 pm

Re: Ahorrar memoria en BASIC ZX Spectrum

Notapor Scooter el Vie Oct 13, 2017 9:45 pm

Yo no he dicho de cortar la cadena.
Yo pondría la cadena "Yo vivo en%3desde agosto"
Pero para imprimir la cadena usaría un "parser" que hiciera un for hasta el Len De la cadena e iría imprimiendo hasta llegar al% y a continuación cambiaría la cadena.
No sé si el basic es lo bastante largo para hacer eso o no.
Al menos lo intentaría a ver qué pasa.

Algo así:
For x = 1 to Len(cadena$)
If mid$(cadena$,x,1)="%" then gosub 1000
Print mid$(cadena$,x,1);
Next x

1000
X=x+1
Indice= mid$(cadena,x,1)
X=x+1
If indice ="1" then print" cosa1 ";: return
If indice ="2" then print" cadenaslarga2 ";:return
...
...

No sé si eso es viable en zxbasic. En el cutrebasic V2 del c64 si que lo sería...previo ajustes variados, ya que esto es un pseudicódigo

Si hace falta se pueden usar todas las letras para las primeras 34 cadenas repetitivas, contando números y letras


Enviado desde mi 5056D mediante Tapatalk
Aquellos chalados en sus viejos cacharros...
Avatar de Usuario
Scooter
Freddy Hardest
 
Mensajes: 709
Registrado: Jue Nov 11, 2010 11:17 pm

Re: Ahorrar memoria en BASIC ZX Spectrum

Notapor zup el Sab Oct 14, 2017 12:13 am

Scooter escribió:Yo no he dicho de cortar la cadena.
Yo pondría la cadena "Yo vivo en%3desde agosto"
Pero para imprimir la cadena usaría un "parser" que hiciera un for hasta el Len De la cadena e iría imprimiendo hasta llegar al% y a continuación cambiaría la cadena.


O usar caracteres por encima de 127 (los TOKENs) para representar hasta 128 palabras. Los problemas de estas soluciones son dos:
- ¿El BASIC será suficientemente rápido para tratar la cadena sin ralentizar mucho el texto?
- Codificar a mano las cadenas es un coñazo.

El primer problema se soluciona tirando de c/m, y el segundo... habría que hacer una utilidad que codificara los textos y generara el BASIC correspondiente.
I have traveled across the universe and through the years to find Her. Sometimes going all the way is just a start...
zup
Freddy Hardest
 
Mensajes: 587
Registrado: Vie Ago 15, 2008 2:43 pm

Re: Ahorrar memoria en BASIC ZX Spectrum

Notapor K.O.D. el Sab Oct 14, 2017 2:11 am

Me viene ahora a la cabeza este programa, igual ya lo conoces:

http://sol.gfxile.net/mucho/mucho.html

No lo he usado pero le he dado un vistazo a las aventuras que vienen en .tap (están todas en inglés, of couse) y bueno no se ve mal, pero si ya tienes todo el código y demás, igual no es buena idea

Salu2
K.O.D.
Herbert
 
Mensajes: 64
Registrado: Mar Sep 30, 2008 8:45 am
Ubicación: Valencia

Re: Ahorrar memoria en BASIC ZX Spectrum

Notapor K.O.D. el Sab Oct 14, 2017 1:14 pm

Tratándose de un proyecto en BASIC, estos dos artículos de Francisco León igual te dan alguna idea (o igual ya los conoces), al desarrollar un juego del mismo tipo que el tuyo:

- http://trastero.speccy.org/cosas/FLeon/ ... gramas.txt
- http://trastero.speccy.org/cosas/FLeon/ ... turas1.txt

El objetivo del autor (que consigue, obviamente) es crear una aventura tipo libro-juego con más de 100K de texto desde BASIC, empleando técnicas que detalla muy bien. Creo recordar que consigue 160k de texto en la versión +3.

Un saludo.
K.O.D.
Herbert
 
Mensajes: 64
Registrado: Mar Sep 30, 2008 8:45 am
Ubicación: Valencia

Re: Ahorrar memoria en BASIC ZX Spectrum

Notapor Scooter el Sab Oct 14, 2017 9:19 pm

Pues si, usar los caracteres altos me parece mejor opción que el carácter comodín, se ahorra algún byte y es un poco más rápido.

Coñazo relativo, sería cosa de hacer el trabajo en un PC con la opción buscar y reemplazar de un editor de textos.
Primero contar palabras repetidas y luego reemplazar.

Enviado desde mi 5056D mediante Tapatalk
Aquellos chalados en sus viejos cacharros...
Avatar de Usuario
Scooter
Freddy Hardest
 
Mensajes: 709
Registrado: Jue Nov 11, 2010 11:17 pm

Re: Ahorrar memoria en BASIC ZX Spectrum

Notapor AncientBits el Mar Oct 17, 2017 12:47 am

Gracias chavales por vuestra ayuda! Estoy leyendo e intentando asimilar el tutorial de Francisco León para enlazar programas como si fueran uno solo y también echando un vistazo al MuCho que habéis nombrado.

Debo decir que se escapan un poco a mi comprensión, pero llego a entender algo. Si finalmente no llego a darles utilidad práctica espero que al menos algo se me quede... :wink:

Yo inocentemente pensaba que habría algún programa milagroso que me introdujera un código de compresión de texto o algo así...






zup escribió:
AncientBits escribió:Eso me ahorra unos 700kb o así al final del juego, pero querría saber si hay más trucos o maneras de comprimir el texto en BASIC o similar.


700 kb. Eres mi héroe.



:lol: Je, je... ahí veis el nivel "Total Pro" que llevo... ¡Con esos 700Kb mis problemas estarían resueltos! :lol:
Imagen

Imagen

Imagen
Avatar de Usuario
AncientBits
rst 0
 
Mensajes: 9
Registrado: Sab Sep 30, 2017 10:50 am


Volver a Programación y nuevos desarrollos

¿Quién está conectado?

Usuarios navegando este Foro: Bing [Bot] y 2 invitados

cron