Í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 defecto7080 :7090 DEFine PROCedure init_mem7100 init_mem_max(0)7110 END DEFine 7120 :7130 REMark --- Inicializa la memoria con el tamaño que le indicamos7140 :7150 DEFine PROCedure init_mem_max(max)7160 LOCal i7170 :7180 minMem = 3007190 maxMem=max7200 IF (max < minMem) THEN maxMem=minMem7210 NULL = -1 : REMark Puntero nulo7220 ptrBase = 0 : REMark Puntero a la base de la memoria7230 :7240 REMark --- Crear la memoria e inicializarla7250 :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 pantalla7330 :7340 DEFine PROCedure ver_mem7350 LOCal i7360 :7370 PRINT " "; : FOR i=0 TO 4 : PRINT i;"/";i+5;" "; : END FOR i7380 PRINT7390 PRINT " "; : FOR i=0 TO 4 : PRINT "| "; : END FOR i7400 PRINT7410 PRINT " "; : FOR i=0 TO 4 : PRINT "0123456789"; : END FOR i7420 :7430 FOR i=0 TO maxMem-17440 IF (i=0) OR ((i MOD 50) = 0) THEN 7450 INK 7 : PRINT : PRINT n2c$(i,3);":"; : INK 47460 END IF 7470 PRINT MemPos$(i);7480 END FOR i7490 INK 7 : PRINT7500 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 bytes7570 :7580 DEFine FuNction GetBytes(bytes)7590 LOCal base7600 :7610 IF (ptrBase + bytes > maxMem) THEN 7620 PRINT "No hay sitio en la memoria"7630 base = NULL7640 ELSE 7650 base = ptrBase7660 ptrBase = ptrBase + bytes7670 END IF 7680 RETurn base7690 END DEFine GetBytes7700 :7710 REMark --- Guarda una cadena en la memoria7720 :7730 DEFine PROCedure Save_Mem(base, ValorCadena$)7740 LOCal i,p7750 :7760 FOR i=1 TO LEN(ValorCadena$)7770 p=base+i7780 IF (p < 1) OR (p > maxMem) THEN 7790 PRINT " *** Sobrepasa la memoria "7800 EXIT i7810 ELSE 7820 Memoria$(base+i)=ValorCadena$(i)7830 END IF 7840 END FOR i7850 END DEFine Save_Mem7860 :7870 : REMark --- Recupera una cadena desde la memoria7880 :7890 DEFine FuNction GetMem$(base,lon)7900 LOCal c$,i,p7910 :7920 c$=""7930 FOR i=1 TO lon7940 p = base + i7950 IF (p<0 or="" p="">maxMem) THEN 0>7960 PRINT " +++ Sobrepasa la memoria ";7970 EXIT i7980 ELSE 7990 c$=c$ & Memoria$(p)8000 END IF 8010 END FOR i8020 RETurn c$8030 END DEFine GetMem8040 :
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