Guardar variables en formato .bin y recuperarlas desde basic

Por jorge.romero.9655

Master (147)

Imagen del jorge.romero.9655

31-05-2015, 20:44

Saludos gente.

Sigo programando mi ultimo invento y me convendria muchisimo poder guardar algunas variables en formato .bin para recuperarlas despues desde nestorbasic/basic. Mi idea con esto es sacar todo lo que pueda del turbo bloque y dejar espacio para la propia logica del juego.

Al principio pense en hacer un bsave tras averiguar las posiciones de memoria en que quedan guardadas las variables con un varptr, pero no consigo recuperarlas despues. Algo debo de estar haciendo mal seguro, pero no se me ocurre el que puede ser.

Os dejo una copia del codigo que guarda los datos en una variable bidimensional y despues los guarda en un archivo con nombre "var.bin".

A ver si se os ocurre como puedo solucionarlo, o alguna solucion alternativa que pueda usar para lograr el objetivo de "importar" las variables.

05 DIM A%(9,256)
08 RESTORE 10000: FOR I%=0TO255: READ D%: A%(0,I%)=D%: NEXT I% 
09 RESTORE 10805: FOR I%=0TO255: READ D%: A%(1,I%)=D%: NEXT I% 
10 RESTORE 10880: FOR I%=0TO255: READ D%: A%(2,I%)=D%: NEXT I% 
11 RESTORE 10960: FOR I%=0TO255: READ D%: A%(3,I%)=D%: NEXT I% 
12 RESTORE 11040: FOR I%=0TO255: READ D%: A%(4,I%)=D%: NEXT I% 
13 RESTORE 11130: FOR I%=0TO255: READ D%: A%(5,I%)=D%: NEXT I% 
14 RESTORE 11210: FOR I%=0TO255: READ D%: A%(6,I%)=D%: NEXT I% 
15 RESTORE 11280: FOR I%=0TO255: READ D%: A%(7,I%)=D%: NEXT I% 
16 RESTORE 11360: FOR I%=0TO255: READ D%: A%(8,I%)=D%: NEXT I% 
20 VC%=VARPTR(A%(0,0)): VF%=VARPTR(A%(8,255))
30 PRINT VC% 
40 PRINT VF%
50 BSAVE"VAR.BIN",VC%,VF%
10000 'PISTAS
10100 DATA 0,0,0,0,0,0,0,0,0,0,0,1,2,3,4,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
10200 DATA 0,0,0,0,0,0,0,6,19,50,9,9,9,15,51,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
10300 DATA 0,0,0,0,0,6,7,8,9,9,9,9,9,9,9,10,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
10400 DATA 0,0,0,0,12,8,9,9,9,9,9,9,9,9,9,9,9,22,13,14,0,0,0,0,0,0,0,0,0,0,0,0
10500 DATA 0,0,0,12,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,10,13,14,0,0,0,0,0,0,0,0,0
10600 DATA 0,0,12,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,10,13,0,0,0,0,0,0,0
10700 DATA 0,12,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,15,16,17,0,0,0,0
10800 DATA 12,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,15,16,17,0

10805 DATA 0,0,0,0,0,0,0,0,0,0,0,0,18,19,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
10810 DATA 0,0,0,0,0,0,0,0,6,19,20,9,9,9,15,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
10820 DATA 0,0,0,0,0,0,6,7,8,9,9,9,9,9,9,9,22,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0
10830 DATA 0,0,0,0,0,52,8,9,9,9,9,9,9,9,9,9,9,9,22,31,32,0,0,0,0,0,0,0,0,0,0,0
10840 DATA 0,0,0,0,23,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,10,17,0,0,0,0,0,0,0,0,0
10850 DATA 0,0,6,38,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,15,44,39,0,0,0,0,0,0
10860 DATA 0,6,24,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,25,26,14,0,0,0
10870 DATA 53,8,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,16,17,0

10880 DATA 0,0,0,0,0,0,0,0,0,0,0,0,6,2,27,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
10890 DATA 0,0,0,0,0,0,0,0,0,0,29,20,9,9,9,9,54,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
10900 DATA 0,0,0,0,0,0,0,0,29,30,9,9,9,9,9,9,9,15,31,14,0,0,0,0,0,0,0,0,0,0,0,0
10910 DATA 0,0,0,0,0,0,52,30,9,9,9,9,9,9,9,9,9,9,9,15,31,32,0,0,0,0,0,0,0,0,0,0
10920 DATA 0,0,0,0,6,23,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,10,11,0,0,0,0,0,0,0,0
10930 DATA 0,0,0,53,30,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,22,26,14,0,0,0,0,0
10940 DATA 0,0,7,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,15,16,32,0,0,0
10950 DATA 33,24,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,40,13,0

10960 DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,33,19,34,35,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
10970 DATA 0,0,0,0,0,0,0,0,0,0,0,2,20,9,9,9,9,55,14,0,0,0,0,0,0,0,0,0,0,0,0,0
10980 DATA 0,0,0,0,0,0,0,0,0,36,37,9,9,9,9,9,9,9,9,16,32,0,0,0,0,0,0,0,0,0,0,0
10990 DATA 0,0,0,0,0,0,0,36,37,9,9,9,9,9,9,9,9,9,9,9,9,16,32,0,0,0,0,0,0,0,0,0
11000 DATA 0,0,0,0,0,33,38,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,16,39,0,0,0,0,0,0,0
11010 DATA 0,0,0,0,7,8,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,40,11,0,0,0,0,0
11020 DATA 0,0,36,30,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,40,13,0,0,0
11030 DATA 33,38,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,22,13,0

11040 DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,37,40,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0
11050 DATA 0,0,0,0,0,0,0,0,0,0,0,0,36,37,9,9,9,9,40,11,0,0,0,0,0,0,0,0,0,0,0,0
11060 DATA 0,0,0,0,0,0,0,0,0,0,36,37,9,9,9,9,9,9,9,9,40,11,0,0,0,0,0,0,0,0,0,0
11070 DATA 0,0,0,0,0,0,0,0,36,37,9,9,9,9,9,9,9,9,9,9,9,9,40,11,0,0,0,0,0,0,0,0
11080 DATA 0,0,0,0,0,0,36,37,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,40,11,0,0,0,0,0,0
11090 DATA 0,0,0,0,36,37,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,40,11,0,0,0,0
11100 DATA 0,0,36,37,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,40,11,0,0
11110 DATA 36,37,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,40,11
11120 DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,25,26,32,0,0,0,0,0,0,0,0,0,0,0,0,0

11130 DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,6,56,9,9,9,9,10,17,0,0,0,0,0,0,0,0,0,0,0
11140 DATA 0,0,0,0,0,0,0,0,0,0,0,33,41,9,9,9,9,9,9,9,9,40,11,0,0,0,0,0,0,0,0,0
11150 DATA 0,0,0,0,0,0,0,0,0,33,41,9,9,9,9,9,9,9,9,9,9,9,9,40,11,0,0,0,0,0,0,0
11160 DATA 0,0,0,0,0,0,0,1,41,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,42,32,0,0,0,0,0
11170 DATA 0,0,0,0,0,36,37,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,15,31,0,0,0,0
11180 DATA 0,0,0,29,37,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,22,11,0,0
11190 DATA 0,29,30,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,42,32
11200 DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,43,44,17,14,0,0,0,0,0,0,0,0,0,0,0,0

11210 DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,57,9,9,9,9,10,13,0,0,0,0,0,0,0,0,0,0
11220 DATA 0,0,0,0,0,0,0,0,0,0,0,0,6,7,8,9,9,9,9,9,9,9,22,13,0,0,0,0,0,0,0,0
11230 DATA 0,0,0,0,0,0,0,0,0,0,33,7,8,9,9,9,9,9,9,9,9,9,9,9,22,58,0,0,0,0,0,0
11240 DATA 0,0,0,0,0,0,0,0,36,20,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,45,14,0,0,0,0
11250 DATA 0,0,0,0,0,6,19,30,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,22,51,0,0,0
11260 DATA 0,0,0,33,41,8,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,31,0,0
11270 DATA 0,29,37,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,47,32

11280 DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,46,10,26,18,0,0,0,0,0,0,0,0,0,0,0,0
11290 DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,8,9,9,9,10,26,14,0,0,0,0,0,0,0,0
11300 DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,29,30,9,9,9,9,9,9,9,15,31,14,0,0,0,0,0,0
11310 DATA 0,0,0,0,0,0,0,0,0,0,0,33,7,30,9,9,9,9,9,9,9,9,9,9,9,15,58,0,0,0,0,0
11320 DATA 0,0,0,0,0,0,0,0,0,2,20,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,45,0,0,0,0
11330 DATA 0,0,0,0,0,0,1,27,8,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,42,14,0,0
11340 DATA 0,0,0,6,19,34,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,47,14,0
11350 DATA 0,2,41,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,15,51

11360 DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,49,3,17,39,0,0,0,0,0,0,0,0,0,0,0
11370 DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,53,8,9,9,9,50,26,14,0,0,0,0,0,0,0
11380 DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,20,9,9,9,9,9,9,9,15,31,14,0,0,0,0,0
11390 DATA 0,0,0,0,0,0,0,0,0,0,0,0,6,29,30,9,9,9,9,9,9,9,9,9,9,9,15,35,0,0,0,0
11400 DATA 0,0,0,0,0,0,0,0,0,6,29,20,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,35,0,0,0
11410 DATA 0,0,0,0,0,0,0,29,20,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,35,0,0
11420 DATA 0,0,0,0,2,41,8,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,35,0
11430 DATA 0,2,41,8,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,35 
Login sesión o register para postear comentarios

Por AxelStone

Prophet (2956)

Imagen del AxelStone

01-06-2015, 10:45

Me vas a hacer trabajar. La solución se llama segmento 0, la uso en mi proyecto de juego (algo parado me temo Crying ) y te va a permitir hacer todo lo que tu quieres. Al final todos topamos con los mismos problemas en TB, y justo se me ocurrió la misma solución en 2 pasos:
1.- Hago un loader independiente con todos los DATAs, tal como pones aquí.
2.- En el motor del juego los recupero al segmento 0, fuera del turbo bloque, dejando toda la memoria disponible.

Como te he dicho en el otro hilo, en cuanto pueda te pongo aquí los fuentes. Esta semana la tengo muy apretada en el trabajo, no te extrañe si no los pongo esta noche, pero lo tengo presente en cuanto saque un hueco Wink

Por jorge.romero.9655

Master (147)

Imagen del jorge.romero.9655

01-06-2015, 14:10

Muchas gracias tocayo, vale usted un potosí. Wink

Por AxelStone

Prophet (2956)

Imagen del AxelStone

02-06-2015, 22:42

Uff vaya días, mira las horas a las que llego a casa Crying
Bueno, aquí tengo los fuentes, te pongo básicamente lo que hago porque me parece que por ahí van los tiros:

Paso 1: cogemos todos los DATA y los guardamos en un archivo. Este programa solo lo lanzarás una vez para que te genere el .dat, luego no necesitas lanzarlo más veces.

10 DIM Z%(72)
20 FOR A=1 TO 72:READ Z%(A):NEXT A
30 DATA 0,0,22,42,64,84,106,106,128,148,170,190
40 DATA 15,21,41,63,83,105,121,127,147,169,189,211
50 DATA 124,134,124,124,124,124,124,134,124,124,124,124
60 DATA 133,145,147,155,155,155,133,145,147,155,155,155
70 DATA 2,0,0,0,0,0,2,0,0,0,0,0
80 DATA 22,20,4,0,0,0,22,20,4,0,0,0
90 COPY Z% TO "ZOMBIE.DAT"

Paso 2: Aquí llega la gracia. El fichero almacenado puede recuperarse sobre el slot 0 de memoria de modo que las variables están ahí. Te preguntarás ¿y no puedo saltarme el paso 1 y guardar en el slot 0 directamente los DATAs? Sí y no, la gracia está en que el COPY es tremendamente rápido dentro de un turbo bloque, y cargarás todas las variables a la velocidad del rayo, bastante más rápido que usar los DATAs.

10 CLS
20 DEFINT A-Z
30 CLS:LOCATE 24,10:PRINT "Loading chars..."
40 DIM Z%(72)
60 COPY "ZOMBIE.DAT" TO Z%
100 CALL TURBO ON(A%(),Z%(),G%(),P%(),S%())
170 ' Zombie: posiciones 321-392
180 FOR A%=1 TO 72
190 V%=Z%(A):AD%=A%+320
200 '#I 58,V%,95,58,65,243,42,AD%,205,20,0
210 NEXT A%
...

La gracia está en la línea 200: estamos almacenando las variables en la página 0, a partir de la posición 320. Digamos que esa línea hace las veces de POKE. Este loader lo lanzas antes de ejecutar el motor principal del juego, y guardará en la zona baja de memoria tantas variables como necesites iniciar. Tienes hasta 16Kb para guardar datos.

Paso 3: Leer cada variable.

60 'V=PEEK(AD)
70 '#I,58,65,243,42,AD,205,12,0,50,V

Después del loader puedes ejecutar el motor principal, contando con los 10Kb del Turbo Basic el loader lo puedes borrar ya que ha hecho su trabajo, dejar las variables cargadas.

Espero que te sea de provecho.

Por jorge.romero.9655

Master (147)

Imagen del jorge.romero.9655

03-06-2015, 20:52

¡Gracias mil don Jorge! Big smile

Tengo una duda. He estado probando los codigos que has publicado, pero hay una cosa que no he terminado de entender muy bien.

He creado un primer archivo con el codigo que graba un archivo "var.dat" es basicamente un calco del tuyo con mis variables.

A continuacion cargo un archivo practicamente igual que tu segundo bloque, en el que leo el archivo "var.dat" y lo vuelco en memoria.

El problema surge si despues hago un load a un tercer archivo con las lineas del ultimo bloque

60 'V=PEEK(AD)
70 '#I,58,65,243,42,AD,205,12,0,50,V

En ese archivo ya no lee los valores de la variable. Es como si hubiera machacado la informacion al hacer el load. ¿Lo estoy haciendo mal?

Si lo hago justo despues de leer el archivo "var.dat" los leo guay, pero ese trocito de codigo lo tengo que dejar en el mismo archivo. Para lo que quiero me sirve perfectamente porque apenas son unas cuantas lineas, pero me ha quedado la duda.

Asi queda el archivo que me funciona, ya creado el .dat, si te fijas tengo comentada la linea que hacia el load.

10 CLS
20 DEFINT A-Z
30 CLS:LOCATE 24,10:PRINT "Loading chars..."
40 DIM A%(9,256)
60 COPY "VARS.DAT" TO A%
100 'CALL TURBO ON(A%(),Z%(),G%(),P%(),S%())
180 FORI1%=0TO8: FORI2%=0TO255 
190 V%=A%(I1%,I2%): AD%=320+I1%*I2%+1
200 '#I 58,V%,95,58,65,243,42,AD%,205,20,0
210 NEXT I2%: NEXT I1%
220 'LOAD"REVAR",R
260 'V=PEEK(AD)
270 '#I,58,65,243,42,AD,205,12,0,50,V
280 FORI1%=0TO8: FORI2%=0TO255 : PRINT A%(I1%,I2%): NEXT I2%: NEXT I1%

Por FX

Champion (264)

Imagen del FX

04-06-2015, 23:22

O no he entendido tu pregunta, o creo que AxelStone te ha respondido como grabar y como cargar las variables.
Sería con el COPY "VARS.DAT" to A%
No era eso lo que buscabas? Porque entonces es como digo que no entendí lo que querías hacer...
FX

Por jorge.romero.9655

Master (147)

Imagen del jorge.romero.9655

05-06-2015, 23:09

Me explico un poco mas, porque creo que la segunda pregunta no ha quedado del todo clara.

Lo que buscaba era poder guardar las variables en memoria a partir d otro archivo o un cargador. Eso con lo que me ha explicado Axel ya lo puedo hacer y me viene genial.

Ahora bien: en su explicación tenemos un bloque que hace la copia de los datos a un archivo, ese programa una vez creado el archivo .dat lo podemos borrar si queremos.

Después tenemos otro bloque que hace de loader, volcando esos valores en una zona alta de la memoria.

Por último tenemos otro pequeño bloque que los lee.

Hasta aquí todo bien. El tema es que si después de hacer el volcado de los datos del archivo .dat a la zona alta de la memoria, si después hago un load para cargar el "core" de mi juego e intento acceder a estos valores ya no lo consigo. Es como si estos valores se borraran o ya no pudiera acceder a ellos.

Para conseguir esos valores no puedo hacer un load, tengo que meter el "loader" (segundo bloque de Axel) dentro del motor del juego, no lo puedo aislar en un archivo independiente.

Realmente no es algo súper importante, pero me queda la duda de si se puede hacer y asi tener un código mas limpio y legible. Puede que yo este haciendo algo mal o que simplemente sea así la única forma de hacerlo... de ahí viene mi pregunta.

Por AxelStone

Prophet (2956)

Imagen del AxelStone

07-06-2015, 12:05

Qué tal tocayo, te cuento. Lo que estamos haciendo es guardar las variables en el segmento 0, es algo así como tener unos DATAS persistentes en memoria. En principio un código en BASIC no va a pisar esa zona, salvo que Nestor Basic limpie el segmento 0 al iniciarse. En mi juego el loader va por separado, vuelca todo en el segmento 0, y luego puedo hacer un new y cargar el motor del juego que las variables siguen ahí.

Sobre machacar variables ojo, ¿estás usando las mismas direcciones de memoria para guardar? Porque si es así lo vas a machacar, me explico. En el segmento 0 tenemos 16Kb, léase desde la posición 0-16383 donde guardar valores de los variables.

Tu primer archivo, llamemoslo "var.dat" almacena 100 valores DATA por lo que podrías lanzar el saver desde las posiciones 1 a 99:

180 FOR A%=1 TO 100
190 V%=Z%(A):AD%=A%
200 '#I 58,V%,95,58,65,243,42,AD%,205,20,0
210 NEXT A%

Llega tu 2º archivo, llamemoslo "var2.dat", que almacena 200 valores DATA. Dado que las primeras 100 direcciones están ocupadas, deberás empezar en la 101:

280 FOR A%=101 TO 300
290 V%=Z%(A):AD%=A%
300 '#I 58,V%,95,58,65,243,42,AD%,205,20,0
310 NEXT A%

Digamos que vas colocando las variables una detrás de otra, mientras tengas espacio dentro de esos 16Kb. Anota en un papel dónde estás mandando cada archivo para luego poder recuperarlo. Sabes por ejemplo que var.dat está desde la posición 1, por lo que recuperar sus valores es de la 1 a la 100, pero en el caso de var2.dat los almacenas a partir de la 101 por lo que el primer valor deberás recuperarlo en la posición 101.

Es menos lioso de lo que parece, créeme Wink

Por jorge.romero.9655

Master (147)

Imagen del jorge.romero.9655

09-06-2015, 06:21

Buff... nada don Jorge, que no doy con la tecla. A ver que estoy haciendo mal.

Mis tres archivos:

1.- SAVAR (Crea el .DAT)

05 DIM A%(9,256)
08 RESTORE 10000: FOR I%=0TO255: READ D%: A%(0,I%)=D%: NEXT I% 
09 RESTORE 10805: FOR I%=0TO255: READ D%: A%(1,I%)=D%: NEXT I% 
10 RESTORE 10880: FOR I%=0TO255: READ D%: A%(2,I%)=D%: NEXT I% 
11 RESTORE 10960: FOR I%=0TO255: READ D%: A%(3,I%)=D%: NEXT I% 
12 RESTORE 11040: FOR I%=0TO255: READ D%: A%(4,I%)=D%: NEXT I% 
13 RESTORE 11120: FOR I%=0TO255: READ D%: A%(5,I%)=D%: NEXT I% 
14 RESTORE 11200: FOR I%=0TO255: READ D%: A%(6,I%)=D%: NEXT I% 
15 RESTORE 11280: FOR I%=0TO255: READ D%: A%(7,I%)=D%: NEXT I% 
16 RESTORE 11360: FOR I%=0TO255: READ D%: A%(8,I%)=D%: NEXT I% 
20 COPY A% TO "VARS.DAT"
30 LOAD"LOVAR",R

10000 'PISTAS
10100 DATA 0,0,0,0,0,0,0,0,0,0,0,1,2,3,4,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
10200 DATA 0,0,0,0,0,0,0,6,19,50,9,9,9,15,51,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
10300 DATA 0,0,0,0,0,6,7,8,9,9,9,9,9,9,9,10,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
10400 DATA 0,0,0,0,12,8,9,9,9,9,9,9,9,9,9,9,9,22,13,14,0,0,0,0,0,0,0,0,0,0,0,0
10500 DATA 0,0,0,12,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,10,13,14,0,0,0,0,0,0,0,0,0
10600 DATA 0,0,12,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,10,13,0,0,0,0,0,0,0
10700 DATA 0,12,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,15,16,17,0,0,0,0
10800 DATA 12,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,15,16,17,0
...

2.- "LOVAR" Loader (carga las variables y las vuelca en la pagina 0)

10 CLS:PRINT "Loading chars..."
20 DIM A%(9,256)
30 COPY "VARS.DAT" TO A%
40 FORI1%=0TO8: FORI2%=0TO255 
50 V%=A%(I1%,I2%): AD%=A%+320
60 '#I 58,V%,95,58,65,243,42,AD%,205,20,0
70 NEXT I2%: NEXT I1%
80 LOAD"REVAR",R

3.- Lector (lo que vendria a ser el "core" del juego, pero he creado este para hacer los tests)

10 'V%=PEEK(AD%)
20 '#I,58,65,243,42,AD%,205,12,0,50,V%
30 FORI1%=0TO8: FORI2%=0TO255 : PRINT A%(I1%,I2%): NEXT I2%: NEXT I1%

y nada... como si no estuviera declarada la matriz A%.

Otro test que si me ha funcionado es este:

10 DIM A%(9,256)
20 COPY "VARS.DAT" TO A%
30 FORI1%=0TO8: FORI2%=0TO255 : PRINT A%(I1%,I2%): NEXT I2%: NEXT I1%

Pero claro, aqui no miramos la pagina 0 y no ganamos ese espacio adicional. Para lo que necesito me vale perfectamente, pero me interesa aprender bien la tecnica que comentas.