MANUAL Beta Basic 3.00 Beta Basic On / Off: Randomize Usr 59904 = desactiva el Beta Basic. Randomize Usr 58419 = vuelve a hacer operativo el Beta Basic. Comandos de edición: Alter (ref) sintaxis: ALTER TO Busca a través del programa todas las apariciones de la primera referencia y la reemplaza por la segunda. Una referencia puede ser una variable, un número o una cadena de texto. Ejemplos: ALTER a$ TO b$ - cambia nombre de variable "a$" por "b$" ALTER cuenta TO c - cambia variable numérica "cuenta" por "c" ALTER 1 TO 23 - cambia número en u forma invisible de 5 bytes ALTER 1 TO "23" - cambiar el número por una cadena no es muy aconsejable ALTER "break to stop" TO "pulse una tecla para parar" - cambia el texto LET s$="exe": ALTER (s$) TO "execute" - reemplazará "exe" por "execute" ALTER "word" TO "" - elimina esa palabra de todo el listado Auto sintaxis: AUTO [línea] [,salto] Activa la numeración automática de líneas. Si se omite el "salto" se elige 10 por defecto. AUTO sin parámetros empieza desde la línea en curso. Un número menor de 10 o mayor de 9983, desactivan la modalidad AUTO. También cuando se imprime un reporte o se pulsa BREAK más de un segundo. Delete sintaxis: DELETE [línea1] TO [línea2] Borra todas las líneas especificadas desde "línea1" hasta "línea2". DELETE 0 TO 0 borra solamente la línea cero. DELETE TO sin parámetros borra todo el listado menos la línea cero. Edit sintaxis: EDIT [línea] Facilita la edición de líneas. Basta pulsar "0" para obtener el comando EDIT. Si en vez de la palabra apareciera un cero antes del número a editar, esto también efectúa la edición. EDIT sin parámetros edita la línea donde ha quedado el cursor. Join sintaxis: JOIN [línea] Une la línea especificada (o de omitirse, la línea señalada por el cursor) con la de abajo siempre que hubiese una. Ref sintaxis: REF Permite buscar por todo el listado el dato especificado como referencia, el cual puede ser una variable, un número o una cadena. Una vez hallado el dato, la línea que la contiene es editada y queda en espera de ser modificada. Basta pulsar ENTER para no cambiar esa línea. La búsqueda se repite hasta darse un "OK". Basta dar cualquier comando en vez de ENTER para que REF dé por terminado el proceso. Ejemplos: REF 123 - busca número en su forma de 5 bytes REF "count" - busca el texto en todo el listado REF (a$) - busca el contenido de la variable a$ Renum sintaxis: RENUM [*] <[x] TO [y]> [LINE nueva línea] [STEP salto] Este comando permite renumerar o copiar bloques de línea desde x hasta y, a partir de una nueva línea pudiendo medir el intervalo de salto entre líneas. Ejemplos: RENUM 30 TO 70 LINE 200 RENUM 100 TO LINE 200 STEP 5 "Renum *" para copiar bloques en vez de renumerarlos. "Renum (x TO y)" todavía es admitido para mantener la compatibilidad con la sintaxis de las versiones anteriores. Split sintaxis: "<>" Hace lo contrario a JOIN. El signo "<>" debe ponerse luego de ":" dentro de una línea múltiple y pulsar para lograr su división. Una nueva línea con el mismo número aparece en la zona de edición esperando su renumeración. Trace sintaxis 1: TRACE sintaxis 2: TRACE : sentencia: sentencia: ...: [RETURN] Permite depurar los prOgramas BASIC, mostrando en pantalla la línea en curso, la sentencia y las variables seleccionadas, así como reducir la velocidad de ejecución y verlo paso a paso. Hay dos formas de rastreo (TRACE): la primera permite ir a una subrutina en modo de interrupción interna, justo antes de que cada sentencia se vaya ejecutando. La segunda forma permite ejecutar las sentencias que vienen después del comando TRACE en una misma línea de comando directo o de listado en el programa. Utiliza las variables reservadas LINO (línea) y STAT (estado). Ejemplos: 10 TRACE 9000 9000 PRINT INVERSE 1;lino;":";stat: RETURN TRACE: PRINT INVERSE 1;lino;":";stat: RETURN Bucles y procedimientos: Do sintaxis: DO [WHILE / UNTIL ] DO y LOOP junto con WHILE y UNTIL proveen de estructuración al programa con ciertas ventajas respecto de las que normalmente provee el BASIC. Por sí solo, DO indica el inicio del bucle. DO - LOOP UNTIL es equivalente a REPEAT - UNTIL de otroS lenguajes de prOgramación. DO WHILE - LOOP equivale a WHILE - WEND o ENDWHILE de lenguajes similares. Devuelve error si faltase el LOOP correspondiente. Un simple ejemplo del uso del bucle DO - LOOP es: 10 DO 20 PRINT "HELLO "; 30 LOOP Ejemplo de DO WHILE: 10 LET total = 0 20 DO WHILE total <= 100 30 INPUT "ENTER A NUMBER ";x 40 LET total = total + x 50 PRINT total 60 LOOP 70 PRINT "THAT IS OVER A HUNDRED" La línea 20 puede ser reemplazada también por: 20 DO UNTIL total > 100 Exit if sintaxis: EXIT IF Permite salir de un bucle DO - LOOP, siempre que se cumpla la condición especificada. Ejemplo: 100 DO 110 PRINT "Line 110" 120 PAUSE 20 130 EXIT IF INKEY$ = " STOP " 140 PRINT "Line 140" 150 PAUSE 20 160 LOOP 170 PRINT "Out of LOOP" Loop sintaxis: LOOP [WHILE / UNTIL ] Cierra el bucle DO. Da error si faltase el DO correspondiente. Def proc sintaxis 1: DEF PROC [parámetros] [,REF parámetro,...] sintaxis 2: DEF PROC DATA Permite crear un procedimiento "nombre" al estilo del PASCAL. A diferencia de la versión anterior de BB, DEFPROC ahora permite pasar información a los procedimientos por medio de parámetros los cuales van seguidos del nombre asignado a dicho procedimiento. Los nombres pueden ser en mayúsculas o en minúsculas indistintamente ya que son considerados equivalentes. El nombre también puede ser el mismo de una variable existente sin que se confunda el sistema. Ejemplo 1: 100 DEF PROC BOX x,y,anch,alt 120 PLOT x,y: DRAW anch,0 130 DRAW 0,-alt: DRAW -anch,0 140 DRAW 0, alt 150 END PROC Los parámetros son considerados formales, y deben ser siempre nombres de variables. Cuando la opción REF antecede a un nombre de parametro, se dice que este es "pasado por referencia". Esto se hace cuando deseamos obtener resultados del procedimiento en vez de solo pasarle información. El parámetro REF es renombrado según la variable usada al llamar el procedimiento. Algunas versiones de lenguajes, no permiten que los procedimientos usen matrices como parámetros, Beta Basic puede hacerlo siemrpe y cuando estos sean pasados por referencia, así no hay necesidad de tener copias separadas de cada matriz. el nombre de la variable debe ser seguido de paréntesis para diferenciarlas de las variables no matriciales. Ejemplo 2: 100 DEF PROC total REF a(), REF sum 110 LOCAL n 120 LET sum=0 130 FOR n=1 TO LENGHT(1,"a()") <*> 140 LET sum=sum+a(n) 150 NEXT n 160 END PROC 1000 DIM t(10) 1010 FOR n=1 TO 10 1020 LET t(n)=n 1030 NEXT n 1040 TOTAL t(), resp 1050 PRINT resp <*>: ver LENGTH en funciones numéricas. Algunas veces seria preferible trabajar con listas de parámetros de cantidad desconocida. Para esto se ha añadido una opción especial. Si en vez de la lista usual de parámetros se pone DATA, entonces bastará con usar READ dentro del procedimiento para leer los datos entrados al llamarlo por su nombre. Ejemplo 3: 100 DEF PROC kill DATA 110 DO UNTIL ITEM()=0 <*> 120 READ a$ 130 ERASE 1,a$ 140 LOOP 150 END PROC Ahora es posible tipear por ejemplo: KILL "test","test2","ficha5" <*>: ver ITEM en funciones numéricas. Se dice que si un procedimiento se llama a sí mismo, entonces es recursivo. La recursión es una forma elegante y concisa para resolución de problemas de programación. Tiene como contra que el programa pierde en velocidad y de que se requiere un monto considerable de memoria temporal para sus variables en juego. Ejemplo 4: 100 DEFPROC diamante x,y,t,dif DEFAULT dif=15 PLOT x,y-t DRAW -t,t DRAW t,t DRAW t,-t DRAW -t,-t 110 IF t>4 THEN DIAMANTE x,y+t,t-dif DIAMANTE x,y-t,t-dif DIAMANTE x-t,y,t-dif DIAMANTE x+t,y,t-dif 120 END PROC Este procedimiento puede ser llamado por ejemplo como: diamante 128,88,40. Endproc sintaxis: END PROC Marca el fin de un nombre de procedimiento, evitando así que los comandos dentro de este se ejecuten a menos que dicho procedimiento sea llamado. Equivale al RETURN de una subrutina GOSUB. Usar END PROC sin su correspondiente DEF PROC genera error. Default (vars) sintaxis: DEFAULT [,variable = valor, ...] Al igual que LET asigna un valor a una variable siempre y cuando esta variable no existiese, de ser así entonces no hará nada ya que solo genera valores por defecto, es decir valores "asumidos a menos que se indique lo contrario". DEFAULT puede ser usado en cualquier parte del programa pero su fin principal es dentro de los procedimientos, para que el usuario pueda omitir los parámetros que guste a la hora de llamarlos, dándole a uno mayor libertad en el manejo de los procedimientos. Ver ejemplo 4 en DEFPROC. Local sintaxis: LOCAL [,variable ,variable ,...] Permite crear variables especiales que solamente existan dentro de un procedimiento especificado (los parámetros del procedimiento son locales). LOCAL solo puede ser usado dentro de procedimientos, lo contrario genera error. Ver ejemplo 2 en DEFPROC. Proc sintaxis: [PROC] [parametros...] Este comando existe solo para mantener la compatibilidad con las versiones anteriores del BB. Es innecesario para llamar procedimientos en el BB 3.xx Read Line sintaxis: READ LINE [,var$ ,...] READ LINE puede ser usado en cualquier parte del programa pero su fin principal es dentro de los procedimientos. Permite ingresar y leer cadenas en sentencias DATA sin tener que ponerlas entre comillas. Ejemplo 1: 100 DATA perro,rata,pescado,rana,z$,12,"?*+" 110 READ LINE a$ 115 IF a$(1)=CHR$ 34 THEN LET a$=VAL$ a$ <*> 120 PRINT GOTO 110 <*>: esto evita que se dé error al toparse con algo como por ejemplo: "?*+". Ejemplo 2: En el ejemplo 3 de DEFPROC, el READ a$ de la línea 120 dará error a menos que la lista consista solo de cadenas. Para evitar el uso de las comilla puede aplicarse la siguiente modificación: 120 READ LINE a$ 125 IF a$(1)=CHR$ 34 OR a$(LEN a$)="$" THEN LET a$=VAL$ a$ Esto permitirá tipear: KILL test,test2,ficha5 Comandos diversos: Break No es sentencia. El BREAK normal es bastante adecuado para muchos propósitos, pero no para detener la ejecución de rutinas en código máquina. Beta Basic incluye un sistema de apoyo BREAK que decide que si presionas dicha tecla por más de un segundo, entonces significa que estás atascado y hace el BREAK aun si la rutina normal no opera. Es muy útil cuando se deshabilita "STOP" o "BREAK" con ON ERROR, así como para salir de un INPUT LINE, EDIT y AUTO. Clear sintaxis: CLEAR Un comando de interés para los que programan en código máquina. CLEAR con un valor de 767 o menor, mueve la RAMTOP hacia abajo según el monto especificado. El STACK de las variables, pantalla, y retornos de GOSUB/DO-LOOP/PROC no es afectado. Las ventanas definidas con WINDOW y las teclas definidas con DEF KEY tampoco son afectadas. CLEAR con un valor negativo moverá la zona de la RAMTOP, las ventanas y teclas definidas hacia arriba según el monto especificado. Hay que tener cuidado de no aplastar el código del Beta basic. En el ejemplo sigte. la RAMTOP es movida sin pérdida de variables: 100 LET ramtop=23730 110 PRINT DPEEK(ramtop) 120 CLEAR 100 130 PRINT DPEEK(ramtop) 140 CLEAR -50 150 PRINT DPEEK(ramtop) Clock sintaxis1: CLOCK sintaxis2: CLOCK sintaxis3: CLOCK sintaxis4: CLOCK : sentencia: sentencia: ...: Return donde: x = un valor del 0 al 7 indicando el modo de operación MODE ALARMA/GOSUB ALARMA MOSTRAR 0 NO APAGADA NO 1 NO APAGADA SI 2 NO PUESTA NO 3 NO PUESTA SI 4 SI APAGADA NO 5 SI APAGADA SI 6 SI PUESTA NO 7 SI PUESTA SI x$ = una cadena con el formato "[A]hh:mm:ss" indicando 'hora:minuto:segundo' siendo "A" opcional para fijar la alarma a un tiempo específico. Clock empieza desde "00:00:00" a partir del momento que se carga y ejecuta el Beta Basic. Basta entrar una nueva cadena con el tiempo que se desee para poner el reloj a la hora. línea = un número entero entre 8 y 9999 Sus 7 opciones o modos de operación permiten activar o no la alarma, mostrar o no el reloj en pantalla así como tener activa o no la opción de ir a una subrutina (prefijada por "línea") al darse cierto tiempo. El valor debe ser en este caso mayor de 7 para diferenciarlo del selector de modo de acción. Al igual que con ON ERROR y TRACE, es posible incluir una serie de sentencias después de CLOCK, las cuales solamente se ejecutarán si se ha activado la opción de GOSUB y se ha puesto la alarma con CLOCK "Axxxx". Una posible aplicación sería por ejemplo cambiar tonos de sonido, imágenes gráficas, así como tocar un beep cada hora. La velocidad del reloj puede ser cambiada con un POKE 56866 y POKE 56870. Un buen ejemplo del uso del comando para los amantes de la electrónica es: 8999 STOP 9000 PRINT "Subrutina activada" 9010 LET puntero=DPEEK(USR "a"): POKE puntero,IN 127 9020 LET puntero=puntero+1: IF puntero>65535 THEN LET puntero=USR "a"+2 9030 DPOKE USR "a",puntero: LET z$=TIME$() 9040 LET hora= VAL z$(1 TO 2), min= VAL z$(4 TO 5) 9050 LET min=min+1: IF min=60 THEN LET hora=hora+1,min=0 9060 CLOCK "a"+USING$("00",hora)+USING$("00",min): RETURN Esta rutina debe ser ejecutada con: DPOKE USR "a",USR "a"+2: CLOCK 9000: CLOCK 5 Para apagar la alarma a futuro, hacer: CLOCK "Axxxx" Copy sintaxis: COPY TO Copia todo o partes de una cadena o matríz (var$_fuente), colocándola en cualquier punto dentro de otra cadena o matríz (var$_destino). Ver ejemplos en JOIN (var$). Def key sintaxis1: DEF KEY ; sintaxis2: DEF KEY : Beta Basic permite que se ejecuten o que se impriman en el área de edición cualquier texto o sentencia almacenada en cualquier tecla del Spectrum. Para lo último, la cadena o serie de sentencias debe terminar con ":" y entonces el texto esperará a ser editado o a que se pulse ENTER para su ejecución. Para ejecutar las neuvas definiciones de tecla hay que pulsar SYMBOL SHIFT y ENTER. El cursor cambia a un "*" parpadeante en espera de la pulsación de la tecla definida. DEFKEY ERASE elimina todas la definiciones hechas. SAVE peude salvar cualquier definición existente en memoria junto con el código del Beta Basic o programas BB. Ejemplos: DEFKEY "1";"Hola:" - aparece en el área de edición y espera una acción DEFKEY "A": PRINT "Adios" - ejecuta directamente el comando dado DEFKEY "a","10 REM hola" - permite insertar líneas al programa existente DEFKEY "Q": PRINT "Prueba": - no se ejecuta sino que aparece en el área de edición en espera de una acción. Delete (vars) sintaxis: DELETE Permite eliminar todo o partes de una cadena o matríz. Si se usa DELETE para eliminar toda la cadena, esta desaparecerá en vez de solo quedar con longitud cero (LEN =0). Ejemplos: DELETE a$(3 TO 5) - elimina dicha porción de la cadena a$ DELETE a$ - borra la variable de la memoria en vez de dejar la cadena vacía (""). Dpoke sintaxis: DPOKE , Equivale a hacer POKE dir, número- INT(número/256)*256: POKE dir+1, INT(número/256). Es decir un POKE doble donde el byte menos significativo es puesto en "dir" y el byte más significativo es puesto en la dirección siguiente. Permite almacenar números entre 0 y 65535 solamente. Edit (vars) sintaxis 1: EDIT [(input);] sintaxis 2: EDIT [(input)]<; var#> Esta variante permite editar y modificar los valores de las variables ya sean numéricas o de cadena. EDIT tiene una sintaxis similar a la de INPUT, es posible usar ";", coma, TAB, AT, LINE, valores y textos como con INPUT. Solo es posible editar una variable por cada sentencia EDIT, si se da más de una variable, todas las restantes serán ignoradas excepto al primera. Es posible trocear las cadenas a editar por otro lado. Ejemplos: LET a$="Juan Brown": EDIT a$: PRINT a$ LET num=365.253: EDIT ;num: PRINT num LET a$="1234567890": EDIT a$(3 TO 6): PRINT a$ 10 DIM a$(10,15) 20 FOR n=1 TO 10 30 INPUT a$(n) 40 NEXT n 50 PRINT "Editando" 60 FOR TO 10 70 EDIT ("registro ";n;" ");a$(n) 80 NEXT n Else sintaxis: IF THEN :ELSE ELSE forma parte de la estructura IF - THEN. ELSE como primer comando de una línea de programa no hará nada y será igual que REM. Nota: ELSE siemrpe debe estar antecedida por ":" luego de THEN de lo contrario el corrector sintáctico no admitirá la línea. Get (vars) sintaxis: GET Permite leer el teclado sin esperar que se pulse ENTER. Es como INKEY$ pero a difeencia de este último GET espera hasta que se pulse una tecla. Usado con variables de cadena devuelve una cadena de un caracter de longitud. Usado con variables numéricas dará un valor numércio en su forma de cinco bytes. ejemplos: GET a$: PRINT a$;: GOTO 10 GET x - las teclas 0 a 9 daran estos valores y a partir de "A" dará 10 en adelante. Join (var$) sintaxis: JOIN TO Mueve o junta (JOIN) una cadena o matríz ya sea total o parcialmente a cualquier punto dentro de otra cadena o matríz. Al hacerlo var$_fuente desaparece pues ha sido fusionada con var$_destino. Ejemplo 1 (variables simples): 10 LET a$="12345" 20 LET b$="ABCDEFG" 30 JOIN a$ TO b$ 40 PRINT b$ :REM el contenido de b$ será impreso 50 PRINT a$ :REM dará error de no hallado La línea 30 puede ser cambiada por: 30 COPY a$ TO b$ Esto copia a$ dentro de b$ en vez de removerla. Si bien es un equivalente a LET b$=b$+a$, tanto COPY como JOIn pueden funcionar incluso si la cadena satura la memoria libre cosa en la que LET fallaría. Los siguientes permiten ver los efectos obtenidos al trocear la cadena: JOIN a$(2) TO b$ JOIN a$(3 TO) TO b$ JOIN a$ TO b$(3) JOIN a$(2 TO 3) TO b$(LEN b$+1) Ejemplo 2 (matrices): DIM a$(100,30): DIM b$(20,30): JOIN b$ TO a$ Ejemplo 3 (matrices numéricas): 10 DIM a(8) 20 FOR n=1 TO 8 30 LET a(n)=n 40 NEXT n 50 DIM b(5) 60 FOR n=1 TO 5 70 LET b(n)=n*10 80 NEXT n 90 JOIN b() TO a() 100 FOR n=1 TO LENGTH(1,"a(") 110 PRINT a(n) 120 NEXT n Keyin sintaxis: KEYIN Permite ejecutar las sentencias dentro de una cadena como si se tipearan desde el teclado. Así también permite insertar líneas creadas desde dentro del mismo programa al ejecutarse. Es como si el programa se autoescribiera. De este modo es posible producir líneas de datos automaticamente. Ejemplo: 10 LET A$="100 DATA" 20 FOR N=0 TO 9 30 LET A$=A$+STR$(PEEK N)+"," 40 NEXT N 50 LET A$=A$(TO LEN A$-1) 60 KEYIN A$ Keywords sintaxis: KEYWORDS donde numero = un valor de 0 a 4: 0 - Permite ver ver e imprimir los UDGs y demás caracteres gráficos 1 - muestra los comandos Beta Basic en vez de los gráficos. 2 - todas las palabras claves son tipeadas del modo normal del ZX Basic y BB 1.xx 3 - los comandos pueden ser ingresados letra a letra 4 - anula el modo "K" y fuerza el tipeado letra a letra. Los modos 0 y 1 son los originales de las versiones anteriores y solo periten que uno elija si desea ver en pantalla los caracteres gráficos o los comandos extras del Beta Basic. Los modos 2, 3 y 4 permiten elegir el modo de tipear los comandos. El modo 3 tiene un pleno evaluador sintáctico y basta pulsar SPACE para cancelar el modo "K" y pasar a tipear los comandos letra a letra. En el modo 4 hay que pulsar S-Shift + ENTER para volver temporalmente al modo "K". Let sintaxis: LET [,variable = valor, ...] LET ha sido mejorado para hacer asignaciones de variables separándolas con comas. Esto da un ahorro de un byte por cada LET menos. List: LIST [[x] TO [y]] Lista exclusivamente desde "x" a "y". LIST [DATA / VAL / VAL$] El SPECTRUM tiene 6 tipos de variables. LIST VAL lista los 4 tipos numéricos en el siguiente orden: 1- matrices numéricas 2- variables FOR - NEXT 3- variables numéricas de una sola letra 4- nombres de variables con varias letras LIST VAL$ lista los 2 tipos únicos de cadena de este modo: 5- matrices de cadena 6- variables de cadena ordinarias LIST DATA muestra todos los tipos del 1 al 6. La lista se hace en orden alfabético y se muestra el contenido. En el caso de las matrices solo se muestra su dimensionamiento pero no su contenido. Y en el caso de las cadenas solo se muestran los primeros 15 caracteres de esta. LIST DEFKEY Lista todas las teclas definidas por usuario emdiante DEF KEY así como el contenido de las mismas. LIST FORMAT donde n = un valor de 0 a 5: 0 = similar al ZX Basic pero indentando las sentencias para mayor claridad 1 = pone cada sentencia en una nueva línea y algunas veces genera indentación 2 = igual que Format 1 pero con indentación automática de 2 espacios 3 = igual que Format 0 pero sin números de línea 4 = igual que Format 1 pero sin números de línea 5 = igual que Format 2 pero sin números de línea LIST FORMAT permite manipular la apariencia del listado tanto en la pantalla como en la impresión. La indentación afecta a los comandos DEF PROC, DO y FOR hasta sus respectivos END PROC, LOOP y NEXT. IF, ON ERROR y ON indentan uno o dos espacios. Para forzar las líneas tras THEN y ELSE se puede añadir ":". LIST PROC Lista un procedimiento especificado en el nombre desde su DEFPROC hasta su ENDPROC. List Proc no admite variables de cadena para asignar busqueda de nombres de modo directo pero puede usarse el método siguiente: 10 INPUT a$: KEYIN "list proc "+a$ LIST REF [dato] Lista solamente los números de líneas en los que aparece el dato refencial especificado. Si se queire enviar la información a una impresora se puede usar LLIST REF o: LIST # REF Llist La misma sintaxis y opciones que LIST. On (Goto / Gosubs) sintaxis 1: GOTO ON ;<...> sintaxis 2: GOSUB ON ;<...> Dos variantes de ON son ofrecidas. La primera permite hacer GOTO o GOSUB a una línea especificada dentro de una lista dependiendo de una expresión numérica "n". Es el equivalente al ON GOTO/GoSUB de otros Basics. Ejemplo: 10 INPUT elije: GOTO ON elije;90,135,60,40 On (statements) sintaxis: ON : sentencia1: sentencia2: ... Esta forma de ON permite ejecutar un comando en particular dentro de una lista de sentencias dependiendo del valor que tome "n". Ejemplo: DO GET num ON num: GOSUB 100: sound: GOSUB 200: PRINT "adios" LOOP On error sintaxis 1: ON ERROR sintaxis 2: ON ERROR : sentencia: sentencia: ...: [RETURN] Eisten dos formas del comando ON ERROR. La primera hace GOSUB a uan subrutina si se da un error durante la ejecución del programa o comandos. La segunda ejecuta todas las sentencias que vayan después de ON ERROR de un modo más directo. Utiliza la variable reservada ERROR que almacena el código del error dado. También LINO para conocer en qué número de línea se dio el error. Ejemplo 1: 100 ON ERROR 5000 5000 IF ERROR=11 AND LINO=120 THEN RETURN: ELSE POP: CONTINUE Ejemplo 2: 100 ON ERROR IF ERROR=11 AND LINO=120 THEN RETURN ELSE POP CONTINUE Poke sintaxis: POKE , Permite introducir datos en memoria en forma de cadenas. Combinado con MEMORY$ se pueden manipular muy rápidamente enormes áreas de memoria. Ejemplo: LET a$= STRING$(6144,"U"): POKE 16384,a$ Pop sintaxis: POP [var#] Extrae el valor de retorno de la pila para RETURN, LOOP o ENDPROC. Este se puede almacenar en una variable numérica para impimirlo o manipularlo despues. POP devolverá error si se usara cuando no hay datos alguno en la pila de retornos. Ejemplo: 100 GOSUB 500 110 STOP 500 POP loc 510 PRINT "Subrutina llamada desde ";loc 520 GOTO loc+1 En la última línea es necesario usar GOTO ya que RETURN provocaría error. Sort sintaxis: SORT [INVERSE] donde: vars = cadenas simples y matrices numéricas o de cadena Ordena en orden ascendente o descendente (INVERSE) cualquIer lista de números o letras por su código ASCII. Ejemplo: 100 DIM A$(100,10) 110 FOR S=1 TO 100: FOR L=1 TO 10 120 LET A$(S,L)= CHR$(RND*25+65) 130 NEXT L: NEXT S: GOTO 200 140 SORT A$ 200 FOR S=1 TO 100: PRINT A$(S): NEXT S Es posible también ordenar fragmentos de cadenas o matrices. Ejemplo: SORT a$(1 to 29) Las cadenas simples o matrices unidimensionales no necesitan paréntesis: INPUT s$: SORT s$: PRINT s$ SORT también opera con matrices numéricas de una o dos dimensiones: SORT B(1 TO 20)(2) Siempre debe añadirse las paréntesis para diferenciar las variables normales de las matrices: SORT B() Using sintaxis: PRINT USING <"formato"> ; Comando típico de otras versiones de Basic, permite imprimir números con el formato que uno desee. También puede usarse con LPRINT. Los formatos pueden ser por ejemplo: "###.##", "000.00", "##.# ", "$#####". Ejemplos: PRINT USING "###.##";x PRINT USING a$;numero Códigos de control Codigos de cursor no limitados por ventanas: CHR$ 2 izquierda CHR$ 3 derecha CHR$ 4 abajo CHR$ 5 arriba Códigos limitados por la ventana: CHR$ 8 izquierda CHR$ 9 derecha CHR$ 10 abajo CHR$ 11 arriba Códigos extras: CHR$ 12 DELETE (hace un back space) CHR$ 15 SS+ENTER Códigos gráficos: CHR$ 0 permite crear formas al estilo de los UDG's mediante 8 bytes CHR$ 1 igual que el anterior pero añadiendo un byte para los atributos antes de los 8 códigos siguientes. Ejemplo: 10 LET a$=CHR$ 0+CHR$ 255+CHR$ 129+CHR$ 129+CHR$ 129+CHR$ 129+CHR$ 129+CHR$ 129+CHR$ 255 20 PRINT a$:PLOT 128,88;a$ Comandos gráficos: Alter (Attr) sintaxis: ALTER [atributos] TO donde: atributos = Ink , Paper , Flash , Brigth Permite cambiar los atributos de color de la pantalla sin borrar la pantalla. Ejemplo: ALTER TO PAPER 2, INK 7, FLASH 1 ALTER INK 7 TO INK 0 Cls sintaxis: CLS [ventana] CLS sin parámetros borra la pantalla o ventana en curso. Si le sigue un valor mayor de cero, borrará la ventana especificada siempre y cuando esta haya sido creada con el comando WINDOW, en caso contrario CLS dará el mensaje de error "Invalid I/O device" (dispositivo de entrada salida no válido). CLS 0 hará un CLS normal. Csize sintaxis: CSIZE [,alto] Modifica el tamaño de los caracteres usados por los comandos PRINT, LIST y PLOT. Al igual que INK o PAPER puede ser usado como sentencia o dentro de una instrucción PRINT (en este caso tendrá efecto temporal) o PLOT. Tanto el ancho y alto son números de píxeles. Si se omite "alto", su valor sera considerado igual al del "ancho". CSIZE 8, 9, 10 y 11 usan caracteres de 8x8, CSIZe del 12 al 19, usan caracteres de 16x16. Con algunos valores es aconsejable usar OVER 1 para evitar la superposición de caracteres. También es posible obtener caracteres más pequeños. CSIZE 3,8: OVEr 1 da 85 caracteres por línea usando un set de caracteres más chico pero menos legible a menos que se usen minúsculas y un monitor de alta resolución. CSIZE 4,8 da 64 caracteres que son mucho más legibles. CSIZE 5,8 también usa este nuevo set de caracteres. CSIZE 6,8: OVER 1 da 42 caracteres, para obtener 40 caracteres en pantalla usar WINDOW para reducir el ancho a 240 pixels. CSIZE 0 vuelve todo al modo normal provocando un WINDOW 0 inclusive. Ejemplos: 10 PRINT CSIZE 8,16;"doble alto ";CSIZE 8;"normal ";CSIZE 4,8;"pequeño" 20 PLOT CSIZE 32,16; 100,100;"AS" Draw to sintaxis: DRAW TO [,z] A diferencia del comando DRAW normal del ZX Basic que es relativo, DRAW TO permite dibujar una línea o arco desde la posición de pantalla en curso hasta el punto x,y. También pueden usarse PAPER, INK y demás instrucciones con DRAW TO. Ejemplo: 10 FOR n=1 TO 100 20 DRAW TO INK 2;RND*255,RND*175 30 NEXT n Fill sintaxis: FILL [INK / PAPER ;] Rellena áreas de figuras con el color de papel o tinta especificados. FILL x,y solo, es igual a FILL INK 0;x,y. Ejemplo: 10 FOR n=1 TO 6 20 CLS 30 CIRCLE INK n;128,88,n*10 40 FILL INK n;128,88 50 NEXT n Get sintaxis: GET [,a,l] [;t] donde: var$ = cualquier nombre de variable de cadena x,y = coordenadas de pantalla en píxeles a = altura del bloque en caracteres l = largo del bloque también en caracteres t = tipo de cadena (0 = sin atributos de color / 1 = con todo y atributos) Captura bloques de pantalla en las coordenadas x,y para almacenarlas en variables de cadena que luego pueden ser puestas en pantalla con PLOT o PRINT, en este último caso es sugerible un CSIZE distinto de cero como CSIZE 8. Si se omite "t", GET toma el valor por defecto que es cero, es decir hace la captura de imagen sin atributo de color alguno. Ejemplo 1: 10 PRINT "QWE" 20 GET a$,4,175 30 PLOT 100,100;a$ Ejemplo 2: 10 CIRCLE 10,165,10 20 CIRCLE 13,165,5 30 FILL 5,165 40 GET a$,0,175,3,3 50 PLOT RND*230,RND*150+20;a$ 60 GO TO 50 Ejemplo 3: 10 PRINT INK 2;"ABC" 20 PRINT'INK 4;"DEF" 30 GET a$,0,175,3,3,1 40 PLOT 100,100;a$ Over sintaxis: OVER Ahora OVER acepta también el valor 2, además de 0 y 1. OVER 2 permite que las letras o figuras impresas con PLOT var$ sean añadidas a lo que ya está en la pantalla en vez de sobreescribir o invertir los puntos de píxeles previamente dibujados. OVER 2 trabaja con impresiones en cualquier tipo de CSIZE. Plot sintaxis: PLOT [;var$ / cadena] Permite escribir en cualquier parte de la pantalla usando las coordenadas de alta resolución. Combinado con GET, se obtiene una dupla similar a la de los comandos del Basic Microsoft: GET y PUT para manejo de gráficos en pantalla. Ejemplos: FOR X=16 TO 224: PLOT X,X/2;"<>":NEXT X PLOT CSIZE 32;INK 2;100,100;"Hola!" Roll sintaxis: ROLL [,píx] [;x,y ;ancho,largo] donde: dir = un valor del 1 al 12 para indicar la dirección: 1 = izquierda con atributos 2 = abajo con atributos 3 = arriba con atributos 4 = derecha con atributos 5 = izquierda patrón de datos 6 = abajo patrón de datos 7 = arriba patrón de datos 8 = derecha patrón de datos 9 = izquierda ambos 10 = abajo ambos 11 = arriba ambos 12 = derecha ambos píx = el número de pixeles a mover por la pantalla x, y = la esquina superior izquierda de una porción de pantalla. ancho = 1 < ancho < 32 largo = 1 < largo < 176 Mueve la pantalla o porciones de pantalla en cualquier dirección especificada. Todo lo que se mueve hasta el borde de un lado de la pantalla, reaparece en el lado opuesto. Ejemplo 1: 100 FOR d=5 TO 8: FOR p=1 TO 100 110 ROLL d 120 NEXT p: NEXT d: STOP Puede acelerarse el movimiento haciendo por ejemplo el cambio: 110 ROLL d,4 ejemplo 2: 10 LET y=88,r=15 20 FOR n=1 TO 4 30 LET x=n*48+8 40 CIRCLE x,y,r 50 FILL INK n;x,y 60 CIRCLE INK n; INVERSE 1; OVER 1;x,y,r+5 70 NEXT n 80 DO: ROLL 9: LOOP` Ejemplo 3: 100 LIST: LIST: LIST 110 LET pixel=4 120 ROLL 5, pixel;0,175;32,88 120 ROLL 6, pixel;0,175;16,176 120 ROLL 8, pixel;0,87;32,88 120 ROLL 7, pixel;128,175;16,176 160 GOTO 120 Scroll sintaxis: SCROLL [dirección] [,píxeles] [;x,y ;ancho,largo] Similar a ROLL, pero al llegar al borde de la pantalla, todo se pierde y ya no reaparece. SCROLL sin parámetros, mueve la pantalla una línea hacia arriba. Ejemplo: 100 LET A$="UN TEXTO MUY LARGO..." 110 FOR C=1 TO LEN A$ 120 PRINT AT 10,31; INK 7;A$(C) 130 FOR P=1 TO 8: SCROLL 5;0,95;32,8: NEXT P 140 NEXT C 150 FOR P=1 TO 255: SCROLL 5;0,95;32,8: NEXT P La línea 120 puede ser reemplazada por: 120 PLOT 248,05; INK 7;A$(C) Window sintaxis 1: WINDOW [,x,y ,a,l] sintaxis 2: WINDOW ERASE donde: n = número de ventana a crear x,y = coordenadas a, l = ancho y largo de la ventana en píxeles Este comando permite crear ventanas o áreas separadas en la pantalla para imprimir y hacer listados. Cada ventana tiene sus propios atributos. Se pueden crear desde 1 a 127 ventanas. Los datos de cada ventana definida se guardan por encima de la RAMTOP, quedando así a salvo de NEW. WINDOW 0 refiere siempre a la pantalla completa, que es la ventana por defecto al cargar el Beta Basic. Si no se ha creado una ventana entonces el sistema dará error al intentar activarla. Al igual que OVER o INK, WINDOW puerde ser usada también dentro de un comando PRINT. Para borrar la ventana en curso, usar CLS. Para eliminar todas las ventanas en existencia usar WINDOW ERASE. Ejemplos: WINDOW 1,0,175,128,176 - crea ventana 1 WINDOW 1 - activa la ventana previamente creada. WINDOW 1: INK 1: PAPER 6 - fija los atributos de la ventana seleccionada PRINT WINDOW 1;"uno"; WINDOW 2;"dos" - usado dentro de PRINT Xos, Yos, Xrg, Yrg Estos no son comandos, son una forma especial de variables que permiten cambiar la escala y el origen de las cordenadas usadas por PLOT, DRAW y demás comandos de alta resolución. Están siempre presentes desde que se carga el Beta Basic. CLEAR y RUN las devuelven a sus valores por defecto y pueden ser modificadas con LET. XOS y YOS = mueven el origen de coordenadas a cualquier parte de la pantalla. XRG y YRG = cambian la escala (rangos) de los ejes x e y. Sus valores por defecto son xos = 0, yos = 0, xrg =256, yrg =176. He aquí unos ejemplos de sus usos: Ejemplo 1: 10 GOSUB 100: REM modo normal 20 LET XRG = 128: GOSUB 100 30 LET YRG = 88: GOSUB 100 40 LET XRG = 256: GOSUB 100: STOP 100 CLS: PLOT 0,0: DRAW 50,0: DRAW 0,50 110 DRAW -50,0: DRAW 0,-50: PAUSE 100: RETURN Ejemplo 2: 100 LET XRG = 2*PI: REM 360 grados 110 LET YRG = 2.2: REM seno varía entre -1 y 1 120 LET YOS = 1.1: REM fija origen a la mitad de la pantalla 130 FOR n=0 TO 2*PI STEP 2*PI/256 140 PLOT n,SIN n: NEXT n Comandos Microdrive: Cat sintaxis: CAT [n] Sin parámetro alguno, muestra el directorio por defecto que normalmente es el 1. Default= sintaxis: DEFAULT= [número] donde: letra = M/m (Microdrive), N/n (Red), B/b (RS-232) y T/t (Casette) número = 1 - 8 para microdrives o un número de estación de usuario de red Esta orden permite que los comandos SAVE, LOAD, MERGE y VERIFY usualmente para casette, usen su sintaxis sin extensión con Microdrives, la REd o la conexión RS-232 y simplifica los comandos CAT y ERASE. En suma, DEFAULT permite seleccionar el dispositivo por defecto para las operaciones SAVE/LOAD corrientes. Ejemplos: DEFAULT =m - selecciona la unidad 1 por defecto DEFAULT =M2 - selecciona unidad 2 DEFAULT =N5 - elige la estación 5 de red LET x=2: DEFAULT =Mx - puede usarse una variable en vez de un número Nota: no es posible reemplazar las letras por cadenas ni ponerlas entre comillas. Erase sintaxis: ERASE [n;]"nombre" La sintaxis ha sido simplificada y es posible incluso omitir el número del drive. La unidad por defecto sigue siendo 1 a menos que se especifique otro valor o se use el marcado por DEFAULT=. Ejemplos: ERASE "test" ERASE 4,"TEST" Load sintaxis: LOAD [n;]"nombre" [CODE/DATA/SCREEN$] Es posible usar la sintaxis de casette o añadir el número de drive al igual que el comando ERASE. Merge sintaxis: MERGE [n;]"nombre" Sintaxis simplificada igual que la de ERASE. Normalmente el microdrive da error si se intenta hacer MERGE con programas salvados con SAVE LINE, ahora es posible hacerlo anulándose la opción de auto ejecución, lo cual puede ser en cierta forma conveniente. Move sintaxis: MOVE "m";;"nombre_1" TO "m";;"nombre_2" El comando MOVE del microdrive no permite mover o copiar archivos de programas, código máquina ni matrices, solo ficheros de datos OPEN/CLOSE. Con Beta Basic, MOVE puede transferir cualquier tipo de archivo sin tener que indicar su tipo. Basta la sintaxis normal. Ejemplo: MOVE "m";1;"test" TO "m",2,"test" Save sintaxis 1: SAVE [n;]"nombre" sintaxis simplificada como la de casette. El número de drive es opcional. sintaxis 2: SAVE [linea1 TO linea2;][n;]"nombre" Permite salvar parte de un programa desde la linea1 hasta la linea2 ya sea al casette o al microdrive, inclusive la red o el RS232 si se seleccionan con DEFAULT=. sintaxis 3: SAVE DATA [n;]"nombre" Permite salvar solamente las variables del programa. Es preferible usar MERGE en vez de LOAD en estos casos, ya que incluso las variables salvadas serán consideradas como un programa pero sin líneas. Ejemplos: SAVE 10 TO 100;2;"fraccion" SAVE 900 TO,"caja" SAVE DATA "VARS3" Verify sintaxis 1: VERIFY [n;]"nombre" sintaxis 2: VERIFY [line TO line;][n;]"nombre" sintaxis 3: VERIFY DATA [n;]"nombre" Igual en todo a la sintaxis simplicada de SAVE. Ejemplos: VERIFY 10 TO 100;2;"fraccion" VERIFY DATA "VARS3" Funciones de cadena Bin$ sintaxis: BIN$ (x) Conversor decimal binario, hace lo contrario a BIN. Char$ sintaxis: CHAR$ (x) Convierte un número entre 0 y 65535 en una cadena de dos caracteres. Hex$ sintaxis: HEX$ (x) Conversor decimal - hexadecimal. Inarray sintaxis: INARRAY (a$(n [,x TO y]) ,b$) Busca la cadena o variable de cadena b$ dentro de la matriz a$. Devuelve la posición donde dicha cadena está contenida o un cero si no se hallara nada. Instring sintaxis: INSTRING (x,a$,b$) Busca la cadena b$ dentro de la cadena a$ a partir de x. Devolverá el número del puntero dentro de la cadena a$, o un cero de no hallar nada. Memory$ sintaxis: MEMORY$() Permite manejar toda la memoria como si fuera una cadena. Pudiendo seleccionar zonas de la misma mediante "TO". Se combina muy bien con POKE. Ejemplo: POKE 16384, MEMORY$()(1 TO 6912) Scrn$ sintaxis: SCRN$ (x,y) Versión mejorada de SCREEN$, reconoce también los UDG's. Shift$ sintaxis: SHIFT$ (x,a$) donde: a$ = un texto o variable de cadena x = un valor de 1 al 11: 1 - convierte todo a mayúsculas 2 - convierte todo a minúsculas 3 - cambia toda mayúscula a minúscula y viceversa 4 - cambia los códigos de control a "." excepto CHR$ 13 5 - cambia los códigos 128-255 a 0-127 (elimina las palabras claves) 6 - similar a 5 7 - cambia palabras reservadas a sus equivalentes letra a letra 8 - cambia las palabras tipeadas por su forma compacta 9 - similar a 8 pero con cualqueir caracter seguido de la palabra clave 10 - como 9 pero con las palabras reservadas en mayúsculas 11 - como 8 pero con las palabras reservadas en mayúsculas String$ sintaxis: STRING$ (x,a$) Repite la cadena a$, "x" veces. Time$ sintaxis: TIME$() Devuelve la hora en curso como una cadena de 8 caracteres. Using$ sintaxis: USING$ ("formato",n) Hace lo mismo que USING, pero puede usarse con cualquier otro comando aparte de PRINT y LPRINT. Funciones numéricas And sintaxis: AND (x,y) Función lógica bit a bit entre los dos números x e y. Cose sintaxis: COSE (x) Versión mejorada 6 veces más rápida y con un grado de aproximación de 4 digitos. Dec sintaxis: DEC (cadena) Conversor hexadecimal - decimal. Dpeek sintaxis: DPEEK (x) Permite un Double Peek. Complementa a DPOKE. Eof sintaxis: EOF(x) Esta función nos dice si se ha llegado al fin de un fichero Microdrive. Devuelve 1 si se ha llegado al final del fichero o cero si no es así. Filled sintaxis: FILLED() Muestra el número de píxeles que rellenó FILL. Item sintaxis: ITEM() Devuelve: 0 - si se ha leido (READ) toda la lista de datos (DATA) 1 - si el dato es una cadena 2 - si el dato es un número Length sintaxis: LENGTH (n,"nombre") Nos dice la dimensión de una matriz (ya sea numérica o de cadena) o su posición dentro de la memoria. Devuelve la posición en memoria si n=0. Nos dice cuál es la primera dimensión de la matriz si n =1, la segunda si n =2, o da 1 si la matriz es unidimensional. No funciona con matrices de más de dos dimensiones. Mem sintaxis: MEM() Muestra el número de bytes libres en memoria. Mod sintaxis: MOD (x,y) Devuelve el "resto" de la operación "x/y". Number sintaxis: NUMBER (x) Devuelve el número almacenado en una cadena con CHAR$. Or sintaxis: OR (x,y) Función lógica binaria. Rndm sintaxis: RNDM (x) Da un número entero entre 0 y "x". Es dos veces y media más rápido que RND. Sine sintaxis: SINE (x) Versión mejorada de SIN, como COSE. Xor sintaxis: XOR (x,y) Función lógica binaria de OR exclusivo. Mensajes de error: A continuación tenemos los valores obtenidos mediante el comando ON ERROR. Errores del Spectrum: 0 0 ok (no interceptado) 1 1 NEXT sin FOR 2 2 Variable no hallada 3 3 Error de suscripción 4 4 Sin memoria 5 5 Fuera del margen de pantalla 6 6 Número demasiado grande 7 7 RETURN sin GOSUB 8 8 Fin de fichero 9 9 Sentencia STOP (no interceptado) 10 A Argumento no valido 11 B Entero fuera de rango 12 C Sin sentido en Basic (ver reporte 44) 13 D Repite BREAK - CONTinue 14 E Fuera de datos 15 F Nombre de archivo no válido 16 G no hay espacio para la línea 17 H STOP en INPUT 18 I FOR sin NEXT 19 J Dispositivo de entrada/salida no valido 20 K Color no válido 21 L BREAK en un programa 22 M RAMTOP no buena 23 N Sentencia perdida 24 O Flujo no válido 25 P FN sin DEFine 26 Q Parámetro erroneo 27 R Error de carga de la cinta Reportes del Beta Basic: 28 S Falta LOOP 29 T LOOP sin DO 30 U No hay tal línea 31 V No hay datos para POP 32 W Falta DEFPROC 33 X No hay ENDPROC Reportes del Interfase 1: 43 b Programa terminado 44 c Sin sentido en Basic 45 d Número de flujo no válido 46 e Expresión de dispositivo no válida 47 f Nombre no válido 48 g Número de drive no válido 49 h Número de estación no válido 50 i Falta nombre 51 j Falta el número de estación 52 k Falta el número del drive 53 l Falta el rango de baudios 54 m Error de cabecera diferente 55 n Flujo ya abierto 56 o Escribiendo archivo de lectura 57 p Leyendo archivo de escritura 58 q Drive protegido contra escritura 59 r Microdrive lleno 60 s No hay Microdrive presente 61 t Archivo no hallado 62 u Error en el código de enganche 63 v CODE error 64 w MERGE error 65 x VERIFY falló 66 y Tipo de archivo erroneo Comandos Beta Basic: Código Tecla 128 8 KEYWORDS 129 1 DEF PROC 130 2 PROC 131 3 ENDPROC 132 4 RENUM 133 5 WINDOW 134 6 AUTO 135 7 DELETE 136 SS+7 REF 137 SS+6 JOIN 138 SS+5 EDIT 139 SS+4 KEYIN 140 SS+3 LOCAL 141 SS+2 DEFAULT 142 SS+1 DEF KEY 143 SS+8 CSIZE 144 A ALTER 145 B 146 C CLOCK 147 D DO 148 E ELSE 149 F FILL 150 G GET 151 H 152 I EXIT IF 153 J WHILE 154 K UNTIL 155 L LOOP 156 M SORT 157 N ON ERROR 158 O ON 159 P DPOKE 160 Q POP 161 R ROLL 162 S SCROLL 163 T TRACE 164 U USING Funciones: FN A( AND FN M( MEM FN B$ BIN$ FN M$ MEMORY$ FN C$ CHAR$ FN V( MOD FN C( COSE FN N( NUMBER FN D( DEC FN O( OR FN P( DPEEK FN R( RNDM FN E( EOF FN K$ SCRN$ FN F( FILLED FN Z$ SHIFT$ FN H$ HEX$ FN S( SINE FN U( INARRAY FN S$ STRING$ FN I( INSTRING FN T$ TIME$ FN T( ITEM FN U$ USING$ FN L( LENGTH FN X( XOR Mayo 2006 zx_if1@hotmail.com