COMPILER Spectrum 48k. INVESTRONICA. INSTRUCCIONES INSTRUCCIONES GENERALES DE CARGA 1.- Rebobina la cinta hasta su principio. 2.- Conecta el (EAR) del ZX-SPECTRUM con el (EAR) del cassette. 3.- Ajusta el volumen del cassette a 3/4 del volumen máximo (aproximadamente). Si el cassette tiene control de agudos, posicionalo en el máximo, y el de graves en el mínimo. 4.- Escribe LOAD "" o bien sigue las instrucciones particulares de carga de cada cinta, y a continuación ENTER. 5.- Pulsa PLAY en el cassette. COMPILER - SPECTRUM (48K) ¿QUÉ ES UN COMPILADOR? Esencialmente, un compilador es un programa que convierte un programa escrito en BASIC en el equivalente en código máquina. SUPER C hace todo eso, convirtiéndose casi todos los programas en BASIC de SINCLAIR en donde se usen números enteros al Z80 Assembler. CARGA DEL PROGRAMA. Pulsa LOAD "SUPER C" y deja el cassette en marcha hasta que veas que ha terminado. Pulsa ENTER y vera como, aparentemente, hay solo 5 líneas de BASIC en memoria. De hecho, el compilador ha sido colocado por encima del RAMTOP y las 5 líneas ya no se necesitan, aunque la número 5 puede ayudarte a recordar qué dirección debes usar en la instrucción RAND USR (borra estas líneas una por una). Después de cargar el programa aparecerá una sentencia 9 STOP STATEMENT,2:8. La cinta contiene una versión del programa en cada cara. COMO USAR EL COMPILADOR. Aunque volveremos con los detalles de cómo usar el compilador, en esencia sólo tienes que copiar tu programa en BASIC y después ejecurar RUN para ver si tiene fallos. Una vez corregidos éstos (si los hay), escribe: RANDOMIZE USR 49152 seguido de ENTER y tu programa en BASIC se habrá convertido en una versión en código máquina super rápido. ¡Así de fácil! PRIMEROS PASOS. Después de cargar SUPER C, encontrarás que el pequeño programa de 5 líneas está todavía en memoria, aunque ya no se necesita. No sólo ha cargado el código máquina del compilador, sino que también ha cambiado INK a blanco y PAPER y BORDER a azul. Después de amplia experimentación, decidimos que éstos son los colores que menos problemas causan a la vista. El programa introduce el modo de letras mayúsculas, y el compilador solo reconoce variables en letras mayúsculas (aunque se pueden usar minúsculas en pantalla). El programa en BASIC es inútil de ahora en adelante, y debes borrarlo línea a línea. Crear un programa en código máquina es muy fácil con SUPER C. Después de haber copiado tu programa y haber examinado cuidadosamente para ver que no hay errores, asegúrate de que no usas números decimales, cadenas o tablas. Puedes incluso cargar el programa desde el cassette como siempre. SUPER C tiene un muy limitado chequeo de errores, e insistimos en que te asegures de arreglar los errores. Ahora escribe: RANDOMIZE USR 49152 y pulsa ENTER. Casi instantáneamente aparecerá en la parte inferior de la pantalla 0:1 OK. Para ejecutar la nueva versión del programa en lenguaje máquina, pulsa RUN y ENTER, y trátalo como cualquier programa en BASIC, aunque, por supuesto, no lo es. Si el programa ha sido compilado correctamente, no debe aparecer otra cosa en la pantalla cuando listes que: 1> PROPERTY OF SOFTEK ALL COMERCIAL RIGHTS RESERVED. Si es así, todo ha ido bien, y el programa deberá ser ejecutado unas diez veces más rápido que de costumbra. Sin embargo, algunos programas pueden registrar dallos durante la compilación por varias razones. Esta es una lista de su significado: 0,1 OK. Compilado. C,X Comando ilegal (X=Nº de línea). 6,X GOTO o GOSUB erróneo. mientras se ejecute: N,X Pasado el fin del programa. También: A,X Argumento inválido, si tratas de usar algunas posibilidades de SPECTRUM que SUPER C no puede manejar aún. Del mismo modo, puedes tener problemas con el RAMTOP por razones similares. Esto no significa que suceda siempre. Lee las siguientes páginas para ver lo que hace y lo que no SUPER C, y trata siempre de incluir una línea con REM B en él para poder parar el programa durante su ejecución y modificación, así como para poder grabarlo en cassette, etc. Después de haber ejecutado un programa compilado, deberás obtener un error tipo BREAK o "Stetement Lost". ¿QUÉ PUEDE COMPILAR SUPER C? SUPER C pueden compilar casi todos los programas que no incluyan números decimales (y por lo tanto, SQR, SIN, TAN, etc.), CADENAS o TABLAS. De todos modos hay varias formas de crear dichas funciones en un programa compilado. Pronto aparecerán nuevas versiones para ampliar las posibilidades de SUPER C. Todas estas mejoras serán compatibles con esta versión mediante "merge". SUPER C puede manejar: CHR$, IN, PAPER, POINT, RND, USR, BEEP, BORDER, BRIGHT, CIRCLE, CLS, COPY, DATA, DRAW, FLASH, FOR-TO-NEXT-STEP, GOSUB, GOTO, IF-THEN, INK, INVERSE, LET, NEW, NEXT, OUT, OVER, PAPER, PAUSE, PLOT, POKE, PRINT (AT), RANDOMIZE, RESTORE, READ, RETURN, RUN, STOP. Además, usa CODE INKEY$ y dos REM que mejoran las posibilidades del BASIC de SINCLAIR. REM B Comprueba si BREAK está pulsado. REM M,X,Y,Z dice al compilador que lo siguiente a la 'M' es una serie de bytes decimales que forman un programa en código máquina que no debe ser compilado. En resumen, hay poco que SUPER C no pueda hacer comparado con el normal lenguaje de máquina. NOTA: Cuando hayas escrito el programa en BASIC, haz una copia en cassette antes de compilarlo. Cuando lo cargues, introduce primero CLEAR 32000, pues el compilador coloca el RAMTOP muy bajo. PECULIARIDADES DEL COMPILADOR. En la inmensa mayoría de los casos, puedes simplemente copiar los programas en BASIC como siempre, pero hay algunas restricciones. La más importante es que LAS BARIABLES DEBERÁN SER LETRAS MAYÚSCULAS. INKEY$ Este comando no funciona como tal, sino que deberá estar en la forma CODE INKEY$. Para simular INKEY$ puedes usar CHR$ CODE INKEY$. De igual manera, no puedes ejecutar POKE xxx, CODE INKEY$ sino que se debe sustituir por : 100 LET A = CODE INKEY$ 110 POKE XXX, A NEW Solo borrará tu progrma BASIC, pero el compilador permanecerá en memoria. Recuerda que si quieres ejecutar un "NEW total" sin desconectar el micro, simplemente compila la línea: 1 REM N Cuando lo ejecutes, borrará totalmente la memoria de tu Spectrum. PRINT Puedes usar PRINT AT y PRINT CHR$, pero no PRINT TAB. FOR-NEXT-STEP Puedes usarlo siempre que STEP alcance exactamente el límite. 10 FOR A = 1 TO 11 STEP 2 no funcionará 10 FOR A = 1 TO 11 STEP 3 no acabará nunca PAUSE No puedes pulsar una tecla para parar la pausa. READ/DATA/RESTORE Sólo puedes usar variables numéricas simples en READ, y números enteros en DATA. RESTORE devuelve el puntero al principio de todos los DATA (por tanto, RESTORE x no es posible). REM M,x,y,z Esta instrucción ordena al SUPER C tomar los bytes que siguen a la 'M' como una rutina en lenguaje máquina que no debe ser compilada. No olvides la coma detrás de la 'M'. RND Obtienes un número entre 0 y 32767 (deberás dividirlo para obtener valores menores. Por ejemplo: RND 1128 da uno entre 0 y 255). Para un mejor funcionamiento usa RANDOMIZE RND antes de RND. *,/,+,- Como en BASIC, solo que todas las expresiones serán calculadas de izquierda a derecha, ignorando los paréntesis. USR Deberá ser seguido de un número o una variable numérica. REM N Ejectuta NEW totalmente, como si apagaras la máquina. NÚMEROS Números impresos: 0a 32767 ó -32767 a 0. Números en INPUT: 0 a 65536 ó -32767 a 32767 LET/VARIABLES NUMÉRICAS Puedes usar cualquier letra, en mayúsculas (A-Z) para variables numéricas. Todas valen cero al principio, no hay necesidad de definirlas como ocurre en BASIC. CONDICIONALES Puedes trabajar con =,<>,>,< (nótese que '<' significa "menor o igual qué"). OVER, INVERSE Todas estas instrucciones deberán ser usadas como comandos únicos, y no en comandos PRINT; por ejemplo. Así, para imprimir algo en INK amarillo (sin que toda la línea aparezca de tal color), y en PAPER rojo: 10 PAPER 2: INK 6 20 PRINT "SUPER C" Análogamente con FLASH, BRIGHT, etc. CLS Borra las 24 líneas, no las 22 primeras como hace el BASIC. Por supuesto, puedes usar las 24 líneas con el compilador, puesto que en las dos inferiores no aparecen códigos de error. CLEAR Borra todas las variables, tal y como hace el BASIC. RANDOMIZE Debe incluir un número después. RETURN Como RETURN en BASIC, vuelve desde uns subrutina, pero al final del programa volverá al BASIC. GOTO/GOSUB La línea a la que saltas debe existir y debe ser un número, no una variable ni una expresión. SUPER VELOCIDAD Pensamos que estarás muy impresionado de la velocidad que SUPER C desarrolla comparado con la versión en BASIC. Aquí están los siete primeros test del banco de pruebas llevados a cabo por PCW en un BBC, un SPECTRUM, y un SPECTRUM con SUPER C. BENCHMARK BBC SPECTRUM BASIC SPECTRUM COMPILER 1 1.0Ss 4.8 0.15 2 3.1 8.7 0.09 3 8.2 21.1 1.10 4 8.7 20.4 0.99 5 9.1 24.0 1.11 6* 13.9 55.3 1.91 7* 21.4 80.7 2.14 * Las dos últimas fueron medidas con el compilador asignando un área de memoria para cargar valores de una table en (BM6) y colocando valores allí (BM7). Esto representa un incremento de 20 a 100 veces más rápido trabajando en compilador con respecto a BASIC, y éstas no son necesariamente los mejores ejemplos para mostrar la velocidad de SUPER C. Hay ocasiones en que el compilador ejecuta los programas varios cientos de veces más rápido que el BASIC. Es incluso más rápido que las alternativas a BASIC de FORTH y PASCAL. Como un consejo general, para velocidad extra, usa ciclos en que una variable sea incrementada y su valor comprabado con un comando IF-THEN, mejor que con un ciclo FOR-NEXT. GENERALIDADES Y RUTINAS ÚTILES 1) Área de memoria lectura-escritura: En esta versión de SUPER C, recomendamos el uso del área superior a 53.000. Allí puedes colocar tablas de datos, crear matrices, cargar elementos de la pantalla y demás. 2) Puedes grabar tu programa compilado en cassette, introduciendo esta línea como comando directo: SAVE "Nombre" CODE 23500,9268 PANTALLA Como sugerencia, aquí hay una interesante rutina que transfiere la pantalla como información a la memoria superior para poder cargarla de nuevo en pantalla cuando desees. 10 CIRCLE 128,88,50 20 LET A = 16384 30 LET X = 53000 40 LET K = PEEK A 50 POKE X, K 60 IF A < 22526 THEN GOTO 80 70 LET A = A + 1: LET X = X + 1: GOTO 40 80 CLS: PAUSE 100 90 LET A = 16384: LET X = 53000 100 LET K= PEEK X 110 POKE A, K 120 LET A = A + 1: LET X = X + 1 130 IF A < 22527 THEN STOP 140 GOTO 100 Este es un pequeño paso para poder crear gráficos unimodos, simplemente cargando varias zonas de memoria en pantalla. TABLAS NUMÉRICAS A pesar de que SUPER C no admite tablas en esta versión, es fácil colocar números en la zona de lectura-escritura de la memoria (por encima de 53000). De hecho puedes crear un "área de variables" bastante fácilmente marcando el principio de una tabla dada con el CODE de la letra (65="A", por ejemplo) y determinar la longitud de la tabla en el siguiente byte, seguido de los datos. TABLAS ALFANUMÉRICAS De nuevo, SUPER C no maneja este tipo de tablas ne esta versión, pero puedes cargar elementos alfanuméricos desde 53000 en adelante. Sólo tienes que cargar sus CODE's y después imprimirlos en pantalla usando PEEK y CHR$. CARACTERES Y GRÁFICOS DEFINIDOS Como verás, si tratas que el compilador ejecute PRINT CHR$ de los CODE desde 0 a 255, sólo funcionará con el juego de caracteres ASCII. Para ver el USR de los gráficos definidos, deberás mover el puntero colocado en 23606 y 23607 (CHARS) para que el valor de dichas direcciones apunte 256 más abajo del área de gráficos definidos. Sabiendo la dirección de los gráficos definidos (65368 para el Spectrum 48k) puedes calcular fácilmente las direcciones de los bytes que definen el nuevo carácter. SUPER C tampoco imprimirá los caracteres gráficos del Spectrum, pero son fáciles de crear como subrutinas USR. FLASH DEL BORDER Compila este programa para que el BORDER parpadee y produzca algunos efectos sonoros: 10 LET A = RND 20 REM B 30 OUT 254, A 40 GOTO 10 Y compila este para crear líneas multicolores en el BORDER: 10 LET A = RND / 4096 20 REM B 30 OUT 254, A 40 GOTO 10 CLS PARA CREAR UN NUEVO PAPER o INK Esta rutina, una vez compilada, cambia el color del INK y el PAPER a los definidos por 'X' en la línea 20. Puede cambiar también FLASH y BRIGHT (ver página 16 del manual para calcular este número). Coloca en 'A' el valor 'X'. A propósito, si usas IF A 23697 THEN GOTO, no olvides poner el número de línea detrás, o un error GOTO aparecerá cuando el compilador no encuentre la línea. COMPROBANDO EL TECLADO Para ello, debes usar CODE INKEY$. Sin embargo, SUPER C solo detectará si la tecla está pulsada en un determinado instante, y por lo tanto no manejas teclas con SHIFT. Para detectar éstas, deberás primero comprobar si SHIFT o SYMBOL SHIFT han sido pulsadas, y después acudir a una subrutina para ver la tecla pulsada posteriormente. Realmente ni CAPS ni SYMBOL SHIFT tienen asignado un CHR$ CODE, pero SUPER C les ha otorgado a CAPS SHIFT el 39 y a SYMBOL SHIFT el código 24. Aquí va un simple programa gráfico que ilustra ésto: 10 LET X = 128: LET Y = 88 20 OVER 1 30 PLOT X, Y 40 IF CODE INKEY$ = 54 THEN LET Y = Y - 1 50 IF CODE INKEY$ = 55 THEN LET Y = Y + 1 60 IF CODE INKEY$ = 53 THEN LET X = X - 1 70 IF CODE INKEY$ = 56 THEN LET X = X + 1 80 REM B 90 GOTO 30 LIMITACIONES DEL COMPILER Puedes compilar un programa BASIC de aproximadamente 8K de longitud con un máximo de 10K de datos adicionales en la zona alta de la memoria (por encima de 53000). Si quieres más espacio, deberás usar trucos como el de cargar datos en los dos tercios inferiores de la pantalla (con el mismo PAPER e INK), pero ¡cuidado al ejecutar CLS! Puedes usar cualquier número de línea que el Spectrum acepte normalmente. CARGADOR HEXADECIMAL Como ejemplo de programa útil y fácil para SUPER C, aquí hay un cargador hexadecimal que imprime las direcciones seguidas de su contenido en decimal y hexadecimal. Pulsando 'M', disminuirás la velocidad del listado (que es bastante) para poder ver los bytes, y pulsando SPACE pararás la lista para poder hacer una copia en impresora. 1 REM 2 REM 3 REM 5 LET P = 1 10 LET A = 0 15 PRINT A;" "; 16 LET X = 0: LET Y = 0 18 LET P = 1: IF CODE INKEY$ = 77 THEN LET P = 100 19 PAUSE P: REM B 20 LET A = PEEK A 25 PRINT " "; K ;" "; 26 IF K = 0 THEN GOTO 200 30 IF K/16 > 0 THEN LET X = K/16 40 LET J = K/16 45 LET Z = X * 16 50 LET Y = K - Z 60 IF X > 9 THEN LET X = X + 55 70 IF Y > 9 THEN LET Y = Y + 55 80 IF X > 9 THEN GOTO 100 90 PRINT X; 95 GOTO 120 100 PRINT CHR$ X; 120 IF Y > 9 THEN GOTO 140 130 PRINT Y 135 GOTO 150 140 PRINT CHR$ Y 150 LET A = A + 1: GOTO 15 200 LET X = 0: LET Y = 0: GOTO 9O