Thunder Basic 1.0 Es una extensión del Basic exclusiva para usar solamente con Interfase 1 creada por Jeroen Kwast y Frank Vierstra en 1985. Añade más de 40 instrucciones nuevas al ZX Basic con Interfase 1 y Microdrives. Randomize Usr 50872 reinicia el Thunder Basic borrando cualquier programa en curso. Al cargar con LOAD "" o su equivalente en Microdrive, aparece el siguiente mensaje: >> Extended Basic Version 1.0 << >> © 1985 JJSoft and Easysoft << sintaxis: {*/G+8}comando donde: CS = caps shift G = CS + 9 (graphics) SS = Symbol Shift comandos: Alter, Auto, Edit, Delete, Renumber, Join, Split, Trace, Reset, Find, Onerror, Goto, Push, Pop, Mode, Defproc, Endproc, Repeat, Until, Proccls, Repcls, Color, Udg, Vdu, Sound, Save, Load, Copy, Stop, Ldir, Doke, Deek, Defchar, Sprite, Scroll, Move, Size, Fill, Get, Hex, Dec, Change, Insert, String, Cat#, Re-edit Todos los nuevos comandos son tecleados entrando primero en modo G (gráfico) y pulsando 8, luego 9 para finalmente tipear la sentencia thunder basic o en vez de todo eso, prefijándolos con un *. Pueden ser tipeados indistintamente con mayusculas o minusculas ya que automaticamente los comandos son puestos a mayusculas y aparecerán siempre prefijadas con un símbolo 'G+8'. Nota: En caso de ROMs modificadas como la if1-imc.rom de Ian Collier, debido a que usa el "*" para prefijar sus propios comandos extendidos, los comandos Thunderbasic que empiezan con s, l, m, v, r, e deben ser ingresados no con * sino con G+8. Otro detalle a notar, además de los nuevos comandos ya mencionados, Thunderbasic también incluye una variante de los comandos originales del Spectrum, pero que se tipean letra a letra y aparecen en el listados solo en minúsculas y son: run, ink, copy, let, for, out, paper, plot, draw, new, save, load, verify, merge, circle, input, print, next, dim, list, pause, over, inverse, bright, randomize, border, goto, gosub, return, cls, flash, beep, clear, rem, poke, if, stop, continue Así es posible tener en un mismo listado: 100 CIRCLE 100,100,50 - la sentencia original y: 150 circle100,100,20 - la versión tipeable letra a letra Nota: no es posible usar más de una orden tipeable seguida de otra. 200 print ink1;n - considerará 'ink1' como variable y devolverá error, pero: 200 print INK 1;n - siendo INK obtenido mediante SS+X en modo E, es correcto Una línea puede en cambio aceptar varias sentencias separadas por dos puntos: 300 inputa:printa - curiosamente imprimirá en la última línea y no en las de arriba Los espacios son innecesarios, en este caso: 'print5' es tan valido como 'print 5'. Para poder tipear estas sentencias, hay que entrar en modo L o C primero, tipeando cualquier signo que nos saque del modo K como por ejemplo: . , ; / ' entre otros y luego la sentencia que se desee como por ejemplo: .print120 - para ingresar esta orden hay que borrar ahora el '.' y recién Comandos de edición: Auto sintaxis: *AUTO {línea{,salto}} Genera automáticamente la numeración de líneas. Para salir de este modo hay que borrar el número en curso, tipear STOP y luego dar . Delete sintaxis: *DELETE x {TO y} Borra líneas desde x hasta y. Su se omite 'y' borra solo la línea 'x', la cual no puede ser cero. Nota: No es admitido "Delete TO y", "Delete x TO" pero si "Delete TO". Este último borra todo el listado. Edit sintaxis1: *EDIT {línea} sintaxis2: *RE-EDIT {línea} Facilita la edición de líneas, evitándole a uno hacer LIST [línea] + BREAK + EDIT (CS + 1) Renumber sintaxis: *RENUMBER {x,s} Renumera listados empezando desde 10 en adelante con saltos de 10 a menos que se den: 'x' especificando la línea de comienzo y 's' como intervalo de salto entre líneas. Ejemplo: RENUMBER 200,5 - renumera todo el listado empezando ahora desde la linea 200 con intervalos de 5 en 5 Nota: si x es mayor de 9999, borrará todo el listado y devolverá OK Join sintaxis: *JOIN {línea} Fusiona la línea especificada (o en curso) con la siguiente del listado. Split sintaxis: *SPLIT {x} Hace lo contrario a JOIN. Trace sintaxis: *TRACE TRACE 1 permite activar la opción de rastreo de ejecución de un programa para su mejor depuración como TRON. Activado muestra la información en la esquina superior derecha. Basta TRACE 0 para desactivar el rastreo como TROFF. Reset sintaxis: *RESET reinicia el sistema Thunderbasic de modo similar a NEW o Rand.Usr 50872. Dir sintaxis: *DIR {n} donde: n = un valor del 1 al 8 permite ver el catalogo del microdrive en curso como CAT. Sin parámetros muestra el catálogo de la unidad 1 por defecto. Cat# sintaxis: *CAT# muestra por el canal n, la siguiente información (en pantalla si n=2): CHANS : xxxx PROG : xxxx VARS : xxxx E_LINE : xxxx WORKSP : xxxx STKEND : xxxx RAMTOP : xxxx UDG : xxxx P_RAMT : xxxx PROGRAM- LENGTH : xxxx Copy right sintaxis: *Copy muestra en pantalla los nombres de los autores del programa: "Jeroen en Frank" Find sintaxis: *FIND Permite buscar en el listado cualquier texto dentro de la cadena especificada. Ejemplo: *FIND "INPUT alfa: PRINT alfa" - dará el número de linea de existir o dirá que no se encuentra Change sintaxis: *CHANGE una mezcla entre INPUT y EDIT, permite editar el contenido de una variable de cadena. Ejemplo: LET s$="alfa": PRINT s$ CHANGE s$: PRINT s$ - 'alfa' aparece en la zona de edición para ser modificada Comandos graficos: Mode sintaxis: *MODE Mode 0 permite usar 64 caracteres en pantalla con PRINT y LIST, mientras 1 vuelve al modo normal. Udg sintaxis: *UDG permite elegir entre 5 juegos de UDGs siendo n un valor del 0 al 4. Vdu sintaxis: *VDU muestra en pantalla el caracter asociado al código n, siendo este un valor de 0 a 255. Ejemplo: VDU18,1,33 - imprime en pantalla un signo "!" parpadeante Alter sintaxis: *ALTER ,

donde: t, p = valores del 0 al 9 para tinta y papel respectivamente Permite cambiar los atributos de color de la pantalla, igual que los comandos INK y PAPER. Ejemplo: *ALTER 6,1 - pone tinta = 6 y papel = 1 Color sintaxis: *COLOR donde: x = un número de 0 a 7 pone el color del borde y el papel al color x, con el color de tinta por defecto. Move sintaxis: *MOVE permite mover las coordenadas de pixeles. Como PLOT, pero sin dibujar nada. Ejemplo: 100 CIRCLE 100,100,40 105 PLOT 100,100: DRAW 20,20 120 MOVE20,20: DRAW 20,20 Fill sintaxis: *FILL [INK / PAPER ;] Rellena áreas de figuras con el color de papel o tinta especificados. Ejemplo: FILL INK 4;100,100 Scroll sintaxis: *SCROLL dir,p dir = una de las cuatro direcciones indicadas por 1(izq),2(abj),3(arr), y 4(der). p = el número de pixeles a mover por la pantalla. Todo lo que se mueve hasta el borde de un lado de la pantalla, reaparece en el lado opuesto. Ejemplo: 100 CIRCLE 100,100,40 110 SCROLL1,200 120 SCROLL2,40 130 SCROLL4,20 140 SCROLL3,30 Nota: se mueven las figuras pero no sus atributos Defchar sintaxis: *DEFCHAR a;b,c,d,f,g,h,i,j donde: a = un valor de 0 a 19 b - j = un valor de 0 a 255 permite definir hasta 20 UDGs de cada set seleccionado mediante *UDG Ejemplo: DEFCHAR 1;255,1,1,1,1,1,1,1 Sprite sintaxis: *SPRITE a,b,c{,d,e} donde: a = un valor de 0 a 20 b, c = coordenadas en pixeles de 0 a 254 (b) y 0 a 174 (c) d, e = el tamaño del sprite de 1 a 5 permite mostrar en pantalla sprites de hasta 5 tipos de tamaño hechos de UDGs. Ejemplo: SPRITE 1;100,100,2,2 - imprime sprite #1 a tamaño 2x2 caracteres Size sintaxis: *SIZE a,b,c,d;a$ donde: a, b = son las coordenadas de 0 a 255 (a) y 0 a 175 (b) c, d = el tamaño del texto desde 0 hasta un poco más de 34 (c) y 0 a 22 (d) a$ = la cadena a imprimir permite imprimir textos ampliados en la pantalla. Ejemplo: *SIZE255,175,2,2;"Alfa" - imprime a doble largo, doble ancho *SIZE255,175,34,22;"a" - imprime una enorme 'a' ocupando toda la pantalla A mayor tamaño, el texto avanza hacia la derecha y reaparece por el otro lado. Comandos diversos: Ldir sintaxis: *LDIR n TO m;x permite mover x bytes de la dirección de memoria 'n' a la 'm'. Para copiar toda una pantalla en cualquier parte de la RAM basta con hacer por ejemplo: *LDIR16384 TO 40000;6917 Doke sintaxis: *DOKE , Doble POKE, donde n es un número desde 0 hasta 65535. Deek sintaxis: *DEEK var# = Hace un doble PEEK extrayendo el contenido de la dirección y lo guarda en una variable numérica Dec sintaxis: *DEC var# = hex$ convierte un valor hexadecimal y lo guarda en una variable numerica Hex sintaxis: *HEX var$ = n Convierte un valor decimal a hexadecimal y lo guarda en una variable de cadena Goto sintaxis: *GOTO l,n salta a la línea 'l' y ejecuta las sentencias dentro de esa línea segun su posición 'n' Ejemplo: 100 PRINT 1: PRINT 2 *GOTO100,2 - llamará al segundo PRINT en 100, e imprimirá solo 2 en la pantalla Get sintaxis: *GET A diferencia de INKEY$, Get siempre espera hasta la pulsación de una tecla y puede ser usado para leer variables tanto numéricas como alfanuméricas. Ejemplos: *GET a. *Get a$. On error sintaxis1: *ONERROR sintaxis2: *ON ERROR Permite capturar errores e ir a una subrutina preestablecida que podrá ya sea corregir el error o informarnos al respecto. Ejemplo: 20 ON ERROR1000 30 INPUT n: IF n=-1 THEN GOTO 10000 40 PRINT 1/n 50 GOTO 30 1000 INPUT n 1010 GOTO 40 Nota: debido a que no parece haber modo de leer qué tipo de error se da, se puede generar un bucle sin fin, del cual solo se puede salir reiniciando el sistema. Tampoco parece haber manera de desactivar ONERROR, solo redirigirlo a otras líneas. En otros Basics, ON ERROR 0 desactiva las capturas, aquí salta al comienzo del listado. Pop sintaxis: *POP Extrae el valor de retorno de la pila para RETURN, REPEAT o ENDPROC. Este se puede almacenar en una variable numérica para impimirlo o manipularlo despues. Push sintaxis: *PUSH hace lo contrario a POP Sound sintaxis: *SOUND donde: v, s = valores de 0 a 999 genera efectos de sonido diverso siendo 'v' el valor que indica la duración. Ejemplo: SOUND 100,10 Save y Load *SAVE admite al parecer todos los parámetros de SAVE menos 'DATA var()'. *LOAD no requiere ni acepta parametro alguno. Nota: estas dos ordenes así como 'save' y 'load' funcionan exclusivamente con Cassette, no con Microdrive. Insert sintaxis: *INSERT a$ permite insertar lineas de programas almacenadas como cadenas al listado Da error en cualquier otro caso. Ejemplo: *insert "" - es valido y no hace nada *insert "a" - devuelve error *insert "120 PRINT n" - añadirá esa linea al listado *insert "120" - borrará esa linea de existir Nota: Esta sentencia debe ser usada solo dentro de un pograma para que sea efectiva. String sintaxis: *STRING x;x$ Es la inversa de Insert, permite guardar líneas x del listado en una variable de cadena. Ejemplo: 10 LET a$="Alfaguara" 20 STRING 10;b$ - almacena en b$ la línea 10 como cadena de texto 30 PRINT b$ - imprimirá sólo la línea 10 en la pantalla Bucles y procedimientos: Repeat sintaxis: *REPEAT Indica el inicio del bucle. Until sintaxis: *UNTIL Se sigue el bucle hasta que se cumpla "cond" Ejemplo: *REPEAT: sentencias...: *UNTIL Defproc sintaxis: *DEFPROC Permite crear un procedimiento "nombre" al estilo del PASCAL. Un procedmiento puede ser usado directamente o dentro de un programa, prefijándolo con '*' ó G+8. Al no permitirse el uso de parametros, solo queda usar variables globales. Endproc sintaxis: *ENDPROC Marca el punto en que se cierra el procedimiento. Ejemplo: 100 DEFPROC ALFA 110 REPEAT 120 INPUT n 130 PRINT n*n 140 UNTIL n=-1 150 ENDPROC *ALFA - para ejecutar el procedimiento Proccls y Repcls *PROCCLS - parece aludir a procedure clear stack (limpiar pila de procedimientos) *REPCLS - por repeat clear stack (limpiar pila de repeat) Su unico objetivo de ser el caso, es evitar que se desborde la pila y genere error. Stop sintaxis: *STOP No detiene ningún proceso ni nada, parece aludir a Stack Top (lo alto de la pila). Códigos de control: Estos códigos han sido corregidos respecto de los bugs de la rom original del Spectrum. CHR$ 8 - cursor izquierda CHR$ 9 - cursor derecha, avanza un espacio cada vez que se la usa CHR$ 10, cursor abajo y CHR$ 11, cursor arriba, no están implementados en Thunderbasic Mensajes de error: Estos son los mensajes exclusivos del Thunderbasic, ON ERROR puede capturarlos junto con los mensajes de error propios del Sinclair Basic. Invalid color - color no valido, se da con ALTER y COLOR Empty string - cadena vacía String to long - cadena demasiado larga No such direction - no existe esa dirección No REPEAT found - Un UNTIL fue usado sin su correspondiente REPEAT. To many REPEATs - demasiados repeats Line does not exist - A DELETE se le dio un número que no existía en el listado. Invalid cat stream - canal de catalogo no valido, se da con CAT# No colon found - no se encontraron los ":" Number error - número erroneo Tape error - error de la cinta Break pressed - BREAK fue presionado Stack empty - Se intentó un POP con el stack vacío. MODE error - se da cuando el parámetro de MODE no es 0 ni 1 Bad PROCedure name - nombre de procedimiento incorrecto, no existe el nombre dado con * No END PROC found - Al definirse un procedimiEnto se olvidó del respectivo END PROC. PROC loop too complicated - bucle de procedimiento demasiado complicado No PROC found - no se encontró el procedimiento No DEF PROC found - ENDPROC no halló su DEFPROC correspondiente. Otros mensajes: Not found - no encontrado Found at - encontrado en ... Searching, BREAK to exit. - buscando, pulsar Break para salir Name: - Nombre: ... Files: - Archivo: ... No files present. - Ningún archivo presente Kbytes free: - Kbytes libres: ... Continue - Continuar Francisco León zx_if1@hotmail.com