FORTH de K. Wierstra y publicado por Your Computer. Tras cargarse el programa con LOAD"", aparece la sigte. pantalla inicial: "LOADING FORTH" "(YOUR COMPUTER JAN '85)" " PRESS ANY KEY " Luego de pulsar una tecla aparece en pantalla el sigte texto: FORTH 1984 K.Wierstra con un cursor cuadrado parpadeante en el área de edición y el sistema queda en espera de que le demos alguna orden Forth. Palabras del Forth: CONSTANT, VARIABLE, RESET, VLIST, DLIST, EXIT, LIST, FORGET, EDIT, LLIST, SAVE, LOAD, CLVAR, +, -, *, /, MOD, DROP, DUP, SWAP, OVER, ROT, PICK, ROLL, EMIT, ., U., CR, =, <>, <, >, !, @, C!, C@, KEY, INKEY, CLEAR, BEGIN, UNTIL, WHILE, REPEAT, DO, LOOP, +LOOP, I, IF, ELSE, THEN, ALLOT, ABORT, AND, OR, BREAK, QUERY, WORD, COUNT, CMOVE, TYPE, UDG, BEEP, CLS, PLOT, AT, RANDOM, SP@, .", :, ; Todas las palabras reservadas del Forth deben ser tipeadas en mayusculas. No admite fracciones, solamente valores enteros con signo desde -32768 a +32767 y sin signo desde 0 hasta 65535. Comandos directos No pueden ser usados dentro de definiciones de palabras. : sintaxis: : np {lp} ; donde: np = nueva palabra o nombre de procedimiento lp = serie de palabras que conforman el cuerpo del nuevo procedimiento palabra permite al usuario definir nuevas palabras que se incluirán en la librería del Forth. ejemplo: : area * . ; También es posible tipearlo linea a linea: : area * . ; - tras cada definición el sistema responde siempre con "out of memory" pero acepta la definicion nueva. EDIT sintaxis: EDIT np permite editar y modificar el contenido de la palabra definida por el usuario 'np'. FORGET sintaxis: FORGET np Elimina las palabras nuevas creadas por el usuario que no sean variables ni constantes RESET Reinicia todo el sistema a cero EXIT Abandona el Forth y retorna al Basic DLIST Muestra todas las palabras reservadas del FORTH, incluidas las que añade el usuario. Equivale a VLIST y WORDS de otros Forth. LIST Lista las nuevas palabras definidas por el usuario y su contenido. VLIST Lista las variables y constantes creadas por el usuario LLIST como LIST pero listandolo todo por la impresora SAVE sintaxis: SAVE np salva en cinta un archivo en CM de nombre np con inicio en 26112 generalmente. LOAD carga archivo salvado con SAVE, el nombre puede omitirse. CLVAR ¿? Palabras reservadas del Forth Pueden ser usadas tanto directamente como dentro de definiciones de nuevas palabras. CLEAR limpia y vacía la pila para su uso. + (suma) sintaxis: x y + - (resta) sintaxis: x y - * (multiplica) sintaxis: x y * / (divide) sintaxis: x y / = (igual) sintaxis: x y = <> (distinto) sintaxis: x y <> - nota: debe obtenerse tipeando los dos signos separadametne y no con SS+W < (menor) sintaxis: x y < > (mayor) sintaxis: x y > . Extrae el valor de la pila y lo imprime en pantalla, vaciando a su vez la pila U. Igual pero con números sin signo, permite mostrar valores mayores de 32000. CR da un retorno de carro, en los Forth que carecen de esta palabra es posible definirla así: : CR 13 EMIT ; ." sintaxis: ."texto" imprime en pantalla el texto contenido entre las comillas DUP duplica el valor contenido en el stack para evitar generalmente que se pierda al usar "." DROP borra el valor en el stack sin mostrarlo en pantalla swap sintaxis: x y SWAP intercambia los dos valores que estan en la pila over sintaxis: x y OVER copia el segundo valor y lo pone en lo alto de la pila MOD guarda en la pila el resto de la división ROT sintaxis: x y z ROT Como SWAP pero intercambiando los valores primero y tercero de la pila. PICK sintaxis: n PICK copia el enesimo numero en la pila. Sean por ejemplo los números ingresados: 10 20 30 40 3 PICK - añadirá 20 que es el tercero desde el último valor ingresado 2 PICK - es equivalente a OVER Nota: pick debe tener un argumento o elimirá el último valor ingresado en la pila ROLL sintaxis: n ROLL pone el enesimo numero en la pila moviendolo de su sitio en vez de copiarlo. Ejemplo: 3 ROLL - en el ejemplo anterior dejará la lista como: 10 30 40 20 Nota: sin parametros roll borrará los valores último y primero ingresados. KEY Espera indefinidamente a que se pulse una tecla y la guarda en la pila INKEY Como KEY pero espera por un breve momento a que se pulse una tecla usando el área de edición. EMIT extrae de la pila el valor ingresado ya sea del teclado, posición de memoria, variable o constante. key e inkey dan el codigo ascii, emit muestra en pantalla su caracter correspondiente Ejemplo: : espera KEY EMIT ; QUERY Acepta caracteres en el area de edición hasta que se pulse ENTER. WORD sintaxis: n WORD donde: n = codigo ascii usado como delimitador toma el texto del area de edición y lo pone en la dirección 63488 con la longitud al inicio. Ejemplo: QUERY 13 WORD - lee del teclado hasta pulsar ENTER (13) y lo salva TYPE sintaxis: d s TYPE extrae cadenas de texto de la posición de memoria 'd' con longitud 's'. COUNT contiene la longitud de una cadena almacenada con WORD. Ejemplo: 63488 COUNT TYPE - leerá el texto guardado con WORD ! sintaxis: y x ! Almacena el valor y en la dirección de memoria x (como doble POKE en Basic) ó Da el valor 'y' a la variable 'x' previamente definida, sino se generará un error. Ejemplo: 444 60000 ! @ sintaxis: x @ busca el valor contenido como 2 bytes en la dirección x (doble PEEK) o en la variable 'x'. Ejemplo: 60000 @ . - devolverá 444 o el valor que sea que contenga C! como ! pero guarda el byte menos significativo (POKE simple) C@ como @ para el byte almacenado con C! (PEEK simple) SP@ devuelve la dirección de la pila en la memoria RAM. Para verlo usar: SP@ U. CMOVE sintaxis: d1 d2 n CMOVE mueve n bytes de la dirección d1 a la d2. Estructura condicional if: sintaxis: c IF lp1 {ELSE lp2} THEN {lp3} if inicia la condicion y ejecuta 'lp1' si se cumple 'c' else sino ejecuta siguiente opción 'lp2' then cierra la condición y se prosigue con 'lp3' Ejemplo: : test 2 < IF ."TOO BIG" THEN ; - para ejecutar hacer por ejemplo: '1 test' Bucle do - loop: sintaxis: f c DO {I} lp {s +}LOOP donde: f = valor final o el numero de veces que correrá el bucle + 1 c = valor inicial lp = la serie de palabras que se ejecutarán dentro del bucle do inicia el bucle y equivale en Forth al bucle FOR del Basic loop cierra el bucle (como NEXT) +loop sintaxis: s +LOOP equivale a 'STEP s' del Basic I guarda el índice del bucle do loop. Ejemplo: : ft 11 1 DO I . CR LOOP ; - imprimirá 10 numeros bucles begin: sintaxis1: BEGIN lp c UNTIL {...} begin inicia el bucle indefinido o condicional until hasta que se cumple 'c'. De omitirse 'c' el bucle se repite indefinidamente Ejemplo: : tt BEGIN KEY EMIT UNTIL ; - una vez ejecutado no hay modo de interrumpirlo : tt BEGIN KEY DUP EMIT 13 = UNTIL ; - termina al pulsar sintaxis2: BEGIN {lp} c WHILE lp2 REPEAT {...} while mientras se cumpla 'c' repeat se repite el bucle Ejemplo: : tt BEGIN KEY DUP 13 <> WHILE EMIT REPEAT ; ABORT interrumpe la ejecución de un programa Forth y limpia la pila de datos. Ejemplo: : ft DO I DUP 6 = IF ABORT THEN . CR LOOP ; - para ejecutarlo: 11 1 ft - se detendrá tras imprimir 5 numeros con el mensaje BREAK AND sintaxis: y x AND Función lógica bit a bit entre los dos números x e y OR sintaxis: y x OR Función lógica binaria OR Spectrum equivalentes: son ordenes exclusivas del Forth para ZX Spectrum, inexistentes en Forth estandar. CLS limpia la pantalla y pone el cursor de texto en la esquina superior izquierda. AT sintaxis: y x AT posiciona el cursor de texto para usar con ., U., ó ." Ejemplo: 5 5 AT ."Hola Mundo" PLOT sintaxis: y x PLOT dibuja un punto en el color por defecto en alta resolución. BEEP sintaxis: d s BEEP toca una nota s de duración d RANDOM genera un valor entero aleatoriamente UDG es una variable reservada que puede aceptar cualquier valor numerico. Normalmente guarda la posición en memoria de cada grafico definible por el usuario. BREAK ¿? Manejo de variables y constantes CONSTANT sintaxis: v CONSTANT n Crea una constante numérica 'n' de valor 'v' la cual no podrá ser modificada después, ni usada como nombre de variable o procedimiento. Ejemplo: 120 CONSTANT alfa - crea una constante numerica de valor 120 Otra forma de crear constantes es usando ":". Ejemplo: : alfa 120 ; Para ver el contenido de la constante basta hacer "alfa ." En este caso la constante puede ser modificada con 'EDIT'. VARIABLE sintaxis: VARIABLE n En el caso de las variables numericas hay que hacer por ejemplo: VARIABLE beta - define variable de nombre beta 23 beta ! - da a la variable beta previamente definida el valor 23 beta @ . - muestra el contenido de la variable. Una variable siempre puede ser modificada con ! y examinada con @. Otros Forth admiten "?" para leer valores, el cual puede ser definido así: : ? @ . ; ALLOT allot reserva n bytes y dimensiona la variable para ser usada como tabla tipo DIM ejemplo: VARIABLE rcamb 290 ALLOT - define tabla de nombre rcamb 1230 rcamb ! - agrega el valor 1230 al inicio de la tabla 700 rcamb 2 + ! - añade valor en la posición +2 300 rcamb 4 + ! - y así sucesivamente... para leer cualquier parte de la tabla: rcamb 2 + @ . - muestra el contenido de la +2. Nota: Tanto Constant como Variable son ordenes directas que no pueden ser incluidas dentro de una definición. Allot en cambio puede ser usada en definiciones para cambiar la cantidad de espacio reservado en la pila. EXPECT No existe en esta versión de Forth, permite leer del teclado n caracteres y los almacena en una posición de memoria x para ser leidos luego por TYPE. Su sintaxis es: dirección largo EXPECT Podemos definir nuestra propia versión del modo sigte: : EXPECT DO KEY I ! LOOP ; Su sintaxis ahora sería: dirección final dirección inicial EXPECT Ejemplo: VARIABLE A 5 ALLOT - equivale a DIM a$(5) A 5 + A EXPECT - equivale a a$= INPUT$(5) de otros Basics A 5 TYPE - equivale a PRINT a$(TO 5) En cambio, si le añadimos OVER y SWAP a la definición: : EXPECT OVER + SWAP DO KEY I ! LOOP ; vemos que al menos ya admite la sintaxis original y por lo tanto es posible hacer: A 5 EXPECT - todas las versiones de Forth suelen admitir esta sintaxis Nota: COUNT funciona bien con QUERY y WORD pero no con EXPECT a menos que se ponga la longitud de la cadena al comienzo de la misma. : EXPECT 1 + OVER + SWAP 1 + DO KEY I ! LOOP ; Compatibilidad: No es muy compatible con Interfase 1, afecta la captura de errores pudiendo colgarse. Con el Disciple, ABORT da el mensaje de "OK Gdos 3" y retorna al Basic. Igual con +D. Funciona corectamente con Opus D1, D80-Mdos, y Trdos. Tras cargarse con Wafadrive se genera un mensaje de error y altera la linea 3 pero excepto eso parece no haber problema para ejecutarse, basta con hacer GO TO 2 o 1 para ir al Forth y permite volver al basic y usar los comandos del wafa os. Corre en el MB-02+ sin problemas. Carga sin problemas en un 128k y se mantiene en ese modo, sin necesitar ir al modo 48k. Lo mismo en el +2, pero en el caso del +3 y +2a/b, carga pero resetea al volver al Basic. No pasa eso si se usa una ROM modificada, en este caso devuelve al modo 48k. Idem con el +2c de Owen. El +3e requiere que se haga primero un LOAD "t:" para poderlo cargar de la cinta. Mensajes de error: integer out of range - se ha dado un numero fuera del rango aceptado por Forth undefined word - una palabra no definida o inexistente ha sido tipeada Pardon ? - se da generalmente con SAVE sin parametros BREAK - se ha interrumpido un proceso con ABORT o pulsando la tecla Break (CS + SPACE) Out of memory - fuera de memoria, se da también tras definir una palabra nueva Stack empty - pila vacia Stack overflow - pila llena Illegal name - el nombre (definición, variable o constante) no es válido division by 0 - se ha intentado una división por cero zx_if1@hotmail.com