31 4: PRINCIPIOS BASICOS En este capitulo se analizaran las reglas usadas para la reali- zacion de programas en Basic AMOS, y te informara como mejorar la tecnica de programacion con la ayuda de las rutinas en Basic de AMOS. 1- Variables Es la forma como se denominan los lugares de almacenamiento en el ordenador. Esos lugares contienen el resultado de una serie de calculos realizados en tus programas. La eleccion del nombre de cada variable es libre, y puede ser una cadena de caracteres o de numeros. Existe solo un par de res- tricciones. Todos los nombres de variables deben comenzar con una letra, y ademas no debe comenzar de forma igual a algun tipo de instruccion basic de AMOS. Sin embargo, es perfectamente licito usar esas instrucciones basic precedidas de otra letra, asi es posible usar variables como VPRINT, pero NO seria valido PRINTV. Los nombres de las variables no deben ser entrecortados, por lo que no deben contener espacios. Si fuera necesario introducir un espacio, es posible sustituirlo por el caracter "_". A continuacion algunos ejemplos de nombres ilegales. Cuando se introduce un nombre ilegal, este aparecera sobreimpresionado para facilitar las cosas: WHILE$ (Para distinguirlo del comando WHILE) 5C (NO pueden comenzar por una cifra) MODERN$ (Comando MODERN) TOAD (Comando TO) 2- Tipos de variables Existen 3 tipos de variables usados en AMOS: A) NUMERO ENTERO A diferencia de otros Basics, AMOS inicialmente presume que todas las variables son de numeros enteros. Numero entero es todo aquel numero como el 1, 3 o el 8 (sin decimales), y son ideales para ser usados en tus programas. El manejo en operaciones aritme ticas de estos numeros enteros es mucho mas rapido que aquellas operaciones realizadas con decimales, tambien llamadas de coma flotante (point floating). Cada numero entero se almacena en 4 bytes que pueden oscilar desde mas/menos 147.483.648. Algunos ejemplos de este tipo de variables: A, NUMBER, SCORE, LIVES B) NUMERO REAL En el Basic AMOS, este tipo de variables siempre iran seguidas por el simbolo (#). Los numeros reales pueden ser fraccionarios como 3.1 o 1.5. Cada variable real es almacenada en 4 bytes que estan entre 1E-14 y 1E-15. Todos los valores se almacenan con una precision de 7 decimales. Son ejemplos de este tipo de variables: P#, NUMER#, TEST# 32 C) VARIABLES DE CADENA Contienen texto en lugar de numeros. Se distinguen de las va- riables normales por el caracter "$" que se añade al final. La longitud de texto puede ir desde 0 hasta 65.000 caracteres. Son ejemplos: NAMES$, PATH$, ALIEN$ 3- Dando un valor a una variable Asignar un valor a una variable es facil. Simplemente elige un nombre apropiado y asignale el valor usando el simbolo "=". MES= 10 Esto permite almacenar el valor 10 en la variable entera MES. A$="Hola" Esto asigna la cadena "Hola" a la variable de cadena A$ 4- Matrices (Arrays) Una lista de variables puede ser combinada conjuntamente for- mando lo que denominamos una MATRIZ. Para la creacion de matrices se usa el comando DIM (dimensionado de matrices). DIM VAR (z,x,y) DIM define una tabla de variables en tus programas AMOS. Esas tablas pueden contener tantas dimensiones como desees, pero cada dimension esta limitada a un maximo de 65.000 elementos. Ejemplo: DIM A$ (10), B(10, 10), C# (10,10,10) Al objeto de acceder a un elemento de la matriz, simplemente teclea el nombre de la matriz, seguido por el numero indice. Esos numeros se separan por comas y se encierran entre parentesis. Ten en cuenta que el numero de elementos de una matriz siempre empie- za desde cero. Ejemplo: DIM ARRAY (10) ARRAY (0)=10:ARRAY (1)=15 Print ARRAY (1); ARRAY (0) (Resultado: 15 10) 5- Constantes Las constantes son simplemente numeros o cadenas asignados a una variable o usados en alguno de tus calculos. Se llaman cons- tantes porque no cambian de valor durante el curso de tu progra- ma. Los siguientes valores son todos constantes: 1, 42, 3.141, "Hola" 33 Por defecto, todas las constantes numericas se tratan como si fueran enteros. Cualquier asignacion de numero decimal a una va- riable de numero entero sera convertida automaticamente a un nume ro entero de la forma siguiente: Decimal: 255 Hexadecimal: $FF Binario: $11111111 Ten en cuenta que cualquier numero tecleado en AMOS sera auto- maticamente convertido a un formato interno especial. Cuando lis- tes tus programas esos numeros seran reexpandidos a su formato original. Una vez que AMOS Basic imprime todos los numeros en la forma estandard, no existiran diferencias entre el numero que tu habias introducido y el que aparece en pantalla. El valor del nu- mero permanece exactamente igual. Las constantes de coma flotante se distinguen de los numeros enteros por el punto decimal. Si el punto no se usa, el numero se asume que es entero, incluso si aparece dentro de una formula de coma flotante. Mira el siguiente ejemplo: For X = 1 TO 10000 A# = A# + 2 Next X Cada vez que la expresion es calculada en tu programa, el "2" sera convertido en un numero real. Asi esta rutina sera mucho mas lenta que la siguiente: For X = 1 TO 10000 A# = A# + 2.0 Next X Esta ultima formula se ejecuta un 25% mas rapidamente que la original debido a que la constante se almacena ahora de forma di- recta en formato coma flotante. Siempre recordaras este truco y colocaras un punto decimal despues de una constante, incluso si esta va a ser un numero entero. Si de forma accidental mezclas numeros enteros y de coma flotante, el resultado sera transforma do en un numero real. Ejemplo: Print 19.0/2 (resultado: 9.5) Print 3.141 + 10 (resultado: 13.141) 34 6- Operaciones aritmeticas Las siguientes operaciones aritmeticas pueden ser usadas en cualquier expresion numerica: ª elevacion a una potencia /* multiplica y divide MOD Modulo Operador (resto de una division) +- Suma y resta AND Operador logico AND OR Operador logico OR NOT Operador logico NOT Hemos listados estas operaciones en orden descendiente de prio ridad. Esta prioridad se refiere a la secuencia en la que las va- rias secuencias de operaciones o expresiones aritmeticas seran realizadas. Asi que las operaciones con mayor prioridad seran cal culadas en primer lugar. INC (añade o incrementa 1 a una variable entera) INC VAR: añade 1 a la variable de numero entero VAR usando para ello una simple instruccion. Es el equivalente logico de la expresion VAR = VAR +1, pero mucho mas rapida. Ejemplo: A=10:Inc A:Print A (Resultado: 11) DEC (resta 1 de una variable de numero entero) DEC VAR: resta 1 a la variable VAR. Ejemplo: A=2:Dec A:Print A (Resultado: 1) ADD (suma rapida de numero entero) ADD V,Exp La instruccion estandard inmediatamente añade el resultado de la expresion a la variable entera V. Es el equivalente de la li- nea de Basic V = V + EXP La unica diferencia significativa entre las dos es que ADD realiza la funcion un 40% mas rapido. Ten presente que la varia- ble V ha de ser de numero entero. Ejemplo: Timer = 0 For X = 1 to 1000 Add T,X Next X Print T,Timer (Resultado: 500500 7) 35 La segunda version de ADD es un poco mas complicada. Es efecti vamente identica al siguiente programa, (pero mucho mas rapida) V=V+A If VBase then V=Base Ejemplo: DIM A(10) ForX=0 to 10:A(X)=X:Next X V=0 Repeat Add V,1,1to10 Print A(V) Until V=100:Rem este es un bucle infinito al ser V siempre menor que 10 Como puedes ver ADD es ideal para bucles circulares o repeti- tivos en tus programas. 7- Operaciones de cadena Como la mayoria de las versiones Basic, AMOS felizmente tam- bien podra unir dos cadenas. A$="AMOS"+" Basic" Print A$ (R.: AMOS Basic) Tambien es posible establecer comparaciones entre dos cadenas caracter a caracter usando los valores ASCII de cada una de las letras. "AA"<"BB" "Filename"="Filename" "X&">"Xpt" "HOLA"<"Hola" 8- Parametros Los valores que introduces en una instruccion AMOS son conoci- dos como PARAMETROS. Ej.: Inc N Add A,10 Ink 1,2,3 En las instrucciones anteriores, los parametros son N, A, 10, 1, 2 y 3 respectivamente. De forma ocasional, alguno de los para metros de un comando puede ser omitido en una instruccion. En este caso, un valor no usado sera automaticamente asignado como numero por defecto. Ejemplo: Ink 5,, Esta instruccion cambia el color de la tinta sin afectar el color del papel y los margenes. 36 9- Numeros de linea y etiquetas Las etiquetas son una aconsejable forma de remarcar un punto dentro de tu programa AMOS. Consiste en una cadena de caracteres que se rigen por las mismas reglas que las variables. Una etique- ta podra ser siempre situada al comienzo de la linea, y debe ser seguida inmediatamente por un caracter ":", sin que existan espa cios entre la etiquetas y los dos puntos. Ejemplo: TESTLABEL: Print "Hola!" Goto TESTLABEL Este programa puede ser abortado pulsando CTRL + C T06 10- Procedimientos Los procedimientos te permiten concentrar tus esfuerzos justo en un problema sin que el resto del programa te distraiga para nada. Una vez que hayas escrito tus procedimientos podras rapida- mente combinarlos con una infinidad de tus propios programas. Los procedimientos AMOS son programas totalmente independientes que pueden contener sus propias lineas de programa, variables e inclu so lineas de Data. PROCEDURE (esta instruccion te permite crear un procedimiento de AMOS Basic) PROCEDURE NAME ¡parameter list¿ : : End Proc¡Expresion¿ Esto define un procedimiento AMOS llamado NAME. NAME es una cadena de caracteres que identifica dicho procedimiento. Se cons- truye de igual forma a las variables basicas de cadena, pero ten presente que es perfectamente licito usar nombres identicos para procedimientos, variables y etiquetas. AMOS sabre de forma automa tica a que clase de objeto te refieres en el contexto de una li- nea. Los procedimientos son parecidos a los comandos GOSUB, tipi- cos de las primeras versiones Basic. He aqui un ejemplo de un sim ple procedimiento: Procedure ANSWER Print "Forty-Two!" End Proc Observa como el procedimiento ha terminado con el comando END PROC. Tambien comprobaras como PROCEDURE y END PROC se situan en sus propias lineas. Esto es obligatorio. Si tecleas el procedimiento anterior en AMOS Basic tal y como aparece, e intentas ejecutarlo, nada ocurrira. Esto es debido a que no has llamado a tu nuevo procedimiento desde tu programa Ba- sic. Esto puede solucionarse simplemente con teclear el nombre del procedimiento en el punto adecuado del programa. Como ejemplo introduce la siguiente linea al comienzo del programa y ejecutalo y podras observar el resultado de tu procedimiento: ANSWER 37 Es importante, que cuando estes usando varios procedimientos en la misma linea, es aconsejable añadir un espacio extra al fi- nal de cada orden. Esto evitara el riesgo de que el procedimiento sea confundido con una etiqueta. Por ejemplo: TEST : TEST : TEST (Ejecuta el TEST en 3 ocasiones) TEST:TEST:TEST (Define la etiqueta TEST y ejecuta el TEST en 2 ocasiones) Otra posibilidad es preceder tus procedimientos con el aparta- do PROC, de la forma siguiente: Proc ANSWER Ejemplo: Proc ANSWER Procedure ANSWER Print "Forty-Two" End Proc Si ejecutas este programa de nuevo, el procedimiento sera eje- cutado y la respuesta imprimida en pantalla. Aunque la definicion del procedimiento sea posicionada al final del programa, es posi- ble localizarla en cualquier sitio. Donde sea, AMOS podra encon- trar las ordenes contenidas en el procedimiento, ejecutandolas y regresando cuando encuentre End Proc. Esto significa que no hay peligro de que se autoejecuten tus procedimientos por error. Una vez que hayas creado un procedimiento, y lo ensayes con satisfac- cion, podras eliminarlo de tus listados usando la opcion FOLD del menu principal. Realizando un FOLD de tus procedimientos reduciras la compleji dad de tus listados mientras estes programando, con lo que evita- ras distracciones. Mas tarde podras recuperar tus procedimientos seleccionando la opcion UNFOLD del menu. A) VARIABLES LOCALES Y GLOBALES Todas las variables que definas dentro de tus procedimientos son independientes de cualquier otra usada en tu programa. Esas variables se denominan "LOCALES" porque pertenecen a un procedi- miento en particular. He aqui un ejemplo que ilustra todo esto: A=1000:B=42 TEST Print A,B Procedure TEST Print A,B End Proc Ejecutalo y veras como A y B son variables completamente dis- tintas segun se usen dentro o fuera de un procedimiento. Las va- riables que se usan fuera de un procedimiento se denominan "GLO- BALES" y no se pueden acceder a ellas desde un procedimiento. He aqui otro ejemplo: 38 Dim A(100) For V = 1 TO 100: A(V) = V:Next V TEST_FLAG =1 APRINT End Procedure APRINT If TEST_FLAG=1 For P=1 TO 100 Print A(P) Next P End If Enf Proc Este programa puede parecer bastante inocente, pero contiene dos errores garrafales. Primeramente, el valor de TEST_FLAG den- tro del procedimiento siempre tendra el valor de 0, de modo que el bucle IF-ENDIF nunca sera ejecutado; esto se debe a que la va- riable TEST_FLAG dentro del procedimiento es totalmente distinta a aquella otra usada fuera del mismo, y todas las variables toman inicialmente el valor 0. Por otro lado, el programa nunca se ejecutara dado que la ma- triz A ha sido definida fuera del procedimiento, por lo que el procedimiento APRINT al llegar a la linea PRINT A(P), se interrum pira dando un mensaje de error de matriz no dimensionada: Array not dimensioned. Error at the line : PRINT A(P) Esta clase de errores son muy faciles de cometer. Asi que es vital que trates tus procedimientos como si fueran programas inde pendientes y contengan sus propias variables e instrucciones. Pero existe la posibilidad de transferir datos desde tus proce dimientos hasta el programa principal. Una vez que te familiari- ces con los nuevos comandos no tendras problemas en utilizar los procedimientos dentro de tus programas. B) PARAMETROS Y PROCEDIMIENTOS Existe la posibilidad de introducir una lista de definiciones de parametros en tu procedimiento. Este crea un grupo de varia- bles locales que pueden grabarse directamente del programa princi pal. He aqui un ejemplo: Procedure HELLO¡NAME$¿ Print "Hello ";NAME$ End Proc El valor que sera grabado en NAME$ se introduce entre comillas como parte de la llamada del procedimiento. Asi el procedimiento HELLO quedaria de la forma siguiente: Rem Load N$ en NAME$ e introduce el procedimiento Input "Como te llamas?"; n$ HELLO¡N$¿ HELLO¡"Francis"¿ 39 Como veras, el sistema de parametros trabaja de igual forma con variables o constantes. Solo es importante el tipo de varia- ble. Este proceso puede ser usado para la transferencia de varia- bles de numeros enteros, reales o de cadena. Sin embargo, no pue- des transferir matrices enteras con esta funcion. Si deseas intro ducir varios parametros, tendras que separar las variables median te comas. Por ejemplo: Procedure POWER ¡A,B¿ Procedure MERGE ¡A$?B$?C$¿ Esos procedimientos deben ser llamados usando lineas como: POWER¡10,3¿ MERGE¡"Uno","Dos","Tres"¿ C) VARIABLES COMPARTIDAS (SHARED VARIABLES) Otro modo de transferir datos entre un procedimiento y el pro grama principal es usar la funcion SHARED. SHARED (Define un listado de variables globales) SHARED variable list. SHARED se situa dentro de la definicion de un procedimiento y se le asigna un listado de variables separa das por comas. Esas variables se tratan ahora como si fueran glo- bales, y a ellas se podra acceder directamente desde el programa principal. Una matriz que transfieras de esta forma ha de ser pre viamente dimensionada dentro del programa principal. Ejemplo: A=1000:B=42 TEST Print A,B Procedure TEST SHARED A,B A=A+B:B=B+10 End Proc De esta forma TEST puede ahora ser leer y escribir informacion dentro de las variables globales A y B. Si deseas compartir una matriz, la definiras como sigue: SHARED A(),B#(),C$() :Rem SHARE matrices A, B# y C$ GLOBAL (define una lista de variables globales del programa principal) GLOBAL variable list. Cuando este escribiendo un gran programa es habitual que algunos de los procedimientos compartan ciertas variables globales. Esto permite un simple metodo de transferen- cia de gran cantidad de informacion entre varios procedimientos. Al objeto de simplificar este proceso, hemos incluido un comando simple que puede ser usado directamente en el programa principal. Se trata de GLOBAL, que define un listado de variables a las que podemos acceder en cualquier momento desde el programa Basic, sin sin necesidad de una orden SHARED dentro de un procedimiento. 40 D) VALORES RETENIDOS TRAS UN PROCEDIMIENTO Si un procedimiento necesita retener un valor como variable local, entonces se precisa el siguiente comando, que solo requie- re donde encontrar la variable local. PARAM (retiene un parametro dentro de un procedimiento) La orden PARAM te permite retener un resultado dentro de un procedimiento, tomandolo de una expresion opcional en el momento de hallar la orden End Proc, reteniendolo en una de las siguien- tes variables: PARAM, PARAM#, PARAM$, segun el tipo de dato. Ej: MERGE_STRINGS¡"AMOS"," ","Basic"¿ Print PARAM$ Procedure MERGE_STRINGS¡A$,B$,C$¿ Print A$,B$,C$ End Proc Advierte que End Proc solo retiene un simple parametro con este metodo. Las funciones PARAM siempre contendran el resultado de la ultima operacion ejecutada en el procedimiento. He aqui otro ejemplo, que esta vez muestra el uso de la funcion PARAM#. CUBE¡3,0¿ Print PARAM# Procedure CUBE¡A#¿ C#=CUBE#*CUBE#*CUBE# End Proc¡C#¿ E) DEJANDO UN PROCEDIMIENTO POP PROC (deja un procedimiento de forma inmediata) Normalmente, los procedimientos regresan al programa principal cuando se llega a una instruccion End Proc. Pero a veces, sin em bargo, puedes necesitar salir urgentemente de un procedimiento. Es en este caso cuando debes usar este comando (POP PROC) para salir inmediatamente. F) ALMACENAMIENTO LOCAL DE DATAS Cualquier almacenamiento de DATAS definidas dentro de tus pro cedimientos se almacenan de forma completamente separada del res- to de DATAS del programa principal. Esto significa que cada proce dimiento puede contener sus propias areas de almacenamiento de DATAS. G) PISTAS Y CONSEJOS He aqui un par de consejos que te ayudaran para sacar el maxi mo de provecho a tus procedimientos: * Es perfectamente licito que un procedimiento se autollame, pero este recurso esta limitado por la cantidad de espacio usado para el almacenamiento de variables locales. Si tu pro- grama excede la memoria disponible, aparecera el oportuno men saje de error * Todas las variables locales se anulan automaticamente una vez que se ha ejecutado el procedimiento. 41 11- Bancos de memoria AMOS Basic incluye un cierto numero de poderosos metodos de manipulacion de sprites, bobs y musica. Los datos necesarios para estas funciones deben ser almacenados dentro del programa Basic. AMOS Basic utiliza un juego especial de 15 secciones de memoria para este proposito que se denominan BANKS. Cada banco se identifica por un numero de 1 a 15. Muchos de esos bancos pueden ser usados para cualquier tipo de datos, pero otros se dedican exclusivamente para cierto tipo de informacion como las definiciones de sprites. Todas las imagenes de sprites se almacenan en el banco 1 y se podran cargar en memoria usando la siguiente linea: LOAD "AMOS_DATA:Sprites/Octopus.abk" Hay dos formas diferentes de bancos de memoria: Permanente y temporal. Los bancos Permanentes solo necesitan ser definidos en una sola ocasion, y son automaticamente salvados con tus progra- mas. Los bancos Temporales son muchos mas efimeros y se reinicia- lizan cada vez que se ejecuta el programa. Ademas, a diferencia de los permanentes, los bancos temporales pueden ser borrados de memoria usando el comando CLEAR. A) TIPOS DE BANCOS DE MEMORIA AMOS Basic dispone de los siguientes bancos de memoria: Clase Almacenamiento Restricciones Tipo ===== ============== ============= ==== Sprites Definicion sprites/bobs Solo bank 1 Perm. Icons Definicion iconos Solo bank 2 Perm. Music Datos de Sound Track Solo bank 3 Perm. Amal Usado para datos AMAL Solo bank 4 Perm. Samples Datos de Samples bancos 1-15 Perm. Menu Defincion de Menus bancos 1-15 Perm. Chip Work Espacio de trabajo temp. bancos 1-15 Temp. Chip Data Espacio de trabajo perm. bancos 1-15 Perm. Fast Work Espacio de trabajo temp. bancos 1-15 Temp. Fast Data Espacio de trabajo perm. bancos 1-15 Perm. RESERVE (Reserva un banco) RESERVE AS type,bank,length Los bancos usados por tus sprites o bobs se localizan automati camente por AMOS. El comando RESERVE te permite crean otros ban- cos que puedas necesitar. Cada tipo diferente de banco tiene su propia y unica version por la instruccion RESERVE. RESERVE AS work bank,length. Esta orden va a reservar cierta cantidad (length) de bytes para el uso de espacio de trabajo tem- poral. Tambien es posible localizar este area en memoria rapida, con lo que tendras que añadir otros datos: RESERVE AS CHIP WORK bank, length. Pero previamente debes cono cer si dispones de memoria chip suficiente mediante el comando CHIP FREE. 42 RESERVE AS CHIP DATA, bank,length. Reserva X bytes de memoria chip ram en el banco numero "bank", dicho banco se grabara automa ticamente con tus programas AMOS. El banco podra ser cualquiera entre 1-15. Dado que los 5 primeros son normalmente reservados por el sistema, es mas logico reserva algun otro. Ten siempre pre sente que el unico impedimento para estas RESERVAS es la cantidad de memoria disponible. LISTBANK (Lista los bancos en uso) LISTBANK hace un listado del numero de los bancos actualmente reservados por el programa, asi como su localizacion y tamaño. El listado se realiza segun el siguiente formato: Numero Tipo Comienzo Longitud Normalmente, la longitud de un banco se muestra en bytes, pero en caso de sprites e iconos el valor representa el numero total de imagenes instaladas en el banco. La razon de esto es que el almacenamiento de cada imagen puede tener lugar en cualquier lu- gar de la memoria del AMIGA, por lo que el banco no es un bloque continuo de memoria. Por tanto no utilices la orden BSAVE para grabar un banco de sprites, sino simplemente SAVE "nombre.abk". B) BORRANDO BANCOS Durante el curso de un programa puedes necesitar borrar algun banco de memoria, asi como cargar datos adicionales. Los sprites pueden necesitar un cambio en cierta parte del programa, tambien una musica distinta puede ser necesario incluir. El comando ERASE te permite un rapido control de borrado de datos. ERASE b (borra un banco) ERASE borra el contenido de memoria de un banco. El numero de banco (b) puede oscilar entre 1-15. Advierte que toda la memoria contenida en ese banco podra ser libremente usada en tus progra- mas. C) FUNCIONES DE PARAMETROS DE BANCO Si deseas tener acceso directo a los datos de un banco numero b, como con la vieja funcion "POKE", lo podras realizar con los nuevos comandos de direccionamiento de bancos en memoria y de tamaño de banco: = START (situa la direccion de inicio de un banco) = START (b). Esta funcion situa la direccion de inicio del banco b. Una vez haya sido ubicada, la localizacion del banco no sufri- ra mas cambios. Asi el resultado de esta funcion permanecera fijo durante todo el tiempo. Ejemplo: Reserve As Work 3,2000 Print Start (3) 43 = LENGTH (establece la longitud de un banco) l=length (b). La funcion LENGTH situa la longitud en bytes del banco numero b. Si el banco contiene los sprites entonces el nume ro de sprites o iconos sera mostrado inmediatamente. Un valor 0 indica que el banco b no existe. Ejemplo: Reserve as work 6,1000 Print length(6) Erase 6 Print length(6) D) GRABANDO Y CARGANDO BANCOS Algunos programas requeriran muchos bancos de informacion, un buen ejemplo es una aventura. Este tipo de programas necesita la carga de varios graficos y sonidos para las diferentes localiza- ciones dentro del programa. Un A-500 tendria gran dificultad en almacenar todos estos datos a la vez, asi que lo mejor que hace es cargar aquellos datos necesarios en un determinado momento. LOAD (carga uno o mas bancos) LOAD "filename"¡,n¿ El efecto de este comando varia dependiendo del tipo de fiche- ro que estes cargando. Si el fichero contiene varios bancos, en- tonces todos los actuales bancos de memoria se borraran antes de que los nuevos bancos sean cargados desde el disco. Sin embargo, si solo estas cargando un banco, solo este banco sera reemplazado El punto opcional de destino especifica el banco en donde se car- garan tus datas. Si este fuera omitido, entonces las datas seran cargadas en el banco donde originalmente estaban grabadas. Los bancos de sprites son tratados de forma algo distinta. En este caso el parametro "n" da lugar a dos formas de carga diferen tes. Si "n" se omite o si le asigna el valor 0, el actual banco sera completamente sobreimpresionado por los nuevos sprites. Cual quier otro nuevo valor de "n" obliga a que los nuevos sprites se adjunten a este banco. Esto te permite combinar varios ficheros de sprites en el mismo programa. Ejemplo: LOAD "AMOS_DATA:sprites/octopus.abk" SAVE (graba uno o mas bancos en disco) SAVE "filename"¡n¿. El comando SAVE graba tus bancos de memo- ria en disco. Existen dos posibles formatos: 1) SAVE "Filename.ABK" Esta forma graba TODOS los bancos actualmente definidos en un fichero simple en tu disco. 2) SAVE "Filename.ABK",n Esta forma expandida, graba el banco de memoria n. Debemos es- tar seguros de añadir la expresion .ABK al final del nombre para asegurarnos asi de poder identificar los ficheros que con- tienen bancos de memoria. 44 BSAVE (graba un bloque no formateado en formato binario) BSAVE file$, start TO end. La memoria almacenada entre START y END se graba en disco en el fichero FILE$. Estas datas se graban sin un formato especial. Ejemplo: BSAVE "test",Start(7)toStart(7)+Length(7) El ejemplo anterior graba las datas del banco de memoria 7 en disco. La diferencia entre este fichero y un fichero grabado nor- malmente es que SAVE especifica y escribe un cabecero especial que contiene informacion concerniente al banco. Este cabecero no se imprime en el caso de BSAVE, asi que no podra ser cargado me- diante LOAD. ATENCION: Los bancos de sprites e iconos no son almacenados como trozo de memoria. Cada objeto puede residir en algun lugar de la memoria. Gracias a que AMOS usa este sistema tan flexible de alma cenamiento de datas, tu simplemente puedes grabarlos en memoria mediante la orden BSAVE. BLOAD (carga informacion binaria en una direccion o banco previamente especificado) BLOAD file$, addr. Esta orden carga un fichero de datos binarios en memoria, sin que se altere esta informacion. Existen dos for- mas de realizacion: 1) BLOAD file$, addr El fichero File$ se carga desde disco en la direccion addr 2) BLOAD file$, bank En este caso file$ sera cargado en un banco. Este banco debe haber sido previamente reservado, de otra forma se generaria un error. Tambien debes asegurarte de no cargar un fichero que sea mas grande del espacio reservado, de otro modo se desbordara el banco lo que originara alteraciones en otras areas de memoria. 12- Fragmentacion de memoria A veces, despues de una aburrida sesion de edicion, obtienes un error tipo "OUT OF MEMORY", por lo que debes asegurarte espa- cio. 13- Encontrando espacio para tus variables Por defecto, todas las variables se almacenan en una zona de la memoria de 8k de longitud. Aunque esto pueda parecer increible mente pequeño, es capaz de albergar hasta 2 paginas de texto nor- mal, o bien 2000 numeros. Lo hemos puesto intecionadamente peque- ño para asi aumentar el espacio disponible para tus pantallas y bancos de memoria. 45 SET BUFFER (situa el tamaño del area de variables) SET BUFFER n. Establece el tamaño del area de variables en tu pro grama actual en "n" Kilobytes. Esta debe ser la primera instruc- cion en tu programa (excluidos los rem). De otro modo, obtendras un mensaje de error. SET BUFFER sera usado en tus programas cuando obtengas un men saje de error del tipo "OUT OF STRING SPACE ERROR". Aumenta en 5K el valor hasta que el error desaparezca. Si quedas fuera de memo- ria durante este procedimiento, necesitaras reducir el tamaño de tu programa por algun sitio. Observa el comando CLOSE WORKBENCH o CLOSE EDITOR para mas detalles. FREE (Indica la cantidad de memoria disponible en el area de variables) f=FREE. Free indica el numero de bytes que estan actualmente dis- ponibles para almacenaje de tus variables. Este valor puede ser aumentado si fuera preciso utilizando el comando SET BUFFER. Cuando FREE es llamado, el area de variables se reorganiza para proveer el maximo espacio posible para tus variables. Este proceso se denomina "Garbage Collection" o recoleccion de basura y habitualmente se realiza de forma automatica. Debido al poder de AMOS Basic, todo el procedimiento se reali za habitualmente de forma instantanea. Pero si tu area de varia- bles es muy grande y tu estas utilizando gran cantidad de cadenas la rutina de recoleccion de basura llevara varios segundos hasta que se complete. Consecuentemente, esto podra ocasionar un peque- ño retraso en la ejecucion de tu programa.