Índice de entradas sobre programación del Sinclair QL
El módulo que simula la memoria es reducido, crea unas variables de control, luego una variable de cadena en la que simularé el manejo de la memoria, la inicializa rellenándola con asteriscos, tiene una función para retornar un puntero a un espacio en la "memoria" del tamaño que le pasemos, otra para copiar una cadena a la "memoria" a partir de una posición, y una para presentar la "Memoria" en pantalla.
He rediseñado el sistema ocupando ahora cinco módulos:
- Arbol_Base: Se ocupa de cargar los módulos del programa y presentar un menú de las pruebas.
- Arbol_Utilidades: Funciones comunes a todos los módulos
- Arbol_Nodos: Funciones de manejo de nodos
- Arbol_Nodos_Test: Para efectuar pruebas del manejo de nodos
- Arbol_Memoria: Funciones de manejo de la memoria
- Arbol_Memoria_Test: Pruebas de manejo de la memoria
Veamos las funciones para el manejo de la memoria:
- init_mem: inicializa la memoria con su tamaño mínimo
- init_mem_max(max): inicializa la memoria con un tamaño max, si este es menos del mínimo será el mínimo, definido en 300 bytes. Luego podemos usar las variables globales para ver en minMem el tamaño mínimo, y en maxMem el tamaño definido para la memoria.
- ver_mem: presenta la memoria en pantalla
- MemPos$(i): función auxiliar, la memoria comienza en posición cero, pero las cadenas en la posición 1, lo que hace es retornar el byte en la posición i+1
- GetBytes(bytes): Solicita un hueco de bytes tamaño, y retorna el puntero a donde comienza.
- SaveMem(base, ValorCadena$): Guarda una cadena en la memoria, a partir de una posición
- GetMem$(base,lon): Retorna el contenido de la memoria a partir de la posición indicada, en una cadena de longitud indicada.
7000 REMark *************************************************************
7010 REMark * Librería.: Arbol Binario *
7020 REMark * Modulo...: Memoria *
7030 REMark * Contenido: Rutinas de manejo de memoria *
7040 REMark * Autor....: javu61, septiembre 2024 *
7050 REMark *************************************************************
7060 :
7070 REMark --- Inicializa la memoria con su tamaño mínimo por defecto
7080 :
7090 DEFine PROCedure init_mem
7100 init_mem_max(0)
7110 END DEFine
7120 :
7130 REMark --- Inicializa la memoria con el tamaño que le indicamos
7140 :
7150 DEFine PROCedure init_mem_max(max)
7160 LOCal i
7170 :
7180 minMem = 300
7190 maxMem=max
7200 IF (max < minMem) THEN maxMem=minMem
7210 NULL = -1 : REMark Puntero nulo
7220 ptrBase = 0 : REMark Puntero a la base de la memoria
7230 :
7240 REMark --- Crear la memoria e inicializarla
7250 :
7260 DIM Memoria$(maxMem)
7270 PRINT "Inicializando la memoria (";maxMem;" bytes) ";
7280 Memoria$=FILL$("*",maxMem)
7290 :
7300 END DEFine
7310 :
7320 REMark --- Presentar el contenido de la memoria en pantalla
7330 :
7340 DEFine PROCedure ver_mem
7350 LOCal i
7360 :
7370 PRINT " "; : FOR i=0 TO 4 : PRINT i;"/";i+5;" "; : END FOR i
7380 PRINT
7390 PRINT " "; : FOR i=0 TO 4 : PRINT "| "; : END FOR i
7400 PRINT
7410 PRINT " "; : FOR i=0 TO 4 : PRINT "0123456789"; : END FOR i
7420 :
7430 FOR i=0 TO maxMem-1
7440 IF (i=0) OR ((i MOD 50) = 0) THEN
7450 INK 7 : PRINT : PRINT n2c$(i,3);":"; : INK 4
7460 END IF
7470 PRINT MemPos$(i);
7480 END FOR i
7490 INK 7 : PRINT
7500 END DEFine
7510 :
7520 DEFine FuNction MemPos$(i)
7530 RETurn (Memoria$(i+1))
7540 END DEFine
7550 :
7560 REMark --- Solicita un hueco en memoria de x bytes
7570 :
7580 DEFine FuNction GetBytes(bytes)
7590 LOCal base
7600 :
7610 IF (ptrBase + bytes > maxMem) THEN
7620 PRINT "No hay sitio en la memoria"
7630 base = NULL
7640 ELSE
7650 base = ptrBase
7660 ptrBase = ptrBase + bytes
7670 END IF
7680 RETurn base
7690 END DEFine GetBytes
7700 :
7710 REMark --- Guarda una cadena en la memoria
7720 :
7730 DEFine PROCedure Save_Mem(base, ValorCadena$)
7740 LOCal i,p
7750 :
7760 FOR i=1 TO LEN(ValorCadena$)
7770 p=base+i
7780 IF (p < 1) OR (p > maxMem) THEN
7790 PRINT " *** Sobrepasa la memoria "
7800 EXIT i
7810 ELSE
7820 Memoria$(base+i)=ValorCadena$(i)
7830 END IF
7840 END FOR i
7850 END DEFine Save_Mem
7860 :
7870 : REMark --- Recupera una cadena desde la memoria
7880 :
7890 DEFine FuNction GetMem$(base,lon)
7900 LOCal c$,i,p
7910 :
7920 c$=""
7930 FOR i=1 TO lon
7940 p = base + i
7950 IF (p<0 or="" p="">maxMem) THEN
7960
PRINT " +++ Sobrepasa la memoria ";
7970
EXIT i
7980 ELSE
7990
c$=c$ & Memoria$(p)
8000
END IF
8010
END FOR i
8020
RETurn c$
8030 END DEFine GetMem
8040 :
Para ejecutar solo debéis cargar el módulo Arbol_Base y ejecutarlo, se encargará de cargar el resto de módulos y presentar el menú. Los módulos los podéis descargar de este enlace.
En este momento el sistema pasa los test, pero al final del segundo da un error que no tiene nada que ver, y no consigo localizar, a ver si alguno ve donde puede estar el problema.
No hay comentarios:
Publicar un comentario