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 mximo (aproximadamente). Si el cassette tiene control de agudos, posicionalo en el mximo, y el de graves en el mnimo.
4.- Escribe LOAD "" o bien sigue las instrucciones particulares de carga de cada cinta, y a continuacin 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 cdigo mquina.

SUPER C hace todo eso, convirtindose casi todos los programas en BASIC de SINCLAIR en donde se usen nmeros 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 lneas de BASIC en memoria. De hecho, el compilador ha sido colocado por encima del RAMTOP y las 5 lneas ya no se necesitan, aunque la nmero 5 puede ayudarte a recordar qu direccin debes usar en la instruccin RAND USR (borra estas lneas una por una). Despus de cargar el programa aparecer una sentencia 9 STOP STATEMENT,2:8.

La cinta contiene una versin del programa en cada cara.

COMO USAR EL COMPILADOR.

Aunque volveremos con los detalles de cmo usar el compilador, en esencia slo tienes que copiar tu programa en BASIC y despus 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 versin en cdigo mquina super rpido. As de fcil!

PRIMEROS PASOS.

Despus de cargar SUPER C, encontrars que el pequeo programa de 5 lneas est todava en memoria, aunque ya no se necesita. No slo ha cargado el cdigo mquina del compilador, sino que tambin ha cambiado INK a blanco y PAPER y BORDER a azul. Despus de amplia experimentacin, decidimos que stos son los colores que menos problemas causan a la vista. El programa introduce el modo de letras maysculas, y el compilador solo reconoce variables en letras maysculas (aunque se pueden usar minsculas en pantalla).

El programa en BASIC es intil de ahora en adelante, y debes borrarlo lnea a lnea.

Crear un programa en cdigo mquina es muy fcil con SUPER C. Despus de haber copiado tu programa y haber examinado cuidadosamente para ver que no hay errores, asegrate de que no usas nmeros 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 instantneamente aparecer en la parte inferior de la pantalla 0:1 OK. Para ejecutar la nueva versin del programa en lenguaje mquina, pulsa RUN y ENTER, y trtalo 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 ms rpido que de costumbra. Sin embargo, algunos programas pueden registrar dallos durante la compilacin por varias razones. Esta es una lista de su significado:

0,1	OK. Compilado.
C,X	Comando ilegal (X=N de lnea).
6,X	GOTO o GOSUB errneo.

mientras se ejecute:

N,X	Pasado el fin del programa.

Tambin:

A,X	Argumento invlido, si tratas de usar algunas posibilidades de SPECTRUM que SUPER C no puede manejar an.

Del mismo modo, puedes tener problemas con el RAMTOP por razones similares. Esto no significa que suceda siempre.

Lee las siguientes pginas para ver lo que hace y lo que no SUPER C, y trata siempre de incluir una lnea con REM B en l para poder parar el programa durante su ejecucin y modificacin, as como para poder grabarlo en cassette, etc.

Despus de haber ejecutado un programa compilado, debers obtener un error tipo BREAK o "Stetement Lost".

QU PUEDE COMPILAR SUPER C?

SUPER C pueden compilar casi todos los programas que no incluyan nmeros 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 aparecern nuevas versiones para ampliar las posibilidades de SUPER C. Todas estas mejoras sern compatibles con esta versin 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.

Adems, 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 cdigo mquina que no debe ser compilado.

En resumen, hay poco que SUPER C no pueda hacer comparado con el normal lenguaje de mquina.

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 mayora de los casos, puedes simplemente copiar los programas en BASIC como siempre, pero hay algunas restricciones. La ms importante es que LAS BARIABLES DEBERN SER LETRAS MAYSCULAS.

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 lnea:

	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 lmite.

	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

Slo puedes usar variables numricas simples en READ, y nmeros 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 instruccin ordena al SUPER C tomar los bytes que siguen a la 'M' como una rutina en lenguaje mquina que no debe ser compilada. No olvides la coma detrs de la 'M'.

RND

Obtienes un nmero entre 0 y 32767 (debers 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 sern calculadas de izquierda a derecha, ignorando los parntesis.

USR

Deber ser seguido de un nmero o una variable numrica.

REM N

Ejectuta NEW totalmente, como si apagaras la mquina.

NMEROS

Nmeros impresos: 0a 32767  -32767 a 0.

Nmeros en INPUT: 0 a 65536  -32767 a 32767

LET/VARIABLES NUMRICAS

Puedes usar cualquier letra, en maysculas (A-Z) para variables numricas. Todas valen cero al principio, no hay necesidad de definirlas como ocurre en BASIC.

CONDICIONALES

Puedes trabajar con =,<>,>,< (ntese que '<' significa "menor o igual qu").

OVER, INVERSE

Todas estas instrucciones debern ser usadas como comandos nicos, y no en comandos PRINT; por ejemplo. As, para imprimir algo en INK amarillo (sin que toda la lnea aparezca de tal color), y en PAPER rojo:

	10 PAPER 2: INK 6
	20 PRINT "SUPER C"

Anlogamente con FLASH, BRIGHT, etc.

CLS

Borra las 24 lneas, no las 22 primeras como hace el BASIC. Por supuesto, puedes usar las 24 lneas con el compilador, puesto que en las dos inferiores no aparecen cdigos de error.

CLEAR

Borra todas las variables, tal y como hace el BASIC.

RANDOMIZE

Debe incluir un nmero despus.

RETURN

Como RETURN en BASIC, vuelve desde uns subrutina, pero al final del programa volver al BASIC.

GOTO/GOSUB

La lnea a la que saltas debe existir y debe ser un nmero, no una variable ni una expresin.

SUPER VELOCIDAD

Pensamos que estars muy impresionado de la velocidad que SUPER C desarrolla comparado con la versin en BASIC.

Aqu estn 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 ms rpido 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 ms rpido que el BASIC. Es incluso ms rpido 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 versin 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 dems.

2)	Puedes grabar tu programa compilado en cassette, introduciendo esta lnea como comando directo:
	SAVE "Nombre" CODE 23500,9268

PANTALLA

Como sugerencia, aqu hay una interesante rutina que transfiere la pantalla como informacin 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 pequeo paso para poder crear grficos unimodos, simplemente cargando varias zonas de memoria en pantalla.

TABLAS NUMRICAS

A pesar de que SUPER C no admite tablas en esta versin, es fcil colocar nmeros en la zona de lectura-escritura de la memoria (por encima de 53000).

De hecho puedes crear un "rea de variables" bastante fcilmente 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 ALFANUMRICAS

De nuevo, SUPER C no maneja este tipo de tablas ne esta versin, pero puedes cargar elementos alfanumricos desde 53000 en adelante. Slo tienes que cargar sus CODE's y despus imprimirlos en pantalla usando PEEK y CHR$.

CARACTERES Y GRFICOS DEFINIDOS

Como vers, si tratas que el compilador ejecute PRINT CHR$ de los CODE desde 0 a 255, slo funcionar con el juego de caracteres ASCII.

Para ver el USR de los grficos definidos, debers mover el puntero colocado en 23606 y 23607 (CHARS) para que el valor de dichas direcciones apunte 256 ms abajo del rea de grficos definidos. Sabiendo la direccin de los grficos definidos (65368 para el Spectrum 48k) puedes calcular fcilmente las direcciones de los bytes que definen el nuevo carcter. SUPER C tampoco imprimir los caracteres grficos del Spectrum, pero son fciles 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 lneas 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 lnea 20. Puede cambiar tambin FLASH y BRIGHT (ver pgina 16 del manual para calcular este nmero). Coloca en 'A' el valor 'X'.

A propsito, si usas IF A 23697 THEN GOTO, no olvides poner el nmero de lnea detrs, o un error GOTO aparecer cuando el compilador no encuentre la lnea.

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, debers primero comprobar si SHIFT o SYMBOL SHIFT han sido pulsadas, y despus 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 cdigo 24.

Aqu va un simple programa grfico 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 mximo de 10K de datos adicionales en la zona alta de la memoria (por encima de 53000). Si quieres ms espacio, debers 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 nmero de lnea que el Spectrum acepte normalmente.

CARGADOR HEXADECIMAL

Como ejemplo de programa til y fcil para SUPER C, aqu hay un cargador hexadecimal que imprime las direcciones seguidas de su contenido en decimal y hexadecimal. Pulsando 'M', disminuirs la velocidad del listado (que es bastante) para poder ver los bytes, y pulsando SPACE parars 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
