SERIE COMPARANDO BASICS (II) TRS-80 BASIC Nivel I A MODO DE INTRODUCCIÓN Esta serie esta dedicada a ver aquellos BASICs y maquinas de lo cuales no hay emulacion ni interprete para el ZX Spectrum. Tras ver el BASIC de Darmouth lo mas logico hubiera sido continuar con el de Altair, SOL y DEC, o incluso el de Apple ][, pero he decidio trata con el Nivel 1 del Modelo 1 del TRS80, debido a que se basa en el Tiny Basic. Tras la aparición del APPLE ][ en 1977, ese mismo año Commodore sacó el primero de su serie PET, el CBM PET 2001; y Tandy mediante su filial Radio Shack, no tardaría en sacar su TRS-80. A continuación mi traducción del texto original de Matthew Reed, publicado en inglés, en la página WEB "Matthew Reed's TRS-80.org" PARTE I Sobre el Basic Nivel I "Cuando el TRS-80 Modelo I salió por primera vez en 1977, el interprete BASIC que Microsoft estaba escribiendo (BASIC Nivel II), aun le faltaban meses para poderlo completar. Debido a eso, el Modelo I original fue suplido con un interprete BASIC conocido como BASIC Nivel I. El BASIC Nivel I estaba basado en el “Palo Alto Tiny BASIC”, una version de 2K del Tiny BASIC escrito por el Dr. Li-Chen Wang para la edición de Mayo de 1976 del Dr. Dobb’s Journal. Como el Dr. Li Chen-Wang puso su BASIC bajo dominio publico, (él lo etiquetó “@COPYLEFT; ALL WRONGS RESERVED” - @izquierda de copia, todos los errores reservados), Steve Leininger, el diseñador del TRS-80, pudo usarlo como un punto de partida. Le añadió las rutinas para matemática de coma flotante, cassette, teclado y video, con lo que aumentó el tamaño del código original a 4K. El Modelo I venia con un libro guía del BASIC Nivel I escrito por el Dr. David A. Lien llamado "Manual del usuario para Nivel I". Este libro era una excelente introducción al BASIC Nivel I, así como para las computadoras en general. Un catálogo de Radio Shack describía la combinación de esta manera: Nivel I es una versión simplificada del BASIC. Nivel I, junto con su sobresaliente manual, le permite aprender como programar de forma rápida y facil - incluso si no tiene conocimientos previos sobre las computadoras o sobre programación. Versiones Radio Shack vendió Modelo I Nivel I con dos tamaños de memoria: 4K y 16K. Tecnicamente, el BASIC Nivel I podía soportar hasta 48K de memoria, pero para incrementar un Modelo I más allá de los 16K, usualmente requería de la Interfaz de Expansión Interface, la que a su vez requería del BASIC Nivel II. Contrario a lo que algunos clamaban, sí había BASIC Nivel I para el Modelo III. Cuando el Modelo III fue introducido, Radio Shack vendió una versión de 4K con BASIC Nivel I. Esta version de Nivel I era la misma que la del Modelo I pero con comandos añadidos para el maejo de impresoras (LLIST y LPRINT). Variables El BASIC Nivel I permite usar solamente tres tipos de variables: 26 variables numéricas, con nombres de una sola letra de la A a la Z 2 variables de cadena, que son A$ y B$ 1 sola variable matricial numérica, de nombre A(x) (siendo x usado como índice) Mensajes de Error El BASIC Nivel I ofrece solo tres mensajes de error: HOW?, WHAT? y SORRY (¿cómo?, ¿qué? y lo siento). El Manual del usuario del Nivel I describe estos mensajes de error de esta forma: En general, un mensaje "HOW?" significa "Entiendo sus instrucciones, pero, me está pidiendo hacer algo que es imposible." El error "WHAT?" por otro lado, quiere decir "No entiendo sus instrucciones - o la gramática es erronea o está usando palabras que no estan en mi vocabulario." El tercero y último error es "SORRY". Refiere a “Lo siento — se ha quedado sin memoria y debe ya sea acortar el tamaño de su programa o comprar memoria extra." Abreviaciones El BASIC Nivel I posee un “dialecto tipo taquigráfico” lo cual permite abreviar los comandos BASIC muy largos mediante el uso de un punto. Por ejemplo: PRINT puede abreviarse como P. En total, el BASIC Nivel I reconoce 27 abreviaciones, las cuales eran importantes muy especialmente porque Nivel I no tokeniza los programas, a diferencia de muchos otros BASICs. Las formas breves eran a veces la clave para encajar programas en la memoria disponible. Software El poder del BASIC Nivel I era muy remarcable, especialmente considerando que el BASIC Nivel II ocupaba tres veces más espacio que el Nivel I (12K contra 4K). Hubo algunos programas muy impresionantes escritos en BASIC Nivel I, incluso para el limite de los 4K de memoria base. Gran parte del software de comienzos del TRS-80 eran en Nivel I y luego salian versiones en Nivel II. El BASIC Nivel I podía salvar y cargar archivos BASIC de cintas cassette a 250 baudios. Carecía de comandos para cargar programas en código máquina, pero los programadores muy pronto descubrieron un modo muy habil para hacer eso. Algunos programas, tales como el "Simulador de vuelo T80-FS1" de subLOGIC, contenía un cargador que operaba ya sea con Nivel I o Nivel II." Hasta aquí el texto traducido del original de Matthew Reed. A continuación lo que he podido experimentar y aprender sobre este BASIC. PARTE II El BASIC Nivel I soporta las sigtes. palabras reservadas: Comandos: NEW, RUN, LIST, CONT Sentencias: PRINT, INPUT, READ, DATA, RESTORE, LET, STOP, END Cassette: CSAVE, CLOAD, PRINT#, INPUT# Para estructuras: GOTO, GOSUB, ON-GOTO/GOSUB, RETURN, IF-THEN, FOR-TO-STEP, NEXT Gráficos: CLS, SET, RESET, POINT(), AT, TAB Funciones: ABS(), INT(), RND(), MEM Matemáticas: +, -, * y / Operadores relacionales: <, >, =, <=, => y <> Op. Logicos: * y +, para efectuar las funciones de AND y OR. El modo abreviado: PRINT P. TAB T. NEW N. INT I. RUN R. GOSUB GOS. LIST L. RETURN RET. END E. READ REA. THEN T. DATA D. GOTO G. RESTORE REST. INPUT IN. ABS A. MEM M. RND R. FOR F. SET S. NEXT N. RESET R. STEP S. POINT P. STOP ST. PRINT AT P.A. CONT C. Debido a que el BASIC es harto conocido, he decidido simplemente listar todas sus instrucciones sin dar mayores referencias, excepto por aquellas que requieran mayor explicacion como es a continuacion... Entre las caracteristicas del BASIC tenemos: - Los comandos no pueden ser usados dentro de un listado de programa. - LIST {n} lista cada 12 líneas, continua si se pulsa el cursor arriba, se detiene si se pulsa otra tecla. - RND(0) devuelve un valor entre 0 y 1. RND(x) devuelve un entero entre 1 y x. - Debido a la parquedad de funciones, el manual ofrece un apendice con las subrutinas requeridas en reemplazo de funciones como TAN, SIN o LOG. - Tiene un modo de texto de 64 caracteres por 16 líneas, lo que es a igual a 1024 caracteres en total a visualizar en pantalla, en las posiciones de 0 a 1023. - Para poder posicionar en la pantalla de textos se usa PRINT AT n. - Tiene un único modo gráfico de baja resolución: 128 x 48, los cuales son en realidad bloques de 6 pixeles, osea de 3 de largo por 2 de ancho. - La pantalla avanza una línea tras la ejecución de un programa y la aparición del prompt "Ready". - NEW borra el programa en curso y limpia la pantalla poniendo el cursor al inicio. - carece de sonido en su versión Nivel I. El manejo de los datos: - Carece de DIM, CHR$, PEEK, POKE y USR, entre otras cosas. - Para salvar un programa había que conectar una grabadora de cassettes, pulsar PLAY y tipear CSAVE, la cual salva un programa sin nombre. - Para cargar el programa, se posiciona la cinta y se usa CLOAD también sin parámetros. - Para salvar solamente datos se usa por ejemplo: Sean las variables A, B y C, entonces se pulsa PLAY y enseguida PRINT# A;",";B;",";C - y para cargar dichas variables de vuelta: INPUT# A,B,C. No requiere ni de OPEN ni de CLOSE. - Si encendemos o reiniciamos el TRS-80 y tipeamos como orden directa PRINT A,B,C aparecerá tres veces el valor .5 en pantalla. Eso significa que todas las variables numéricas han sido inicializadas a ese valor. - Las variables de cadena A$ y B$ no pasan de los 16 caracteres de largo. - Hacer A$="ZZZ" es igual a hacer A$=ZZZ. El modo gráfico Hay un único modo de texto de 64 caracteres y ninguna forma de cambiarlo. No hay ningun comando para seleccionar el modo gráfico, se accede directamente mediante SET y RESET. La pantalla es en realidad una TV adaptada para servir como monitor en blanco y negro, con texto y gráficos en blanco sobre fondo negro. Ejemplo tomado del manual del TRS-80 Nivel I: 10 IN. "VERTICAL POSITION (0 TO 47)";Y 20 CLS 30 FOR X = 0 TO 127 40 FOR J = 0 TO 47 50 SET(X,J) 60 NEXT J 70 NEXT X 80 FOR X = 0 TO 127 90 RESET(X,Y) 100 NEXT X 999 G.999 Otro ejemplo incluyendo POINT y AT: 10 Y=1:N=0 20 IN."DO YOU WISH TO LIGHT THE BLOCK (Y/N)";Q 30 CLS 40 IF Q=0 GOTO 80 50 SET(75,20) 60 GOTO 100 80 RESET(75,20) 100 IF POINT(75,20)=1 P.AT200,X;Y,"IS LIT" 200 IF POINT(75,20)=0 P.AT200,X;Y,"IS DARK" 999 G. 999 EL TECLADO El teclado original ofrece la sigte. conformación: | 1! || 2" || 3# || 4$ || 5% || 6& || 7' || 8( || 9) || 0 || *: || =- ||BREAK| | f.a || Q || W || E || R || T || Y || O || P || @ || f.i || f.d | | f.ab || A || S || D || F || G || H || J || K || L || +; ||ENTER||CLEAR| |Shift|| Z || X || C || V || B || N || M || <, || >. || ?/ ||Shift| | barra espaciadora | donde: f.a = cursor arriba f.ab = curs. abajo f.i = curs. izquierda f.d = curs. derecha la tecla BREAK, en vez de ESC, interrumpe un programa Dos teclas CAMBIO (Shift) CLEAR - el manual original del Nivel I no explica su uso ENTER resalta por ser la única tecla clara, las demas son todas negras. El teclado en los primeros modelos tuvo un problema llamado "keyboard bounce" (rebote de teclado), Eso hacia que al presionar una tecla su caracter aparecíese múltiples veces repetido. Se solucionó primero con un programa en cinta y luego sería añadida a la ROM misma. Tenía 53 teclas, con sólo mayúsculas sin caracteres gráficos. Hubo opcionalmente algunos con teclados numérico incorporado en lugar de la etiqueta con la marca del aparato. Ya que no tengo un TRS80, esto es lo que he comprobado con el emulador MAME: Shift + 0 = espacio + C = interrumpe una entrada de datos (tecla BREAK) + L = hace un CLS y espera que se tipee algo (tecla CLEAR) + M = avanza una línea (LF o ENTER) + cursores = imprime una flecha de la direccion del cursor El cursor izquierda funciona como DELETE o BS (retroceso y borrado) Parte III Del Basic Nivel I al Basic Sinclair Convertir listados Basic de Nivel I al Basic del Spectrum, no es nada dificil, ya que muchos de sus comandos están presentes en el Basic Sinclair. Por lo que podemos resaltar: - Carece de ELSE al igual que el Spectrum, Apple, Atari o el C=64. - ON GOTO/GOSUB tiene su equivalente en el Spectrum o BetaBasic. - el modo abreviado tiene su equivalente en MEGA Basic y en las ROMs LEC 80 y 528. - AT debe ser modificado para la sintaxis Sinclair. - El Basic del Galaksija es un super set del Nivel I en el cual se basa. - Su modo gráfico puede ser adaptado de la forma que veremos a continuación... AT, SET y RESET en el Spectrum Ejemplo del AT de TRS-80 PRINT AT 40,"PRUEBA" El equivalente SINCLAIR a AT: DEF FN X(X)=INT(X/32):DEF FN Y(X)=INT(X-32*FN X(X)) PRINT AT FN X(40),AT Y(40);"PRUEBA" En el caso de SET y RESET Basta con definir una subrutina que las replique como en el caso del ZX-81. Pero SET empieza 0,0 en la esquina superior izq. y no abajo como el Spectrum pero sin afectar a PRINT como hace el ZX-81. Así que su definición sería: 8900 REM trs80 set 8902 PLOT xx*2,172-yy*4: DRAW 1,0: DRAW 0,3: DRAW -1,0: DRAW 0,-3: DRAW 1,3 8904 RETURN Ejemplo de su uso: 10 SET(0,0): SET(63,43) - reemplazar por... 10 LET xx=0: LET yy=0: GOSUB 8900: LET xx=63: LET yy=43: GOSUB 8900 para replicar RESET basta con añadir OVER 1 o INVERSE 1. Pero esto sólo genera una resolución de 128 x 43 y no 128 x 47 (encima el texto sigue a 32 x 21). Ahora, si modificamos: 8902 PLOT xx*2,172-yy*3: DRAW 1,0: DRAW 0,2: DRAW -1,0: DRAW 0,-2: DRAW 1,2 mientras en el ejemplo de su uso hacemos: 10 LET x=0: LET y=0: GOSUB 8900: LET x=63: LET y=47: GOSUB 8900 terminamos obteniendo gráficos de más de 47 puntos llegando a 128 x 57. En el caso de POINT: LET A=POINT(xx*2,172-yy*4) Y para cerrar... ¿Emulación o intérprete please? Hasta el momento de escribir estas notas, no existe ningún emulador del TRS-80 Modelo I (a pesar de que ya existe emulación del Galaksija basado en el TRS-80), menos aun un intérprete del Basic Nivel I (siquiera eso) para el Spectrum. Considerando que ambas máquinas usan un procesador Z80, no debería ser tan dificil crear un emulador del Modelo I Nivel I. Y tomando en cuenta que el BASIC ocupa solamente 4k, y la RAM mínima era de 4k, habiendo modelos con 16k y RAM video de 1k en monocromo, implementar un interprete tampoco debería ser más dificil aun con un 48k, 128k o +3. El Spectrum ya tiene la tecla BREAK, así que un hipotético emulador de trs80 podría usar ya sea EDIT o GRAPHICS en reemplazo de la tecla CLEAR. Pero ya que nada de eso existe todavía, tendremos que conformarnos con adaptar los listados del Nivel I al Spectrum. Con BetaBasic 4 para el 128k, no solo tenemos ya ON GOTO, sino que también podemos definir un procedimiento para PRINTAT, SET, RESET y POINT, pudiendo trabajar a pantalla completa, dandonos los 128 x 47 que queremos replicar, además de los 64 caracteres x 16 lineas. Acepta hasta 32767 numeros de línea. Debido a eso es forsozo renumerar todo el listado que uno encuentre que pase de la linea 9999 a la hora de covertirlo al Spectrum. Y hasta aqui todo lo que he podido probar, comparar y averiguar sobre el TRS80 Modelo 1 Nivel 1 de Basic. (c)2021-22 zx_if1@hotmail.com