Historial de desarrollo de La legionela del pisto en 2011

Descripción del contenido de esta página

Historial de desarrollo en 2011 del proyecto La legionela del pisto, una aventura conversacional en Beta BASIC 4.0+D (con formato BBim) para ZX Spectrum.

2011-03-03

Antes de iniciar los cambios para tener preparadas las matrices de datos en el disquete (de forma que durante el inicio del programa solo sea necesario copiarlas al disco RAM), cronometré el proceso de arranque: cuarenta minutos tardan los programas auxiliares en preparar las matrices de datos y textos en el disco RAM, con el emulador al 100% de la velocidad de la ZX Spectrum.

Primeras modificaciones en el sistema de preparación de datos.

2011-03-04

Terminado el nuevo sistema de preparación de datos: El programa Library se llama ahora Init; hace lo mismo que antes pero en lugar de pasar el control a Texts copia las matrices de datos desde el disquete al disco RAM y después pasa el control a Main. Los antiguos programas Texts y Data ahora se llaman MakeTexts y MakeData y ya no son necesarios en la primera ejecución del juego: construyen las matrices de datos en el disquete (con una copia intermedia en el disco RAM).

Nuevos procedimientos volantes en el programa Init: ramToDisk, diskToRam...


9091 DEF PROC eraseRD f$
       LOCAL c$,pointer
       LET c$=CAT$(),pointer=LEN c$-12,f$=(f$+"          ")( TO 10)
       DO WHILE pointer>0
         IF f$=c$(pointer TO pointer+9) THEN ERASE !f$
         EXIT IF 1
9092     LET pointer=pointer-13
       LOOP 
     END PROC 

9375 DEF PROC ramToDisk f$
       CLOSE #*4
       OPEN #4;d*;f$RND
       LIST #4;!f$
       CLOSE #*4
     END PROC 

9378 DEF PROC diskToRam f$
       eraseRD f$
       CLOSE #*4
       OPEN #4;d*;f$RND
       INPUT #4;!f$
       CLOSE #*4
     END PROC 

2011-03-05

Ajustes finales en el nuevo sistema de arranque.

El programa Init hace una copia de sus procedimientos volantes en el disquete, para que los programas MakeTexts y MakeData los carguen de ahí y no dependan de que Init haya sido ejecutado y los haya creado en el disco RAM.

Nuevos procedimientos volantes en el programa Init: eraseOver, formatRD, listTexts...


9390 DEF PROC formatRD
       DO UNTIL CAT$()=""
         ERASE !CAT$()( TO 10)
       LOOP 
     END PROC 

9395 DEF PROC eraseOver f$,drive
       DEFAULT drive=INT PI
       LOCAL d$
       LET d$="12*"(drive)
       KEYIN " SAVE OVER d"+d$+";f$ CODE 0,0: ERASE d"+d$+";f$"
     END PROC 

Comprobación de la descripción escrita de la estructura de las matrices de datos.

Seguimiento de un error en la impresión de textos.

Nuevo programa CopyOvrls, para copiar los procedimientos volantes desde el disco RAM al disquete sólo cuando sea necesario actualizarlos, y evitar que Init haga el trabajo en cada ocasión.

Corregida sintaxis de INARRAY en el proc getFirstHere de Main.

2011-03-06

En el disquete quedaban dos entradas de directorio libres de las 80 predeterminadas. Lo copié a una nuevo formateado con FORMAT d2,7 para tener 140 entradas. Quizá en algún momento hagan falta más entradas o usar dos disquetes.

Corregido el fallo que dejaba parte de la matriz de textos en blanco: el programa MakeData tenía que ejecutarse justo a continuación de MakeTexts, como ocurría en el sistema de arranque anterior, pues MakeData también añade textos a la matriz. Ahora MakeTexts, cuando termina su tarea, arranca MakeData y este al final copia del disco RAM al disquete la versión actualizada de las matrices de textos.

Reorganizado el sistema de transferencia de variables en ficheros: Init crea initVars, que será leído por MakeTexts; MakeTexts creará textsVars, que será leído por MakeData; MakeData creará el fichero final, vars, que será leído por Main.

En Main

Sustituidas las llamadas dobles a getEntName y getEnArticle por getEntAName.

Nuevo proc tellNLtext, para llamar desde tellError.

Proc text renombrado getText pues se trata de una seudofunción con parámetro por referencia.

En Init

Parámetro opcional en proc setupOverlays, para copiar los procedimientos volantes del disco RAM al disquete sobre la marcha. Así no hay que cargar CopyOvrls para actualizarlos.

Incluido como procedimiento volante el proc showLocs, que formaba parte del sistema depuración de Main.

Nuevo procedimiento volante debugData para mostrar una lista de valores de cualquier tipo en los puntos de depuración.


9409 DEF PROC debugData DATA 
       LOCAL d,d$,datum
       LET datum=ITEM()
       DO WHILE datum
         IF datum=1 THEN 
           READ d$
         ELSE READ d
           LET d$=STR$ d
9410     tell d$,debugInk
       LOOP 
     END PROC 

2011-03-07

Nuevos gráficos de escenarios.

Nuevo sistema para salvar la zona de texto de la pantalla al mostrar un nuevo gráfico. El sistema antiguo salvaba toda la pantalla en el disco RAM, con lo que al recuperarla quedaba el borde del gráfico del escenario anterior:


1940 DEF PROC describeLocation
       LOCAL n$,s$
       LET s$="scr.tmp"
       eraseRD s$
       SAVE !s$SCREEN$ 
       showgraphic
       LOAD !s$SCREEN$ 
       getEntAName location,n$
       tellNL "Estoy en "+n$+"."
       listPresentEnts
       action_EXITS
     END PROC 

2010 DEF PROC showGraphic
       LOCAL g
       LET g=!ent#(location,fGraphic)
       IF g THEN loadgraphic g
2020 END PROC 
     
2030 DEF PROC loadGraphic g
       LOAD d*"scr-"+STR$ g SCREEN$ 
       PAUSE PI
       PAUSE VAL "1e3"
     END PROC 

El sistema nuevo usa GET por líneas (no se puede hacer entero, que sería mucho más rápido, por falta de memoria, pues se necesitarían más de 5 KiB para guardar la zona de pantalla en una cadena de texto), las salva en una matriz del disco RAM y las recupera después con PLOT. Solo queda resolver un problema con el estado de OVER y CSIZE, para evitar usarlos en cada PLOT:


  70 DIM !win$(19,280)
     REM temp storage for window content

1950 DEF PROC describeLocation
       LOCAL n$
       showGraphic
       getEntAName location,n$
       tellNL "Estoy en "+n$+"."
       listPresentEnts
       action_EXITS
     END PROC 
     
2020 DEF PROC showGraphic
       LOCAL g,row,r$,y
       LET g=!ent#(location,fGraphic)
       IF NOT g THEN GO TO 2070
2030   LET row=1
       FOR y=23 TO 159 STEP 8
         GET r$,16,y,28,1;1
         LET !win$(row)=r$
         LET row=row+1
       NEXT y
       GET o$,16,7,28,1;1
       LET !win$(row)=r$
2040   loadGraphic g
2050   LET r$=!win$(19)
       PLOT CSIZE 0; OVER 0;16,7;r$
2060   LET row=1
       FOR y=23 TO 159 STEP 8
         LET r$=!win$(row)
         PLOT CSIZE 0; OVER 0;16,y;r$
         LET row=row+1
       NEXT y
2070 END PROC 
     
2080 DEF PROC loadGraphic g
       LOAD d*"scr-"+STR$ g SCREEN$ 
       PAUSE PI
       PAUSE VAL "1e3"
     END PROC 

Pero resulta que PLOT, en su función ampliada de situar gráficos, usa los atributos de impresión de la ventana de salida. Para corregir los efectos indeseados había que usar CSIZE 0 y OVER 0 para modificar PLOT, y además guardar primero los valores de las variables de Beta BASIC WXCOORD y WYCOORD (direcciones de memoria 57364 y 57365) y restaurarlos tras la operación. Por suerte había un sistema más sencillo y rápido: cambiar temporalmente a la ventana 0 durante la restauración de la pantalla. Además, no hacía falta salvar y restaurar la zona de entrada de comandos, pues inmediatamente se borraría:


1340DEF PROC showGraphic
       LOCAL g,r,r$,y
       LET g=!ent#(location,fGraphic)
       IF g THEN 
         LET r=0
         FOR y=23 TO 159 STEP 8
           GET r$,16,y,28,1;1
           LET r=r+1,!win$(r)=r$
         NEXT y
         loadGraphic g
         WINDOW 0
         FOR y=159 TO 23 STEP -8
           PLOT 16,y;!win$(r)
           LET r=r-1
         NEXT y
         WINDOW oWin
1350 END PROC 

¿Y por qué no hacer la restauración en un solo paso? Para ello sólo bastaría unir las filas obtenidas por GET con los caracteres de control adecuados:


  70 DIM !win$(18*284+1)
     REM temp storage for window content

1340 DEF PROC showGraphic
       LOCAL c$,g,r,r$,y
       LET g=!ent#(location,fGraphic),c$=CHR$ 10+CHR$ 13+CHR$ 3+CHR$ 3
       IF g THEN 
         LET r=1
         FOR y=23 TO 159 STEP 8
           GET r$,16,y,28,1;1
           LET !win$(r TO r+284)=r$+c$,r=r+284
         NEXT y
         loadGraphic g
         WINDOW 0
         PLOT 16,159;!win$()
         WINDOW oWin
1350 END PROC 

Pero el comando PLOT provocaba un error de memoria porque al parecer necesita copiar toda la cadena desde el disco RAM antes de pasarla a la pantalla. Se podía imprimir por grupos de líneas, tantas como la memoria libre permitiera, pero eso no suponía mucha ventaja respecto a restaurar la pantalla línea por línea.

2011-08-31

Impresión de todo el código fuente para obtener ficheros de texto y convertirlos al formato BBim, aún en desarrollo.

2011-09-26

Código fuente pasado a formato BBim.

Páginas relacionadas

Glosario

BASIC
Beginner's All-Purpose Symbolic Instruction Code (código polivalente de instrucciones simbólicas para principiantes)
BBim
Beta BASIC improved (Beta BASIC mejorado)
KiB
kibiocteto (1024 octetos)
RAM
Random Access Memory (memoria volátil de lectura y escritura)