Mario de Lama
malar@arrakis.es
http://www.arrakis.es/~malar
Una vez todo en la calculadora (si no sabes como se instalan las librerías aprende primero User y luego prueba con System) ve a la librería JAZZ y verás que la primera variable es ASS. Es el comando que compila los programas, sirve tanto para system como para ML o para crear librerías aunque esto último es mucho más fácil con la librería HACK. Muchos otros comandos sirven para system y ML pero yo siempre me voy a referir a la parte system. Si quieres saber más de ellos ve a la documentación de JAZZ que es de donde estoy extrayendo el presente documento.
Para escribir el código fuente debes hacerlo en una cadena que comience por "::" (DOCOL) y termine con ";" (SEMI). El punto y coma último tampoco es necesario. Para compilarlo pon la cadena en 1: y presiona ASS, verás que bonita colección de External obtienes. Vamos a hacer la prueba, escribe lo siguiente:
Ejecuta el comando DIS de JAZZ y verás que obtienes el mismo código ":: CK1 DUP ;"
Si el flag 1 está fijado puedes ver el desarrollo del proceso de compilación en el área de estado de la calculadora pero no te lo recomiendo ya que el proceso se ralentiza mucho. Si durante la compilación se encuentra un error nos aparece una pantalla como la de la Fig.1:
Fig. 1 | Fig. 2 | Fig. 3 |
Fig. 4 |
Ahora si podemos presionar ENTER para regresar a la pila y volver a compilar el fuente (en ED no funciona ON para salir sin guardar los cambios, siempre se sale con ENTER).
Os aconsejo que estudieis la documentación del editor ED (en la documentación de JAZZ). Tiene numerosas funciones que nos facilitan en gran medida la programación. Unos ejemplos:
Los comentarios (texto que no se compilará) pueden introducirse de dos formas:
Es muy conveniente al programar en system el utilizar la base hexadecimal en vez de la decimal.
Cuando deseamos introducir una cadena de caracteres debemos escribirla:
:: ;Esto es: El equivalente System de los programas User. Para saber qué prólogo hay que poner a cada tipo de datos lo mejor es poner el dato deseado en la pila y descompilarlo con DIS. Lo editamos y vemos su estructura.
Cuando deseemos introducir un comando User en el código sólo debemos anteponerle el caracter "x". Por ejemplo, para introducir el comando PICT deberemos compilar
:: xPICT ;
La palabra INCLOB seguida de un nombre de variable global (ID en system) incluye el contenido de dicha variable en el punto en el que se encuentre la etiqueta INCLOB. Ejemplo: Siendo A una variable que contiene: << 2 ->LIST >> si compilamos:
:: %1 %2 INCLOB A ;se obtiene el secondary:
1 2 << 2 ->LIST >>Cuando dentro de la variable no se encuentra un objeto si no código fuente, la etiqueta a poner es INCLUDE. Ejemplo: Siendo A una variable que contiene: "%2 x->LIST" si compilamos:
:: %1 %2 INCLUDE A ;se obtiene el secondary:
1 2 2 ->LISTCuando deseamos hacer una macro utilizaremos DEFINE etiqueta código (todo en una sola fila). En todo lugar del código en el que pongamos la etiqueta el compilador la reemplazará por el código asociado. Ejemplo: Si compilas:
:: DEFINE 4dup DUPDUP DUP 4dup ;y posteriormente lo descompilas obtienes:
:: DUPDUP DUP ;Recuerda que también puedes establecer macros con ED y los comandos MEXEC, MSTART y MEND, todos ellos en la tecla CST.
Las variables temporales (equivalentes a las variables locales de User) pueden ser con nombre o anónimas (NULLLAM). Estas últimas son más rápidas y ocupan menos que las otras pero, al no tener nombre, son más difíciles de usar. JAZZ introduce una fácil forma de usar las variables temporales anónimas. Para introducirlas normalmente escribiríamos:
:: ' (el siguiente comando no se evalúa, sólo se pone en la pila) NULLLAM (pone NULLLAM en la pila) TWO (pone el binary integer 2) NDUPN (duplica NULLLAM) DOBIND (crea las variables) 2GETLAM (trae a la pila el contenido de la 2ª variable) 1PUTLAM (almacena este valor en la 1ª variable) ABND (destruye las variables) ;Con las macros para variables temporales de JAZZ escribiríamos
:: {{ A B }} (no dejar espacios entre las llaves y si entre llave y nombre) B (trae a la pila el contenido de la 2ª variable) A! (almacena este valor en la 1ª variable) ABND (destruye las variables) ;Podeis compilar y descompilar este segundo código. Obtendreis el primero. Para más información ver el apartado 2.2.1 de la documentación de JAZZ
Se puede usar JAZZ sin ED, RPL.TAB o DIS.TAB pero no es nada conveniente. Como habeis podido ver, ED es un editor genial para la programación y necesita para ejecutarse de la librería de fuentes pequeña UFL. También la necesitan el comando EC (sirve para ver el contenido de RPL.TAB) y VV que es un visor de texto y gráficos.
RPL.TAB es una librería que incorpora las direcciones de memoria de los comandos system y su etiqueta de forma que cuando ASS compila se reemplazan las etiquetas por las direcciones de memoria. Si no tenemos RPL.TAB, JAZZ compilará el fuente pero este sólo puede estar formado por las direcciones de memoria de cada comando y descompilará en una cadena formada sólo por direcciones de memoria. Como os podeis imaginar sería casi imposible programar así. RPL.TAB puede modificarse para añadir, quitar o cambiar etiquetas.
EC es un browser muy útil para ver las etiquetas y direcciones de esta tabla, si damos al cursor derecho entramos en el código de la etiqueta que hay en primer lugar del browser. Volvemos de nuevo al estado normal con ENTER. También podemos poner en la pila la dirección, la etiqueta o ambas cosas del comando deseado. Es también muy conveniente tener DIS.TAB si queremos descompilar rápidamente. Gracias a ella DIS hace una búsqueda binaria de las etiquetas en vez de secuencial.
El comando SDB inicia un debugger que vale su peso en oro. Veamos una somera explicación de sus comandos:
El comando SSTK nos introduce en un nuevo Kernel con una pila de 5 niveles y, si el flag 3 está desactivado, permite ver los programas como si estuvieran descompilados con DIS. Desaparecen los External.