Manual de programación del ZX Spectrum para (muy) torpes

(http://moebiuspuck.wordpress.com)




CAPÍTULO 9: MAX2: Fabricándonos un escritorio desde BASIC (parte III).

Continuamos con nuestra GUI, que va creciendo, y empezamos con algunos concept artísticos previos que fui realizando y que no son representativos del resultado visual final (pero ya que los hice...); lo dicho y visto en anteriores capítulos: fueron solo un inicial modelo, una referencia, de esas que tienen la extraña tendencia de no cumplirse:
        
A la derecha tenemos, sin embargo, la pinta que va teniendo el GUI actualmente, en dos pantallas. Como siempre, añadimos nuevos fondos de pantalla (aka. wallpaper). La idea es seguir dándole algunas pinceladas ligeras al pequeño y rústico interface gráfico que venimos programando desde hace dos partes (capítulos 2 y 5 de este mismo Manual, léanse o déseles un mínimo vistazo para enterarse de qué va éste, no voy a repetirlo todo desde el principio) y que no lleguemos a notar demasiado los límites (sobretodo en lo que respecta a tiempos de espera) que implica usar el Sinclair +3BASIC interpretado como esqueleto sobre el que descansa buena parte de la pseudo-aplicación* (ver nota).

Realmente las modificaciones en esta versión serán bastante pocas: retoques menores intentando optimizar el código hay dispersos mil, entrar a explicar cada uno sería largo y soporífero. Solo comentaré los cambios mayores añadidos, que como dije no son muchos.

Por lo pronto, el fichero de arranque del disco lo vamos a dejar tal que así:

Con respecto al antiguo, lo más relevante es la carga directa a RAM de los UDG: por temas de memoria necesitamos liberar espacio en M: y además la única salida del programa, con "CATFREE7.BAS", no afecta a los UDG. No copiar ese fichero al disco RAM suponen 2K libres más (el archivo realmente solo ocupa 152 bytes, es por culpa del +3DOS).

Recordad que dejamos del capítulo anterior pendiente el "Double Screen Mode", nombre tras el que escondemos algo así como dos proto-pseudo-escritorios entre los que cambiamos simplemente a golpe de click del botón derecho del ratón, así veloz flash rantanflás, sin más tonterías; este botón hasta ahora no lo usábamos para nada. El concepto de "Double Screen", tal y como lo vamos a implementar, implica que los iconos queden asociado a una u otra "Screen" (vamos, lo que es poner una variable a 1 y que puede ser alguna de las direcciones en RAM que usamos como variables), lo que se traduce por otra parte en un saco de sentencias IF (no particularmente rápidas) que tenemos que distribuir por los IF de los click_X_Y relacionados con iconos del escritorio, que son unos cuantos (los IF, no los iconos). 

Nuestra interface
gráfica crece sana...
La incorporación del fondo "vertical" en esta versión va a correr a cargo de la demoscene, dado que para la tontolluada esa del "Double Screen" quiero emplear lo que serían imágenes extendidas, ya sea del doble de alto o del doble de ancho, al objeto de crear el efecto visual o la sensación de "escritorio extendido"; este tipo de imágenes no son muy habitual de ver en el Spectrum. Esto lo podríamos crear sin embargo de varias formas, p.ej.: haciendo screenshots de los fondos de juegos con esos diferentes tipos de scroll, si alguno de ellos fuera lo suficientemente interesante en blanco y negro como para incorporarlo de wallpaper al MAX2. Pero debido a la exquisitez gourmet y a la actitud perruna que nos caracteriza y que es ya seña de identidad del MAX2, y también a la casualidad de haberlo encontrando dando un garbeo vagabundoso por https://www.youtube.com/watch?v=_k1j0ScEpfA, queda incorporada por unanimidad lo que en su origen es una secuencia animada scrollada vertical con tinta roja sobre fondo amarillo con brillo 0, aparecida en esta vistosa demo: http://www.pouet.net/prod.php?which=61315La obra, en su conjunto, se llama "Dozen Megademo", realizada por el grupo Hacker VBI y publicada en abril de 2013 para la AAA ZX Spectrum demo compo 2013. Distribuida en un disco .TRD (ergo, para BetaDisk/TR-DOS), vamos a proceder a sacar la imagen scrollada y la adaptamos y retocamos artísticamente (con permiso telepático de sus autores), como venimos haciendo hasta ahora con todas las imágenes que hemos ido pillando, para que encaje guay-coherente en la estética blanquinegra que queremos seguir manteniendo. Guardamos la parte del scroll que nos interesa como dos imágenes SCREEN$ en el disco con el resto del programa. Estrictamente hablando, no son dos pantallas enteras, se solapa una parte, por lo que he estado por despedazarlas en las tres franjas horizontales de imagen que ya conocemos (ver Capítulo 2) a ver si con eso ahorraba en RAM, pero no, y además ralentizamos; he probado también con un par de compresores de imagen, pero el ahorro no es significativo. Todo esto lo digo porque actualmente el conjunto de programas que grabamos en el disco RAM ya lo viene a ocupar casi por completo, con lo que solo nos caben dos pantallas. Esta va a ser una variable muy importante a tener en cuenta en las ampliaciones siguientes que hagamos al sistema. Como ejemplo de doble pantalla "horizontal" voy a improvisar algo yo mismo:

 . 
Aspecto de nuestro fondo "horizontal"

Si nos vamos a lo que es el código, qué pantalla de las dos posibles está en uso lo vamos a PEEKear y POKEar:

  94 IF PEEK 59999=THEN LOAD "m:{img_d1}.scr" SCREEN$
  96 IF PEEK 59999=THEN LOAD "m:{img_d2}.scr" SCREEN$

La parte que corresponde a los iconos la asociaremos a otra posición de memoria:

 130 IF PEEK 59997=0 THEN FLASH FN z(0,28,10):PRINT OVER 1;PAPER 6;
     INK 0;AT 1,29;" ";AT 2,29;"  ":LET bt=56:LET li=4:LET co=45:LET 
     p$="System":RANDOMIZE USR 64564
 135 IF PEEK 59997=1 AND PEEK 59999=1 THEN FLASH FN z(0,28,10):PRINT 
     OVER 1;BRIGHT 0;PAPER 6;INK 0;AT 1,29;"  ";AT 2,29;"  ":LET bt=56:LET 
     li=4:LET co=45:LET p$="System":RANDOMIZE USR 64564
 137 IF PEEK 59997=2 AND PEEK 59999=0 THEN FLASH FN z(0,28,10):PRINT 
     OVER 1;BRIGHT 0;PAPER 6;INK 0;AT 1,29;"  ";AT 2,29;"  ":LET bt=56:
     LET li=4:LET co=45:LET p$="System":RANDOMIZE USR 64564
 140 PRINT PAPER 0;INK 2;OVER 0;BRIGHT 1;AT 20,0;"C";AT 21,0;"D"
 145 IF PEEK 59997=0 OR PEEK 59999=1 THEN FLASH FN z(18,28,24):PRINT 
     OVER 1;INK 1;PAPER 5;AT 19,29;"  ";AT 20,29;"  "
 147 IF PEEK 59997=0 OR PEEK 59999=0 THEN FLASH FN z(0,0,9):FLASH FN 
     z(3,0,9):PRINT OVER 1;PAPER 7;INK 1;BRIGHT 1;AT 1,1;"  ";AT 2,1;
     " A";AT 4,1;"  ";AT 5,1;" B"
 279 REM -----------------------
 280 GOSUB 9900
 282 LET btn=1 IF PEEK 59999=1 THEN POKE 59999,0:GO TO 80
 283 LET btn=1 IF PEEK 59999=0 THEN POKE 59999,1:GO TO 80
 285 IF ATTR(1,1)=121 THEN IF x>5 AND x<25 AND y>5 AND y<25 THEN LOAD 
     "a:":GO SUB 330:GO TO 1000
 286 IF ATTR(4,1)=121 THEN IF x>5 AND x<25 AND y>30 AND y<46 THEN LOAD 
     "b:":GO TO 1000
 290 IF ATTR(2,29)=48 THEN IF x>230 AND x<250 AND y>5 AND y<35 THEN
     GO TO 490
 300 IF ATTR(20,29)=41 THEN IF x>230 AND x<250 AND y>150 AND y<180 THEN 
     GO SUB 330:GO TO 440

Con lo anterior quda resuelto grosso modo el tema del escritorio. De la demo 1 a la demo 2 como se recordará desdoblamos la serie "System">"Info." a "System">"Screen/Info". Para esta tercera, vamos a desdoblar "Info." también en dos ventanas, "Info/Vars". De esta manera dejamos una ventana solo para variables del sistema (hay que meter más de las que hay, obviously) y dejamos otra para la información sobre los autores de los ingredientes que van componiendo el coktail MAX2. Añadiremos un cuarto botón, "List", que lo que hará es eso, un LIST del código fuente "MAX2.BAS". Como empleamos el comando BASIC, si respondemos NO ante la pregunta de si queremos seguir con el scroll del listado salimos al editor de BASIC. Teclear GOTO1 en ese caso para volver al programa y listo.

De acuerdo con todo esto, "System" se nos queda así:


Estos cuatro botones dan lugar a estas cuatro ventanas (en el mismo orden en el que están los botones):

  .  

  .  

Desde la penúltima ventana podemos cambiar la distribución de los iconos (todos en una los pantalla, o distribuidos entre dos, horizontal o verticalmente) y también las imágenes de fondo (pulsando sobre "Change Set"). Las imágenes las he ido emparejando dos a dos, así que he creado una simple para emparejar con la única de la demo 1. Lo cierto es que el nuevo código ahí implementado no es sino duplicación del ya visto en los dos anteriores capítulos, por lo que no lo comentaré. Para quien esté interesado/a, remito al código fuente y su comparación con el de la versión previa. Como se puede ver en la primera de las cuatro ventanas, "SYSTEM.BIN" ha modificado un poco su aspecto y además ahora se carga y arranca desde 56226 (totalmente pegado a "IZX.DRV"). La nueva versión ocupa bastante menos (1'4K). Para ello el listado a compilar debe incluir en el encabezado:

REM : USR 56226
REM : INT+ x

Como antes, remito al código fuente, en el disco el fichero "SYSTEM.BAS", para los cambios menores.

Una segunda cosa a añadir en esta tercera versión de la demo va a ser algo parecido a un salvapantallas. Ahora mismo, no nos vamos a liar con algo que se active solo, lo que vamos a hacer es añadir un icono a la derecha del de "Exit" (en la banderola desplegable, etiquetado como "Pause") y que el usuario, si se va a ausentar y es responsable, que enchufe el protector de pantalla. Después de mucho mirar arriba y abajo animaciones potenciales, me he decidido por incorporar un pequeño listado de la sección "Trucos" de la MicroHobby (https://microhobby.speccy.cz/mhforever/numero213.htm, presentado como "Colorín Colorado", por más señas: esa revista la compré en el kiosko en su día, y de hecho este listado lo tecleé en mi +2A, ah, qué tiempos). Es breve y vistoso (ideal). Su autor, David Pérez Pérez, tiene unos cuantos más listados como ese publicados en la MH, también notables visualmente, han sido una tentación todos (véase por ejemplo, en el siguiente número de la MH, el presentado como "Simetricolor", http://microhobby.speccy.cz/mhf/214/MH214_13.jpg). Como el listado es el mismo, pues tampoco hace falta entrar a comentarlo. En el código fuente en el fichero "MAX2.BAS" se encuentra entre las líneas 900 y 931.

El fichero con todo lo necesario es el siguiente (en negrita y cursiva los ficheros que se copian al disco RAM):

FILE_INFO:
 Name:Size: 
Description: 


 
  1.    CAT7.BIN
  2.    CATFREE7.BAS 
  3. DISK
  4.    FREE7.BIN
  5. FS
  6. IMG0.SCR
  7. IMG1.SCR
  8. IMG2.SCR
  9. IMG3.SCR
  10. IMG4.SCR
  11. IMG5.SCR
  12. LEEME.BAS
  13. LEEME.TXT
  14.    MAX2.BAS
  15. MAX2.UDG
  16. SYSTEM.BAS
  17.    SYSTEM.BIN
  18. TS
  19.    {IMG1}.SCR
  20.    {IMG2}.SCR
  21.    {IZX}.DRV
  22.    {MOUSE}.DRV
  23.    {MPRINT}.DRV 
  •  1K
  •  2K
  •  1K
  •  1K
  •  1K
  •  7K
  •  7K
  •  7K
  •  7K
  •  7K
  •  7K
  •  1K
  •  1K
  • 12K
  •  1K
  •  2K
  •  2K
  •  1K
  •  7K
  •  7K
  •  2K
  •  1K
  •  2K
  • Fichero binario
  • Fichero BASIC. Auto-arranque (LINE 1)
  • Fichero BASIC. Auto-arranque (LINE 1)
  • Fichero binario
  • Fichero de datos
  • Pantalla SCREEN$
  • Pantalla SCREEN$
  • Pantalla SCREEN$
  • Pantalla SCREEN$
  • Pantalla SCREEN$
  • Pantalla SCREEN$
  • Fichero BASIC. Auto-arranque (LINE 1)
  • Fichero ASCII
  • Fichero BASIC. Auto-arranque (LINE 10)
  • User Defined Graphics
  • Fichero BASIC. Para compilar (HiSoft BASIC)
  • Fichero binario. De "system.bas"
  • Fichero de datos
  • Pantalla SCREEN$
  • Pantalla SCREEN$
  • Fichero binario. Driver e iconos IZX
  • Fichero binario. Control del ratón
  • Fichero binario. Rutina Micro-PRINT 85

- MAX2.dsk

- leeme.txt

 
 - 191K

 - 1K

- Imagen de disco para
 emulador
- Fichero ASCII

 MAX2v3.dsk.zip
 
 38K


 Fichero comprimido



* Nota: ¿Por qué pseudo-aplicación? Vamos a ver: lo único que podemos hacer a fecha de hoy con este programa es 1- configurar los fondos de pantalla (mu monito) y 2-hacer un CAT bastante rústico, lento y limitado; vamos, que para eso no hace falta correr. Demos por ejemplo un vistazo a los primitivos primeros pasos de los GUI en entornos Intel (GEM y ViewMAX, DOS-Shell, Windows en sus primeras encarnaciones) para saber cuál era su aporte y ventajas con respecto a la shell de texto a la que pretendían substituir.  Por eso, MAX2 actualmente es simplemente una simulación, una imitación muy limitada de lo que sería un entorno GUI, pero leeeeeejos está de ello, no perdamos de vista lo que es. Por otra parte, un programa de este tipo solo adquiere sentido como utilidad en volúmenes superiores a los 170K que nos da el +3 original básico. Puede que lo mínimo exigible sean las dos disqueteras a doble densidad (720K) y de ahí en adelante. Para el modelo +3e es más patente la utilidad de una herramienta así, y para esta configuración podemos encontrar ya por ejemplo el Workbench +3e o el +3e Drives Explorer.

ċ
MAX2v3.dsk.zip
(37k)
Rambo Petazeta,
6 ago. 2018 9:22
Comments