MANUAL DEL MSX TURBO-BASIC (MSX-BASIC-KUN COMPILER) INDICE Cap¡tulo 1 - Introducci¢n 1.1 - El int‚rprete BASIC: Descripcci¢n general 1.2 - Compilador vs. int‚rprete 1.3 - TURBO-BASIC vs. compilador tradicional Cap¡tulo 2 - C¢mo utilizar el TURBO-BASIC 2.1 - M‚todos para utilizar el TURBO-BASIC 2.1.1 - Si se compila la totalidad del programa 2.1.2 - Si se compila parte del programa 2.3 - Tipos de variables y precisi¢n 2.4 - Directivas especiales del TURBO-BASIC 2.4.1 - Directiva #I 2.4.2 - Directiva #C 2.4.3 - Directiva #N 2.5 - Manejo de interrupciones: Sentencias "ON...GOSUB..." Cap¡tulo 3 - Diferencias entre TURBO-BASIC y MSX-BASIC 3.1 - Diferencias de uso 3.2 - Listado de sentencias MSX-BASIC y su implementaci¢n en TURBO-BASIC Cap¡tulo 4 - Consideraciones finales y ejemplos 4.1 - Algunos trucos para acelerar todavia m s los programas 4.2 - Programas de ejemplo CAPITULO 1 - INTRODUCCION Analizaremos en esta introducci¢n la relaci¢n existente entre un int‚rprete y un compilador, utilizando algunas definiciones inform ticas en la medida que se necesiten. 1.1 - El int‚rprete BASIC: Descripci¢n general Toda computadora digital maneja, por definici¢n, exclusivamente c¢digos binarios, los cuales son interpretados por la CPU (Central Processing Unit, Unidad Central de Procesamiento) para ejecutar comandos muy sencillos de manipulaci¢n de datos y c lculos elementales tales como suma y resta. Estos c¢digos se representan internamente mediante largas cadenas de unos y ceros. Sin embargo, la computadora MSX, por ejemplo, maneja muy bien instrucciones tales como: PRINT 3*SQR(4)/36 ¨De d¢nde surge esta capacidad de por s¡ aparentemente incompatible con el funcionamiento de la CPU? De un programa incorporado en la computadora que se denomina int‚rprete MSX-BASIC. El int‚rprete MSX-BASIC es un programa en lenguaje m quina cuya tarea consiste en traducir al lenguaje m quina las instrucciones que reciba en BASIC. Una vez que las instrucciones est n en c¢digo m quina, la CPU ya puede trabajar con ellas y, por lo tanto, entenderlas. De lo dicho surge que la CPU no entiende realmente BASIC, por lo que antes de que pueda ajecutar programas escritos en dicho lenguaje hay que traducirle todo a lenguaje m quina. Es como cuando alguien nos habla, por ejemplo, en franc‚s y no le entendemos; para poder comunicarnos con ‚l necesitamos o bien un buen diccionario, o bien un int‚rprete o traductor que nos vaya traduciendo el franc‚s a castellano. Analogamente, la parte del sistema operativo que realiza ese trabajo de traducci¢n se denomina int‚rprete de BASIC. La "traducci¢n" se realiza cada vez que se ejecutan las sentencias. El tiempo necesario para realizar esta traduci¢n se suma al tiempo necesario para ejecutar el proceso especificado por las sentencias. Ya definido qu‚ es un int‚rprete, pasamos a analizar qu‚ es un compilador, y las ventajas de ‚ste frente al int‚rprete. 1.2 - Compilador vs. int‚rprete El hecho de que se tengan que se traducir las instrucciones en BASIC antes de poder trabajar con ellas explica el porqu‚ es m s lento utilizar programas escritos en BASIC que los escritos en lenguaje m quina, por ejemplo. El proceso de traducir un lenguaje a otro lleva tiempo, y a menudo las instrucciones en c¢digo de m quina resultantes no son tan eficientes para el tipo de funci¢n que se dise¤¢. Sin embargo, un programa escrito en lenguaje de m quina posee varias desventajas frente al int‚rprete, siendo las m s destacadas las siguientes: a) Los programas en lenguaje de m quina son dificiles de leer y de detectar los errores que tengan. b) Son espec¡ficos para cada tipo de computadora. c) Se utiliza una gran cantidad de instrucciones. d) Los programas que usan aritm‚tica complicada son dif¡ciles de programar. Per eso como soluci¢n intermedia surge el compilador. El proceso de traducci¢n de un programa BASIC a c¢digo de m quina utilizando el int‚rprete se realiza instrucci¢n por instrucci¢n, de manera que en el siguiente programa: 10 FOR I=1 TO 100 20 PRINT I; 30 NEXT I La linea 20 es traducida 100 veces, ya que aunque ya se tradujo "PRINT I", la siguiente vez que se ejecuta, el int‚rprete "olvid¢" su traducci¢n previa. El compilador, en cambio, cumple una tarea similar a la del int‚rprete, pero la realiza una sola vez. Como el int‚rprete, el compilador traduce una tras otra las instrucciones BASIC. Pero la gran diferencia est  en que el compilador traduce todo el programa en una £nica operaci¢n, generando una versi¢n completa del mismo en c¢digo de m quina y almacen ndola como versi¢n "objeto". Siguiendo el ejemplo anterior, el compilador traduce la instrucci¢n "PRINT I" una sola vez, evitando tener que "retraducirla" 99 veces. Sin embargo, todo tiene su precio. La ventaja de hacer una traducci¢n £nica en un compilador tradicional se diluye al tener que realizar varios pasos hasta lograr que un programa se pueda ejecutar. Los pasos a seguir en un compilador tradicional son los siguientes: a) Utilizar un editor de texto para cargar el programa fuente y grabarlo (generalmente en disco). b) Ejecutar el programa compilador que analizar  el programa fuente e indicar  si hubo errores. En este caso deber  ir al paso a) nuevamente hasta que no haya errores de compilaci¢n (por ejemplo, errores de sintaxis). c) Una vez que el compilador tradujo exitosamente el programa fuente, genera otro archivo denominado "c¢digo intermedio", que es un programa que est  m s cerca del c¢digo de m quina, pero todav¡a falta incorporar ciertas definiciones ("linkedici¢n" en lenguaje inform tico. Consiste en resolver direcciones de memoria definitivas las que genera el compilador, generalmente no fijadas sino de manera relativa). d) Una vez ensamblado el programa, se ejecuta el mismo para verificar si no hay errores de l¢gica. En caso de existir, se deber  corregir el programa fuente y repetir todo el proceso de compilaci¢n hasta lograr que se ejecute correctamente. O sea, para el usuario del programa es mejor el compilador por su mayor eficiencia y velocidad, pero el programador debe pasar la "odisea de la compilaci¢n" si utiliza un compilador tradicional. La utilizaci¢n del TURBO-BASIC evita estas complicaciones. 1.3 - TURBO-BASIC vs. compilador tradicional El TURBO-BASIC es un compilador que se puede invocar desde un programa en MSX-BASIC. La principal ventaja que tiene el compilador TURBO BASIC versus los compiladores tradicionales es que tiene la flexibilidad del int‚rprete para edici¢n y depuraci¢n (correci¢n) de programas, con la velocidad de los programas compilados. Esto se logra gracias a la gran flexibilidad que tiene el sistema MSX, que permite agregar comandos al int‚rprete que acceden al compilador en forma directa, sin tener que pasar por el paso intermedio de la edici¢n y ensamblaje. Con el TURBO-BASIC, basta ingresar el programa como lo hace habitualmente en su MSX, y luego, ejecutando un comando, el TURBO BASIC toma el control, traduce todo el programa y lo ejecuta, con la £nica -y gran- diferencia en la velocidad de ejecuci¢n. En el siguiente capitulo describiremos c¢mo utilizar el TURBO BASIC, con ejemplos aclaratorios y comparaciones con el int‚rprete BASIC. CAPITULO 2 - COMO UTILIZAR EL TURBO-BASIC Vamos a describir algunas de las t‚cnicas de programaci¢n utilizando el compilador BASIC. 2.1 - M‚todos para utilizar el TURBO-BASIC Existen dos formas de utilizar el compilador BASIC a saber: a) Compilar todo el programa BASIC en una sola operaci¢n y ejecutarlo. b) Mientras se est  en la ejecuci¢n normal del programa BASIC, compilar y ejecutar las lineas comprendidas entre los comandos "CALL TURBO ON" y "CALL TURBO OFF". La ejecuci¢n del programa BASIC contin£a a partir de la instruci¢n "CALL TURBO OFF". 2.1.1 - Si se compila la totalidad del programa En este caso se programa en forma normal (con algunas restricciones que luego detallaremos) en BASIC y luego simplemente con la instrucci¢n "CALL RUN" (o "_RUN"), compila todo el programa y lo ejecuta. La velocidad de ejecucion es de 20 a 30 veces mayor que la del MSX-BASIC. 2.1.2 - Si se compila parte del programa Esta opci¢n se utiliza en caso de ser imprescindible utilizar alguna sentencia del int‚rprete BASIC que este compilador no acepta (tal como manejo de archivos). En este caso, a las lineas de programa que se quieran compilar se les antepone una linea con la sentencia "CALL TURBO ON" (o "_TURBO ON") y al final de las lineas a compilar se le coloca la sentencia "CALL TURBO OFF" (o "_TURBO OFF"). Hay que tener en cuenta que estas sentencias deben ser £nicas en la linea, o sea, que no se pueden utilizar multisentencias en las lineas que figuren "CALL TURBO ON" o "CALL TURBO OFF". Finalmente, se ejecuta la sentencia "RUN" y el programa comenzar  su ejecuci¢n. Cuando el int‚rprete BASIC encuentra la sentencia "CALL TURBO ON", le pasa el control al compilador "TURBO BASIC", que se encarga de compilar todo el programa hasta que encuentra la sentencia "CALL TURBO OFF" y ejecuta las rutinas compiladas. Cuando termina de ejecutar el bloque compilado, el TURBO BASIC devuelve el control al int‚rprete BASIC y ‚ste continua la ejecuci¢n de las sentencias siguientes al "CALL TURBO OFF" en forma normal. Hay algunos puntos que debemos destacar: a) Las variables utilizadas dentro de las rutinas compiladas desaparecen al terminar su ejecucion. b) Las variables fuera del bloque compilado son totalmente independientes de las variables dentro del bloque, aun siendo hom¢nimas. Sin embargo, muchas veces necesitamos que la parte compilada "conozca" las variables de la parte interpretada, para lo cual deberemos pasar par metros entre ambas as partes. Esto se puede interpretar como que el contenido de ciertas variables se hace coincidente tanto dentro como fuera del bloque de compilaci¢n, o sea que estas variables son compartidas por el TURBO BASIC y el int‚rprete. En el TURBO-BASIC se puede lograr esto s¢lo para variables enteras simples y matrices del mismo tipo con subindice. Para pasar par metros al compilador, basta escribir en lugar de "CALL TURBO ON" la sentencia "CALL TURBO ON(X,Y,Z,...)" donde X,Y y Z son los nombres de variables que van a ser compartidas entre la parte compilada y la interpretada. Por ejemplo: CALL TURBO ON(A%,B()) En este caso, la variable A% y el vector B() contienen los mismos valores, tanto dentro como fuera de la parte compilada del programa. Veamos un par de ejemplos ilustrativos: PROGRAMA N§1: 10 ' Programa No. 1 20 ' 30 DEFINT A-Z 40 SCREEN 2,0:COLOR 15,1,1 50 SPRITE$(0)=STRING$(8,255) 60 X=225\2:Y=191\2:VX=1:VY=1:XMX=225-9:YMX=191-9 70 LINE(7,0)-(255,191),13,B 80 ' Ciclo principal 90 X=X+VX:Y=Y+VY 100 A$=INKEY$ 110 IF X<8 OR X>XMX OR Y<1 OR Y>YMX THEN GOSUB 160 120 PUT SPRITE 0,(X,Y),12,0:PSET(X+4,Y+4),13 130 IF A$=CHR$(13) THEN END 140 GOTO 90 150 ' Rutina reflexion 160 IF X>7 AND X<=XMX THEN VY=-VY:Y=Y+VY:RETURN 170 IF Y>0 AND Y<=YMX THEN VX=-VX:X=X+VX:RETURN 180 VY=-VY:VX=-VX:Y=Y+VY:X=X+VX:RETURN Analicemos el primer listado. Es un programa en el cual podemos compilar todo el programa con la sentencia "CALL RUN". En la linea 30, con la sentencia "DEFINT A-Z" hemos definido como entero a todas las variables que se van a utilizar. En el resto del programa, todas las sentencias que se utilizar n son sentencias comunes del BASIC, por lo tanto se pueden correr con la sentencia "RUN", pero su velocidad de ejecuci¢n ser  de 20 a 30 veces menor. PROGRAMA N§2: 10 ' Programa No. 2 20 ' 30 DEFINT A-Z:DIM C(20,20) 40 SCREEN 2:COLOR 15,1,1:CLS 50 ' 60 _TURBO ON 70 FOR X=1 TO 20 80 LINE(X*8,0)-(X*8,160) 90 NEXT X 100 FOR Y=0 TO 20 110 LINE (8,Y*8)-(160,Y*8) 120 NEXT Y 130 _TURBO OFF 140 ' 150 FOR X=1 TO 19 160 FOR Y=0 TO 19 170 C(X,Y)=RND(1)*13+2 180 NEXT Y 190 NEXT X 200 ' 210 _TURBO ON (C()) 220 FOR Y=0 TO 19 230 FOR X=1 TO 19 240 LINE (X*8+1,Y*8+1)-(X*8+7,Y*8+7),C(X,Y),BF 250 NEXT X 260 NEXT Y 270 _TURBO OFF 280 ' 290 GOTO 150 Ahora veamos el listado 2; en este programa se ha utilizado compilaci¢n en bloques. Lo que est  fuera de compilaci¢n es al solo efecto de demostrar c¢mo se particionan los bloques. Para el segundo bloque se ha pasado como par metro la matriz C(). 2.3 - Tipos de variables y precisi¢n El tipo de variable num‚rica por defecto es punto flotante. A diferencia del int‚rprete, la representaci¢n del n£mero se hace mediante 3 bytes. Pueden tomar valores desde 2.939E-39 a 1.701E+38 y la precisi¢n de los c lculos es de 4.5 cifras significativas. La representaci¢n interna es la siguiente: Ejemplo: -1 -> &H81,&H00,&H80 0 -> &H00,&H5F,&H80 0.5 -> &H80,&H00,&H00 1 -> &H81,&H00,&H00 TURBO-BASIC maneja la aritm‚tica de enteros en forma an loga al MSX-BASIC. Los nombres de las variables pueden ser de cualquier longitud pero s¢lo los dos primeros caracteres son significativos. Las matrices pueden ter cualquier dimensi¢n. Debe tenerse en cuenta que no se pueden realizar operaciones con ariables alfanum‚ricas muy complejas. Para estos casos es recomendable hacerlo fuera del bloque de compilaci¢n, m‚todo utilizado en el listado 2. 2.4 - Directivas especiales del TURBO-BASIC. Utilizando directivas especiales se le puede indicar al TURBO BASIC que realize tareas especiales que no est n previstas por el int‚rprete. Las directivas se componen de una linea que comienza con "comentario" (REM o ') seguida de la directiva. Estas directivas son las siguientes: 2.4.1 - Directiva #I Cuando "#I" se encuentra al principio de una linea de comentario, los valores ubicados a continuaci¢n en la linea se ubican directamente en el codigo objeto (por byte). Un n£mero precedido por el simbolo "@" especifica la direcci¢n de una linea (palabra de 2 bytes), y un nombre de una variable especifica la direcci¢n de la variable (palabra de 2 bytes). Por ejemplo: 10 A%=0 20 IF A%>100 THEN END 30 '#I &H2A,A%,&H23,&H22,A%,&HC3,@10 En este caso, la linea 30 es completamente id‚ntica a: 30 A%=A%+1:GOTO 10 Observese que los valores indicados en la linea 30 en hexadecimal corresponden al c¢digo de m quina del microprocesador Z80 y por lo tanto, para usar esta directiva se deber  tener conocimiento del tema. En el ejemplo, en lenguaje ensamblador la linea 30 se habria expresado: ld HL,(A%) inc HL ld (A%),HL jp @10 2.4.2 - Directiva #C La directiva "#C" se utiliza para habilitar/desabilitar el ajuste de coordenadas. Cuando se especifica "#C+", la coordenada (vertical) se ajusta si le produce desborde. "#C-" suprime el ajuste. El valor por defecto es "#C+". Ejemplo: 10 SCREEN 2 20 REM #C- 30 LINE (0,0)-(255,255) 40 ' #C+ 50 LINE (0,0)-(255,255) El ajuste de coordenadas consiste en verificar los limites de la pantalla respecto a las coordenadas indicadas por el usuario. Si se excede de dichos limites, el ajuste consiste en ignorar las coordenadas fuera de rango. 2.4.3 - Directiva #N La directiva "#N" activa la verificaci¢n de desborde de numeros enteros. Cuando, por ejemplo, se hace un bucle FOR-NEXT cin variables enteras de la forma: 10 FOR I%=0 TO &H7FFF 20 NEXT I% Bajo el entorno del MSX-BASIC, esta rutina generar  un error de "Desborde"; pero si se la ejecuta con el TURBO-BASIC, entrar  en un loop infinito Para evitar este inconveniente se provee de la directiva especial "#N+" (precedido por "REM") que le indica al compilador que vigile si los c lculos se van fuera del rango de los enteros. Sin enbargo es conveniente no abusar de esta opci¢n, ya que consume m s memoria y disminuye la velocidad de ejecuci¢n. Para cancelar esta funci¢n se utiliza la opci¢n "#N-". 2.5 - Manejo de interrupciones: Sentencias "ON...GOSUB..." TURBO-BASIC soporta el manejo de interrupciones. Sin embargo cuando se utilizan estas rutinas se genera un c¢digo compilado largo y lento, debido a que la rutina de verificaci¢n de interrupci¢n se llama cada vez que se ejecuta una sentencia. El manejo de alfanum‚ricos se mantiene igual al MSX-BASIC, con ciertas limitaciones que se explicitsn en el siguiente capitulo, donde tambi‚n veremos las principales diferencias entre el TURBO-BASIC y el int‚rprete MSX-BASIC. CAPITULO 3 - DIEFERENCIAS ENTRE TURBO-BASIC Y MSX-BASIC 3.1 - Diferencias de uso Veamos algunas diferencias que se tienen que tener en cuenta al programar al TURBO-BASIC. a) Todos los ordenamientos deben ser dimensionados previamente, a£n los que vayan a utilizar sub¡ndices menores a 10. b) La sentencia DIM s¢lo puede estar precedida por las sentencias "DEFINT", "DEFSNG", "DEFDBL", "REM", "DATA" y "DIM"; de lo contrario generar  el error "DIM ya usado". c) Cuando se llame a rutinas en c¢digo de m quina, los par metros que van a continuaci¢n de la sentencia USR s¢lo podr n ser valores enteros. d) Cada variable alfanum‚rica toma 256 bytes de memoria, por lo tanto su uso indiscriminado provoar  el mensaje "Out of memory" (Memoria completa). e) Las variables que se utilizan como distribuidor en las sentencias "ON GOTO" y "ON GOSUB" son tomadas para la ejecuci¢n con el valor que surge del resto de la divisi¢n de las mismas por 256. f) No se verifican los limites de los par metros que se pasan a los funciones ni los sub¡ndices de las matrices. g) La precisi¢n num‚rica es de hasta 4.5 d¡gitos, y el rango num‚rico va desde 2.939E-39 hasta 1.701E+38. h) Cuando se imprimen n£meros con la sentencia "PRINT", las cifras mayores a 10000 ser n puestas en notaci¢n cientifica (con el exponente E). i) Dentro del TURBO-BASIC, tanto las variables de doble precision como las de simple precision son tratados de igual forma, por lo tanto su distinci¢n dentro del programa (por ejemplo A# con A! son inv lidas). j) Los resultados de operaciones que no sean divisiones o potencias, normalmente se resuelvem como enteros. Esto puede traer la siguiente consecuencia: 10 A%=100 20 PRINT A%*A% En MSX-BASIC, el resultado ser  el n£mero real 40000; pero para el TURBO-BASIC ser  el n£mero entero -25536. Para evitarlo, cuando se sabe "a priori" que el resultado puede salir fuera de rango de los enteros, es necesario anteponer el indicador de n£mero de punto flotante, com por ejemplo: PRINT 1!*A%*A% Con esto dara el resultado correcto, pero a su vez provoca demora en la ejecuci¢n y aumento en el consumo de memoria. k) No se hace ningun tipo de validaci¢n de subindices de las matrices, excepto el numero de dimensiones. l) No se verifican los rangos de los par metros en "_TURBO ON". m) Se debe especificar la variable de la sentencia "NEXT" (en esta versi¢n del TURBO-BASIC). Ejemplo: 10 FOR I=1 TO 10:NEXT I (correcto) 10 FOR I=1 TO 10:NEXT (incorrecto en TURBO-BASIC) n) S¢lo se admite una variable por sentencia "INPUT". o) Los n£meros de linea de la directiva "#I" no se renumeran. 3.2 - Listado de sentencias MSX-BASIC y su implementaci¢n en TURBO-BASIC. En este apartado brindamos una tabla ordenada alfab‚ticamente de las sentencias, funciones y operadores del MSX-BASIC referenciada a su utilizaci¢n en TURBO-BASIC. OK -> igual que MSX-BASIC / ND -> no disponible ABS OK AND OK ASC OK ATTR$ ND ATN OK AUTO ND BASE ND BEEP OK BIN$ OK BLOAD ND BSAVE ND CALL ND CDBL ND CHR$ OK CINT ND CIRCLE No se admite ni . CLEAR ND CLOAD ND CLOSE ND CLS OK CMD ND COLOR OK CONT ND COPY S¢lo se admite COPY de gr ficos (en MSX 2). COS OK CSAVE ND CSNG ND CSRLIN OK CVD ND CVI ND CVS ND DATA OK DEF S¢lo se acepta "DEF USR". DEFDBL OK DEFINT OK DEFSNG OK DEFSTR OK DELETE ND DIM Igual que MSX-BASIC, con la diferencia que "DIM" debe ejecutarse antes de cualquier sentencia ejecutable, y la declaraci¢n debe realizarse utilizando constantes enteras. DRAW ND DSKF ND DSKI$ ND DSKO$ ND ELSE OK END OK EOF ND EQV ND ERASE ND ERL ND ERR ND ERROR ND EXP OK FIELD ND FILES ND FIX OK FN ND FOR OK FPOS ND FRE ND GET ND GOSUB OK GOTO OK HEX$ OK IF OK IMP ND INKEY$ OK INP OK INPUT Una sola variable por "INPUT" INSTR OK INT OK IPL ND KEY Igual que MSX-BASIC excepto "KEY," y "KEYLIST" KILL ND LEFT$ OK LEN OK LET OK LFILES ND LINE Igual que MSX-BASIC excepto "LINE INPUT" LIST ND LLIST ND LOAD ND LOC ND LOCATE Igual que MSX-BASIC, excepto que deben indicarse simultanemanete X e Y, mientras que el no se admite. LOF ND LOG OK LPOS OK LPRINT OK LSET ND MAX ND MERGE ND MID$ OK MKD$ ND MKI$ ND MKS$ ND MOD OK MOTOR ND NAME ND NEW ND NEXT Siempre necesita especificaci¢n de variable. NOT OK OCT$ OK OFF OK ON Igual que MSX-BASIC, excepto "ON STOP GOSUB..." OPEN ND OR OK OUT OK PAD OK PAINT OK PDL OK PEEK OK PLAY ND POINT OK POKE OK POS OK PRESET OK PRINT Igual que MSX-BASIC, excepto que "SPC" e "TAB" no se aceptan, el espaciado por zonas (",") actua diferente, y los numeros no se alinean para conformar la linea (es decir, no se envian al seguiente rengl¢n si exceden al mismo, simplemente se cortan y siguen abajo). PSET OK PUT S¢lo se admite "PUT SPRITE". REM OK RENUM ND RESTORE OK RESUME ND RETURN OK RIGHT$ OK RND OK RSET ND RUN Igual que MSX-BASIC, excepto que las variables no se inicializan. SAVE ND SCREEN S¢lo se admite y . SET S¢lo se admite "SET PAGE" en MSX 2. SGN OK SIN OK SOUND OK SPACE$ OK SPC ND SPRITE OK SQR OK STEP OK STICK OK STOP OK STR$ OK STRIG OK STRING$ OK SWAP OK TAB ND TAN OK THEN OK TIME OK TO OK TROFF ND TRON ND USING ND USR OK VAL OK VARPTR OK VDP OK VPEEK OK VPOKE OK WAIT OK WIDTH ND XOR OK ' OK > OK = OK < OK + OK - OK * OK / OK ^ OK ^ OK En el siguente capitulo veremos c¢mo lograr programas m s eficientes y los listados de ejemplo que acompa¤an este manual. CAPITULO 4 - CONSIDERACIONES FINALES Y EJEMPLOS 4.1 - Algunos trucos para acelerar todavia m s los programas. Existen algunos trucos para que los programas compilados por el TURBO-BASIC sean m s r pidos: a) Tratar de utilizar divisi¢n modular o multiplicaci¢n ("^" o "*") en vez de divisi¢n o potencia ("/" o "^"). De esta forma, aunque el programa pueda resultar un poco m s largo, se acelera notablemente. b) Las divisiones por n£meros enteros, tratar de hacerlas con cifras en potencias de 2. Por ejemplo: A=1000/2/16 es m s r pido que A=1000/32 c) Las multiplicaciones por enteros, tratar de hacer que sean por m£ltiplos de 2^n o las cifras 3, 5, 6, 7, 9, 10, 20, 25, 50, 80, 100, 200, 256 y 257. 4.2 - Programas de ejemplo: PROGRAMA N§3 - Plot 3D: Al ingresar diametro y altura, siendo los valores ideales para MSX 1 50 y para MSX 2 100 con altura para ambos de 20, se dibuja una figura en forma de rosquilla en un gr fico de 3 dimensiones en perspectiva. Luego de finalizado, se pulsa la tecla RETURN y finaliza el programa. Ejecutar con "RUN". Si pulsa RETURN en cualquier momento se suspende la ejecuci¢n del programa. 10 ' Programa No. 3 20 ' T¡tulo: Plot 3D 30 ' 40 SCREEN 0:WIDTH 40:KEYOFF 50 COLOR 15,1,1 60 _TURBO ON 70 DEFINT A,I 80 DIM A(300),I(300) 90 ' Engresa los parametros de la figura 100 INPUT"DIAMETRO ";R1 110 INPUT" ALTURA ";R2 120 ' Testea si es MSX 1 o MSX 2 130 IF PEEK(&HFAFC) THEN 170 140 L1=85:L2=120:L3=120:L4=120:L5=2:L6=50 150 SCREEN 2 160 GOTO 200 170 L1=140:L2=160:L3=240:L4=240:L5=1:L6=90 180 SCREEN 7 190 ' Rutina principal de dibujo 200 FOR I=0 TO 300 210 A(I)=191:I(I)=0 220 NEXT I 230 B1=50:B2=100:S1=12:H=0:Z=0 240 FOR Y=-L1 TO L2 STEP 6 250 B1=B1-L5:B2=B2-1:H1=B1:V1=B2 260 FOR X=-L3 TO L4 STEP 2 270 IF INKEY$=CHR$(13) THEN 410 'Si pulsa interrumpe el dibujo 280 H1=H1+1 290 IF INT((X*16*16)/S1)=INT(X/S1)*16*16 THEN V1=V1-1 300 MM=R1-SQR(X*X+Y*Y) 310 ZZ=R2*R2-MM*MM 320 IF ZZ<0 THEN Z=0 ELSE Z=SQR(ZZ) 330 H=H1:V=V1-Z 340 IF H<0 THEN 400 350 IF V<=I(H) AND V>=A(H) THEN 390 360 IF V>=I(H) THEN I(H)=V 370 IF V" 460 CLOSE 470 I$=INKEY$ 480 IF I$=CHR$(13) THEN CLS:END 490 IF I$="" THEN 470 PROGRAMA N§4 - Curva del Drag¢n: El nombre de este programa se debe a que las curvas dibujadas siguiendo certas reglas se asemejan mucho a las representaciones de dragones que realizan los chinos. Estas reglas se representan en este programa por unos e ceros. Si es uno, se gira a la derecha y si es cero, gira a la izquierda. Si la regla es el azar, se generan curvas un poco deformadas. En este programa hemos previsto 11 reglas que permiten dibujar curvas con cierta armon¡a. Si elige el N§12, podr  ingresar su propia regla de curva. Ejecutar con "RUN". 10 ' Programa No. 4 20 ' T¡tulo: Curva del drag¢n 30 ' 40 _TURBO ON 50 DIM A(125),B$(11) 60 GOSUB 230 70 S=2:GOSUB 430 80 ' Calcula la curva 90 N=1 100 A=N+50:B=N+75 110 M=A(A) 120 IF A(M)=-1 THEN 170 130 R=A(B)*(2*A(M)-1) 140 W=P:P=R*Q:Q=-R*W 150 A(A)=A(A)+A(B) 160 GOTO 70 170 A(A)=A(A)-A(B) 180 A(B)=-A(B) 190 N=N+1 200 IF INKEY$=CHR$(13) THEN 880 210 IF N<=K THEN 100 220 GOTO 520 230 SCREEN 0 240 GOSUB 550 250 FOR I=1 TO 100 260 A(I)=1:D$=MID$(B$,I,1) 270 IF I<51 THEN IF D$="0" THEN A(I)=0 280 NEXT I 290 A(0)=-1:A(LEN(B$)+1)=-1 300 PRINT 310 INPUT"ORDEM ";K 320 P=0:Q=-1 350 L1=128 360 SCREEN 2 400 X=L1:Y=96 410 RETURN 420 ' Dibuja la curva 430 FOR L=1 TO S 440 PSET(X,Y) 450 X=X+P:Y=Y+Q 460 IF Y=-1 THEN Y=191 470 IF Y=192 THEN Y=0 480 IF X=-1 THEN X=255 490 IF X=L1*2 THEN X=0 500 NEXT L 510 RETURN 520 A$=INKEY$:IF A$="" THEN 520 530 GOTO 60 540 ' Ingresa la forma del dibujo 550 PRINT "1) 1" 560 PRINT "2) 110" 570 PRINT "3) 1100" 580 PRINT "4) 1011" 590 PRINT "5) 1101100" 600 PRINT "6) 1000110" 610 PRINT "7) 1101011" 620 PRINT "8) 1100011" 630 PRINT "9) 10001110" 640 PRINT "10) 11000101" 650 PRINT "11) 11011010" 660 PRINT "12) ORIGINAL" 670 B$(1)="1" 680 B$(2)="110" 690 B$(3)="1100" 700 B$(4)="1011" 710 B$(5)="1101100" 720 B$(6)="1000110" 730 B$(7)="1101011" 740 B$(8)="1100011" 750 B$(9)="10001110" 760 B$(10)="11000101" 770 B$(11)="11011010" 780 PRINT 790 INPUT"Elija el n£mero (1-12)";N 800 IF N<1 OR N>12 THEN 790 810 IF N=12 THEN 830 820 B$=B$(N):RETURN 830 CLS:PRINT:PRINT 840 PRINT"<< ORIGINAL >>":PRINT 850 PRINT" Ingrese 0 ¢ 1 !" 860 INPUT B$ 870 RETURN 880 ' 890 _TURBO OFF 900 CLS 910 END PROGRAMA N§5 - Simulaci¢n de pulga: Este programa simula el movimiento de un conjunto de pulgas en una caja cerrada. Normalmente, asimilamos al concepto de pulga ("bug") a un error en la programaci¢n, asi que podria decirse que este programa esta plagado de "bugs". El c lculo de las par bolas de salto se realiza £nicamente con sumas y restas. Se sale del programa pulsando la tecla RETURN. Para ejecutar este programa, utilice el comando "RUN", y para suspender la ejecuci¢n, pulse la tecla RETURN. Si quiere comparar velocidades, borre las lineas 40 y 120. En vez de pulgas tenemos tortugas saltarinas... 10 ' Programa No. 5 20 ' T¡tulo: Simulaci¢n de pulga 30 ' 40 _TURBO ON 50 DIM X1(5),Y1(5),CX(5),CY(5) 60 DIM XD(5),YD(5),C(5) 70 COLOR 15,1,7 80 ' Testea si es MSX 1 o MSX 2 90 IF PEEK(&HFAFC) THEN 130 100 SCREEN 2 110 L1=254:L2=193 120 GOTO 160 130 SCREEN 7 140 L1=512:L2=193 150 ' Rutina principal 160 Y=191 170 FOR I=0 TO 5 180 X1(I)=RND(1)*256+1 190 Y1(I)=Y 200 CX(I)=X1(I) 210 CY(I)=Y1(I) 220 XD(I)=RND(1)*10+1 230 YD(I)=RND(1)*15+2 240 C(I)=I+10 250 NEXT I 260 FOR I=0 TO 5 270 PRESET(CX(I),CY(I)) 280 PRESET(CX(I),CY(I)-1) 290 PRESET(CX(I),CY(I)-2) 300 PSET(X1(I),Y1(I)),C(I) 310 PSET(X1(I),Y1(I)-1),C(I) 320 PSET(X1(I),Y1(I)-2),C(I) 330 CX(I)=X1(I):CY(I)=Y1(I) 340 X1(I)=X1(I)+XD(I) 350 Y1(I)=Y1(I)-YD(I) 360 YD(I)=YD(I)-1 370 IF X1(I)<1 THEN XD(I)=-XD(I):X1(I)=0 380 IF X1(I)>L1 THEN XD(I)=-XD(I):X1(I)=L1+1 390 IF Y1(I)>L2 THEN GOSUB 460 400 NEXT I 410 ' Si pulso interrumpe 420 K$=INKEY$ 430 IF K$=CHR$(13) THEN 620 440 GOTO 260 450 ' 460 Y1(I)=Y 470 XD(I)=(RND(1)*5+1)*SGN(XD(I)) 480 YD(I)=RND(1)*20+1 490 GOSUB 530 500 RETURN 510 ' 520 ' Efecto sonoro 530 SOUND 6,RND(1)*31+1 540 SOUND 7,&HF7 550 SOUND 8,16 560 SOUND 11,0 570 SOUND 12,RND(1)*7+1 580 SOUND 13,0 590 RETURN 600 ' 610 'Fim del programa 620 _TURBO OFF 630 CLS 640 END PROGAMA N§6 - C lculo del n£mero e: El n£mero e es la base del logaritmo natural o neperiano. Es un n£mero real irracional, y por lo tanto posee infinita cantidad de decimales, de los cuales calculamos 500. 10 ' Programa No. 6 20 ' Calculo del n£mero e con 500 decimales 30 _TURBO ON 40 DEFINT A-Z 50 DIM E(255) 60 FOR I=260 TO 2 STEP -1 70 A=1 80 PRINT I 90 FOR K=1 TO 255 100 A=(A MOD I)*100+E(K) 110 E(K)=INT(A/I) 120 NEXT K 130 NEXT I 140 PRINT "e=2."; 150 FOR K=1 TO 250 160 PRINT CHR$(INT(E(K)/10)+48); 170 PRINT CHR$(E(K)MOD10+48); 180 NEXT K 190 _TURBO OFF 200 END PROGRAMA N§7 - Explosi¢n: Se simulan las explosiones de fuegos artificiales. Existen 3 tipos de fuegos artificiales. Algunos tienen la p¢lvora un poco h£meda y por eso su explosi¢n no es tan espetacular. La cantidad de "chispas" es de 26. Programa ideal para las fiestas. Ejecutar con "RUN". Se suspende la ejecuci¢n pulsando la tecla RETURN. 10 ' Programa No. 7 20 ' T¡tulo: Explosi¢n 30 ' 40 COLOR 15,1,7 50 _TURBO ON 60 DIM X(25),Y(25),XD(25),YD(25) 70 DIM CX(25),CY(25),D(25),C(25) 100 L1=200 110 SCREEN 2 150 ' Rutina principal 160 X=INT(RND(1)*L1)+28 170 D=INT(RND(1)*3)+1 180 SOUND 6,D*10:SOUND 7,&HE7 190 SOUND 8,16:SOUND 9,16 200 SOUND 11,0:SOUND12,20-D*5 210 SOUND 13,0 220 FOR I=0 TO 25 230 X(I)=X:CX(I)=X 240 Y(I)=191:CY(I)=191 250 XD(I)=INT(RND(1)*10)-5 260 YD(I)=INT(RND(1)*12)+5 270 C(I)=INT(RND(1)*13)+2 280 NEXT I 290 P=0 300 FOR I=0 TO 25 310 PRESET(CX(I),CY(I)) 320 PRESET(CX(I),CY(I)+1) 330 IF Y(I)>191 THEN P=P+1:GOTO 400 340 PSET(X(I),Y(I)),C(I) 350 PSET(X(I),Y(I)+1),C(I) 360 CX(I)=X(I):CY(I)=Y(I) 370 X(I)=X(I)+XD(I) 380 Y(I)=Y(I)-YD(I) 390 YD(I)=YD(I)-D 400 NEXT I 410 IF P=26 THEN 160 420 K$=INKEY$ 430 IF K$=CHR$(13) THEN 470 440 GOTO 290 450 ' 460 ' Fin del programa 470 _TURBO OFF 480 CLS 490 END 500 ' PROGRAMA N§8 - Sort: Este programa genera un vextor de 255 elementos al azar y luegos los reordena, con arrastre de otro vector que almacena su posici¢n anterior al ordenamiento. Tambi‚n se imprime el tiempo de ejecuci¢n en segundos. N¢tese la diferencia de velocidades entre el TURBO BASIC y el int‚rprete MSX-BASIC: el tiempo con el programa compilado es de 20 segundos aproximadamente, mientras que con el int‚rprete tarda 190 segundos. Ejecutar con "CALL RUN". 10 ' Programa No. 8 20 ' T¡tulo: Sort 30 DIM D(255),Y(255) 40 SCREEN 0:KEYOFF 50 PRINT"Generando numeros" 60 FOR I=1 TO 255 70 D(I)=INT(RND(1)*3000) 80 Y(I)=I 90 NEXT I 100 PRINT"Ordenando...":TIME=0 110 L=10 120 L=INT(L+1)/2 130 FA=1 140 FOR I=1 TO 255-L 150 IF D(I)>D(I+L) THEN SWAP D(I),D(I+L):SWAP Y(I),Y(I+L):FA=0 160 NEXT I 170 IF FA=0 THEN 130 180 IF L>1 GOTO 120 190 TI=TIME/60:FOR I=1 TO 255 200 PRINT" Cantidade=";D(I);" No.";Y(I) 210 IF STRIG(0)<>0 THEN INPUT I$ 220 NEXT I:PRINT"Tiempo insumido :";TI;"segs." 230 END