Volver menú revistas

DOC'S Nº30

Volver menú DOC's Nº30
LLFB
 


Manual de AMOS (6 al 22)
François Lionet
                                                               46
                     5:  FUNCIONES  DE  CADENA
      LEFT$  (retiene el caracter mas a la izquierda de una cadena)
      d$=LEFT$(S$,n). Esta instruccion funciona como en los mas pri-
   mitivos lenguajes basic. Ejemplo:
      B$="Hello! Soy Francis"
      L$=LEFT$(B$,9)
      Print L$
      (Resultado: Hello! So)
      RIGHT$   (retiene el caracter mas a la derecha de una cadena)
      d$=RIGHT$(S$,n). Funciona como la anterior pero a la derecha.
      Print RIGHT$("AMOS Basic",5)
      (Resultado: Basic)
      MID$   (retiene un conjunto de caracteres de una cadena)
      d$=MID$(S$,p,n)
      MID$(d$,p,n)=S$. La funcion MID$ retiene una porcion de la ca
   dena S$. "P" indica el comienzo donde se iniciara esta subcadena,
   mientras que "N" especifica el numero de caracteres que seran to-
   mados. Si no se especificara el valor de N en esta instruccion,
   entonces se leeran a partir de la derecha hasta el final de tu
   cadena. Ejemplo:
      Print MID$(AMOS Basic,6)
      (Resultado: Basic)
      Otra forma de presentacion de la instruccion MID$ es:
      MID$(d$,p,n)=S$
      Esta version de MID$ carga "N" caracteres de la cadena d$ des-
   de la posicion p+1 que seran almacenados dentro de la cadena S$.
   Si no se especificara el valor de N, directamente se reemplazara
   por el resto de la cadena. Este tipo de instruccion tambien se
   puede realizar conjuntamente con LEFT$ y RIGHT$.
      A$="AMOS *****"
      MID$(A$,5)="Magic"
      Print A$
      (Resultado: AMOS Magic)
                                                                 47
      INSTR (busca la aparicion de una cadena dentro de otra cadena)
      f=INSTR(d$,S$ ¡,p¿)
      INSTR te permite buscar todas las veces que aparece una cadena
   dentro de otra. A menudo se usa en los juegos de aventura para
   reducir toda una completa linea de texto en un solo comando. Hay
   dos posibles formatos para esta instruccion:
      f=INSTR(d$,s$)
      Esta orden busca la primera aparicion de s$ en d$. Si se en-
   cuentra la cadena, entonces nos da automaticamente su posicion,
   en caso contrario, el resultado sera 0. Ejemplos:
      Print Instr ("AMOS BASIC","AMOS")
        (Resultado: 1)
      Print Instr ("AMOS BASIC","S")
        (Resultado: 4)
      Print Instr ("AMOS BASIC","AMIGA")
        (Resultado: 0)
      Do
        Input "Cadena a buscar";d$
        Input "Cadena a encontrar";s$
        x=instr (d$,s$)
        If x=0 then print s$;" no se encuentra"
        If x<>0 then print s$;" encontrado en la posicion ";x
      Loop
      Normalmente, la busqueda comienza desde el primer caracter en
   tu texto (d$). La segunda version de INSTR te permite comprobar
   una seccion determinada en una cadena al mismo tiempo. "P" es
   ahora la posicion de comienzo de busqueda. Todos los caracteres
   estan numerados desde izquierda a derecha empezando en 0. De tal
   forma que "P" toma valores que van desde 0 hasta LEN(s$). Ejemplo
      Print Instr ("AMOS BASIC","S",5)
        (Resultado: 8)
      UPPER$  (convierte una cadena de texto en mayusculas)
      s$=UPPER$(n$). Esta funcion convierte la cadena n$ en mayuscu-
   las y transfiere la nueva cadena a s$. Ejemplo
      Print UPPER$ ("AmOs BaSic")
        (Resultado: AMOS BASIC)
                                                                 48
      LOWER$  (convierte una cadena de texto en minusculas)
      s$=LOWER$(n$). LOWER$ traslada todos los caracteres de n$ a
   minusculas. Esto es especialmente util en los juegos de aventuras
   ya que permiten al usuario la introduccion de datos en un formato
   estandard (mayusculas o minusculas) mucho mas facil de interpre-
   tar. Ejemplo:
      Input "Continuo (YES/NO)";ANSWER$
      ANSWER$=LOWER$(ANSWER$):IF ANSWER$="no" then edit
      Print "Continuo con tu programa..."
      FLIP$   (Invierte una cadena)
      f$=FLIP$(n$). FLIP$ simplemente invierte el orden de los carac
   teres de la cadena n$.
      SPACE$  (Espacia una cadena de texto)
      s$=SPACE$(n). Genera una cadena de n espacios en s$. Ejemplo:
      Print "Veinte"; Space$(20);" espacios"
     STRING$  (Crea una cadena llena del caracter a$)
     s$=STRING$(a$,n). STRING$ muestra una cadena con n copias del
   primer caracter de a$. Ejemplo:
     Print String$("The cat sat on the mat",10)
     (Resultado: TTTTTTTTTT)
     CHR$   (Muestra un caracter ASCII)
     s$=CHR$(n). Crea una cadena conteniendo un caracter simple en
   su formato ASCII.
     ASC   (Muestra el codigo ASCII de un caracter)
     c=ASC(a$). ASC te permite acceder al codigo interno ASCII mos-
   trandote el primer caracter de la cadena a$.
     Print ASC("B")
     (Resultado: 66)
     LEN   (Muestra el numero de caracteres presentes en la cadena)
     De este modo puedes conocer la longitud de la cadena:
     Print Len ("1234567890")
     (Resultado: 10)
                                                                 49
     VAL   (Convierte una cadena en un numero)
     v=VAL(x$)
     vpt=VAL(x$)
     VAL convierte una lista de digitos decimales contenidos en x$,
   a un numero. Si este proceso fallara por alguna razon, tomara el
   valor cero. Ejemplo:
     x=VAL("1234"):Print x
     (Resultado: 1234)
     STR$   (Convierte un numero en una cadena)
     s$=STR$(n). STR$ convierte una variable entera en una cadena.
   Esto puede ser muy util en ciertos casos, como el centrado de una
   linea de texto, en donde no se te permite introducir parametros
   numericos. Ejemplo:
     Centre "Memory left is " +STR$(Chip Free)+ "Bytes"
     Cuidado de no confundir STR$ con STRING$.
   1.- Operaciones con matrices
     SORT   (clasifica todos los elementos de una matriz)
     SORT a(0)
     SORT apt(0)
     SORT a$(0)
     La instruccion SORT ordena el contenido de una determinada ma-
   triz en orden creciente. Esta matriz puede contener cadenas, va-
   riables enteras o decimales. El parametro a$(0) especifica el
   punto de comienzo de tu tabla. Debe estar siempre situado en el
   primer item de la matriz, item numero 0. Ejemplo:
     Dim A (25)
     p=0
     Repeat
       input "input a number (0 to stop)";a(p)
       inc p
     until a(p-1)=0 or p>25
     sort a(0)
     for i=0 to p-1
       print a(i)
     next
                                                                 50
     MATCH   (busca una matriz)
     r=MATCH(t(0),s)
     r=MATCH(T#(0),S#)
     r=MATCH(T$(0),s$)
     MATCH busca a traves de una matriz ya ordenada el valor S. Si
   existiera, entonces R toma valor negativo. Ten presente que solo
   las matrices con una sola dimension pueden ser chequeadas de esta
   forma. Tambien necesitaras ordenar previamente la matriz mediante
   la instruccion SORT. Ejemplo:
     Read N
     Dim D$(n)
     For i=1 to N
       Read D$(i)
     Next i
     Sort D$(0)
     Do
       Input A$
       If A$="L"
          For i=1 to N:Print d$(i):Next i
       Else
          POS=MATCH(D$(0),a$)
          if POS>0 then print "Found", D$(POS);" in record ";POS
          if POS<0 and ABS (POS)<=N then print A$,"Not found.
                                         Closest to ",D$(ABS(POS))
          if PO<0 and ABS(POS)>n then print A$, "not found. Closest
                                         to ";D$(n)
       Endif
     Loop
     Data 10,"Adams","Asimov","Shaw","Heinlien","Zelazny","Foster"
     Data "Niven","Harrison","Pratchet","Dickson"
     Recuerda que MATCH puede ser utilizado conjuntamente con la fun
   cion INSTR para potenciar asi la rutina. Deben ser usadas para 
   poder interpretar las instrucciones que se introduzcan en los
   juegos de aventuras.
                                                                 51
     6: G R A F I C O S
     AMOS Basic te ofrece todo lo que necesitas para la generacion
   de divertidos graficos. Existe una facil serie de comandos para
   el diseño de circulos, rectangulos, poligonos, que como podras
   imaginarte en el AMIGA se realizan de forma casi instantanea.
   Pero incluso en este caso, AMOS Basic tiene un truco o dos en la
   manga.
     Las funciones AMOS de graficos trabajan correctamente en todos
   los modos graficos del AMIGA, incluyendo el HAM (Hold And Modify
   Mode). Ademas es posible crear hermosos paisajes directamente en
   modo HAM desde AMOS Basic.
     Por supuesto que no estaras limitado al tamaño de la pantalla, 
   puedes crear grandes imagenes a la que podras ir accediendo por
   partes. Es muy facil generar fondos que hagan un scroll bonito 
   para tus juegos de arcade como, el caso del "DEFENDER".
   1- Colores
      El AMIGA te permite mostrar mas de 64 colores en pantalla al
   mismo tiempo. Esos colores pueden ser seleccionados usando los co
   mandos INK, COLOUR y PALETTE.
      INK   (establece el color a utilizar en los dibujos)
   INK col ¡,paper¿¡,border¿
   "col" especifica el color que sera usado en las siguientes opera-
   ciones de dibujo. El color de cada punto de la pantalla se toma 
   de uno de los 32 diferentes registros de color. Esos registros
   pueden ser individualmente asignados, eligiendo el valor en una 
   paleta de 4096 colores.
     Pese a que el AMIGA solo te permite 32 registros de color, AMOS
   te ofrece un rango de numeracion de color de 0 a 63. Esto permite
   que puedas usar sin limitaciones los colores para los modos HAM y
   Half-Bright respectivamente. Una explicacion detallada de estos
   modos la podras encontrar en el capitulo de Pantallas.
     "paper" asigna el color del fondo que sera generado por un co-
   mando SET PATTERN, cuando se trate de rellenar el fondo.
     "border" selecciona un color sobreimpresionado para lineas y
   poligonos. Esta opcion puede ser activada usando el comando SET
   PAINT como sigue:
     Set pattern 0: set paint 1
     Repeat
       C=rnd(16):ink 16-c,0,c
       x=rnd(320)-20:y=rnd(200)-20:s=rnd(100)+10
       bar x,y to x+s,y+s
     Until mouse key
                                                                 52
   Observa como los parametros col, border y paper, pueden ser omiti
   dos. Simplemente incluye comas "vacias" en los lugares adecuados
   de la instruccion. Por ejemplo:
     Ink ,,5:Rem ajusta el color del borde
     COLOUR   (asigna un color a un indice)
     Colour index,$RGB
     La instruccion COLOUR permite asignar un color a cada uno de 
   los 32 registros de color del AMIGA. INDEX es el numero del color
   que deseas cambiar, y puede oscilar entre 0 y 31. Como ya sabes,
   cualquier color puede crearse mezclando en diversa proporcion los
   3 colores primarios: Rojo, Verde y Azul. Siendo el tono final del
   color la mezcla resultante de la intensidad de estos 3 colores
   primarios.
     La expresion $RGB consiste en 3 digitos de 0 a F. Cada componen
   te establece la fuerza o intensidad de uno de esos colores prima
   rios:    R (Red)     para el rojo
            G (Green)   para el verde
            B (Blue)    para el azul
     En hexadecimal, los digitos 0-F equivalen a
   Hex:       0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F
   Decimal:   0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
      Los modos HAM y Extra Half-Bright usan estos indices con algu-
   na pequeña diferencia. Ver el capitulo 9 para mas detalles.
     =COLOUR   (Lee la asignacion de color)
   c=COLOUR(index)
   La funcion COLOUR toma un numero index de 0 a 31 y devuelve el 
   valor de color previamente asignado a ese registro. "Index" es
   simplemente el numero de color cuya mezcla has determinado. Po-
   dras usar esta funcion para realizar un listado de los actuales
   colores usados en tu amiga, como sigue:
      For C=0 to 15
        Print Hex$(colour(c),3)
      Next C
      PALETTE   (Establece la actual pantalla de colores)
   Palette list of colours. La instruccion PALETTE realmente se tra-
   ta de una poderosa y rapida version de COLOUR. Mientras cargas el
   valor del color, el comando PALETTE te permite instalar una nueva
   y completa paleta de colores en un solo paso. Sin embargo, no 
   puedes ubicar todos los colores en la paleta al mismo tiempo. Asi
   cualquier combinacion de colores debe ser grabada individualmente
                                                                 53
   Por ejemplo:
     Palette $100,$200,$300: Rem ubica 3 colores
   Tambien puedes cambiar colores en medio de tu lista:
     Palette $100,,$300: Rem cambia los colores 0 y 2
   Es importante tener en cuenta que solo los colores en la paleta
   que se especifican en este comando seran los que cambiaran. Todos
   los otros colores retienen el antiguo valor. He aqui algunos ejem
   plos:
     Palette 0,$F00,$0F0
     Palette 0,$770
     Palette 0,,$66
     Palette 0,$1,$2,$3,$4,$5,$6,$7
   Al comienzo de tu programa la paleta de color se carga automatica
   mente usando una lista por defecto de colores. Esta lista por de-
   fecto puede reajustarse usando una simple opcion en la configura-
   cion del programa AMOS.
      Este comando tambien puede ser usado para establecer colores
   usados por los modos HAM y Half-Bright. Estos modos aumentan la
   paleta de color existente hasta generar docenas de colores extra
   en pantalla. Ver el capitulo 10.
   2- Comandos de dibujo de lineas
      GR LOCATE  (posiciona el cursor para graficos)
   GR locate x,y
   Esta orden situa la posicion del cursor en las coordenadas de pan
   talla x e y. El cursor grafico se usa como punto de arranque de 
   la mayoria de operaciones de dibujo. Asi que si omites sus coorde
   nadas, ciertos comandos como PLOT y CIRCLE, utilizaran la actual
   posicion del cursor. Por ejemplo:
      Gr locate 10,10:Plot ,
      Gr locate 100,100: Circle ,,100
      = XGR   (Indica la coordinada X del cursor grafico)
      = YGR   (Indica la coordinada Y del cursor grafico)
   x=XGR: y=YGR
   Estas funciones devuelven las presentes coordinadas del cursor
   grafico:
      Circle 10,100,100
      Print xgr,ygr
                                                                 54
      PLOT   (dibuja un punto simple)
   PLOT x,y¡,c¿
   El comando PLOT es la funcion de pintura mas simple de que se dis
   pone en AMOS Basic. Se usa para dibujar un punto en las coordena-
   das x e y, con el color c. El nuevo color de tinta (INK), en este
   caso "c", sera utilizado en las siguientes operaciones de dibujo.
   Pero si se omitiera el color "c" en esta instruccion, se usara el
   antiguo color. Por ejemplo:
      Curs off:Flash off:Randomize Timer
      DO
        Plot rnd(319),Rnd(199),Rnd(15)
      Loop
      POINT   (Obtiene el color de un punto)
   c=Point(x,y)
   El comando POINT devuelve el index de color de un punto en las
   coordenadas x e y. Ejemplo:
      Plot 100,100
      Print "El color en 100,100 es ";Point(100,100)
      DRAW  (dibuja una linea)
   Draw es otra simple instruccion en basic. Sirve para dibujar una
   simple linea en la pantalla del Amiga.
      Draw x1,y1 to x2,y2
   Dibuja una linea entre las coordenadas x e y.
      Draw to x3,y3
   Dibuja una linea entre la actual posicion del cursor y la posi-
   cion x3,y3. Ejemplo:
      Colour 4,$707:ink4
      Draw 0,50to200,50
      Draw to100,100
      Draw to 0,50
      BOX  (Dibuja un rectangulo hueco)
   Box x1,y1 to x2,y2
   El comando BOX dibuja una caja rectangular y hueca en pantalla.
   X1Y1 son las coordenadas del angulo superior izquierdo de la caja
   mientras que X2Y2 corresponden a las coordinadas del angulo diago
   nalmente opuesto.
                                                                 55
      POLYLINE   (Dibuja multiples lineas)
   Polyline es muy similar a la anterior, excepto que dibuja muchas
   lineas a la vez. Es capaz de generar complejos poligonos huecos 
   en un solo paso.
      Polyline x1,y1 to x2,y2 to x3,y3
      CIRCLE    (Dibuja un circulo hueco)
   Circle x,y,r
   El comando CIRCLE dibuja un circulo hueco de radio R y centro en
   las coordenadas X e Y. Habitualmente si se omiten las coordenadas
   el circulo se dibujara en la actual posicion del cursor:
      Plot 100,100: Circle ,,50
      ELLIPSE   (Dibuja una elipse hueca)
   Ellipse x,y,r1,r2
   La instruccion ELLIPSE dibuja una elipse hueca en las coordenadas
   x e y; siendo el radio horizontal r1. Esto corresponde exactamen-
   te a la mitad de amplitud de la elipse. R2 es el radio vertical,
   que se usa para establecer la altura de la elipse. La altura 
   total de la elipse es r*2.
   Tipos de Lineas
   ===============
      AMOS Basic te permite dibujar tus lineas usando una gran canti
   dad de tipos de linea.
      SET LINE   (Establece los estilos de linea)
   Set line mask
   El comando SET LINE establece el estilo de todas las lineas que
   se trazaran a continuacion usando los comandos BOX, DRAW y POLYLI
   NE. "Mask" es un numero binario de 16 bits que describe con exac-
   titud la apariencia de la linea
      Cualquier punto de la linea que aparezca con el color actual
   de tinta, sera representado por un "1", mientras que el punto con
   el color del fondo lo hara con un "0". Asi una linea normal sera
   representada por un numero binario: %111111111111111 y sera ejecu
   tado como ________________. De forma similar, una linea punteada
   como por ejemplo _ _ _ _ _ _ _ _, sera reproducida por una "mask"
   o mascara del tipo %111100001111000011110000.
      Dando valores a la linea mascara entre 0 y 65535, es posible
   generar una gran variedad de diferentes tipos de linea:
      SET LINE $F0F0
      BOX 50,100 to 150,150
   Este estilo de linea no tiene efectos en los dibujos de figuras 
   con CIRCLE o ELLIPSE.
                                                                 56
   Figuras rellenas
   ================
      PAINT   (Relleno de un contorno)
   PAINT x,y,mode
   El comando PAINT te permite rellenar una determinada region de la
   pantalla con un bloque solido de color. Adicionalmente, puedes
   seleccionar el modelo de relleno para tus figuras utilizando el
   comando SET PATTERN.
      "X" e "Y" son las coordenadas de un punto dentro del area que
   sera rellenada. "MODE" puede ser 0 o 1. Un valor 0 terminara la
   operacion de relleno una vez que encuentre el primer pixel del ac
   tual color del borde. Un mode valor 1 interrumpira la operacion 
   de relleno una vez encuentre cualquier color diferente al de la
   tinta de relleno.
      BAR    (dibuja un rectangulo relleno)
   BAR x1,y1 to x2,y2
   Dibuja una barra rellena desde x1,y1 (coordenadas del borde supe-
   rior izquierdo) hasta x2,y2 (coordenadas de la esquina opuesta).
      POLYGON   (Dibuja un poligono relleno)
   Polygon x1,tox2,y2 tox3,y3
   Polygon to x1,y1 to x2,y2
   POLYGON genera un poligono relleno del actual color de tinta. Es
   basicamente una version solida del comando standard POLYLINE. No
   hay limite de numero de pares de coordenadas, salvo que el maximo
   de longitud de linea que admite AMOS es de 255 caracteres.
   Estilos de relleno
   ==================
     En AMOS Basic no tienes restriccion de relleno para tus figuras
   con un color solido. Existen docenas de modelos de relleno para
   poder elegir, e incluso podras grabar tus propios modelos en el
   banco de sprites.
      SET PATTERN   (selecciona un modelo de relleno)
   SET PATTERN pattern
   Este comando te permite seleccionar un modelo de relleno para que
   puedas emplearlo en tus dibujos. Existen 3 posibilidades:
   1) Pattern = 0
      Este es el valor por defecto, y rellenara tus figuras con un
   bloque solido del actual color de tinta.
                                                                 57
   2) Pattern > 0
      Si el numero del modelo es mayor que 0, AMOS Basic selecciona
   uno de los 34 modelos prediseñados. Estos modelos se encuentran 
   en el fichero MOUSE.ABK del primer disco AMOS, y pueden ser reedi
   tados utilizando el definidor de sprites de AMOS Basic. Ten en
   cuenta que las 3 primeras imagenes de estos ficheros son necesa-
   rias para el cursor del raton (ver CAMBIO de RATON). Los modelos
   de relleno se almacenan en las imagenes 4 y sucesivas.
   3) Pattern < 0
      Esta es la mas poderosa opcion de todas. "Pattern" ahora se
   refiere a una imagen de sprite de banco 1. La imagen es un numero
   que se calcula segun la formula:
      SPRITE IMAGE = PATTERN * (-1)
   La imagen seleccionada sera automaticamente alterada antes de ser
   usada, de acuerdo con las siguientes reglas:
   * La amplitud de la imagen esta limitada a 64 pixels
   * La altura sera redondeada a la mas proxima potencia de 2 (por
     ejemplo 1,2,4,8......64)
     Dependiendo del tipo de tu imagen, el modelo sera dibujado de
   uno o dos modos. Dos imagenes en color se dibujan en "monocromo"
   Los actuales colores de tu imagen seran completamente desechados
   y el moedelo se dibujara usando los actuales colores de tinta y
   papel.
     Tambien es posible producir modelos de relleno multicoloreados.
   En este caso los colores de tu imagen se mezclaran con el actual
   color de tinta usando una funcion logica AND. De forma similar, 
   al color del papel de tu modelo le sera aplicada la funcion OR
   con el sprite del bondo (color 0). Si deseas utilizar los colores
   originales de sprites, necesitaras establecer los colores de fon-
   do y tinta como sigue:
      Ink 31,0
      No olvides cargar tu paleta de sprites desde el banco de spri-
   tes mediante el comando GET SPRITE PALETTE antes de usar estas
   instrucciones, de otro modo la ejecucion es probable que aparezca
   demasiado confusa.
      SET  PAINT    (set/reset el modo subrayado)
   SET PAINT n
   Cambia el dibujo subrayado por las instrucciones POLYGON o BAR.
   Como valor por defecto, este modo se encuentra en OFF.
   Si n=1 entonces se activa el modo subrayado.
                                                                 58
   Estilos de escritura
   ====================
      GR  WRITING   (cambia el modo escritura)
   GR WRITING  bitpattern
   Cuando dibujes graficos en tu pantalla, naturalmente se supone
   que ninguna otra cosa se sobrepondra sobre tu imagen. El comando
   GR WRITING te permite elegir dentro de un rango de 4 alternativas
   de tipos de escritura, que pueden ser usados generandos docenas
   de intrigantes efectos.
   Modo JAM 1 (Bit 0=0)
   JAM 1 solo dibuja las partes de tus graficos que van en el actual
   color de tinta. Cualquier otra parte dibujada con el color del
   papel se omitira. Esto es particularmente util con el comando 
   TEXT, ya que te permitira mezclar tu texto directamente sobre una
   pantalla de fondo preexistente. Por ejemplo:
      Ink 2,5:Text 140,80,"Texto normal":Gr Writing 0:
                         Text 140,71,"JAM1"
   Modo JAM 2 (Bit 0=1)
   Esta es la forma por defecto. Un grafico existente en pantalla
   sera completamente reemplazado por la nueva imagen.
   Modo XOR  (Bit 1=1)
   XOR combina tus nuevos graficos con aquellos ya presentes en tu
   pantalla usando una operacion logica conocida como  eXclusivo OR.
   El resultado neto es un cambio de color de las areas de dibujo
   que solapan un diseño previo.
      Otro interesante efecto de XOR es que puedes borrar cualquier
   objeto de la pantalla, simplemente pasando al modo XOR y grabando
   el nuevo objeto justamente en la misma posicion que el anterior,
   lo que produce una sensacion de borrado.
   Modo  INVERSEVID  (Bit 2=1)
   Este modo invierte la imagen detras del dibujo. Asi cualquier sec
   cion de tu imagen dibujada en el color de tinta, podra ser reem-
   plazada por el actual color del papel y viceversa. El modo INVER-
   SEVID se usa a menudo para reproducir texto invertido.
      Una vez que estos modos se empleen mediante el uso de bitpa-
   ttern, es posible combinar algunos modos juntamente:
      Gr Writing 4+1:Rem establece JAM2 e INVERSEVID
      Gr Writing 7:  Rem elige JAM2, INVERSEVID o XOR
      Ink 2,5:Text 140,80'"Acceso e imagen!!"
      Advierte que este comando solo afecta a las operaciones de
   dibujo como CIRCLE, BOX, y el comando grafico TEXT. El modo de di
   bujo usado con comando "normales" de texto grafico como PRINT y
   CENTRE, se emplea utilizando otro tipo de comandos.
   Ver tambien AUTOBACK.
                                                                 59
      CLIP    (restringe todos los graficos a una parte de pantalla)
   CLIP ¡x1,y1 to x2,y2¿
   La instruccion CLIP limita todas las operaciones de dibujo a una
   region rectangular de la pantalla que se especifica por las coor-
   denadas x1,y1,x2,y2.
      x1,y1 representan las coordenadas del border superior izquier-
   do del rectangulo, mientras que x2,y2 con las coordenadas del an
   gulo inferior derecho del mismo.
      Ten presente que es perfectamente aceptable el uso de coordena
   das que sobrepase el tamaño normal de la pantalla. Todas las ope-
   raciones de dibujo trabajaran normalmente, incluso si solo fuera
   visible una parte del diseño.
      Como puedes ver, solo las partes del circulo que aparece den-
   tro del rectangulo restringido han sido dibujadas en pantalla. La
   zona restringida puede almacenarse como un area normal de panta-
   lla, omitiendo todas las coordenadas para esta instruccion.
   Tecnicas avanzadas
   ==================
      SET  TEMPRAS   (establece un buffer de memoria temporalmente)
   SET TEMPRAS ¡address, size¿
   Esta instruccion permite a los experimentados programadores de
   AMIGA, afinar en la cantidad de memoria utilizada en las operacio
   nes graficas. Pero ATENCION: el uso inadecuado de esta instruc-
   cion puede alterar irreversiblemente tu ordenador.
      Cuando un programa AMOS ejecuta un comando completo, un area
   especial de memoria se reserva para el almacenaje del modelo de
   relleno. Esta memoria reservada es automaticamente devuelta al 
   sistema una vez que la instruccion ha sido ejecutada. El tamaño
   del area de memoria del buffer es equivalente a un simple plano
   bidimensional del actual modo de pantalla. Siendo el valor total
   por defecto de la pantalla de 8k.
      El tamaño y localizacion del buffer de graficos puede ser alte
   rado en cualquier momento usando la instruccion SET TEMPRAS. En
   donde, SIZE es el numero de bytes que deseas reservar para tu 
   area buffer, y puede oscilar entre 256 y 65536.
      La cantidad de memoria necesaria para albergar un objeto sim-
   ple se puede calcular de la siguiente forma:
      - Encierra el objeto en una caja rectangular
      - El area equivalente viene dada por la formula:
                SIZE = Amplitud/8 * Altura
      Si vas a utilizar el comando PAINT, asegurate que la figura
   esta "encerrada", de otra forma se necesitaria mucha memoria adi-
   cional y ademas el sistema puede ser afectado.
                                                                 60
      "BUFFER" puede ser una direccion de memoria o bien un banco de
   memoria. La memoria que reserves para este buffer debera siempre
   ser memoria CHIP. Una vez el area buffer sea instalada al inicio
   de tu programa, no hay necesidad de reservar continuamente y re-
   almacenar la memoria buffer. Esto puede aumentar la velocidad de
   tus programas en mas de un 5%.
      Podras reubicar el area buffer a su valor original, simplemen-
   te usando el comando SET TEMPRAS sin parametros a continuacion.
                                                                  61
             7:  CONTROL  DE  ESTRUCTURAS
      GOTO   (salta a un nuevo numero de linea)
   La accion de GOTO transfiere el control del programa de un lugar 
   a otro. Existen 3 formas de presentacion de este comando en AMOS:
   1) GOTO  label
      "label" es un marcador de lugar opcional al lado de una linea.
   Los nombres de etiqueta (label) se definen usando los dos puntos
   ":" como sigue:
      label:
   La etiqueta puede consistir en cualquier cadena de caracteres al-
   fanumericos, incluyendo "-". Se construye utilizando las mismas
   reglas que se aplican a los tipos de variables y procedimientos.
   2) GOTO  line number
      Cualquier linea de AMOS Basic puede ser opcionalmente precedi-
   da de un numero. Esos numeros de linea se incluyen exclusivamente
   para compatibilidad con otras opciones Basic (como STOS en el Ata
   ri ST). Es preferible utilizar etiquetas, ya que son mucho mas fa
   cilmente legibles y recordables.
   3) GOTO  variable
      La variable puede ser cualquier expresion permitida en AMOS Ba
   sic. Esta expresion debe ser un numero entero o una cadena. Los
   enteros ejecutan un numero de linea para el GOTO, mientras que 
   las cadenas retienen el nombre de una etiqueta.
      En terminos tecnicos, esta construccion es conocida como un 
   GOTO Computerizado. Generalmente es usado por programadores exper
   tos, pero es increiblemente util en ciertas ocasiones. Por ejem-
   plo:
      Room=3
      Begin:
        Goto "room"=Str$(Room)-" "
        End
      Room3:
        Print"room three!"
        Goto Begin
                                                                62     
      GOSUB   (Salta a una subrutina)
   GOSUB es otra instruccion anticuada, que te permite la posibili-
   dad de continuar un programa en otro mas pequeño, mas manejable y
   que se conocen como SUBRUTINAS. Actualmente GOSUB has sido casi
   desplazado por completo por el sistema de PROCEDIMIENTOS de AMOS
   Basic. Sin embargo, GOSUB es util cuando se trata de traducir pro
   gramas de otras versiones de Basic como es el STOS.
      Al igual que GOTO existen 3 formas distintas de GOSUB:
   1) GOSUB n     (salta a una subrutina en la linea n)
   2) GOSUB name  (salta a una etiqueta AMOS)
   3) GOSUB exp   (salta a una etiqueta o una linea dependiendo de 
                   la expresion exp)
   Ejemplo:
     For i=1 to 10
       Gosub TEST
     Next I
     Direct
     Test:
       Print"This is an example of GOSUB":Print "I equals ";i
       Return: Rem salida de la subrutina TEST y regreso al programa
    Es una buena costumbre el emplazar todas las subrutinas al final
   del programa principal, lo que facilita el listado del mismo. Tam
   bien puedes añadir una orden EDIT o DIRECT al final de tu progra-
   ma principal, al objeto de evitar que AMOS ejecute tus subrutinas
   despues de que el programa haya terminado, generando por tanto un
   mensaje de error.
      RETURN   (Regreso de una subrutina)
   RETURN sale de una subrutina a la que previamente se ha accedido
   mediane un GOSUB. Advierte que una simple instruccion GOSUB puede
   contener varios RETURN. Por lo que puedes salir de la subrutina a
   traves de varias vias dependiendo de la situacion.
      POP   (Sustituye al comando RETURN despues de un GOSUB)
   Normalmente es ilicito salir de un comando GOSUB usando un GOTO
   standard. Esto sin embargo, puede ser un inconveniente, especial-
   mente si se produjera un error, por lo que es inaceptable que tu
   intentes regresar al programa principal en el mismo punto de par-
   tida.
      La instruccion POP sustituye al comando RETURN generado por un
   GOSUB, y te permite dejar la subrutina en cualquier momento que
   desees, sin tener que ejecutar primero el comando RETURN. Ejemplo
                                                                 63
     Do
        Gosub TEST
      Loop
      Bye:
        Print "Popped out"
      Direct:
      TEST:
        Print "Hi there!"
        If mouse key then pop: goto Bye
      Return
      IF ... THEN ... ¡ELSE¿  (elige entre acciones alternativas)
   La instruccion IF...THEN te permite emplazar una decision simple
   dentro de un programa Basic. El formato es
      If condition THEN suceso 1 ¡Else suceso 2¿
   "condition" puede un listado de condiciones incluyendo AND y OR.
   Los sucesos 1 y 2 pueden ser tambien un listado de instrucciones
   de AMOS Basic. Si deseas saltar a un numero de linea o a una eti-
   queta, tendras que incluir un comando GOTO de forma separada como
   sigue:
      If TEST then GOTO label: This is fine
   Pero si por olvido, omites GOTO, obtendras un mensaje de error
   "procedure not defined".
      If TEST then LABEL: Rem esto hace llamada a un procedimiento
      El alcance de esta instruccion IF...THEN esta limitada a una
   simple linea de tu programa en Basic. Ademas, este comando ha si-
   do superado ampliamente por el mucho mas poderoso comando IF...
   ELSE...ENDIF.
      IF ... ¡ELSE¿ ... ENDIF   (Es un test estructurado)
   Pese a que la original forma de IF...THEN es indudablemente util,
   realmente esta pasada de moda si la comparamos con las facilida-
   des encontradas en la moderna version Basic de AMOS. Este comando
   te permite ejecutar completos listados de instrucciones dependien
   do del resultado de un test simple.
      If test =TRUE
        << lista de instrucciones >>
      Else
        << lista de instrucciones 2 >>
      Endif
                                                                 64
   NOTA: es ilegal usar un IF...THEN normal dentro de un test estruc
   turado. Este debera ser reemplazado por su instruccion equivalen-
   te IF...ENDIF. Asi:
      If TEST then goto LABEL else LABEL2
   Pasara a ser:
      If TEST: Goto LABEL: Else goto LABEL2: Endif
   O bien:
      If TEST
         Goto LABEL
      Endif
   He aqui un ejemplo de la instruccion IF...ENDIF en accion:
      Input "Introduce valores para a,b y c";A,B,C
      If A=B
         Print "Igual"
      Else
         Print "Diferencia ";
         If A<>B and A<>C
            Print ", y C no es tampoco la misma!"
         Endif
      Enf if
   Cada orden IF en tu programa debe ir aparejada con una instruc-
   cion simple ENDIF, que informara a AMOS con precision que grupo
   de instrucciones deben ser ejecutadas en tu test.
   Ten en cuenta que THEN no se utiliza en este tipo de instruccio-
   nes. Esto puede crearte algun problema si estas demasiado acostum
   brado a las viejas versiones Basic de Commodore.
      FOR ... NEXT   (repite una parte del programa un numero espe-
                      cifico de veces)
    FOR indez=first TO last ¡STEP inc¿
      < lista de instrucciones >
    NEXT ¡index¿
       "INDEX" se trata de un contador que sera incrementado despues
    de cada una de las vueltas. Al comienzo del ciclo, este contador
    debe cargarse con el resultado de la expresion "first". Las ins-
    trucciones entre FOR y NEXT se ejecutaran hasta alcanzar la or-
    den NEXT.
       "INC" es un valor que se añadira al contador despues de cada
    vuelta por la instruccion NEXT. Si se omitiera este valor, se
    añadiria automaticamente la unidad.
       Ten en cuenta que si INC es negativo, el ciclo se interrumpi-
    ra cuando el contador sea menor que el valor "first". De este
    modo todo el ciclo sera ejecutado al reves.
                                                                 65
       Una vez dentro del ciclo, "INDEX" puede ser leido desde tu 
    programa como una variable normal. Pero no podras cambiar su va-
    lor de ninguna forma, a menos que quieras obtener un mensaje de
    error.
       Por cada orden FOR en tu programa, debe existir una instruc-
    cion simple NEXT. Tambien podras utilizar las formas abreviadas
    usadas en otros Basic como NEXT R,T. 
       A continuacion un par de ejemplos de estos ciclos:
      For I=32 to 255 : Print CHR$(i);:Next i
      For R1=20to100 step 20
        For R2=20to100 step 20
          For A=0 to 3
          Ink A
          Ellipse 160,100,R1,R2
          Next A
        Next R2
      Next R1
      WHILE ... WEND   (Repite una parte del programa mientras se
                        mantenga una condicion como cierta)
   WHILE condition
    < lista de instrucciones >
   WEND
      "Condition" puede ser cualquier tipo de test que desees cons-
   truir, incluyendo si fuera necesario las instrucciones logicas.
   Se realiza un chequeo en cada vuelta del ciclo. Si el resultado
   del test fuera -1 (cierto), entonces se ejecutarian las instruc-
   ciones entre WHILE y WEND, de otro modo el ciclo se interrumpiria
   y AMOS continuara con la siguiente instruccion. Ejemplo:
      Input "Teclea un numero";X
      Print "Contando hasta 11"
      WHILE X < 11
        Inc X
        Print X
      WEND
      Print "Ciclo terminado"
   El numero de veces que WHILE ejecuta este programa dependera del
   valor que introduzcas en la rutina. Si introduces un numero mayor
   de 11, el ciclo no se ejecutara jamas. WHILE solo ejecutara ins-
   trucciones si la condicion es cierta al principio del programa.
                                                                  66
      REPEAT ... UNTIL   (Repite hasta que se satisfaga una condi-
                          cion)
   REPEAT
     < lista de instrucciones >
   UNTIL condicion
   REPEAT ... UNTIL es muy similar a WHILE ... WEND, excepto que la
   cumplimentacion del test se realiza al final del ciclo en vez de
   al principio (como pasaba en el anterior). El ciclo se repetira
   continuamente hasta la condicion especificada sea FALSA. Asi se
   realizara como minimo UNA VEZ en tu programa. Ejemplo:
     Repeat
       Print "AMOS Basic"
     Until Mouse Key <> 0
     DO ... LOOP   (Cicla infinitamente)
   Do
    < lista de instrucciones >
   Loop
      El comando DO ... LOOP toma una lista de instrucciones Basic y
   las ejecuta, repitiendolas continuamente. Al objeto de poder sa-
   lir de este bucle, necesitaras utilizar una instruccion especial
   del tipo EXIT o EXIT IF.
      La ventaja de este sistema es que se trata de una estructura
   alternativa al bucle clasico GOTO que aparecia en las primeras
   versiones Basic. Observa el siguiente ejemplo:
      TEST:
      Input "Otro juego S/N"; AN$
      If Upper$(AN$)="N" then goto BYE
      GAME: Rem salta al inicio del juego
      Goto TEST
      BYE:
   Y a continuacion una segunda version, utilizando DO ... LOOP:
      DO
       Input "Otro juego S/N";AN$
       Exit if upper$ (AN$)="N"
       GAME: salta al inicio del juego
      Loop
      End
                                                                 67
      EXIT   (Sale de un bucle DO ... LOOP)
   EXIT ¡n¿
      El comando EXIT sale inmediatamente de uno o mas de un bucle
   creado con las siguientes instrucciones:
   - FOR ... NEXT
   - REPEAT ... UNTIL
   - WHILE ... WEND
   - DO ... LOOP
      Tu programa AMOS saltara entonces automaticamente a la siguien
   te instruccion tras el bucle en cuestion. "N" es el numero de
   ciclos que tu deseas dejar. Si este dato fuera omitido, solo se
   ejecutara el bucle mas interno.
      EXIT IF   (sale de un bucle dependiendo de un test)
   EXIT IF expresion ¡,n¿
      La "expresion" consiste en una serie de test en el formato es
   tandard de AMOS. Solo se ejecutara la orden de salida si el resul
   tado del test fuera -1. El parametro "N" funciona de la misma for
   ma que en el comando anterior.
      EDIT   (Detiene la ejecucion del programa y regresa al editor)
      La orden EDIT detiene el programa actual y regresa al editor
   Basic de AMOS. Esto puede ser muy util cuando estes depurando al-
   guno de tus programas.
      DIRECT   (Sale al modo directo)
      Termina el programa y salta inmediatamente a modo directo, con
   lo que puedes examinar el contenido de las variables o realizar
   un listado del programa en impresora.
      END   (Sale de un programa)
      Esta instruccion sale de un programa. En este momento se te
   ofrecera la posibilidad de regresar al editor o al modo directo.
      ON ... PROC   (Salta a uno o varios procedimientos en funcion
                     de la variable)
   ON v Proc proc1, proc2, proc3,... procN
   Salta a un procedimiento en funcion de la variable "v". Ten en
   cuenta que ninguno de los procedimientos que uses con este coman-
   do podra incluir parametros. Si necesitas transferir informacion
   a uno de estos procedimientos, deberas colocarla dentro de una
   variable global. Ver PROCEDIMIENTOS para una mejor aclaracion de
   esta tecnica.
                                                                 68
      El comando ON ... PROC, es en realidad equivalente a:
      If v=1 then Proc1
      If v=2 then Proc2
         :       :
      If v=n then ProcN
      ON ... GOTO   (Salta a una linea en funcion de la variable)
    ON v GOTO line1, line2, line3, .... lineN
    La instruccion ON GOTO te permite saltar a un numero determinado
    de linea dependiendo del resultado de la variable v. Es el equi-
    valente a las siguientes lineas:
      If v=1 then Goto Line1
      If v=2 then Goto Line2
          :          :
      If v=n then Goto LineN
      ON ... GOSUB   (Salta a una rutina en funcion de la variable)
   ON v GOSUB line1, line2.....
   Es identica a la anterior, salvo que usa un GOSUB en lugar de un
   GOTO.
      EVERY  n  GOSUB   (Llama a una rutina en intervalos regulares)
   Every n GOSUB Label
   La orden ON EVERY llama a una rutina en intervalos regulares sin
   interferir el normal desarrollo del programa principal. Siendo N
   la longitud del intervalo en cincuentavos de segundo. El tiempo
   que requiere la rutina para ejecutarse debe ser siempre menor que
   este intervalo, o en caso contrario aparecera un mensaje de error
      Despues que se haya accedido a una subrutina, el sistema queda
   automaticamente anulado. Al objeto de realizar esta llamada de
   forma continuada, necesitaras añadir el comando EVERY ON antes 
   del RETURN final. Ejemplo:
      Every 50 Gosub TEST
      DO
        Print "Bucle principal"
      Loop
      Test:
       Inc I: Print " Esta es la llamada numero ";i
      Every On: Return
                                                                 69
      EVERY   N  PROC   (Llama a un procedimiento en intervalos 
                         regulares)
   EVERY n PROC name.
   EVERY PROC ejecuta automaticamente el procedimiento deseado en
   intervalos regulares utilizando un potente sistema de interrup-
   ciones. "N" es el retraso entre cada llamada al procedimiento y
   se mide en unidades de cincuentavo de segundo.
      Como en el caso anterior, la interrupcion debe ser activada 
   antes de abandonar el procedimiento, de otra forma la rutina solo
   sera llamada una sola vez. Asi que necesitas usar la instruccion
   EVERY ON antes de volver al programa principal con la orden END
   PROC. Ejemplo:
      Every 50 Proc Test
      Do
        Print "Main loop"
      Loop
      Procedure Test
        Shared I
        Inc I: Print "Esta es la llamada numero "; I
        Every On
      End Proc
      EVERY  ON/OFF   (alterna automaticamente las llamadas al
                       procedimiento)
   EVERY ON/OFF
   EVERY ON reinicializa el sistema de interrupciones usado por el
   comando EVERY. Debe ser ejecutado justo antes de finalizar la eje
   cucion del procedimiento o de la subrutina.
   EVERY OFF anula las llamadas por completo. Se ejecuta automatica-
   mente al inicio de uno de esos procedimientos.
      BREAK ON/OFF   (activa o desactiva la tecla CTRL+C Break)
   BREAK ON/OFF
   Normalmente puedes interrumpir un programa para regresar al Basic
   siempre que aprietas CTRL+C. Esta funcion puede ser desactivada
   usando el comando BREAK OFF. Posteriormente puedes usarla de nue-
   vo mediante el comando BREAK ON.
                                                                 70
   Manejo de errores
   =================
      ON ERROR GOTO   (Capta un error dentro de un programa Basic)
   ON ERROR GOTO Label
   Este comando te permite detectar y corregir los errores de un
   programa Basic AMOS, sin tener que volver a la ventana de edicion
   A veces, los errores pueden aparecer dentro de un programa sin 
   que sean facilmente predictibles por adelantado. Por ejemplo, el
   siguiente ejemplo puede ser una buena ilustracion:
      Do
        Input "Introduce 2 numeros"; A,B
        Print A; "dividido por ";B;" es "; A/B
      Loop
   Este programa funcionara correctamente hasta que introduzcas un
   0 en lugar de B. Entonces podras evitar la aparicion de un mensa-
   je de error (Division por cero) mediante la instruccion ON ERROR
   como sigue:
      On error goto Label
   Cuando un error aparezca en tu programa Basic, AMOS saltara auto-
   maticamente a Label, que podra ser el punto de comienzo de una 
   rutina de correccion de errores que puede localizar tu error y 
   regresar sin problemas al programa principal.
     No olvides que de esa rutina debes salir usando una instruccion
   especial llamada RESUME. No esta permitido regresar al programa
   principal con una simple instruccion GOTO. Ejemplo:
      On error goto HELP
      DO
        Input "Introduce 2 numeros ";A,B
        Print A;" dividido por ";B;" es ";A/B
      Loop
      HELP:
      Print: Print: Bell
      Print" Me temo que has dividido por cero"
      RESUME next: Rem regresa a la siguiente instruccion
   Al objeto de que esto funcione bien, es esencial que un error no
   se presente dentro de la propia rutina correctora, de otro modo
   AMOS detendra la ejecucion de tu programa "irritado". Por otro
   lado, el efecto del comando ON ERROR GOTO puede ser anulado con
   el comando ON ERROR sin parametros a continuacion:
      On error: Rem evita la captura de errores
                                                                 71
      ON ERROR PROC   (Captura un error utilizando un procedimiento)
   ON ERROR PROC Name
   Selecciona un procedimiento que sera llamado automaticamente si
   apareciera un error en el programa principal. Realmente es una
   version del comando anterior.
      Pese a que los procedimientos deben ser terminados mediante el
   comando END PROC, en este caso necesitaras para regresar al pro-
   grama principal, usar el nuevo comando RESUME, que sera localiza-
   do justo antes de la orden final END PROC.
      RESUME   (reanuda la ejecucion del programa tras un error)
   Existen 5 formatos posibles para esta instruccion:
   RESUME. Regresa al comando que causo el error y lo ejecuta de nue
   vo.
   RESUME NEXT. Regresa a la instruccion inmediatamente a continua-
   cion de la que ocasiono el error.
   RESUME LINE. Salta a un punto especifico del programa principal.
   "Line" puede referirse a una etiqueta o a un numero de linea en
   concreto. Pero NO puede ser usado para volver a entrar a un proce
   dimiento.
      Los procedimientos se manejan de forma un tanto diferente. Si
   deseas saltar a un procedimiento en particular, tienes que situar
   un marcador especial en algun lugar del procedimiento para el
   chequeo de errores. Este metodo debe acompañarse del siguiente
   comando RESUME LABEL, del que existen 2 versiones distintas:
   RESUME LABEL label. Define a que etiqueta debe saltar tras la apa
   ricion de un error. Esta debe ser llamada despues de la rutina de
   manejo de errores, es decir justo despues de la orden ON ERROR
   PROC u ON ERROR GOTO.
   RESUME LABEL. Usado dentro de la rutina de manejo de errores para
   poder saltar a la rutina especificada en el comando previo. Ej.:
      On Error Proc HELP
      Resume Label AFTER
      Error 12
      Print "Never Printed"
      AFTER: Print "He llegado aqui"
      End
      Procedure HELP
         Print "Hola, creo que existe un error"
         Resume label
      End Proc
                                                                  72
      ERRN   (indica el numero del ultimo error)
   e=ERRN
   Cuando estes creando tus propias rutinas de manejo de errores con
   el comando ON ERROR, necesitaras ser capaz de conocer con preci-
   sion que tipo de error ha aparecido en tu programa.
      Asi, cuando un error ocurre, ERRN se carga automaticamente con
   su numero de identificacion. Mira el apendice de errores donde 
   encontraras la lista completa de los errores posibles.
      ERROR   (genera un error y regresa al editor)
   ERROR n
   La accion del comando ERROR es la de generar un error. Suponiendo
   que hayas creado un bonito error en las rutinas de manejo de erro
   res, este comando te permite simular un ERROR cualquiera que equi
   valga a cualquiera de los que se pudieran plantear, evitando asi
   la inconveniencia del error actual. Ejemplo:
      Error 40
   Sale del programa e imprime el mensaje de error Label not defined
      Error Errn
   Esta orden usa la funcion ERRN para imprimir el error actual des-
   pues de que aparezca algun problema en tu programa.
   ================================================================
                                                                 73
                8:  T E X T O S    Y    V E N T A N A S
   Atributos de texto
   ==================
      PEN   (Selecciona el color del texto)
   PEN Index
   La instruccion PEN establece el color de todo el texto que se mos
   trara en la actual ventana. Este color puede ser elegido entre 64
   posibilidades diferentes dependiendo del modo grafico que estes
   usando en ese momento. Ejemplo:
      PEN 6
      =PEN$(n)   (Cambia el color PEN usando caracteres)
   a$=PEN$(n)
   PEN$ contiene una secuencia especial de control que cambia el co
   lor de texto dentro de una cadena. El nuevo color de texto sera
   asignado automaticamente cuando esta cadena se muestre en panta-
   lla. Ejemplo:
      C$=PEN$(2)+"WHITE "+PEN$(6)+"BLUE"
      Print C$
   La cadena es devuelta por PEN$ en el formato:
      CHR$(27)+"P"+CHR$(48+n)
      PAPER   (Selecciona el color del fondo de texto)
   PAPER Index
   Index puede ser un numero entre 0-63
      =PAPER$(n)   (Obtiene una secuencia de control para esta-
                    blecer el color del papel)
   x$=PAPER$(index)
   PAPER$ obtiene un caracter de cadena que automaticamente cambia
   el color de fondo cuando aparece en pantalla. Por ejemplo:
      Pen 1: C$=PAPER$(2)+"WHITE "+PAPER$(6)+"BLUE "
      Print c$
      INVERSE ON/OFF   (activa modo inverso)
   INVERSE ON/OFF
   El comando INVERSE invierte los colores del texto y del fondo.
                                                                74
      SHADE ON/OFF   (Sombrea todo el texto siguiente)
   SHADE ON/OFF
   SHADE ON sobreimpresiona el texto al reducir la luminosidad de 
   los caracteres con una especie de filtro. La sombra del texto
   puede a ser la normal mediante la orden SHADE OFF.
      UNDER ON/OFF   (Activa el modo subrayado)
   UNDER ON/OFF
   UNDER ON subraya el texto que aparece en pantalla. UNDER OFF vuel
   ve al modo normal.
      WRITING   (cambia el tipo de escritura)
   WRITING w1 ¡,w2¿
   El comando WRITING te permite cambiar el modo de escritura utili
   zado para todas las siguientes operaciones de texto. Este comando
   determina la forma en la que tu nuevo texto debe ser combinado 
   con los datos ya existentes en pantalla.
     w1=0   REPLACE (Default). El nuevo texto ocultara cualquier
                               otra cosa por debajo.
     w1=1   OR                 Mezcla los caracteres con los de la
                               pantalla mediante un OR logico.
     w1=2   XOR                Los caracteres se combinan ahora con
                               un XOR.
     w1=3   IGNORE             Las operaciones de impresion seran
                               ignoradas
   El segundo numero elige que parte del texto sera imprimida sobre
   la pantalla. Esta opcion puede ser omitida si se desea.
     w2=0   NORMAL        El texto aparece en pantalla sobre el 
                          color del fondo
     w2=1   PAPER         Solo el fondo del texto se dibuja en panta
                          lla
     w2=2   PEN           Ignora el color del papel y escribe el tex
                          to en un fondo de color cero
   No confundas este comando con el GR WRITING, que ya veremos.
                                                                 75
   Funciones del cursor
   ====================
      AMOS incluye una amplia gama de facilidades para maniobrar con
   el cursor a cualquier parte de la pantalla.
      LOCATE   (posiciona el cursor)
   LOCATE x,y
   LOCATE x,
   LOCATE ,y
   El comando LOCATE mueve el cursor a las coordenadas x e y, esta
   bleciendo el punto de comienzo para cualquier operacion futura de
   impresion. Todas las posiciones de pantalla se especifican median
   te un "set" especial de coordenadas de texto. Dichas coordenadas
   son medidas en unidades que dependen del valor de la esquina supe
   rior izquierda de la pantalla. Asi por ejemplo, las coordinadas
   15,10 hacen referencia a un punto 10 caraceres por debajo y 15 a
   la derecha.
      Si intentas imprimir algo fuera de los limites de la ventana,
   se generara un error. Ten en cuenta que la pantalla actual se con
   sidera siempre como ventana 0 (WINDOW 0); por lo que no necesitas
   abrir una ventana antes de usar esas funciones.
      CMOVE   (Relativo al movimiento del cursor)
   CMOVE w,h
   Mueve el cursor a una distancia fija desde su actual posicion. Si
   el cursor estuviera en 10,10, entonces teclea:
      CMOVE 5,-5
   y veras como el cursor aparece en 15,5. Al igual que en LOCATE,
   podras omitir alguna de las dos coordenadas requeridas.
      =AT   (devuelve una secuencia de caracteres a la posicion
             del cursor)
   x$=AT(x,y)
   La funcion AT te permite cambiar la posicion del texto, directa-
   mente desde dentro de una misma cadena de caracteres. Funciona
   devolviendo una cadena en el formato siguiente:
      CHR$(27)+"X"+CHR$(27)+"Y"+CHR$(48+Y)
   Cuando esta cadena sea imprimida, el cursor del texto sera ubica-
   do en las coordenadas X e Y. Por ejemplo:
                                                                 76
     A$="Esto"+AT(10,10)+"es"+AT(1,2)+"el poder de"+AT(20,20)+"AMOS"
     Print A$
   Esos comandos AT son ideales para las tablas de records de puntos
   ya que te permiten posicionar tu propio texto antes y durante el
   desarrollo de la fase de inicializacion de tu programa. Asi que
   ya podras actualizar el tanteo en el punto actual de la pantalla
   usando una simple orden. He aqui un ejemplo:
      HI_SCORE$=AT(20,10)+"Hi Score"
      SCORE=10000
      Print HI_SCORE$;SCORE
   Funciones de conversion
   =======================
      AMOS Basic te facilita utiles funciones que te permiten una
   facil conversion entre coordenadas graficas y de texto.
      =XTEXT   (convierte una coordenada X en formato de texto)
      =YTEXT   (convierte una coordenada Y en formato de texto)
   t=XTEXT(x): t=YTEXT(y)
   Esas funciones toman unas coordenadas normales X e Y y las con-
   vierten en coordenadas de texto relativas a la actual ventana. Si
   las coordenadas de pantalla se salen de la ventana entonces apare
   cera un valor negativo.
      =XGRAPHIC   (convierte coordenada de texto en formato grafico)
      =YGRAPHIC   (convierte coordenada de texto en formato grafico)
   g=XGRAPHIC(x):g=YGRAPHIC(y)
   Esas funciones son en realidad las inversas a las anteriores, y
   van a tomar una coordenada de texto X o Y desde 0 hasta la longi-
   tud o profundidad de la ventana actual y la convierte en una coor
   denada absoluta de pantalla.
   Comandos del cursor
   ===================
      El cursor de texto aparece como un visible punto de comienzo
   para el todo el texto futuro. Es representado como una barra ho-
   rizontal intermitente, aunque este formato puede ser cambiado si
   usamos los comandos SET CURS y CURS OFF.
      Moviendo el cursor en pantalla, podras posicionar tu texto en
   cualquier sitio. Pero recuerda, todas las medidas de coordenadas
   deben ser coordenadas adecuadas a la actual ventana.
                                                                77
      HOME   (Cursor HOME)
   HOME
   Mueve el cursor de texto hacia la esquina superior izquierda de 
   la actual ventana (coordenadas 0,0).
      CDOWN   (Cursor ABAJO)
   CDOWN
   Desplaza el cursor una linea hacia abajo
      =CDOWN$  (Devuelve un caracter CHR$(31))
   x$=CDOWN$
   CDOWN$ es una funcion que devuelve un caracter especial de con-
   trol que automaticamente mueve el cursor cuando es imprimido. Asi
   CDOWN$ es identico a CDOWN, pero CDOWN$ te permite combinar va-
   rios movimientos de cursor en una simple cadena. Por ejemplo:
      C$="Ñ"+CDOWN$
      For a=0to20
        Print C$;
      Next A
      CUP   (Cursor ARRIBA)
   CUP
   Mueve el cursor una linea arriba de forma parecida a CDOWN.
      =CUP$   (Devuelve un caracter CHR$(30))
   x$=CUP$
   CUP$ devuelve una cadena de control que desplaza el cursor arri-
   ba por un simple caracter.
      CLEFT   (Cursor a la izquierda)
   Desplaza el cursor de texto un caracter hacia la izquierda
      =CLEFT$   (Genera una cadena de control CHR$(29) para CLEFT)
   x$=CLEFT$
   Mueve el cursor de texto un caracter hacia la izquierda. Funciona
   como =CUP$
                                                                78
      CRIGHT   (Cursor a la derecha)
   Desplaza el cursor un lugar hacia la derecha.
      =CRIGHT$   (Genera una cadena de control CHR$(28) para CRIGHT)
   x$=CRIGHT$
   Es lo contrario a CLEFT$
      XCURS  (Devuelve la coordenada X del cursor de texto)
      YCURS  (Devuelve la coordenada Y del cursor de texto)
   x=XCURS:y=YCURS
   XCURS es una variable que contiene la actual coordenada X del cur
   sor de texto (en el formato de texto). YCURS hace lo propio con 
   la coordenada Y.
      SET CURS   (Establece el formato del cursor de texto)
   SET CURS L1,L2,L3,L4,L5,L6,L7,L8
   Esta instruccion te permitira cambiar el formato del cursor a una
   otra forma de tu gusto. El formato viene especificado por una lis
   ta de parametros almacenados desde L1 a L8. Cada parametro deter-
   mina la apariencia de una linea horizontal del cursor, numerada 
   de arriba a abajo.
      Cada bit representa un punto simple en la actual linea del cur
   sor. Si se coloca un "1" en un determinado punto, aparecera el ac
   tual color de texto, en caso contrario se mostrara el color del
   fondo. Ejemplo:
      L1=%11111111
      L2=%11111110
      L3=%11111100
      L4=%11111000
      L5=%11110000
      L6=%11100000
      L7=%11000000
      L8-%10000000
      SET CURS L1,L2,L3,L4,L5,L6,L7,L8
      CURS ON/OFF   (activa/desactiva el cursor de texto)
   CURS ON        Hace visible el cursor de texto
   CURS OFF       Oculta el cursor de la ventana actual
      MEMORIZE  X/Y   (Guarda las coordenadas X e Y del cursor)
   MEMORIZE X/Y
   El comando MEMORIZE almacena la actual posicion del cursor.
                                                                79
      REMEMBER X/Y   (Recupera las coordenadas X e Y del cursor)
   REMEMBER X/Y
   El comando REMEMBER recuerda la posicion del cursor, cuyas coorde
   nadas han debido ser previamente salvadas mediante MEMORIZE. En
   caso de que MEMORIZE no haya sido usado, entonces dichas coordena
   das seran cero.
      CLINE   (Limpia parte o toda la actual linea del cursor)
   CLINE ¡n¿
   Limpia la linea en la cual esta posicionado el cursor. Si N es
   indicado, entonces seran N caracteres los afectados por la orden,
   comenzando desde la posicion del cursor.
      CURS PEN   (Elige un nuevo color para el cursor de texto)
   CURS PEN n
   Cambia el color del cursor por el numero indice N.
   Entrada/Salida del texto
   ========================
      CENTRE   (Imprime una linea de texto centrado en pantalla)
   CENTRE A$
   Toma una cadena de caracteres en A$ y lo imprime en el centro de
   la pantalla. Este texto es siempre mostrado en la actual linea 
   del cursor
      Locate 0,1
      Centre "Este es un titulo centrado"
      =TAB$   (Imprime con tabulacion)
   X$=TAB$
   TAB$ devuelve un caracter de control conocido como TAB (ASCII 9).
   Cuando este caracter es imprimido, el cursor de texto se mueve
   automaticamente varios puestos hacia la derecha. El valor del des
   plazamiento puede ser previamente determinado usando el comando
   SET TAB. Por defecto, el espaciado de TAB es de 4 espacios.
      SET TAB   (Cambia la tabulacion)
   SET TAB n
   Especifica la distancia que el cursor de texto debera desplazarse
   cuando aparezca el caracter TAB.
      REPEATS   (repite una cadena)
   x$=REPEAT$(a$,n)
   La funcion REPEAT$ te permite imprimir la misma cadena de caracte
   res varias veces usando una orden simplemente. Funciona añadiendo
   una secuencia de caracteres de control en la variable X$. Cuando
   esta variable es imprimida, AMOS simplemente repite a$ en panta-
   lla n veces. Los valores posibles para N oscilan entre 1 y 207.
      El formato de la cadena de control es:
      CHR$(27)+"RO"+A$+CHR$(27)+"R"+CHR$(48+n)
                                                                 80
   Comandos avanzados de texto
   ===========================
      ZONE$   (Establece una zona alrededor de un texto)
   x$=ZONE$(a$,n)
   La funcion ZONE$ rodea una porcion de texto con una zona de pan-
   talla. Una vez que hayas definido alguna de estas zonas, podras
   chequear la existencia de colisiones entre la zona y el raton,
   mediante el uso de este comando. Esto te permitira crear podero-
   sos menus de pantalla y cajas de dialogos sin tener que recurrir
   a complicadas tecnicas de programacion.
      A$ es una cadena que contiene el texto para uno de los "boto-
   nes" de tu caja de dialogos. Este boton se activara automaticamen
   te cuando imprimas x$ en pantalla. "N" especifica el numero de la
   zona de pantalla que va a ser definida. El numero maximo de estas
   zonas dependera del valor que hayas especificado en la reserva de
   zona (RESERVE ZONE). Ver ejemplo 8.5 en el cajon MANUAL.
      El formato de la cadena de control es:
      CHR$(27)+"ZO"+A$+CHR$(27)+"R"+CHR$(48+n)
      BORDER$   (añade un borde al texto)
   x$=BORDER$(a$,n)
   Devuelve una cadena de caracteres de control que instruyen a AMOS
   para dibujar un borde alrededor del texto deseado. Habitualmente
   se usa conjuntamente con el comando ZONE$ para producir bonitos
   botones y cajas de dialogo o alerta.
     "N" es el numero de borde que puede oscilar de 1 a 16, y "A$"
   contiene el texto a enmarcar, dicho texto comenzara en la actual
   posicion del cursor. Te sorprenderas imprimiendo el texto en la
   posicion 0,0!.  Para crear una zona de pantalla con un borde:
      Print Border$(Zone$(" CLICK AQUI ",1),2)
   Esto encerrara el texto en la zona numero 1 y borde numero 2. La
   secuencia de control seria:
      CHR$(27)+"EO"+A$+CHR$(27)+"R"+CHR$(48+n)
      HSCROLL   (Scroll horizontal de texto)
   HSCROLL n
   Este comando produce un scroll del texto horizontalmente en la
   actual ventana abierta. "N" puede tomar los siguientes valores:
      1= Mueve la actual linea a la izquierda
      2= Scroll de toda la pantalla a la izquierda
      3= Mueve la linea actual a la derecha
      4= Scroll de toda la pantalla a la derecha.
                                                                 81
      VSCROLL   (Scroll vertical de texto)
   VSCROLL n
   Este comando produce uns croll vertical del texto en la ventana
   que este abierta en ese momento. Para "N":
      1= Todo texto desde el cursor hacia abajo sufre un scroll
         hacia abajo
      2= El texto desde la linea del cursor hacia abajo sufre un
         scroll hacia arriba
      3= Solo el texto desde la parte superior de la pantalla hasta
         la linea del cursor es llevado hacia arriba
      4= El texto desde la parte superior de la pantalla hasta la
         linea del cursor es llevado hacia abajo
      Lineas en blanco ocuparan el espacio dejado por las operacio-
   nes de scrolling.
   Ventanas
   ========
      Los comandos de ventana de AMOS restringen las operaciones con
   textos y las graficas, a una parte de la ventana actual. Las ven-
   tanas AMOS pueden ser usadas con los comandos de Zona para produ-
   cir cajas de dialogos como los selectores de ficheros y las ta-
   blas de records. Una tipica caja de atencion, por ejemplo, puede
   ser facilmente creada con solo un par de lineas de AMOS Basic.
      WINDOPEN   (Crea una ventana)
   WINDOPEN n, x, y, w, h ¡,border ¡,set¿
   La instruccion WINDOPEN abre una ventana y la muestra en pantalla
   Esta ventana podra ser ahora utilizada para todas las siguientes
   operaciones. "N" es el numero de la ventana que va a ser definida
   AMOS te permite crear todas las ventanas que desees, con la unica
   limitacion de la cantidad de memoria disponible. Por defecto, el
   numero de ventana es asignado como cero a la pantalla actual. Asi
   que no debes intentar reabrir esta ventana usando WINDOPEN, solo
   cambiala con WIND SIZE o WIND MOVE.
      "X" e "Y" son las coordenadas graficas de la esquina superior
   izquierda de tu nueva ventana. Una vez que las ventanas de AMOS
   son diseñadas usando el chip del Amiga, el area de la ventana es-
   ta siempre limitada a 16 pixel. Al objeto de observar esto, las
   coordenas X seran siempre multiples de 16. Ademas, si incluyes un
   borde para tu ventana, la coordenada X se vera aumentada en 8 mas
   Esto nos asegura que el area de trabajo de la ventan siempre va a
   comenzar en el limite correcto de pantalla. No existen restriccio
   nes con respecto a la coordenada "Y".
      "W" y "H" especifican el tamaño en caracteres de la nueva ven-
   tana. Dichas dimensiones deben ser siempre multiplos de 2.
                                                                 82
      "Border" selecciona un estilo para tu ventana. Existen 16 posi
   bles estilos, con valores que oscilan entre 1 y 16. Los bordes de
   la ventana pueden incluir mas de 2 lineas opcionales de titulos.
   Un titulo es mostrado a lo largo de la parte mas alta de la venta
   na, mientras que el otro puede aparecer en la parte inferior.
      Las ventanas AMOS pueden contener texto o graficos, al igual
   que el sistema. A cada ventana se puede asignar su propio set de
   caracteres con el poderoso comando WINDOW FONT. Tambien existe 
   una no menos poderosa instruccion WIND SAVE que graba el area de
   pantalla contenida en una ventana. Cuando mueves una de esas ven-
   tanas, el contendio subyacente sera nuevamente redibujado. Por
   ejemplo:
      For w=1 to 3
         Windopen W, (W-1)*96,50,10,101
         Paper W+3: Pen W+6: Clw
         Print "Ventana ";W
      Next W
      Puedes elegir entre esas ventanas mediante el comando WINDOW.
   Intenta ejecutar en modo directo las siguientes ordenes:
      Window 1:Print "AMOS" 
      Window 2:Print "in action!"
      Window 3:Print "Basic"
      La ventana activada puede ser siempre distinguida por un cur-
   sor sobreimpresionado que puede ser desactivado si se desea con
   el comando CURS OFF.
      WINDOW  FONT   (Cambia la fuente de la ventana)
   WINDOW FONT n
   Cambia la fuente usada por la ventana actual por el set N. En don
   de "N" es el numero de fuente grafica que ha sido previamente ins
   talado con el comando GET FONT. Esta fuente debe tener unas dimen
   siones exactas de 8*8, puesto que las fuentes proporcionales no
   son permitidas.
      Una vez hayas hecho los bordes de la ventana usando alguno de
   esos caracteres, conseguiras mejores resultados si utilizas las
   fuentes standard de WORKBENCH.
      WIND SAVE   (Graba el contenido de la ventana actual)
   WIND SAVE
   El comando WIND SAVE te permite mover tus ventanas a cualquier
   lugar de la pantalla sin destruir el contenido. Una vez hayas ac
   tivado este sistema, cualquier ventana que abras en lo sucesivo
   grabara automaticamente el contenido de la ventana subyacente. 
   Este area sera redibujada cuando cierres una ventana o la muevas
   a una nueva posicion.
                                                               83
      Es importante advertir que esta opcion graba el contenido de
   la ventana actual, en vez de la que estes definiendo con la orden
   WIND OPEN.
      Al comienzo de tu programa la ventana actual sera por defecto
   la pantalla que ves, y contendra un gran bloque de 32 K de memo-
   ria. Si deseas grabar solo una caja de dialogos sobre el fondo
   subyacente, desperdiciaras la mayor parte de esta memoria.
      La solucion es crear una ventana postiza del tamaño necesario
   y posicionarla sobre la zona que deseas grabar. Ahora podras eje-
   cutar el comando WIND SAVE y continuar normalmente con tu progra
   ma. Cuando posteriormente hagas una llamada a tu caja de dialogos
   el area subyacente sera grabada como parte de tu ventana postiza.
   Asi, se almacenara automaticamente despues de que tu ventana haya
   desaparecido.
      BORDER   (Cambia el borde de la actual pantalla de ventana)
   BORDER n, paper, pen
   El comando BORDER ubica el borde de la ventana actual segun el es
   tilo "N". Este borde sera dibujado usando un grupo de caracteres
   instalados en la fuente por defecto. Ademas es posible crear tu
   propio estilo de borde, utilizando un accesorio de definicion de
   fuentes.
      Las opciones PAPER y PEN te permiten elegir libremente los co-
   lores de tu borde. Se aceptan numeros que oscilan de 1 a 16. Cual
   quiera de los parametros de este comando puede ser omitido:
      BORDER 2,,
      BORDER 2,,3
      TITLE TOP   (Define el titulo superior para la ventana actual)
   TITLE TOP T$
   Esta instruccion ubica en la linea mas alta de la ventana actual,
   el titulo contenido en la cadena T$. Solo aquellas ventanas borde
   adas, es decir que contienen un borde, pueden ser usadas de esta
   forma.
      Windopen 5,1,1,20,10
      Title Top "Window number 5"
      Wait Key
      TITLE BOTTOM (Define titulo inferior para la ventana actual)
   TITLE BOTTOM B$
   Este comando asigna la cadena B$ al titulo inferior de la ventana
   actual.
                                                                 84
      WINDOW     (Cambia la ventana actual)
   WINDOW n
   Este comando activa la ventana N como ventana actual. Si el siste
   ma de grabacion automatica ha sido inicialmente activado, esta
   ventana sera inmediatamente redibujada con su contenido.
      =WINDOW    (Devuelve el valor de la ventana actual)
   W=WINDOW
   Este comando devuelve el numero de identificacion de la ventana
   actualmente activa.
      WIND  CLOSE   (Cierra la ventana actual)
   WIND CLOSE
   Borra la ventana actual. Usa previamente el comando WIND SAVE si
   no quieres perder todo el contenido de la ventana cuando vayas a
   cerrarla.
      WIND MOVE    (Mueve una ventana)
   WIND MOVE x,y
   Mueve la ventana actual a las coordenadas graficas X e Y, que co-
   mo pasaba con las coordenadas originales de definicion de ventana
   la X debe coincidir con el multiplo mas proximo de 16.
      WIND SIZE    (Cambia el tamaño de la ventana actual)
   WIND SIZE sx, sy
   Este comando cambia el tamaño de una ventana AMOS. El nuevo forma
   to, SX y SY, se especificara en unidades simples. SX debe ser mul
   tiplo de dos.
      Si previamente has usado el comando WIND SAVE, el contenido 
   original de tu ventana sera redibujado por esta instruccion. Pero
   si la nueva ventana es mas pequeña que la original, todas aque-
   llas partes que queden fuera del borde se perderan. Por otro lado
   si has expandido el tamaño de tu ventana, el area alrededor de la
   zona grabada aparecera rellena con el color actual del papel. Ten
   presente, ademas, que despues de usar un comando WIND SIZE, el
   cursor de texto se resetea siempre a las coordenadas 0,0.
      CLW        (Limpia la ventana actual)
   CLW
   Este comando borra el contenido de la ventana actual y la rellena
   con el color actual del papel.
                                                                 85
   Barra deslizante
   ================
      AMOS incorpora 3 instrucciones que te permitiran mostrar una 
   barra deslizante standard en pantalla. Esas barras no podran ser
   directamente manipuladas desde el raton. Al objeto de crear una
   barra movil de trabajo, necesitaras escribir una pequeña rutina
   en Basic para organizar su funcionamiento dentro de tu programa.
      Debido al gran poder de AMOS, esto es extremadamente facil de
   realizar, y los resultados son impresionantes, como se podra ver.
      HSLIDER    (Dibuja un 'slider' horizontal (barra movil))
   HSLIDER x1, y1 To x2, y2, total,pos,size
   Esta orden dibuja una barra movil o 'slider' horizontal desde las
   coordenadas xi,y1 hasta x2,y2. "TOTAL" es el numero de unidades
   individuales en que sera dividida la barra movil. Cada unidad re-
   presenta un item simple en el objeto que es controlado por la ba-
   rra movil. En la ventana de edicion, "total" debe ser el numero
   de lineas del programa actual. El tamaño de cada unidad es calcu
   lado segun la siguiente formula:
      (X2-X1)/Total
   "POS" es la posicion de la caja movil donde se ubica inicialmente
   la barra, y se mide en las unidades especificadas al usar "total"
   "SIZE" es la longitud de la caja movil en las unidades previas.
      VSLIDER    (Dibuja un 'slider' vertical)
   VSLIDER x1,y1 to x2,y2,total,pos,size
   Es casi identico a la instruccion previa.
      SET SLIDER   (Establece patron de relleno usado en el slider)
   SET SLIDER b1,b2,b3,pb,s1,s2,s3,sp
   Pese a que este comando parece bastante complicado, es en reali-
   dad muy simple. SET SLIDER introduce los colores y el patron que
   seran usados en los sliders creados con los 2 comandos anteriores
      "B1,B2,B3" establecen el color de tinta, papel y silueta del
   fondo de la caja. "PB" elige el patron de relleno que debe ser
   utilizado en esas regiones.
      "S1,S2,S3" introducen  los colores de la caja del slider y
   "SP" selecciona el patron que sera usado.
       "BP" y "SP" pueden ser cualquier patron que desees. Como es
   habitual, los valores negativos se refieren a la imagen de un 
   sprite del banco actual de sprites. Esto te permite crear diverti
   das y coloreadas cajas de sliders.
                                                                86
   Fuentes
   =======
      Existen dos tipos diferentes de fuentes disponibles en AMOS,
   fuentes de texto y de grafico. Las fuentes de texto son aquellas
   usadas por los comandos PRINT y WINDOW. Las fuentes de texto son
   conocidas como sets de caracteres y cada ventana AMOS puede tener
   su propio set. Las fuentes graficas son mucho mas flexibles y te
   ofrecen una amplia gama de estilos:
   1- Texto grafico
      Tu ordenador AMIGA esta capacitado para mostrar una impresio-
   nante variedad de diferentes estilos de texto. El disco original
   de WORKBENCH, dispone 8 atractivas fuentes con distintos tamaños,
   y muchas mas fuentes de letras pueden ser libremente adquiridas
   en el dominio publico. Si dispones del WORKBENCH 1.3 tambien po-
   dras diseñar tus propias fuentes utilizando para ello el programa
   FED disponible en el disco EXTRAS.
      AMOS te asegura una total compatibilidad para esas fuentes. El
   texto podra aparecer en cualquiera de los tipos de imprenta dispo
   nibles y en cualquier punto de la pantalla. Las fuentes de AMOS
   pueden ser usadas en cualquier tipo de programa.
      TEXT   (Imprime texto grafico)
   TEXT x,y,t$
   Este comando imprime una linea de texto en T$ en las coordenadas
   graficas X e Y. Todas las coordenadas se miden segun la linea de
   base de los caracteres. Esto puede determinarse usando una espe-
   cial funcion: TEXT BASE.
      Normalmente, la linea de base es coloca en la parte inferior 
   del caracter, pero algunas letras con prolongacion hacia abajo,
   como la g, j, q, etc presentan una "cola" que va algo mas alla de
   este punto.
      Por defecto, se selecciona un estilo de 8 puntos Topaz, pero
   este estilo puede cambiarse en cualquier momento utilizando la
   instruccion SET FONT. Prueba el siguiente programa y observa como
   el texto puede ser ubicado en cualquier posicion de pixels de la
   pantalla:
      Do
       Ink Rnd(15)+1,Rnd(15):Text Rnd(320)+1,Rnd(198)+1,"AMOS Basic"
      Loop
      Tambien observa como el color del texto se establece con la
   orden Ink, en lugar de los comandos PAPER o PEN. Esto enfatiza el
   hecho de que el comando TEXT es basicamente una instruccion grafi
   ca. Asi el control de las secuencias creadas por funciones como
   CUP$ seran imprimidas en la pantalla en el momento de ser correc-
   tamente interpretadas.
      No existe un paso automatico de linea cuando el texto alcanza
   el final de la ventana actual. Si intentas imprimir algo demasia-
   do largo, el texto sera habilmente entrecortado en la pantalla
   existente. Esto puede apreciarse en el ejemplo siguiente:
      Print String$("A",100):Text 0,100,String$("A",100)
                                                                 87
      GET FONTS   (Crea una lista con todas las fuentes disponibles)
   GET FONTS
   Este comando crea una lista interna con todas las fuentes dispo-
   nibles en el actual disco de arranque. Esta lista es esencial 
   para el buen funcionamiento del comando SET FONT, asi siempre de
   bes hacer un GET FONTS al menos una vez antes de intentar cam-
   biar la fuente existente. El contenido de esta lista puede ser
   examinado mediante la funcion FONT$.
      ATENCION!! al objeto de que funcione GET FONTS, tu actual dis-
   co AMOS siempre debe contener una copia del LIBS standard entre
   su contenido. Es importante recordar este hecho cuando hagas co-
   pias 'run-only' o programas compilados, porque a menos que tu dis
   co contenga los ficheros necesarios, AMOS Basic no funcionara co-
   rrectamente.
      GET DISC FONTS   (Crea una lista de discos fuentes)
   GET DISC FONTS
   Este comando es identico al anterior, excepto por el hecho de que
   solo busca fuentes en los discos. Esas fuentes estan contenidas
   en el fichero FONTS de tu actual disco de arranque. Si tu deseas
   usar tus propias fuentes con AMOS, necesitaras copiarlas en tu
   disco normal de arranque. 
      GET ROM FONTS   (Crea una lista de fuentes ROM)
   Este comando produce un listado de fuentes instaladas en la memo-
   ria chip de tu Amiga. En este momento hay solo 2 tipos de fuentes
   la Topaz de 8 puntos y la Topaz de 9 puntos.
      =FONT$   (Devuelve un informe sobre la fuente utilizada)
   a$=FONT$(n)
   Devuelve una cadena de 38 caracteres que se describen en la fuen-
   ten. Esta funcion te permite examinar la lista de fuentes creada
   con una llamada previa al comando GET FONT.
      A$ contiene un listado de caracteres que contiene el nombre y
   el tipo de tu fuente. Si una fuente no existe, a$ aparecera como
   valor "", de otro modo, tendra el siguiente formato:
        Caracter               Descripcion
        --------               -----------
          1-29                 Nombre de la fuente
         30-33                 Tamaño de la fuente
         34-37                 Identificador (Disco o ROM)
                                                                 88
      SET FONT    (Elige una fuente para utilizar con la 
                   instruccion TEXT)
   SET FONT n
   Este comando cambia el set de caracteres usados por el comando
   TEXT a la fuente N. Si la fuente se almacena en disco, sera auto-
   maticamente cargada en la memoria del Amiga. Del mismo modo, cual
   quier set previo que no sea usado sera eliminado.
      SET  TEXT   (Establece el estilo de texto)
   SET TEXT Style
   Te permite cambiar el estilo de una fuente. Existen 3 estilos a
   elegir. Un "style" es un patron de bits con el siguiente formato:
         Bit     Efecto
         ===     ======
          0      Subrayado        Mezclando los apropiados bits en
          1      Negrita        este modelo, podras elegir entre un
          2      Italico        total de 8 estilos diferentes.
      =TEXT STYLE   (Devuelve el actual estilo de texto)
   s=TEXT STYLE
   Esta funcion devuelve el estilo de texto del comando SET TEXT. El
   resultado de "S" es un modelo de bit-map con el mismo formato que
   en el caso anterior.
      =TEXT LENGTH  (Devuelve longitud de una seccion de texto)
   w=TEXT LENGTH(t$)
   La funcion devuelve la anchura en pixels de los caracteres de la
   fuente t$. La anchura de una letra varia dependiendo del tamaño 
   de la fuente. Ademas, las fuentes como 'Helvetica' asigna diferen
   tes anchuras para los distintos caracteres.
      =TEXT BASE    (Devuelve la actual base de texto)
   b=TEXT BASE
   Esta funcion devuelve la posicion de la base de linea de tu fuen-
   te. La base de linea es el numero de pixels entre la parte mas al
   ta de un caracter y el punto en que sera imprimida en la pantalla
   2- Instalando nuevas fuentes
      Si deseas usar tus propias fuentes con AMOS Basic, necesitaras
   instalarlas en el propio disco AMOS. El procedimiento basico es
   como sigue:
     - Copia los ficheros de fuentes requeridos en el directorio
       FONTS (directorio de tu disco de arranque)
     - Encontraras mas informacion en el manual de tu Amiga
                                                                89
  3- Deteccion de problemas
   * Problema: GET FONTS parece ignorar alguna de las fuentes del
               disco actual
     Solucion: Probablemente has extraido el disco de arranque de
               tu unidad de discos. Las rutinas de librerias del Ami
               ga solo esperan encontrar el directorio FONTS dentro
               de tu disco de arranque. Esto puede cambiarse utili-
               zando el programa ASSIGN en el cajon de UTILITIES.
   * Problema: GET FONTS bloquea por completo a tu Amiga
     Solucion: Este problema puede aparecer facilmente cuando estes
               creando programas tipo run-only o compilados, ya que
               GET FONTS requiere una libreria (Discfont.library) en
               el cajon LIBS de tu disco, para poder funcionar bien.
   * Problema: El comando SET FONT devuelve un error "Fonts no exa-
               mined"
     Solucion: Añade una llamada a GET FONTS al inicio de tu progra
               ma.
                                                               90
                 9:  C O M A N D O S      M A T E M A T I C O S
      AMOS Basic incluye una amplia variedad de las funciones matema
   ticas mas frecuentemente utilizadas. Para ahorrar memoria, AMOS
   usa las rutinas standards de librerias Amiga. Las librerias apro-
   piadas seran automaticamente cargadas desde el disco Workbench,
   cuando hagas una llamada a cualquiera de esas funciones, es por
   esto que tendras que asegurarte que el disco que se halle dentro
   de la disquetera contenga el fichero MATHTRANS.LIBRARY en el ca-
   jon LIBS.
   Funciones trigonometricas
   =========================
      Estas funciones te permiten utilizar una gran cantidad de fun-
   ciones matematicas. Esas pueden usarse para gran cantidad de co-
   sas desde programas educacionales hasta complejas formulas de on-
   das musicales.
      DEGREE   (usa grados)
   DEGREE
   Habitualmente todos los angulos se especifican en radianes. Dado
   que es mas dificil trabajar con radianes, es posible hacer funcio
   nar a AMOS en grados. De este modo, una vez que hayas ordenado
   este comando, todas las siguientes operaciones utilizaran el gra-
   do como formato.
      RADIAN   (usa radianes)
   RADIAN
   El comando RADIAN informa a AMOS que todos los futuros angulos
   seran medidos en radianes. Tambien se usan radianes por defecto.
      =PI#   (constante Pi)
   Apt=PI#
   Esta funcion devuelve un numero llamado PI que representa el re-
   sultado de dividir el diametro de un circulo por su circunferen-
   cia. PI se utiliza en la mayoria de las funciones trigonometricas
   para calculo de angulos. Ten en cuenta que el caracter pt forma
   parte del comando. Recuerdalo al objeto de evitar errores con los
   nombres de tus variables.
                                                                 91
      =SIN     (Seno)
   S#=SIN(a)
   S#=SIN(A#)
   La funcion SIN calcula el seno de un angulo. Ten en cuenta que el
   resultado de esta funcion siempre se expresa con un numero de
   coma flotante.
      =COS     (Coseno)
   C#=COS(A¡#¿)
   La funcion COS indica el coseno de un angulo a.
      =TAN     (Tangente)
   T#=TAN(a¡#¿)
   TAN genera la tangente de un angulo
      =ACOS    (Arco coseno)
   C#=ACOS(N#)
   La funcion ACOS toma un numero entre -1 y +1 y calcula el angulo
   que se necesitara para generar este valor con coseno.
   NOTA: No existe la funcion ASIN (Arco seno), porque no es necesa-
   ria. Ya que realmente puede ser calculada mediante la formula:
      ASIN(X)=90-ACOS(X): Rem medido en grados
      ASIN(X)=1.5808-ACOS(X):  Rem medido en radianes
      =ATAN     (Arco tangente)
   T#=ATAN(N#)
   ATAN devuelve el arco tangente de un numero.
      =HSIN     (Seno hiperbolico)
   S#=HSIN(a¡#¿)
   HSIN computa el seno hiperbolico del angulo a.
      =HCOS     (Coseno hiperbolico)
   C#=HCOS(a¡#¿)
   HCOS calcula el coseno hiperbolico de un angulo a
                                                                 92
      HTAN       (Tangente hiperbolica)
   T#=HTAN(a¡#¿)
   HTAN calcula la tangente hiperbolica del angulo a
   Funciones matematicas standard
   ==============================
      =LOG     (Logaritmo)
   R#=LOG(v¡#¿)
   LOG devuelve el logaritmo en base 10 (log 10) de la expresion V#
      =EXP     (Funcion exponencial)
   R#=EXP(e#)
   Calcula la exponencial de E#. Ejemplo:
      Print Exp (1)
      (Resultado: 2.71828)
      =LN       (Logaritmo natural)
   R#=LN(L#)
   LN computa el natural del logaritmo naperiano de L#.
      =SQR       (Raiz cuadrada)
   S#=SQR(V¡#¿)
   SQR calcula la raiz cuadrada de un numero.
      =ABS       (Valor absoluto)
   R=ABS(V¡#¿)
   ABS devuelve el valor absoluto de V, sin importar su signo
      =INT       (Convierte en numero entero otro de coma flotante)
   I=INT(V#)
   INT redondea un numero de coma flotante V hacia abajo al mas pro-
   ximo numero entero.
                                                                 93
      =SGN        (Calcula el signo de un numero)
   S=SGN(V¡#¿)
   SGN devuelve un valor que representa el signo de un numero. Exis-
   ten 3 posibilidades:
         -1, si V es negativa
          0, si V es cero
          1, si V es positiva
   Secuencias aleatorias
   =====================
      =RND      (Genera un numero aleatorio)
   RND genera un numero aleatorio entero entre o y N inclusive. Pero
   si N es menor que 0, RND devolvera el ultimo valor producido. 
   Esto puede ser muy util cuando este chequeando tu programa.
      RANDOMIZE   (Establece la "semilla" de un numero aleatorio)
   RANDOMIZE semilla
   En la practica, los numeros producidos por la funcion RND no son
   realmente aleatorios; sino que son producidos internamente utili-
   zando una compleja formula matematica. El punto de comienzo de
   estos calculos se toma de un numero que se denomina "semilla". Es
   esta semilla la que se ubica en un valor estandard cuando tu car-
   gas el AMOS Basic en el ordenador. De este modo la secuencia de
   numeros generados por RND sera siempre la misma cada vez que eje-
   cutes el programa.
      El comando RANDOMIZE te permite asignar un valor a la semilla
   de forma directa, de modo que los numeros generados por RND sean
   diferentes en cada momento. La semilla puede ser cualquier valor
   que desees. Con la intencion de que generes un verdadero numero 
   aleatorio, necesitaras alguna formula para calcular semillas dife
   rentes de un juego a otro. Esto se consigue con la instruccion
   TIMER:
        RANDOMIZE TIMER
   TIMER es una funcion Basic que devuelve la cantidad de tiempo que
   ha transcurrido desde que encendiste tu Amiga por ultima vez. 
   Todo ese tiempo es medido en unidades de cincuentavos de segundo.
                                                                 94
   Numeros manipulados
   ===================
      =MAX     (Obtiene el maximo entre dos valores)
   R=MAX(x,y)
   R#=MAX(X#,Y#)
   R$=MAX(X$,Y$)
   MAX compara dos expresiones y devuelve la mayor. Dichas expresio-
   nes pueden estar compuestas por numeros o por cadenas de caracte-
   res, a condicion de que no mezcles diferentes tipos de variables
   en una instruccion.
      Print MAX (10,4)
      (Resultado: 10)
      =MIN     (Obtiene el minimo entre dos valores)
   Similar a la anterior, solo que devuelve el menor valor.
      SWAP     (Cambia o trueca el contenido entre dos variables)
   SWAP x,y
   SWAP X#,Y#
   SWAP X$, Y$
   Produce un intercambio del contenido de 2 variables de la misma
   clase.
      FIX      (Establece la precision de la coma)
   FIX (n)
   Cambia la precision de los numeros de coma flotante que aparecera
   en pantalla o en impresion. Existen 4 posibilidades:
   1) Si  0< N <16     N mostrara el numero de decimales que aparece
                       ran despues de la coma
   2) Si  N> 16        El resultado sera proporcional y se elimina-
                       ran todos los 0 sucesivos
   3) Si  N< 0         Entonces todos los numeros de coma flotante,
                       apareceran en formato exponencial, y el valor
                       absoluto de N determinara el numero de digi-
                       tos despues del punto decimal
   4) Si  N=16         El formato volvera a ser el normal
      Ejemplo:
      FIX (-4):Print PI#
                                                                 95
      DEF  FN    (Crea una funcion definida por el usuario)
   DEF FN name ¡(lista)¿=expresion
   El comando DEF FN te permite crear tus propias funciones que po-
   dras incluir en tus programas AMOS. Se utiliza habitualmente para
   un facil y veloz computo de ciertos valores utilizados frecuente-
   mente dentro de un programa.
      "NAME" es el nombre de esta funcion que pretendes definir. Y
   "LIST" es un set de variables separadas por comas. Solo es rele-
   vante el tipo de esas variables. Cuando hagas una llamada a tu
   funcion, cualquier variables que introduzcas, sera automaticamen
   te sustituida en su posicion apropiada.
      "EXPRESION" puede incluir cualquier funcion standard de AMOS
   que desees. Como todas las expresiones Basicas, estan limitadas a
   una sola linea de programa.
      FN        (Hace llamada a una funcion definida por el usuario)
   FN Name ¡(variable lista)¿
   FN ejecuta una funcion previamente definida con DEF FN. Ejemplo:
      DEF FN Asin(x)=90-Acos(x)
      Degree
      Print FN Asin(0.5)
  =================================================================
                                                                 96
                       10:  P A N T A L L A S 
   La pantalla por defecto
   =======================
      Cuando ejecutes un programa AMOS Basic se creara una pantalla
   por defecto como pantalla 0. Aparece en formato estandard para
   cualquier operacion grafica habitual.
      El formato por defecto consta de una pantalla de 16 colores y
   de dimensiones 320x200, que puede ser facilmente alterada desde
   el interior de tu programa. Adicionalmente, podras definir mas de
   7 pantallas con el poderoso comando SCREEN OPEN, que veremos a
   continuacion.
   Definiendo una pantalla
   =======================
      SCREEN OPEN    (Define una pantalla)
   SCREEN OPEN n,w,h,nc,mode
   Este comando abre una pantalla y reserva memoria para ella. La 
   nueva pantalla sera el lugar de destino de todas las operaciones
   graficas y de texto que tu programa realice a continuacion.
      "N" es el numero de identificacion de la pantalla creada por
   esta instruccion. Los valores posibles oscilan entre 0 y 7. Si
   esa pantalla ya existiera, sera totalmente reemplazada por tus
   nuevas definiciones.
      "W" contiene la anchura de la pantalla en pixels. Dicha anchu-
   ra NO ESTA LIMITADA a la parte que puedes ver en el monitor, sien
   do perfectamente legal el definir una mas ancha pantalla que lo
   que pueda aparecer en tu monitor.
      "H" establece la altura de tu pantalla usando el mismo sistema
   Con la condicion de que dispongas de suficiente memoria, puedes
   facilmente crear pantallas mucho mas grandes del area visible en
   el monitor. Dichas pantallas pueden ser usadas normalmente con 
   las operaciones de pantalla. Para que puedas diseñar tus imagenes
   off-screen (fuera de monitor, no visibles), a la vez que hacer un
   scroll para visualizarlas en monitor, dispones del comando SCREEN
   OFFSET.
      "NC" solicita en numero de colores necesarios para la nueva 
   pantalla. El rango oscila desde 2 hasta 64 (EHB). Ademas, si acce
   des al modo especial HAM del Amiga, podras alcanzar los 4096.
                                                                 97
      "MODE" te permite elegir la anchura de los puntos individuales
   de la pantalla. La pantalla del Amiga admite anchuras que van des
   de 320 a 640 pixels. Podras seleccionar la anchura necesaria esta
   bleciendo MODE en LOWRES (0) o HIRES ($8000).
      He aqui una lista de las posibles pantallas opcionales, asi
   como la cantidad de memoria que consume cada una:
   Colores   Resolucion   Memoria   Notas
   =======   ==========   =======   =====
      2      320x200        8 K     Paper=0  Pen=1  Crsr=1  No flash
             640x200       16 K       "        "       "        "
      4      320x200       16 K     Paper=1  Pen=2  Crsr=3  Flash=3
             640x200       32 K       "        "       "        "
      8      320x200       24 K       "        "       "        "
             640x200       48 K       "        "       "        "
     16      320x200       32 K     Es la pantalla 0 (por defecto)
             640x320       64 K
     32      320x200       40 K
     64      320x200       48 K     EXTRA HALF-BRIGHT MODE   (EHB)
   4096      320x200       48 K     HOLD AND MODIFY MODE     (HAM)
   Ten en cuenta  que la cantidad de memoria que aparece en la tabla
   anterior solo se refiere a la pantalla estandard. De este modo, 
   si tu creas pantallas mas altas o mas anchas de la estandard, la
   cantidad de memoria consumida es obviamente mayor. La pantalla 0
   o por defecto es el equivalente a:
      SCREEN OPEN 0,320,200,16,lowres
      SCREEN CLOSE     (Borra una pantalla)
   SCREEN CLOSE N
   Este comando borra la pantalla numero N, y dispone libremente de
   esa memoria para cualquier otro uso.
      AUTO VIEW  ON/OFF   (Control de modo visual)
   AUTO VIEW OFF
   Cuando has abierto una pantalla mediante SCREEN OPEN, la nueva
   pantalla se muestra habitualmente enseguida. Esto puede ser un in
   conveniente durante la inicializacion de ciertas etapas dentro de
   tus programas.
      El comando AUTO VIEW OFF te permite un total control del proce
   so de actualizacion. Este comando anula completamente el sistema
   de visualizacion en monitor, con lo que podras hacer aparecer la
   nueva pantalla en el momento adecuado de tu programa utilizando 
   para ello la instruccion VIEW.
      El comando AUTO VIEW ON activa la actualizacion automatica de
   pantallas.
                                                                 98
      DEFAULT   (Reseteado de pantalla)
   DEFAULT
   Cierra todas las pantallas actualmente abiertas, almacenando su
   contenido en su formato original. Ejemplo:
      Load IFF "AMOS_DATA:IFF/AMOSPIC.IFF",0
      Wait Key
      Default
      VIEW      (Muestra el marco de la pantalla actual)
   VIEW
   Muestra cualquier cambio de la pantalla actualmente seleccionada
   en el proximo periodo de verticalizacion. Solo tendras que usar
   este comando cuando AUTOVIEW esta en OFF.
   Modos especiales de pantalla
   ============================
      El color de cada punto de la pantalla esta determinado por un
   valor almacenado en uno de los 32 registros de color del Amiga.
   Cada registro puede ser cargado con una seleccion de 4096 colores
   distintos.
      Pese a que 32 colores puedan parecer demasiados, especialmente
   para iniciados, esto no es suficiente para los profesionales del
   diseño. La mas facil solucion parecia ser aumentar el numero de
   registros de color, pero esto fue desestimado puesto que encare-
   ceria mucho el ordenador.
      Por fin, los ingenieros de Commodore inventaron 2 modos grafi-
   cos especiales, que habilmente explotaban al maximo los registros
   ya existentes, permitiendo asi aumentar el numero de colores en
   pantalla.
      Probablemente ya sabras a que modos nos estamos refiriendo. Se
   trata de los infames modos EHB y HAM. AMOS Basic te permite una
   total compatibilidad para ambos modos. He aqui una breve explica-
   cion:
   1- EXTRA HALF BRIGHT MODE (EHB)
      Dobla el numero maximo de colores en pantalla, con lo que con-
   sigue llegar hasta 64. Trabaja generando 2 colores en cada uno de
   los 32 registros de color.
      Los primeros 32 colores cargan el valor del color directamente
   desde uno de los registros. Cada registro contiene un valor entre
   0 y 4095 lo que da una tonalidad precisa a cada color final. El
   segundo grupo de colores, con numeros desde 32 a 63, toman uno de
   los registros previos y dividen su contenido por dos. Esto produ-
   ce 32 colores extras que tienen exactamente la mitad del brillo
   del color contenido en el registro.
      Al objeto de exprimir este modo EHB al maximo, es necesario
   cargar los 32 registros con las tonalidades mas brillantes de tu
   paleta de colores. Asi conseguiras crear una segunda lista con
   tonalidades intermedias (grupo 32-63).
                                                                 99
   2- HOLD AND MODIFY MODE  (HAM)
      El actual Hardware del Amiga te limita al maximo de 6 planos
   de bits por pantalla. Con esto puedes mostrar mas de 64 colores a
   la vez en la misma pantalla. Si deseas mostrar una fotografia, 
   entonces necesitaras cientos o tal vez miles de colores en panta-
   lla.
      Este fue el problema que afronto Jay Miner cuando estuvo dise-
   ñando el sistema de visualizacion del Amiga. Su solucion consis-
   tio en explotar un viejo truco, conocido por los artistas desde
   hace siglos: si un artista profesional quisiera reunir cada posi-
   ble color, tendria una labor imposible. Por lo que es practica co
   mun, realizar mezclas con unos pocos colores elementales, con lo
   que conseguiras millones de tonalidades diferentes, sin necesidad
   de tener que necesitar muestras de todas las posibilidades. La
   misma tecnica puede ser tambien aplicada a la pantalla de un orde
   nador. Una vez que hayas especificado cada color individualmente,
   tu puedes tomar cualquiera de ellos y modificarlo levemente. Esto
   incrementa considerablemente el numero de colores disponibles, y
   conforma la base del poderoso modo grafico HAM del Amiga.
      El valor de cada color es creado en el Amiga de la mezcla de
   tres componentes por separado. Con lo que se especifica la inten-
   sidad relativa de cada uno de los 3 colores primarios: Rojo, Azul
   y Verde en el color final. El rango posible para cada uno de esos
   3 colores oscila de 0 a 15.
      El modo HAM divide el valor de color del Amiga en 4 grupos se-
   parados:
   1) Registros de color 0-15. Los primeros 16 colores toman un va-
      lor directamente de un registro de color. Esos colores se tra-
      tan como si fuera una pantalla estandard de 16 colores.
   2) Componente rojo 16-31. Sin embargo, si un punto es cargado con
      el numero de color 16-31, el valor del color se cargara desde
      ese pixel a su inmediato izquierdo. El componente rojo de ese
      color es ahora reemplazado con un valor de 0 a 15 que se calcu
      la con la formula siguiente:
           Intensidad = Color indice - 16
   3) Componente Verde 32-47. De forma similar, un numero de color
      de 32 a 47, tomara el tono actual y cambiara el componente ver
      de. La intensidad de este componente se establece en un valor
      de color -32.
   4) Componente Azul 48-63. Esos numeros de colores graban el valor
      de color del punto a la izquierda del pixel actual, y cargan
      un nuevo componente azul de tu numero de color como sigue:
           Intensidad = Color indice - 48
      El color de un punto concreto dependera del color de todos los
   puntos situados a su izquierda. Esto te permite crear difuminacio
   nes de color, ideales para tonos carne. No obstante, no elijas el
   color de cada punto de la pantalla de forma independiente. En la
   practica, se necesita un maximo de 3 pixels para pasar de un co-
   lor a otro.
                                                               100
      En los primeros Amiga, el modo HAM fue considerado solamente
   como una simple curiosidad. Pero hoy en dia, la situacion es muy
   distinta, con la llegada de los excelentes paquetes graficos que
   usan el HAM como es el PHOTON PAINT.
      AMOS te permite usar sin limitaciones todas las operaciones de
   graficos y textos en modo HAM. Otro punto a considerar, es que
   las pantallas HAM se manipulan usando comandos habituales como
   SCREEN OFFSET y SCREEN DISPLAY. He aqui algunos consejos para su
   correcto uso:
   * El primer punto en cada linea horizontal debe ser un numero de
     color de 0 a 15. Esto servira como comienzo de color para todas
     las tonalidades de la linea actual.
   * No intentes someter tu pantalla HAM a scroll horizontal. Si asi
     lo haces, apareceran unas franjas de color a los lados de tu
     pantalla. Esto se debe al cambio en los colores de inicio de 
     cada una de tus lineas. No existen, sin embargo restricciones
     respecto al scroll vertical.
   * Los efectos con franjas, pueden producirse mediante SCREEN COPY
     La solucion consiste en asegurar que el borde de tu zona de di-
     bujo contenga un numero de color de 0 a 15. Esto asegurara que
     tu pantalla HAM se redibujara en su nueva posicion con sus colo
     res originales.
   Cargando una pantalla
   =====================
      LOAD IFF   (Carga una pantalla IFF del disco)
   LOAD IFF "filename"¡,screen¿
   Carga un dibujo en formato IFF del disco. "SCREEN" indica el nume
   ro de pantalla en la que se cargara dicho dibujo. Esta pantalla 
   se abre automaticamente para su uso, si no existiera ya. Si ya
   hubiera sido abierta previamente, cualquier contenido en su inte-
   rior sera totalmente borrado.
      Para cargar un dibujo en la pantalla actual, debes omitir el
   parametro "screen". Ejemplo:
      Load IFF "AMOS_DATA:IFF/AMOSPIC.IFF",1
                                                                101
   Grabando una pantalla
   =====================
      SAVE IFF    (Graba una pantalla IFF)
   SAVE IFF "filename"¡,compression¿
   Graba la actual pantalla como un fichero IFF en disco. "COMPRESSI
   ON" es un parametro que te permite compactar tu fichero antes de
   ser grabado. Un valor "1" especifica que el sistema de compactado
   de ficheros estandard sera empleado, mientras que un valor "0" 
   grabara el fichero al disco tal cual. Por defecto, las pantallas
   AMOS son siempre compactadas.
      Este comando añade automaticamente el apendice ".IFF" a tu fi-
   chero. Cuando tu cargues de nuevo este fichero, AMOS Basic lo de-
   volvera a su posicion original, puesto que tambien se graban los
   comandos de pantalla (SCREEN DISPLAY, SCREEN OFFSET, SCREEN HIDE/
   SHOW). Estos datos extras de los ficheros .IFF de AMOS seran com-
   pletamente ignorados por paquetes graficos como DPaint.
      Ten presente que es posible grabar pantallas dobles con este
   comando.
   Moviendo una pantalla
   =====================
      SCREEN DISPLAY   (Posiciona una pantalla)
   SCREEN DISPLAY n ¡,x,y,y,w,h¿
   Una vez que has definido tu pantalla mediante SCREEN OPEN, necesi
   taras posicionarla en tu pantalla. A diferencia de la mayoria de
   ordenadores, AMIGA es capaz de mostrar un dibujo en cualquier par
   te que desees del monitor. Esto puede ser facilmente explotado 
   con el fin de crear divertidos efectos de pantalla. Con AMOS Ba-
   sic, es incluso posible emplear esas animaciones utilizando las
   interrupciones (vease AMAL).
      Otra aplicacion es sobreponer varias pantallas una sobre otra.
   Esto te permite crear una imagen que contenga una combinacion de
   diferentes modos de pantalla.
      "N" indica el numero de pantalla a posicionar. "X" e "Y" espe-
   cifican la localizacion de la pantalla en coordenadas de hardware
   La coordenada X de la pantalla puede oscilar entre 0 y 488 y sera
   automaticamente redondeada al pixel inferior multiplo de 16. Solo
   las posiciones entre 112 y 448 son visibles en tu monitor. Debes
   evitar asignar a dicha coordenada un valor inferior a 112.
      La coordenada Y de tu pantalla puede oscilar entre 0 y 312. El
   rango visible dependera del tipo de monitor que uses, pero lo mas
   probable es que puedas ver aquellas comprendidas entre 30 y 300,
   accesibles por la mayoria de los sistemas.
                                                                102
      Hay que tener presente que el modo HAM dispone de un menor ran
   go visible. Dichos dibujos HAM no pueden verse con coordenadas de
   256, pero si por encima o por debajo. Asi que debes establecer la
   coordenada Y sobre 255 o 257. No sabemos exactamente la razon de
   este fenomeno, si se trata de un defecto de Hardware o de Softwa-
   re, pero sin embargo, esto no representa ningun tipo de restric-
   cion para AMOS.
      "W" almacena la anchura de tu pantalla en pixels. Si fuera dis
   tinta de la asignacion inicial, solo parte de tu imagen sera mos-
   trada, empezando por la esquina superior izquierda de la imagen.
   Como las coordenadas X, la anchura de pantalla se redondea hacia
   el pixel inferior mas cercano multiple de 16.
      De modo parecido, "H" establece la altura aparente de la panta
   lla. Cambiando este valor se reducira la profundidad de tu imagen
      Generalmente, SCREEN OPEN seleccionara automaticamente la posi
   cion de la imagen, utilizando un sistema estandard de configura-
   cion de los ficheros AMOS. Si la pantalla fuese mas grande que el
   monitor, entonces AMOS pasa la pantalla a "overscan".
      SCREEN DISPLAY te permite de un modo simple cambiar los valo-
   res por defecto. Cualquiera de los parametros x,y,w y h puede ser
   omitido de forma legal. Los valores no usados, seran automatica-
   mente asignados por aquellos por defecto, y deben ser siempre se
   parados por comas:
      Screen Display 0,112,45,, : Rem Posiciona Pantalla en 112,45
      Cuando posiciones tus pantallas, intenta asegurarte que la mis
   ma comience a la izquierda del monitor y termine hacia la derecha
   Esto es esencial para que el Hardware de tu ordenador interprete
   correctamente tu pantalla. En la practica, puedes necesitar expe-
   rimentar poco a poco hasta que consigas el efecto deseado. Por
   suerte, lo peor que puede ocurrir es que aparezca algo amorfo en
   tu monitor; ya que el Amiga no se dañara si cometes un error. A
   continuacion veras algunos consejos que te ayudaran:
   * Solo una pantalla simple puede mostrarse en cada linea horizon-
     tal. Sin embargo, puedes libremente situar varias pantallas en
     el monitor, una a continuacion de la otra. Todas estaran alli,
     pero solo una de ellas podra ser visible.
   * Debe haber siempre un pixel "tonto", es decir una zona muerta
     entre cada par de pantallas. Este, se genera automaticamente y
     es inevitable. Esta zona muerta se hara notar cuando desplaces
     un sprite entre las pantallas. Por ejemplo, intenta mover el
     puntero del raton desde la ventana de edicion hasta la linea de
     menu, y veras una pequeña linea negra entre el puntero del ra-
     ton y el borde entre las dos pantallas.
                                                                 103
      SCREEN  OFFSET   (Scrolling de Hardware)
   SCREEN OFFSET N,X,Y
   La capacidad de visualizacion del Amiga no se limita a lo que es
   exclusivamente visible en la pantalla de tu monitor. No existe en
   absoluto, nada que te impida producir imagenes mucho mas grandes
   que el tamaño de pantalla. Logicamente, no sera posible mostrar-
   las enteras en pantalla, pero facilmente podras ir mostrando las
   diferentes partes de tu imagen, utilizando para ello el comando
   SCREEN OFFSET.
      "N" es el numero de pantalla que va a ser mostrada. "X" e "Y"
   miden la distancia desde la esquina superior izquierda de la pan
   talla hasta el punto de inicio de tu imagen. "X" e "Y" se especi-
   fican en unidades de pixel simple, por eso no hay nada que impida
   la produccion de suaves desplazamientos o scrollings.
      Tambien podras crear copias en negativo con esta instruccion,
   permitiendote mostrar cualquier parte de la memoria del Amiga en
   tu pantalla.
   Comandos de control de pantalla
   ===============================
      SCREEN  CLONE   (Produce una copia identica de una pantalla)
   SCREEN CLONE N
   Este comando asigna una segunda version de la pantalla actual a
   la pantalla numero N. Este clono o copia identica, utiliza la mis
   ma area de memoria que la pantalla original.
      Normalmente, la pantalla clonica aparece en el mismo lugar que
   su precedente. Sin embargo, puede ser manipulada separadamente 
   mediante la utilizacion de las habituales funciones de pantalla
   como son SCREEN DISPLAY y SCREEN OFFSET.
      Una vez que dispongamos de una copia simple de la pantalla ori
   ginal en memoria, no puedes acceder a una copia clonica con los
   comandos de pantalla. En ese caso, obtendras un mensaje de error
   del tipo "ILLEGAL SCREEN PARAMETER". Otra cosa a considerar es 
   que cualquier secuencia de color que hayas establecido en la pan-
   talla original no sera copiada mediante el proceso de clonacion.
   Observa el uso del comando WAIT VBL. Este te asegurara que la co-
   pia clonica sera reposicionado fuera de pantalla, lo que permiti-
   ra la realizacion de rapidos y suaves movimientos.
      Si experimentas con este comando, observaras que existe un li-
   mite real a la cantidad de movimiento que puedes ejecutar sin que
   se altere este efecto. Incluso algo tan trivial como un simple
   calculo de una rutina de movimiento, puede, a menudo, provocar un
   retraso imperceptible en tus animaciones.
      La visualizacion de la pantalla puede ser tambien ajustada di-
   rectamente desde el AMAL (lenguaje de animacion). Este es capaz
   de animar gran cantidad de pantallas de forma facil y suave.
                                                                104
      DUAL  PLAYFIELD   (Combina 2 pantallas en un solo campo doble)
   DUAL PLAYFIELD screen1, screen2
   El modo DUAL PLAYFIELD de AMIGA te permite mostrar por completo 2
   pantallas de forma simultanea y en las mismas coordenadas. Casi
   es el mismo efecto que se produce si pintas una pantalla en papel
   y otra sobre celofan y luego las superpones. 
      Cada pantalla podra ser manipulada independientemente, con lo
   que podras utilizar esta posibilidad para producir efectos suaves
   de desplazamiento paralelo, ideal para desplazamientos de panta-
   llas como los que aparecen en Silkworm.
      Los 2 componentes de un doble campo de juego (DUAL PLAYFIELD),
   son tratados como si una pantalla AMOS y pueden escribirse de la
   forma habitual. Ambos pueden ser animados con AMAL.
      "SCREEN1" y "SCREEN2" se refiere a las dos pantallas que han
   sido previamente definidas con el comando SCREEN OPEN. Pero solo
   ciertas combinaciones de pantallas seran aceptadas: las dos pan-
   tallas deben usar la misma resolucion, siendo ilegal usar HIRES y
   LOWRES en el mismo campo.
      He aqui una lista de las posibilidades:
      Screen 1          Screen 2         Notas
      ============= ================ =========        
       Colores         Colores
      ------------- ----------------
          2                2
          4                2
          4                4
          8                4          LOWRES solamente
          8                8          LOWRES solamente
      Pese a que las escalas de color han sido predefinidas, el tama
   ño de ambas pantallas puede ser perfectamente distinto. Creando
   una pantalla de "fondo" que sea mas grande que la pantalla "delan
   tera" produciras bonitos y realistas efectos, como los que apare-
   cian en Parallax.
      Los colores de esas pantallas seran todos tomados de la paleta
   de la pantalla 1 considerando al color 0 como transparente:
         Screen      Indices de color (de screen 1)
         ------      ----------------
            1        0 - 7
            2        8 - 15
      Mientras estes dibujando la segunda pantalla, AMOS Basic con-
   vertira automaticamente tu indice de color en el numero apropiado
   antes de utilizarlo. Asi INK 2 usara el color 9 de la primera
   paleta.
      Este proceso de conversion no se aplica a la asignacion de or
   denes como COLOUR o PALETTE. Es importante recordar esto cuando
   estes cambiando las asignaciones de color, de otra manera, tus
   nuevos colores no se reflejaran en la pantalla actual. Siempre de
   bes realizar "SCREEN1" antes de cambiar la asignacion de color.
                                                                105
      Existe un par de importantes puntos que debes conocer antes de
   afrontar una pantalla dual:
   * La posicion en pantalla de ambas pantallas no debe ser nunca
     ubicada en 0
   * Cuando hayas posicionado una pantalla dual y posteriormente de-
     sees reubicarla con SCREEN OFFSET, asegurate de especificar la
     primera pantalla dual y no la segunda
      DUAL PRIORITY   (Establece prioridad entre pantallas duales)
   DUAL PRIORITY screen1, screen2
   La primera pantalla de un campo dual es normalmente mostrada di-
   rectamente sobre la segunda. Este comando te permite cambiar este
   orden, con lo que SCREEN2 aparece sobre SCREEN1.
   ATENCION¡¡¡: Esta instruccion solo cambia el orden de la visuali-
   zacion. No tiene ningun efecto sobre la organizacion de pantalla.
   Sobre la primera pantalla de un campo dual recaeran siempre todas
   las asignaciones de color asi como la orden SCREEN DISPLAY.
      SCREEN      (Establece la pantalla actual)
   SCREEN N
   El comando SCREEN te permite realizar operaciones graficas y de
   texto sobre la pantalla numero N.
      =SCREEN     (Obtiene el numero de la pantalla actual)
   S=SCREEN
   Devuelve el numero de la pantalla actualmente activa
      SCREEN  TO  FRONT   (Mueve la pantalla hacia el frente)
   SCREEN TO FRONT ¡s¿
   Esta instruccion mueve la pantalla "S" hacia el frente en el moni
   tor. Si el parametro fuera omitido, entonces se desplazaria la
   ventana actual.
   NOTA: Si el sistema AUTOVIEW ha sido anulado (OFF), necesitaras
   llamar al comando VIEW antes de que este efecto pueda ser visible
   en pantalla.
      SCREEN  TO  BACK    (Mueve la pantalla hacia atras)
   SCREEN TO BACK ¡n¿
   Mueve la pantalla hacia el fondo de tu monitor. Si hubiera otra
   pantalla en las mismas coordenadas esta seria ahora visualizada
   por delante de la pantalla seleccionada.
                                                                106
      SCREEN HIDE    (Oculta temporalmente una pantalla)
   SCREEN HIDE ¡n¿
   Elimina la pantalla seleccionada de visualizacion. Esta pantalla
   podra volver a verse usando el comando SCREEN SHOW. Si "N" fuera
   omitido, esta instruccion ocultara entonces a la pantalla actual.
      SCREEN SHOW    (Muestra una pantalla nuevamente)
   SCREEN SHOW ¡n¿
   Este comando vuelve a visualizar una pantlla despues de que esta
   haya sido previamente oculta por el comando anterior.
      =SCREEN HEIGHT   (Devuelve la altura de la pantalla)
   H=SCREEN HEIGHT ¡n¿
   Devuelve la altura de la pantalla. Si no incluyes el parametro N,
   la altura devuelta sera la de la pantalla actual.
      =SCREEN WIDTH    (Devuelve la anchura de la pantalla)
   W=SCREEN WIDTH ¡n¿
   Este comando recupera la anchura de la pantalla actual o de la 
   numero N.
      =SCREEN COLOUR   (Devuelve el numero de colores)
   C=SCREEN COLOUR
   Devuelve el numero maximo de colores en la pantalla actualmente
   activa.
      =SCIN             (Devuelve el numero de pantalla de una
                         posicion determinada)
   S=SCIN(x,y)
   Devuelve el numero de pantalla que esta debajo de las coordenadas
   X e Y. Si esta pantalla no existiera, entonces S toma un valor
   negativo.
      SCIN es usado normalmente en conjuncion con las funciones X e
   Y del raton para chequear si el cursor del raton se ha introduci-
   do en alguna pantalla.
                                                                107
   Definiendo los colores de una pantalla
   ======================================
      DEFAULT PALETTE   (carga la paleta estandard en una pantalla)
   DEFAULT PALETTE c1,c2,c3...c6,,....(hasta 32 colores)
   Este comando simplifica el proceso de apertura de multiples panta
   llas con la misma paleta. Define una lista de colores que seran
   utilizados para todas las pantallas siguientes que se crearan con
   la instruccion SCREEN OPEN. Como es habitual, el rango de valores
   permitidos de color oscila desde $000 hasta $FFF.
      GET PALETTE       (Obtiene la paleta de una pantalla)
   GET PALETTE n ¡,mask¿
   Esta instruccion copia los colores de una pantalla N, cargandolos
   en la pantalla actual. Esto puede ser muy util cuando estes movi-
   endo informacion desde una pantalla a otra con el comando SCREEN
   COPY, ya que es vital que ambas pantallas, fuente y destino, ten-
   gan el mismo tipo de colores.
      El parametro opcional "MASK" te permite cargar justo una selec
   cion de colores. Vease GET SPRITE PALETTE para mas detalles.
   Limpiando una pantalla
   ======================
      CLS       (Limpia la pantalla)
   Este comando borra todo o parte de la pantalla actual. Existen 3
   formatos posibles para este comando:
   1) CLS
      Borra la pantalla actual llenandola con el color 0 y limpia
      cualquier ventana que haya sido establecida
   2) CLS col
      Llena tu pantalla con el color COL
   3) CLS col,x1,y1 to x2,y2
      Replaza la region rectangular definida por las coordenadas an-
      teriores con un bloque de color COL. COL puede tomar cualquier
      valor desde 0 hasta el maximo valor permitido. X1,Y1,X2,Y2 con
      tienen las coordenadas de las esquinas superior izquierda e in
      ferior derecha del area que va a ser limpiada con este comando
      como por ejemplo:
          CLS: Circle 100,9,9:CLS 1,50,50 to 150,150
                                                                108
   Manipulacion del contenido de una pantalla
   ==========================================
      SCREEN COPY    (Copia secciones de una pantalla)
   SCREEN COPY screen1 TO screen2
   SCREEN COPY screen1,x1,y1,x2,y2 TO screen2,x3,y3 ¡,mode¿
   Este comando realiza una copia de grandes secciones de una panta-
   lla desde un lugar a otro a notable velocidad. "SCREEN1" contiene
   la pantalla utilizada como fuente de imagen. Esta puede ser un nu
   mero estandard de pantalla, o bien el numero de una pantalla logi
   ca o fisica, generada por comandos LOGICOS o FISICOS.
      "SCREEN2" selecciona una pantalla opcional de destino en la
   que estos datos van a ser copiados. Si se omitiera, el area sera
   copiada en la pantalla actual.
      X1,Y1 y X2,Y2 contienen las dimensiones del area fuente rectan
   gular, y X3,Y3 corresponden a las coordenadas de destino. No hay
   limites en absoluto para dichas coordenadas. Cualquier parte de 
   tu imagen que caiga fuera del area de pantalla sera automaticamen
   te catalogada como apropiada.
      El parametro opcional "MODE" elige cual de los 255 posibles
   modos sera usado en la operacion de copia. Dichos modos determi-
   nan como las areas fuente y destino deben combinarse en la panta-
   lla. El modo se establece usando un sistema BIT con el siguiente
   formato:
           MODO           BIT fuente      BIT destino
         ---------        ----------      -----------
             4                0                0
             5                0                1
             6                1                0
             7                1                1
      Advierte que los 4 primeros Bits en este sistema NO son usados
   por esta instruccion y deben ser siempre 0. Cada BIT en "MODE"
   representa una simple combinacion de bits en las areas fuente y
   destino. Si el modo BIT es puesto a 1, entonces el bit asociado a
   la pantalla es tambien puesto a 1, de otra forma el resultado 
   sera 0.
      Al objeto de seleccionar el correcto MODE de dibujo para tus
   aplicaciones, debes simplemente decidir que combinaciones te inte
   resan, y poner los BITS pertinentes a 1.
      Si no estas familiarizado con la notacion binaria, encontraras
   este parametro (MODE) un poco pesado. Asi que antes de que te 
   vuelvas loco con tanta explicacion, sera mejor ver una detallada
   lista de los requerimientos mas frecuentes, con su sistema BIT
   asociado:
                                                                109
        MODE       EFECTO                            BIT-PATTERN
      --------     ------------------------------  --------------
      REPLACE      Replaza el area de destino con    % 11000000
                   una copia de la fuente imagen
                   (Es el modo por defecto)
      INVERT       Replaza la imagen destino por     % 00110000
                   una copia inversa de la imagen
                   fuente
      AND          Combina fuente y destino con      % 10000000
                   una operacion logica AND
      OR           Igual que antes pero con una      % 11100000
                   operacion logica OR
      XOR          Combina fuente y destino con      % 01100000
                   una operacion logica XOR
      Los usuarios mas avezados habran observado que SCREEN COPY com
   bina las imagenes fuente y destino usando areas "blitter" B y C
   mientras que el area "blitter" A no se usa nunca en este sistema.
   Scrolling de pantallas
   ======================
      DEF  SCROLL   (Define una zona de scroll)
   DEF SCROLL n,x1,y1 to x2,y2,dx,dy
   Te permite definir mas de 16 diferentes scrollings. Cada una de
   esas zonas puede ser asociada con una operacion especifica de des
   plazamiento (scroll), determinada por las variables dx,dy.
      "N" contiene el numero de la zona puede oscilar de 1 a 16.
   X1,Y1 se refieren a las coordenadas de la esquina superior iz-
   quierda del area que va a ser desplazada, mientras que X2,Y2 es 
   el punto diagonalmente opuesto.
      "Dx" significa el numero de pixels de la zona que va a ser des
   plazada hacia la derecha en cada operacion. Los numeros negativos
   indican que el scrolling o desplazamiento se realiza de derecha a
   izquierda, mientras que los positivos indican que se hara de iz-
   quierda a derecha.
      De forma similar, "Dy" contiene el numero de pixels de la zona
   que avanzara hacia arriba o hacia abajo durante el scroll. En ca-
   so de valores negativos de Dy el movimiento sera hacia arriba, y
   por el contrario valores positivos traducen un movimiento hacia
   abajo.
                                                                 110
      SCROLL      (Desplaza la pantalla)
   SCROLL N
   Este comando desplaza la pantalla usando los parametros que han
   sido previamente definidos con el comando anterior. "N" hace refe
   rencia al numero de la zona que deseas desplazar:
      LOAD IFF "AMOS_DATA:IFF/Frog_Leap.IFF",2
      DEF SCROLL 1,0,0, TO 320,200,1,0
      DO
        Scroll 1
      Loop
   Intercambios de pantalla
   ========================
      Al objeto de producir los suaves efectos de movimiento encon-
   trados en muchos programas, es necesario completar todas las ope-
   raciones de dibujo en poco tiempo, no mas de un quinceavo de se-
   gundo. Esto representa un gran desafio para cualquier ordenador y
   es, a menudo, dificil de conseguir, incluso para el Amiga. Si la
   animacion en compleja, tus graficos tienden a vibrar de forma muy
   molesta mientras se estan dibujando.
      Por fortuna, existe una solucion que ha sido exitosamente ex-
   plotada en la gran mayoria de los modernos programas de Arcade.
   Esta tecnica de "interrupcion" o Switching de pantalla puede fa-
   cilmente generar animaciones de pantalla sin vibraciones, usando
   solo una fraccion de la potencia del Amiga.
      La idea basica es extremadamente simple. A la vez que constru
   yes tus imagenes en la pantalla actual, diseñaras todas tus opera
   ciones graficas sobre una pantalla logical separada, que es com-
   pletamente invisible al usuario. Esta es distinta de la PANTALLA
   FISICA que es la que normalmente ves en tu monitor. Una vez que
   los graficos han sido completados, podras entonces trasladarte de
   una pantalla a otra. Asi la vieja pantalla fisica ahora se trans-
   forma en una nueva pantalla logica, y sera usada pra la cosntruc-
   cion del proximo dibujo en tu programa.
      A primera vista, este proceso parece bastante complicado, pero
   todo sera ejecutado de forma automatica por el comando DOUBLE BU-
   FFER de AMOS Basic. Dicho comando hace que se ejecuten todas las
   operaciones graficas en la pantalla logica sin que se alteren las
   imagenes actualmente visualizadas. Todo lo que tienes que hacer
   dentro de tus programas es sincronizar tus operaciones graficas
   con los intercambios de pantalla (SWITCHING). Esto queda facili-
   tado con la ayuda de la instruccion SCREEN SWAP
                                                                111
      SCREEN SWAP    (Intercambio entre pantallas logicas y fisicas)
   SCREEN SWAP ¡n¿
   Este comando realiza un "swap" entre pantallas logicas y fisicas.
   Esto te posibilita cambiar instantaneamente lo que se visualiza
   en la pantalla fisica.
      Si estas usando DOUBLE BUFFER, esas pantallas deberan haber
   sido creadas de antemano. Sin embargo, necesitaras anular el sis
   tema automatico de "switching" de pantallas mediante la orden BOB
   UPDATE OFF, de otro modo las pantallas seran intercambiadas 50
   veces por segundo, y podria interferir con tus propias operacio-
   nes de dibujo. Es tambien necesario anular el "autoback" mediante
   AUTOBACK OFF. Esto normalmente copia tus operaciones graficas en
   ambas pantallas (fisica/logica). Es util cuando desees combinar
   graficos simples con bobs moviles, pero destruira totalmente el
   efecto de las operaciones de "switching" de pantallas.
      =LOGBASE     (Devuelve la direccion de parte de una 
                    pantalla logica)
   Address=LOGBASE(plane)
   La funcion LOGBASE es usada por los mas expertos programadores
   para acceder directamente a la pantalla de memoria del Amiga. El
   parametro "PLANE" se refiere a uno de los 6 posibles BIT-planes
   que confeccionan la pantalla actual. Despues de llamar a esta fun
   cion, "ADDRESS" contendra la direccion del Bit-Plane requerido, o
   bien 0 si este no existiera.
      =PHYBASE     (Devuelve la direccion de la pantalla actual)
   Address=PHYBASE
   Este comando devuelve la direccion de memoria del numero de Bit-
   Plane "Plane" para la pantalla actual. Si este plano no existiera
   entonces apareceria un valor 0 en esta funcion.
      =PHYSIC      (Devuelve un identificador de la pantalla fisica)
   =PHYSIC
   =PHYSIC(s)
   Esta funcion devuelve un numero de identificacion de la actual 
   pantalla fisica. Este numero te permite acceder directamente a la
   imagen fisica que es visualizada por el sistema de doble buffer.
      El resultado de esta funcion puede ser sustituido por el nume-
   ro de pantalla en los comandos ZOOM, APPEAR y SCREEN COPY.
      "S" es el numero de pantalla AMOS. Si se omite, entonces la
   presente pantalla sera la utilizada. No confundir con la funcion
   LOGBASE.
                                                                112
      =LOGIC       (Devuelve un identificador de la pantalla logica)
   =LOGIC
   =LOGIC(s)
   Devuelve un numero de identificacion de una pantalla logica. Este
   puede ser usada en conjuncion con los comandos SCREEN COPY, ZOOM
   y APPEAR para cambiar el "off-screen" de tu imagen, sin afectar
   a la visualizacion actual.
   Sincronizacion de pantalla
   ==========================
      Como la mayoria de los ordenadores caseros, el Amiga puede
   usar un formato de mapa de memoria. Este es un termino tecnico,
   pero se trata de un concepto que ya nos suena como muy familiar.
   Simplemente, una imagen "mapeada en memoria" es aquella que se
   sirve de un hardware especial que la convierte una imagen almace-
   nada en memoria en una señal que puede ser visualizada en la pan-
   talla de tu monitor.
      La visualizacion de pantalla es actualizada por el Hardware,
   cada cincuentavo de segundo. Una vez que la pantalla ha sido dise
   ñada, el impulso electronico se apaga y regresa a la esquina supe
   ro-izquierda de la pantalla. Este proceso se denomina periodo de
   vacio vertical (en ingles: Vertical Blank Period/ VBL). Del mismo
   modo, AMOS Basic realiza un buen numero de importantes tareas, 
   como el movimiento de los sprites y el "switch" entre las panta-
   llas fisica y logica. La accion de las instrucciones como ANIM o
   SCREEN SWAP seran ejecutadas solo cuando la pantalla sea dibujada
   por completo.
      Un cincuentavo de segundo es bastante tiempo para AMOS Basic,
   y esto podria ocasionar un importante retraso en la coordinacion
   de tu programa y la pantalla, especialmente relevante en el caso
   de los bucles. El mejor modo de evitar este contratiempo consiste
   en esperar a que la pantalla haya sido actualizada antes de ejecu
   tar el proximo comando Basic.
      WAIT  VBL   (Espera el periodo de vacio vertical)
   Esta instruccion detiene al Amiga hasta que finalice el periodo
   de vacio vertical o VBL. Es frecuentemente usada despues de una
   instruccion PUT BOB o una SCREEN SWAP.
                                                               113
   Efectos especiales
   ==================
      APPEAR     (Mezcla dos dibujos)
   APPEAR source TO destination, effect ¡,pixels¿
   El comando APPEAR te capacita para producir bonitas mezclas entre
   las pantallas fuente y destino. "SOURCE" y "DESTINATION" son sim-
   plemente los numeros de dichas pantallas que ya abras previamente
   abierto mediante SCREEN OPEN. Tambien podras sustituir las funcio
   nes LOGICAS y FISICAS en estas posiciones si lo deseas.
      "EFFECT" determina el tipo de mezcla que se producira por esta
   instruccion. El tamaño de este parametro puede variar desde 1 has
   ta el numero de pixels de la pantalla actual.
      "PIXELS" especifica el numero de puntos que seran afectados.
   Normalmente, este valor se fija en el total del area de pantalla,
   pero puedes reducirlo para mezcla solo una parte de la pantalla.
   Todas las pantallas se dibujaran en estricto orden y desde arriba
   hacia abajo.
      La apariencia de tus mezclas variara naturalmente del modo gra
   fico que estes utilizando.
      FADE        (Combina uno o mas colores)
   FADE speed¡,colour list¿
   FADE speed TO screen ¡,mask¿
   El comando FADE te permite realizar suaves cambios de toda la pa-
   leta, de un juego de colores a otro. Esto puede ser util cuando 
   se quiera generar efectos casi profesionales para tus pantallas.
      La version estandard de esta instruccion, toma la paleta actu-
   al y lentamente disuelve los colores de pantalla hasta 0. Cada va
   lor de color es sucesivamente reducido uno a uno hasta alcanzar 0
   por ejemplo:
      Fade 15: Wait 225
      "SPEED" es el numero de periodos de vacio vertical que transcu
   rriran mientras se ejecuta cada cambio de color.
      Cuando se realice un "fading" mediante interrupciones, es pre-
   ferible esperar a que la operacion haya sido terminada antes de
   proceder a proxima instruccion Basic. El tiempo necesario para la
   espera (WAIT) despues de un "fading" puede ser calculado segun la
   formula siguiente:
      Valor de WAIT = Speed * 15
      Fade puede ser util tambien para generar una nueva paleta di-
   rectamente desde una lista de valores de color:
      FADE 15,$100,$200,$200,$300
                                                               114
      Cualquier numero de colores puede ser especificado en esta ins
   truccion, incluso por encima del maximo permitido por el actual
   modo grafico. Como la mayoria de los comandos AMOS, es posible el
   omitir completamente alguno de los parametros. El resto de los co
   lores no se veran afectados por el comando FADE:
      FADE 15,,$100,$800,$F00
      La mas potente accion de FADE es la lenta transformacion de co
   lores desde la pantalla actual hasta la paleta tomada de otra pan
   talla ya existente:
      FADE speed TO s ¡,mask¿
      Los colores seran lentamente convertidos en los de la paleta 
   de la pantalla "S". Tambien es posible cargar la paleta desde el
   banco de Sprites, utilizando la misma tecnica. Simplemente usando
   un valor negativo para la pantalla numero "S".
      "MASK" es un sistema de BITs que especifica que colores deben
   ser cargados. Cada color se asocia con un simple BIT en este sis-
   tema, numerado de 0 a 15. Si un BIT es puesto a 1, entonces el co
   lor relevante sera cambiado. 
      FLASH     (Establece la secuencia de color de flashing)
   Este comando te ofrece la capacidad de cambiar periodicamente el
   valor asignado a cualquier indice de color. Esto supone una espe-
   cie de interrupcion como la usada por las instrucciones de sprite
   y las musicales. El formato de la instruccion es el siguiente:
      FLASH index,"(colour,delay)(colour,delay)(colour,delay)..."
   "INDEX" es el numero del color que va a ser animado. "DELAY" es
   el retraso, establecido en undiades de cincuentavos de segundo.
   El color se almacena en formato estandard RGB. La accion de FLASH
   consiste en tomar cada nuevo color de la lista, y luego cargarlo
   en el indice durante el tiempo especificado (delay). Cuando se al
   canza el final de la lista, la secuencia completa de colores se 
   repetira desde el principio. Ten en cuenta que solo se permite un
   maximo de 16 cambios de colores por cada instruccion FLASH. A con
   tinuacion un pequeño ejemplo:
      Flash 1,"(007,10)(000,10)"
   Este ejemplo alterna el color numero 1 entre azul y blanco cada
   10 cincuentavos de segundo.
      FLASH  OFF   
   Anula el efecto de flashing. No olvides que en el "start-up", el
   color numero 3 se asigna automaticamente a una secuencia de flash
   para el uso del cursor. Sera una buena idea apagarlo antes de car
   gar cualquier dibujo desde el disco.
                                                                115
      SHIFT UP       (Rotacion de color)
   SHIFT UP delay,first,last,flag
   Este comando rota el valor almacenado en los registros de color,
   desde el primero (first) hasta el ultimo (last). El primer color
   de la lista se copia en el segundo, y el segundo en el tercero, y
   asi sucesivamente hasta que se llegue al ultimo color de la serie
      Cada pantalla AMOS tiene su propio "set" de animaciones de co-
   lor. El "shifting" de colores puede ser usado para la creacion de
   divertidas secuencias hiperespaciales, similares a las que apare-
   cen en los programas Captain Blood y Elite. Cuando esas animacio-
   nes se utilizan mediante interrupciones, pueden ser ejecutadas en
   tanto tu programa este corriendo, sin que lo afecte lo mas minimo
      "DELAY" es el intervalo de tiempo entre cada etapa de la rota-
   cion, y se mide en cincuentavos de segundo.
      "FLAG" controla el tipo de rotacion. Si se situa en "1", el ul
   timo indice de color de la lista se copiara en el primero, y el
   primero en el ultimo. Asi los colores rotararan continuamente en 
   pantalla. Cuando se situa en "0", el contenido del primero y el 
   ultimo indices se descartan, y se reemplazan por una copia del 
   primer color de la lista. Por ejemplo:
      SHIFT UP 100,1,15,1
      SHIFT UP 10,1,15,0
      SHIFT DOWN       (Rotacion de color)
   Es similar al anterior, con la salvedad de que los colores rotan
   en direccion contraria.
      SHIFT  OFF      (Detiene la rotacion de colores)
   SHIFT OFF
   Va anular la rotacion de colores de la pantalla actual producida
   por cualquiera de los dos comandos anteriores.
      SET RAINBOW     (Define un efecto de arco iris)
   Define un atractivo efecto de arco iris que puede ser posterior-
   mente ejecutado mediant el comando RAINBOW. Funciona cambiando la
   tonalidad de un color en funcion de una serie de ordenes simples.
      "N" es el numero de tu arco iris. Los valores posibles van des
   de 0 a 3. "COLOUR" es el indice de color que sera cambiado por la
   instruccion. A este color se le puede asignar un valor diferente
   para cada linea horizontal de pantalla (o linea de scan). Advier-
   te que solo los colores 0-15 pueden ser utilizados mediante este
   sistema.
                                                               116
      "LENGTH" establece el tamaño de la tabla donde se almacenaran
   los colores. Existe una entrada en esta tabla para cada valor de
   color en pantalla. El tamaño de esta tabla puede oscilar entre 16
   y 54.400. Si la longitud es menor que la altura fisica de tu arco
   iris, entonces el modelo de color sera repetido varias veces en 
   pantalla.
      Las cadenas de comando r$, g$, b$, cambian progresivamente las
   intensidades de los componentes rojo (R), verde (G) y azul (B) de
   tu color final. Esos valores seran cargados en una tabla especial
   de color. Cada color de la tabla determina la apariencia de una
   linea simple de scan horizontal de la pantalla.
      Al comienzo del arco iris, todos los componentes de tu color 
   se cargan inicialmente con el valor 0. Esto podra ser cambiado de
   acuerdo a la informacion contenida en la tabla.
      Cualquier comando de cadena puede ser omitido si se desea pero
   tendras que incluir las comas y comillas en sus posiciones teori-
   cas.
      Cada cadena puede contener una completa lista de comandos, que
   se ejecutaran ciclicamente pra producir el modelo final de arco
   iris. El formato sera:
      (n,step,count)
   "N" establece el numero de lineas que se asignaran a un especifi-
   co valor de color en el arco iris. Aumentando este numero se cam-
   biara la altura de cada linea individual del arco iris.
      "STEP" contiene un numero que se añadira al componente. Este
   numero sera usado para generar el color de la siguiente linea de
   la pantalla. Un "step" positivo aumentara la intensidad del compo
   nente de color, mientras que un valor negativo lo reducira.
      Cuando un componente individual excede el maximo de 15, se cal
   culara un nuevo valor a partir de la siguiente formula:
      Nuevo componente =  viejo componente Mod 15
      "COUNT" es el numero de veces que la actual operacion sera re-
   petida. La mejor forma de demostrar este comando es con un ejem-
   plo:
      Set Rainbow 0,1,64,"(8,2,8)","",""
      Rainbow 0,56,1,255
      Wait Key
      El ejemplo anterior crea un nuevo arco iris con el numero 0, y
   utiliza el indice de color 1. Como puedes ver, SET RAINBOW solo 
   define tu arco iris. Al objeto de mostrarlo en pantalla, necesi-
   taras utilizar el comando RAINBOW.
      El efecto "arco iris" primero carga tu color con el valor de 
   0. Cada 4 lineas de scan, el componente rojo se incrementara auto
   maticamente en 2. Asi el contenido del color 0 cambiara progresi-
   vamente desde $000 hasta $E00. Cuando el componente exceda el ma-
   ximo de 15, se calcula su sobrante o exceso, y el color vuelve al
   punto inicial (0). El modelo sera ahora repetido debajo de panta-
   lla.
                                                               117
      Definiendo un modelo distinto para cada uno de los 3 componen-
   tes (rojo, verde y azul), podras facilmente generar algunas image
   nes estelares en tu monitor. Puesto que cada arco iris utiliza un
   solo indice de color, no hay nada que te impida crear los mismos
   efectos pero con dos pantallas de colores. Esto es ideal para los
   fondos de los programas de Arcade, ya que consumen muy poca memo-
   ria. Ejemplo:
      Screen Open 0,320,256,2,Lowres
      Set Rainbow 0,1,128,"(8,1,8)","(8,1,8)",""
      Rainbow 0,1,30,128
      Colour 1,0: Curs Off: Cls 1:Flash Off
      Locate 0,2: Centre "AMOS Basic": Wait Key
      Por ultimo, decir que los arcos iris pueden ser tambien anima-
   dos mediante el poderoso sistema de interrupciones. Vease las ins
   trucciones de AMAL para mas detalles.
      RAINBOW    (Crea un efecto arco iris)
   RAINBOW n,base,y,h
   Muestra el arco iris numero N en pantalla. Si AUTOVIEW esta pues-
   to en OFF, el arco iris solo aparecera cuando llames al comando
   VIEW.
      "BASE" es una copia de tu primer color en la tabla creada con
   SET RAINBOW. Cambiando este valor ciclara el arco iris en panta-
   lla. "Y" contiene la posicion vertical del arco iris en formato
   de coordenadas de hardware. El valor minimo para estas coordena-
   das es de 40. Si intentas utilizar un valor por debajo de este
   punto, el arco iris se mostrara desde la linea 40 hacia adelante.
      "H" contiene la altura del arco iris en lineas de scan. Los
   arcos iris son totalmente compatibles con el sistema AMOS, inclu-
   yendo sprites y bobs. Sin embargo, no intentes hacer un arco iris
   con un color que este siendo usado con las instrucciones FLASH y
   SHIFT, ya que surgiran alteraciones impredecibles en pantalla.
      Ten en cuenta que solo un efecto simple de irisacion puede ser
   mostrado en una linea de scan, incluso si se usaran diferentes 
   colores en pantalla.
      Normalmente el arco iris con la mayor posicion de pantalla se-
   ra mostrado primero. Pero si varios arcos iris comenzaran en la
   misma posicion, entonces el de menor numero de identificacion se-
   ra dibujado encima de los otros.
      =RAIN    (Cambia el color de una linea indivudal de arco iris)
   RAIN (n,line)=c
   C=RAIN(n,line)
   Este es el mas potente de los comandos de irisacion, ya que te
   permite cambiar el color de una linea individual de un arco iris
   a cualquier valor que desees.
                                                                118
      "N" es el numero del arco iris al que deseas acceder. "LINE"
   es la linea de scan individual a ser cambiada. Ejemplo:
      Curs Off: Centre "Margen de Seguridad¡"
      Set Rainbow 1,1,4097,"","",""
      For Y=0 to 4095
         Rain (1,y)=y
      Next Y
      For c=0 to 4095-255
         Rainbow 1,c,40,255
      Next C
      Wait Key
      ZOOM    (Magnifica una seccion de la pantalla)
   ZOOM source,x1,y1,x2,y2 to destination,x3,y3,x4,y4
   ZOOM consiste en una simple instruccion que te permite cambiar el
   tamaño de cualquier region rectangular de la pantalla. "SOURCE"
   es el numero de pantalla de la que tu dibujo sera tomado. Tambien
   puedes usar la funcion logica para grabar tu imagen de la panta-
   lla logica apropiada. El area rectangular afectada por esta ins-
   truccion es la especificada por las coordenadas x1,y,1,x2,y2.
      "Destination" contiene el area de destino para tu imagen. Como
   la fuente, puede ser o un numero de pantalla o una pantalla logi-
   ca especificada mediante LOGIC.
      Las dimensiones de este area de pantalla sera tomada de las
   coordenadas x3,y3,x4,y4. Dichas coordenadas contienen las dimen-
   siones de un rectangulo en el que el segmento de pantalla sera
   comprimido.
      El efecto de esta instruccion depende de los tamaños relativos
   de los rectangulos "source" y "destination". La imagen fuente es
   automaticamente rediseñada para que ajuste en el rectangulo desti
   no. De este modo, la misma instruccion puede ser usada para redu-
   cir o aumentar tus imagenes.
   Cambiando la lista del "COPPER"
   ===============================
      El coprocesador (COPPER) del Amiga ofrece un total control so-
   bre la apariencia de cada linea de tu pantalla. Este coprocesador
   es un procesador separado de su propia memoria interna y unico 
   set de instrucciones. Programando el COPPER, es posible generar
   facilmente una gran cantidad de diferentes efectos de pantalla.
   Normalmente el COPPER funciona autonomamente de AMOS, sin embargo
   cada uno de los efectos del COPPER puede ser directamente ordena-
   do desde AMOS Basic sin la necesidad de enfrascarse en complica-
   dos metodos de programacion en codigo maquina. En la practica, 
   esas instrucciones seran mas que suficientes para la gran mayoria
   de aplicaciones.
                                                                119
      Obviamente, no todo es tan facil. Los mas expertos programado-
   res suelen acceder directamente al COPPER para crear sus propios
   efectos especiales de pantalla.
      Pero ATENCION!! la lista del COPPER es enormemente dificil de
   programar, y si no dominas lo que estas haciendo, podras incluso
   dañar tu ordenador. Antes de embarcarte en experimentos con el
   COPPER por primera vez, leete alguno de los varios libros de refe
   rencia al respecto. Una buena explicacion podras encontrar en la
   Guia del Programador de Amiga de ABACUS.
      COPPER  OFF   (Anula la lista estandard del COPPER)
   COPPER OFF
   Congela la actual lista de proceso de AMOS y apaga la pantalla
   visible por completo. Entonces podras crear tus propias visuali-
   zaciones mediante una serie de instrucciones como son COP MOVE y
   COP WAIT.
      Por defecto, todos los listados de Copper definidos por el
   usuario tienen un limite maximo de memoria de 12 K. De media cada
   instruccion ocupa mas de 2 Bytes. Asi, existe espacio para unas
   6.000 instrucciones. Esto puede aumentarse, si fuera necesario,
   utilizando una especial opcion dentro de la utilidad CONFIG.
      Recuerda que todas las instrucciones COPPER se escriben en una
   lista logica separada que no se visualiza en pantalla. Esto para
   tu programa, destruyendo su visualizacion mientras se este crean-
   do la lista del COPPER. Para activar de nuevo la pantalla, necesi
   taras realizar un "swaping" entre los listados fisico y logico 
   gracias al comando COP SWAP.
      Es tambien importante que generes tus listados COPPER en orden
   estricto, comenzando desde la esquina superior izquierda de la
   pantalla y continuando hacia la esquina inferior derecha.
      COPPER  ON    (Reinicia el listado del COPPER)
   COPPER ON
   Reinicia el listado del COPPER, mostrando las pantallas AMOS ac-
   tuales.
      COP  MOVE     (Escribe una instruccion MOVE en el listado
                     logico del COPPER)
   COP MOVE addr, value
   Genera una instruccion MOVE en el listado logico del COPPER.
   "ADDR" es la direccion de un registro de 16 Bits que sera cambia-
   do. Esto debe estar dentro de la zona normal del COPPER (o zona
   de datas: DATA ZONE $7F-$1BE). "VALUE" es un numero entero  que
   se carga en dicho registro.
                                                               120
      COP  MOVEL    (Escribe una gran instruccion MOVE en el listado
                     del COPPER)
   COP MOVEL addr, value
   Identica al anterior, solo que "ADDR" ahora se refiere a un gran
   registro COPPER de 32 BITS.
      COP WAIT     (Instruccion WAIT del COPPER)
   COP WAIT x,y ¡,x mask, y mask¿
   COP WAIT introduce una instruccion WAIT en el listado del copro-
   cesador del Amiga, que espera hasta que las coordenadas de hard-
   ware X e Y hayan sido alcanzadas y regresen al control del proce-
   sador principal. Advierte que la linea 255 es automaticamente ma-
   nipulada por AMOS. Asi que no te preocupes en absoluto de ella.
      "X MASK" e "Y MASK" son mapas-BITs que te permiten esperar has
   ta que una cierta combinacion de bits aparezca en las coordenadas
   de pantalla. Por defecto ambas mascaras son asignadas automatica-
   mente a $1FF.
      COP RESET    (Resetea los punteros del listado del COPPER)
   COP RESET
   Este comando resetea las direcciones usadas por la proxima ins-
   truccion del COPPER al principio del listado del mismo.
      =COP  LOGIC   (Direccion del listado del COPPER)
   Addr=COP LOGIC
   Esta funcion devuelve la direccion absoluta en memoria del lista-
   do logico del COPPER. Esto te permite "pokear" tus instrucciones
   COPPER de forma directa dentro del Buffer, posiblemente usando
   lenguaje ensamblador.
   Consejos y trucos
   =================
   * Antes de crear una pantalla utilizando un listado de COPPER ya
     definido por el usuario, necesitaras primeramente localizar 
     una zona de memoria para el apropiado mapa-BIT. Aunque hayas
     usado RESERVE para este proposito, es mucho mas facil definir
     una pantalla falsa con el comando SCREEN OPEN. Los registros 
     del COPPER pueden ser cargados con las direcciones necesarias
     del Map-BIT usando para ello la funcion LOGBASE.
        Ahora seras capaz de acceder a tu pantalla usando todas las
     posibilidades graficas de AMOS. Con la idea de reservar la can-
     tidad necesaria de memoria, selecciona el numero maximo de colo
     res a usar para esa nueva pantalla. Esto puede ser un despilfa-
     rro, pero simplifica mucho las cosas.
                                                                121
   * Es perfectamente valido combinar pantallas definidas por el 
     usuario con bobs AMOS. Si utilizar un doble Buffer, tendras que
     definir un listado de COPPER separado para cada pantalla (Logi-
     ca y Fisica). Esto puede evitarse de la siguiente forma:
     1- Define tu listado de COPPER pra la primera pantalla
     2- Realiza un "swaping" de los listados de COPPER fisico y logi
        co mediante el comando COP SWAP
     3- Nuevo "swaping" de las pantallas fisica y logica con el co-
        mando SCREEN SWAP.
     4- Define tu listado de COPPER para la segunda pantalla
     Todo esto te asegura que tus bobs se actualizaran correctamente
     en la nueva pantalla. Todos los comandos estandards AMOS pueden
     utilizarse, incluido el AMAL.
                                                               122
                     11:  S P R I T E S     H A R D W A R E 
      Una de mayores atracciones del AMIGA es su capacidad para pro
   ducir juegos de alta calidad que incluso compiten con las genui-
   nas maquinas de Arcade tradicionales. Esto puede ser ampliamente
   demostrado por terrorificos juegos como Battle Squadron y Elimina
   tor.
      Ahora, por vez primera, todas esas posibilidades estan en la
   punta de tus dedos¡¡¡¡. AMOS Basic te ofrece un control completo
   sobre el Hardware del AMIGA y de los sprites. Dichos sprites son
   manipulados sin dificultad mediante el lenguaje de animacion AMAL
   sin necesidad de complejos lenguajes de codigo maquina, de forma
   que podras facilmente crear tus propios programas de Arcade.
      Los sprites Hardware son imagenes separadas que pueden ser au-
   tomaticamente sobrepuestas en la pantalla del Amiga. El clasico 
   ejemplo de Sprite Hardware es el puntero del raton. Este es com-
   pletamente independiente de la pantalla, y funciona exactamente
   igual en los diferentes modos graficos del Amiga.
      Puesto que los sprites no interfieren con el fondo de la panta
   lla, son ideales para los objetos moviles que aparecen en los jue
   gos del tipo Arcade. No solo son fugazmente rapidos, sino que tam
   bien ocupan muy poca memoria. Asi que cuando estes escribiendo un
   programa Arcade, los sprites Hardware siempre deben ser incluidos
   en tus listados.
      Cada sprite presenta 16 pixels de anchura por 255 de alto. El
   Hardware del Amiga soporta un maximo de 8 sprites tricolores o 4
   de 15 colores. El numero de color 0 es transparente, esta es la
   razon de la extraña distribucion de colores.
      A primera vista, estas posibilidades no parecen especialmente
   importantes. Pero existen un par de trucos que pueden incrementar
   el numero y tamaño de esos sprites hasta hacerlos irreconocibles.
      Una solucion es tomar cada sprite Hardware y dividirlo  en seg
   mentos horizontales. Esos segmentos pueden ser independientemente
   posicionados, permitiendote mostrar, aparentemente, docenas de 
   sprites en pantalla al mismo tiempo. De forma parecida, la res-
   triccion de anchura puede ser excedida si construimos un objeto
   en varios sprites individuales. Usando esta tecnica es muy facil
   generar objetos de mas de 128 pixels de anchura.
      Hasta hace poco, la unica forma de explotar esas tecnicas era
   a traves de misteriosos codigos del lenguaje ensamblador del pro-
   cesador 68.000 del Amiga. Pero ahora te deleitaras con las posibi
   lidades que te ofrece AMOS Basic para manejar todo este proceso
   de forma automatica. Una vez que hayas diseñado tus sprites con 
   el editor de sprites de AMOS, podras manipularlos sin dificultad
   con solo una instruccion Basic.
                                                                123
   Los comandos de sprites
   =======================
      Recuerda que debes tener un banco de sprites cargado en memo-
   ria cuando intentes ejecutar alguno de los comandos descritos en
   este capitulo. Te recomendamos que uses el fichero SPRITES.ABK
   que se encuentra en tu disco AMOS.
      SPRITE    (Muestra un sprite Hardware en pantalla)
   SPRITE n,x,y,i
   El comando muestra un sprite Hardware en pantalla en las coordena
   das X e Y, usando la imagen numero I.
   "N" es el numero de identificacion del sprite en pantalla y puede
   oscilar desde 0 hasta 63. Cada sprite puede estar asociado con 
   una imagen por separado del banco de sprites, asi la misma imagen
   puede ser usada para varios sprites.
      "X" e "Y" contienen la posicion del sprite, utilizando para
   ello coordenadas Hardware. Todas las medidas son tomadas del "HOT
   SPOT" o centro de tus imagenes. Esto sirve como un tipo de manejo
   del sprite y se usa como punto de referencia para las coordenadas
      Normalmente, el "hot spot" se establece en la esquina superior
   izquierda de una imagen. Sin embargo, esto puede cambiarse dentro
   de tu programa usando el comando HOT SPOT.
      Las coordenadas Hardware son independientes del modo de panta-
   lla y comienzan en -129,-45 de la pantalla por defecto. AMOS te
   permite varias funciones para conversion de coordenadas Hardware
   y coordenadas de pantalla. Observa para ello las funciones X HARD
   Y HARD, X SCREEN y Y SCREEN para mas detalles.
      "I" es el numero de una imagen particular almacenada en el ban
   co de sprites. Este banco puede ser creado utilizando el editor
   de sprites de AMOS, y se graba automaticamente con tu programa en
   Basic. Tambien puede ser cargado directamente con la instruccion
   LOAD. Ademas, puedes usar el comando GET SPRITE para grabar una
   imagen justo sobre la pantalla actual.
      Cualquiera de los parametros anteriores (X,Y,I) pueden ser omi
   tidos de forma opcional, pero en su lugar deberan aparecer las co
   mas apropiadas. Por ejemplo:
      Load "AMOS_DATA:Sprites/Octopus.abk"
      Sprite 8,200,100,1
      Sprite 8,,150,1
      Sprite 8,300,,
                                                                 124
   Sprites computerizados
   ======================
      Pese a que Amiga solo te facilita hasta 8 sprites, es posible
   usarlos para mostrar mas de 64 objetos en pantalla al mismo tiem-
   po. Esos objetos se conocen como "SPRITES COMPUTERIZADOS" y son
   completamente manejados por AMOS Basic. Los sprites computeriza-
   dos pueden ser asignados mediante el comando SPRITE, siempre con
   un numero mayor que 7. Por ejemplo:
      Load "AMOS_DATA:Sprites/Octopus.abk"
      Sprite 8,200,100,1
      El tamaño de un sprite computerizado se toma directamente de
   la imagen de datos, y puede variar desde 16 hasta 128 pixels de
   anchura, y desde 1 hasta 255 pixels de altura.
      Antes de que hagas pleno uso de esos sprites necesitaras saber
   algo de los principios que se esconden tras ellos. Cada sprite
   Hardware contiene una estrecha banda de 16 pixels de anchura y 
   256 pixels de profundidad. Dependiendo del numero de colores, tu
   puedes tener 8 o 4 de esas bandas en pantalla al mismo tiempo.
      Deberia ser obvio que la mayor parte del area del area de esos
   sprites es desaprovechada. Y esto debido a que muy pocos progra-
   mas necesitan sprites de un tamaño mayor a 40x64 pixels. Ahora 
   bien, esto nos permite hacer un truco que nos facilita ahorrar 
   este espacio para generar docenas de sprites extras en pantalla.
      Observa el siguiente ejemplo, una banda que contiene 4 letras
   A,M,O y S:
              -----------------------------------
              ¡               ¡ A ¡             ¡  
              ¡               ¡ M ¡             ¡
              ¡               ¡ O ¡             ¡
              ¡               ¡ S ¡             ¡
              -----------------------------------
      Este sprite puede ser dividido en 4 segmentos horizontales y
   cada uno de esos segmentos incluiria una letra. El Hardware del
   Amiga permite que cada seccion pueda ser libremente posicionada
   en cualquier lugar de la misma linea, dando lugar por tanto a 4
   sprites computerizados. He aqui el diagrama que ilustra todo este
   proceso:
              -----------------------------------
              ¡   ¡ A ¡                         ¡
              -----------------------------------
              ¡           ¡ M ¡                 ¡
              -----------------------------------
              ¡                   ¡ O ¡         ¡
              -----------------------------------
              ¡                           ¡ S ¡ ¡
              -----------------------------------
               Particion de 1 sprite Hardware en
                4 sprites computerizados
                                                                125
      Como puedes ver, un sprite computerizado es realmente una par-
   te de un sprite Hardware visualizado en una distinta posicion ho-
   rizontal de pantalla. Date cuenta de la linea que separa cada ob-
   jeto. Esta es una consecuencia inevitable del proceso anterior de
   reposicionamiento, y es generada por el Hardware del Amiga.
      Debido a la forma en la que se producen los sprites computeri-
   zados, hay un par de restricciones a su uso. Primeramente, no pue
   des tener mas de 8 sprites computerizados en una misma linea. En
   la practica, el sistema se complica por la necesidad de producir
   sprites que sean mayores del maximo de 16 pixels. AMOS genera 
   esos objetos por posicionamiento automatico de varios sprites com
   puterizados cara a cara.
      El maximo de 8 sprites Hardware, ademas, impone un limite es-
   tricto al numero de tales objetos que tu puedes visualizar en una
   linea horizontal de pantalla. La anchura total de los objetos no
   puede exceder:
     a) 16*8 = 128 pixels para los sprites tricolores
     b) 16*4 =  64 pixels para los sprites de 15 colores
      Si intentas ignorar esta limitacion, no obtendras ningun men-
   saje de error, pero tu sprite computerizado no aparecera en la
   pantalla. Asi, es vital asegurarse que la anterior restriccion no
   se olvide nunca. Pero esto puede evitarse utilizando el siguiente
   procedimiento:
      Juntar las anchuras de todos los sprites computerizados, multi
   plicando las dimensiones de todos los sprites de 15 colores por 2
   Si el total es mayor de 128, necesitaras espaciar los sprites en
   la pantalla al objeto de que su anchura conjunta sea menor que
   este valor. Ten un cuidado especial al animar tus sprites con 
   AMAL, que ciertas combinaciones solo se conseguiran reducir cuan-
   do hayas experimentado con ellas durante algun tiempo. Esos pro-
   blemas apareceran por la desaparicion aleatoria de uno o mas spri
   tes en pantalla.
       En ultimo caso, necesitaras sustituir alguno de tus mayores 
   sprites con el Blitter Objects. Esto aumentara el tamaño general
   de tu programa de forma significativa, pero sin afectar lo mas
   minimo la calidad final del programa.
      Esas restricciones no son exclusivas de AMOS, sino que se pue-
   den aplicar igualmente a cualquier otro programa de Amiga, inclu-
   so si estos estan completamente escritos en codigo maquina. De
   esta forma no hay nada que te impida el producir tu propio Xenon
   usando exactamente las mismas tecnicas.
      Por ultimo, no olvides que normalmente el sprite Hardware nume
   ro 0 se asigna al cursor del raton. Puedes activar este sprite
   con una simple llamada mediante el comando HIDE.
                                                                126
   Creacion de un sprite Hardware personal
   =======================================
      El unico problema de los sprites computerizados radica en que
   nunca sabes con precision que sprite Hardware esta siendo usado
   en un objeto particular. Normalmente los sprites hardware usados
   en un objeto, cambian cuando el objeto se mueve. Ocasionalmente
   esto puede suponer un inconveniente, especialmente cuando estes
   animando objetos como los misiles que necesitan permanecer visi-
   bles.
      En estas circunstancias, es util ser capaz de localizar direc-
   tamente un sprite hardware. Los sprites hardware personales pue-
   den ser asignados con la instruccion SPRITE y un numero de identi
   ficacion de 0 a 7. Ejemplo:
      Sprite 1,100,100,2
      Esta orden carga el sprite hardware numero 1 con la imagen nu-
   mero 2. "N" ahora corresponde al numero de un simple sprite hard-
   ware, y puede oscilar entre 0 y 7, como ya hemos dicho. Si tu ima
   gen fuera mas grande de 16 pixels de ancho, AMOS grabara automati
   camente los sprites necesarios de forma consecutiva, comenzando
   por el sprite que tu has elegido. Por ejemplo:
      Sprite 2,200,100,1
      Suponiendo que la imagen 1 contiene una imagen con 32 bits y 3
   colores. Este comando colocara dicha imagen dentro de los sprites
   hardware 2 y 3. Nada ocurriria si intentases visualizar el sprite
   hardware 3 con un comando como SPRITE 3,150,100,1 porque este 
   sprite ha sido ya utilizado. Asi, solo tendrias acceso a los spri
   tes 0,1,4,5,6 y 7, y el maximo numero y tamaño de tus sprites com
   puterizados se reducirian proporcionalmente.
      Cada sprite de 15 colores se complementa con un par de sprites
   tricolores. Sin embargo, no es posible combinar dos sprites de
   este modo. Solo las combinaciones 0/1,2/3,4/5,6/7 son las correc-
   tas. Una consecuencia de esto es que debes asignar siempre a tus
   sprites Hardware un numero de sprite, o de lo contrario, AMOS re-
   iniciara tu sprite a partir del proximo grupo de dos, con lo que
   se malgasta un sprite.
      Date cuenta tambien que si intentas crear un gran sprite de 15
   colores con este sistema, podras facilmente usar todos los spri-
   tes disponibles en un objeto simple.
   ATENCION: si estas escribiendo un programa con scrolling, puedes
   encontrar problemas al usar sprites conjuntamente con los coman-
   dos SCREEN OFFSET y SCREEN DISPLAY. Ya que pueden generar un cho-
   que entre el sistema de sprites y la pantalla de mapa-Bit, que
   ocasionalmente puede alterar la pantalla. Este problema es solo
   relevante si estas usando los sprites Hardware 6/7. Cuando la pan
   talla es desplazada hacia la izquierda con SCREEN OFFSET, la can-
   tidad de tiempo para la actualizacion de tus sprites se reduce,
   ya que la actualizacion de pantalla tiene prioridad sobre el sis-
   tema de sprites. Por desgracia, no hay suficiente tiempo de proce
   samiento para dibujar los sprites 6/7, y entonces apareceran des-
   dibujados en tu pantalla.
                                                                127
      Para eliminar este problema, debes crear los sprites 6/7 como
   sprites Hardware individuales y posicionarlos en pantalla usando
   coordenadas negativas. Esto evitara que AMOS Basic los use en tus
   sprites computerizados, permitiendo que los sprites 6/7 no se vi-
   sualicen en pantalla durante tus operaciones de scrolling, y todo
   ira bien.
   La paleta de sprites
   ====================
     Los colores necesarios para un sprite Hardware se almacenan en
   los registros de color 16-31. No esta permitido que tu pantalla
   haga uso de esos registros, los colores del sprite estan comple-
   tamente separados de los colores de pantalla. Este es tambien el
   caso para el modo grafico HAM (4096 colores). Asi que no hay nada
   que te impida producir deslumbrantes programas en modo HAM con
   este sistema.
     No obstante, encontraras problemas cuando utilices pantallas de
   32 o 64 colores conjuntamente con sprites tricolores. Esto se de-
   be a que los colores utilizados por esos sprites se reagrupan de
   la siguiente forma:
          Sprite Hardware       Registros de color
          ---------------       ------------------
              0 / 1               17 /  18  / 19
              2 / 3               21 /  22  / 23
              4 / 5               25 /  26  / 27
              6 / 7               29 /  30  / 31
      Los registros de color 16, 20, 24 y 28 se consideran como
   transparentes.
      La dificultad aumenta debido a la forma en que AMOS genera los
   sprites computerizados. Los sprites Hardware usados para producir
   esos objetos varian durante el curso de un juego asi que es vital
   asegurarse de que los 3 colores usados por cada sprite personal
   tengan asignados exactamente los mismos valores, de otra forma 
   los colores de tus sprites computerizados cambiaran de forma im-
   predecible. He aqui un pequeño procedimiento de AMOS que realiza
   todo el proceso de forma automatica:
      Procedure INIT_SPRITES
        Get Sprite Palette
        For s=0 to 3
          For c=0 to 2
          Colour s*4+c+17,Colour(c)
          Next C
        Next S
      Endproc
      La anterior restriccion, no se aplica de hecho, a los sprites
   de 15 colores. Si deseas obtener los mejores resultados del modo
   Extra Half Bright o del modo con 32 colores, lo tendras mas facil
   si utilizas sprites de 4 colores conjuntamente.
                                                               128
      GET SPRITE PALETTE   (Graba los colores de sprite en pantalla)
   GET SPRITE PALETTE ¡mask¿
   Este comando carga completamente la paleta de color utilizada pa
   ra tus sprites en la pantalla actual. La mascara ("MASK") opcio-
   nal te permite cargar solo una seleccion de colores de tu paleta
   de sprites. Cada uno de los 32 colores se representa por un BIT
   simple en la mascara, numerada de derecha a izquierda. El BIT mas
   a la derecha representa el status del color 0, el siguiente BIT 
   mostrara el del color 1, y asi sucesivamente. Para cargar un sim-
   ple color, basta con ajustar el BIT correspondiente a "1". Si por
   acaso, deseas copiar solo los primeros 4 colores, tendras que 
   ajustar el modelo-BIT como  sigue:
     GET SPRITE PALETTE %0000000000001111
   Identicamente, y puesto que los bobs usan el mismo banco que los
   sprites, este comando puede ser tambien utilizado para cargar los
   colores de un bob.
   Control de sprites
   ==================
      SET SPRITE BUFFER   (Establece la altura del sprite Hardware)
   SET SPRITE BUFFER n
   Este comando establece el area de trabajo en la que AMOS crea las
   imagenes de los sprites hardware. Los valores aceptables para "N"
   oscilan desde 16 a 256. Para establecer un correcto valor para N
   simplemente basta con examinar los sprites en el editor de spri-
   tes y calcular la longitud adecuada para el mayor sprite. Todo
   sprite que sea mayor que "N" sera partido por el apropiado punto.
      La cantidad de memoria consumida por el buffer de sprite puede
   calcularse segun la formula:
       Memory = N*4*8*3 = N * 96
   Asi el minimo buffer es de 1536 bytes y el maximo es de 24 K. Ten
   presente que este comando borra todas las actuales asignaciones
   de sprites y resetea el cursor del raton a su estado original.
      SPRITE  OFF   (Elimina uno o mas sprites de la pantalla)
   SPRITE OFF ¡n¿
   Este comando elimina uno o mas sprites de la pantalla. Todos los
   movimientos del sprite actual seran anulados. Al objeto de reini-
   cializarlos, necesitaras comenzar de nuevo tu patron de movimien-
   tos.
                                                                129
   SPRITE OFF     (Borra de pantalla todos los sprites)
   SPRITE OFF N   (Solo desactiva al sprite numero N)
   Ten presente que tus sprites se desactivaran automaticamente siem
   pre que hagas una llamada al editor de AMOS Basic. Y volveran a
   ser automaticamente recuperados en sus posiciones originales la
   proxima vez que accedas al modo directo.
      SPRITE  UPDATE   (Controla los movimientos de sprites)
   SPRITE UPDATE ¡ON/OFF¿
   Este comando te permite un total control de los movimientos de
   tus sprites. Normalmente, cada vez que mueves un sprite, su posi
   cion se actualiza automaticamente durante el VBL (Periodo de va-
   cio vertical). Pero si estas moviendo gran cantidad de sprites 
   utilizando el comando SPRITE, la actualizacion se realizara antes
   de que la totalidad de sprites se hayan movido. Esto puede obser-
   varse como un salto en tu patron de movimientos. En estas circuns
   tancias, puedes anular el sistema de actualizacion automatico con
   el comando SPRITE UPDATE OFF.
      Una vez que todos los sprites hayan completado sus movimientos
   puedes, podras deslizarlos suavemente con una llamada al comando
   SPRITE UPDATE. Esta orden reposicionara cualquier sprite que se
   haya movido desde la ultima actualizacion.
      =X SPRITE    (Obtiene la coordenada X de un sprite)
   x=X SPRITE(n)
   Devuelve la actual coordenada X del sprite N, medida por el siste
   ma Hardware. Este comando te posibilita chequear rapidamente si 
   un sprite ha sobrepasado el final de la pantalla del Amiga.
      =Y SPRITE    (Obtiene la coordenada Y de un sprite)
   y=Y SPRITE(n)
   Y SPRITE devuelve la posicion vertical de un sprite. Como imagina
   ras, N hace referencia al numero de sprite, y oscila entre 0 y 63
   Recuerda que todas las posiciones de sprites son medidas con coor
   denadas Hardware.
      GET  SPRITE   (Carga una seccion de pantalla en el banco
                     de sprite)
   GET SPRITE ¡s,¿i,x1,y1 to x2,y2
   Esta instruccion te capacita para grabar imagenes directamente de
   pantalla y transformarla en sprites. Las coordenadas x1,y1 y x2,
   y2 definen un area rectangular que sera capturada y trasladada al
   banco de sprites. Normalmente todas las imagenes se toman de la 
   pantalla actual. Sin embargo, es tambien posible grabar la imagen
   desde una pantalla especifica usando el parametro opcional "S".
                                                                130
      Ten presente que no existen limites para la region que puede
   ser grabada de esta forma. Mientras tus coordenadas esten dentro
   de los limites de la pantalla actual, no habra problemas.
      "I" indica el numero de la nueva imagen. Si no existiera ya un
   sprite con este numero, una nueva imagen sera creada de forma au-
   tomatica. AMOS tambien se encargara de reservar espacio en el ban
   co de sprite, si esto no hubiera sido previamente definido.
      Existe tambien otro comando equivalente, GET BOB, que es iden-
   tica a este comando en todos los aspectos. El banco de sprites es
   ocupado por sprites y bobs, y las imagenes se almacenan en el mis
   mo formato. Asi, es perfectamente aceptable usar ambas instruccio
   nes en indistintamente con bobs y sprites. Intenta cambiar la ins
   truccion sprite por bob.
   Funciones de conversion
   =======================
      =x SCREEN     (Convierten coordenadas hardware en coordenadas
      =Y SCREEN      de pantalla)
   x=X SCREEN (¡n,¿ xhard)
   y=Y SCREEN (¡n,¿ yhard)
   Transforman una coordenada hardware en coordenadas de pantalla, 
   relativas a la pantalla actual. Si las coordenadas hardware radi-
   can fuera de la pantalla, entonces ambas funciones devolveran un
   resultado relativo de las pantallas limitrofes. Teclea lo siguien
   te en modo directo:
      Print X Screen(130)
   El resultado debera ser -2. Esto se debe a que la coordenada de
   pantalla 0 es igual a la coordenada hardware 128 y entonces la 
   conversion de 130 a una coordenada de pantalla resulta una posi-
   cion 2 pixels a la izquierda de la pantalla.
      Si el numero de pantalla opcional se incluye entonces, las 
   coordenadas deberan devolver el numero relativo de pantalla N.
      =X HARD        (Convierten coordenadas de pantalla en
      =Y HARD         coordenadas hardware)
   x=X HARD (¡n,¿ xcoord)
   y=Y HARD (¡n,¿ ycoord)
   Estas funciones convierten una coordenada de pantalla en otra de
   hardware. Existen 4 funciones separadas. Como antes, "N" especifi
   ca el numero de pantalla que sera usada con estas funciones. To-
   das las coordenadas tendran valores relativos a esta pantalla.
                                                                131
      =I SPRITE     (Devuelve la imagen actual de un sprite)
   Image=I SPRITE(n)
   Esta funcion devuelve el numero de la actual imagen utilizada por
   el sprite N. Un valor de 0 indicara que el sprite no ha sido mos-
   trado.
                                                                 132
               12:  B L I T T E R     O B J E C T S     (B O B S)
      Aunque los sprites hardware son realmente poderosos, presentan
   algunas fastidiosas restricciones. La solucion consiste en usar 
   el infame chip BLITTER del Amiga. Este es capaz de copiar image-
   nes en pantalla a una velocidad aproximada de un millon de pixels
   por segundo. Con la ayuda del Blitter, es posible crear lo que se
   conoce con el nombre de BOBS.
      Los BOBS, al igual que los sprites, pueden moverse independien
   temente a lo largo de la pantalla sin alterar los graficos pree-
   xistentes. Pero a diferencia de los sprites, los BOBS forman par-
   te de la pantalla misma, asi que los podras incluir en cualquier
   modo grafico que desees. Esto te permite generar bobs con mas de
   64 colores. Ademas, la unica limitacion de bobs posibles en panta
   lla es tan solo la memoria disponible.
      Los BOBS son algo mas lentos que los sprites y consumen mucha
   mas memoria. Ademas existe una compensacion entre la velocidad de
   los sprites y la flexibilidad de los bobs. Por fortuna, no hay
   nada que te impida usar bobs y sprites en el mismo programa.
      BOB     (dibuja un BOB en la pantalla actual)
   BOB n,x,y,i
   El comando BOB crea un BOB en las coordenadas x,y utilizando la
   imagen  Ipt. "N" es el numero de identificacion del bob. Los valo
   res permitidos van de 0 a 63, pero el numero de BOBS puede aumen-
   tar usando una opcion de la configuracion del programa AMOS. Su-
   poniendo que dispongas de suficiente memoria, podras situar este
   limite en el numero que desees.
      "X" e "Y" especifican la posicion del bob utilizando coordena-
   das de pantalla estandards. Esas coordenadas no son las mismas 
   que las coordenadas hardware, sus equivalentes, utilizadas para
   el comando SPRITE. Como los sprites, cada bob es controlado por
   un HOT SPOT (punto caliente o central). Este puede ser cambiado
   en cualquier momento con el comando HOT SPOT.
      "I" se refiere a una imagen del banco de sprites que sera asig
   nada al bob. El formato de esta imagen es identico al usado para
   los sprites, asi que si lo deseas, puedes utilizar las mismas ima
   genes para sprites o bobs.
      Despues de que hayas creado tu bob, podras cambiar independien
   temente su posicion o apariencia omitiendo uno o mas parametros
   de su instruccion. Se puede eliminar cualquiera de los parametros
   x, y, i, si asi lo haces los datos conservaran su valor original.
   Esto es particularmente util si estas animando tu bob con AMAL, y
   te facilita moverlo a cualquier sitio que desees, sin alterar la
   secuencia de animacion. Sin embargo, debes siempre incluir comas
   en el orden original. Ejemplo:
                                                                 133
      Load "AMOS_DATA:Sprite/Ocotpus.abk"
      Flash off:Get Sprite Palette
      Channel 1 to bob 1
      Bob 1,0,100,1
      AMAL 1,"Anim 0,(1,4)(2,4)(3,4)(4,4)"
      AMAL on
      For x=1 to 320
       Bob 1,x,,
       wait vbl
      Next x
      Cuando se moviliza un bob, el area subyacente es reemplazada
   en su posicion original, produciendo un efecto identico al que
   produce el comando SPRITE. A diferencia de STOS en el ST, cada
   objeto se localiza en su propia area de almacenamiento. Esto redu
   ce la cantidad de memoria utilizada por los bobs, y aumenta dras-
   ticamente la disponibilidad general. Gracias al BLITTER, de hecho
   no puede compararse los sprites STOS y los bobs AMOS.
      Pese a que el comando BOB funciona bien para un pequeño numero
   de bobs, existe un pequeño inconveniente cuando pretendas utili-
   zar mas de 3 o 4 objetos en pantalla al mismo tiempo. Esto ocurre
   porque los bobs son actualizados a la vez que la pantalla, con lo
   que podras presenciar como se dibujan los bobs, lo que supone una
   ejecucion de poca categoria.
      Como alternativa para mejorar la calidad de tus animaciones,
   puedes limitar tus bobs a la parte inferior de la pantalla, ya 
   que los bobs al dibujarse de forma muy rapida, pueden completar
   su actualizacion antes que la parte mas inferior de la pantalla.
   Esto te facilita una ejecucion aceptable con un pequeño consumo
   de memoria, lo que supone una doble ventaja.
      Obviamente, esto no puede ser una solucion seria al problema
   anterior. Asi que antes que destruyas tu copia de AMOS, espera a
   oir otra forma de eliminar ese inconveniente por completo, inclu-
   so si utilizas docenas de bobs en cualquier lugar de la pantalla:
      DOUBLE BUFFER     (crea una pantalla de doble buffer)
   DOUBLE BUFFER
   Crea una segunda copia invisible de la pantalla actual. Todos las
   operaciones graficas, incluyendo los movimientos de bobs, son aho
   ra ejecutados directamente en esta "pantalla logica", sin alterar
   la imagen del monitor, lo mas minimo. Una vez que la imagen ha
   sido dibujada, la pantalla logica es visualizada, y la pantalla
   original ("fisica") se funde con la logica. Este proceso se reali
   za completamente de forma ciclica, produciendo una ejecucion soli
   da, incluso si movilizas cientos de bobs simultaneamente a lo lar
   go de la pantalla.
      Todo este procedimiento es completamente gestionado por AMOS
   Basic, asi que una vez que hayas introducido esta instruccion,
   podras olvidarte por completo del problema. Ten presente que los
   sprites hardware se visualizan en pantalla siempre utilizando la
   pantalla fisica, este sistema no tiene ningun efecto sobre las
   animaciones de sprites.
                                                                134
      El doble bufer funciona igualmente bien con todos los modos
   graficos del Amiga. Incluso puede ser usado conjuntamente con el
   campo de juego doble (DUAL PLAYFIELDS). Pero ten cuidado¡¡: El
   doble bufer dobla la cantidad de memoria necesaria para las panta
   llas. Si intentas realizar un doble bufer de muchas pantallas,
   rapidamente te quedaras sin memoria.
      En la practica, el doble bufer es una tecnica considerablemen-
   te util que puede ser explotada de la mayoria de juegos. De hecho
   ha servido en muchos programas comerciales como Starglider. Pue-
   des encontrar mas informacion en el capitulo de Pantallas, y tam-
   bien en los comandos SCREEN SWAP y AUTOBACK.
      SET BOB    (establece el modo de dibujo de un bob)
   SET BOB n,back,planes,minterms
   Este comando cambia el modo grafico usado para la visualizacion 
   de un bob en pantalla. "N" es el numero del bob que deseas cam-
   biar. "BACK" elige la forma de pantalla subyacente a tu bob. Hay
   tres posibilidades:
    - Un valor 0 indica que el area subyacente a tu bob sera grabada
      en memoria. Los datos de la vieja imagen seran automaticamente
      reemplazados cuando se mueva el bob, originando un efecto de
      movimiento suave.
    - Si el parametro "BACK" es positivo entonces el fondo original
      sera eliminado, y el area tras el bob sera rellenada con el co
      lor "back"-1. Esto es ideal para mover bobs sobre un bloque de
      color solido como por ejemplo el cielo azul, a la vez que es
      tambien mucho mas rapido
    - Con un valor negativo para "BACK" anularas completamente el 
      proceso de redibujo del fondo. Puedes desactivar el proceso de
      actualizacion automatica de bobs mediante BOB UPDATE, y manual
      mente mover tus bobs con el comando BOB DRAW. Esto te permite
      generar el fondo de pantalla usando tus propias rutinas.
   "PLANES" es un mapa-BIT que informa a AMOS en que planos de panta
   lla debera dibujarse tu bob. Como sabes, la pantalla del Amiga se
   divide en un numero determinado de planos-BIT. Cada plano presen-
   ta un bit en el color final que este presenta en pantalla. Asi, 
   el primer plano esta representado por el bit 1, el segundo por el
   2 y sucesivamente. Normalmente el bob se dibuja en todos los pla-
   nos-BIT del actual modo grafico. Esto corresponde a un modelo-BIT
   del tipo %111111.
      Si ponemos a 0 alguno de esos bits, podras omitir el color se-
   leccionado del bob que se este dibujando. Esto puede utilizarse
   para generar un gran numero de efectos intrigantes de pantalla.
   "MINTERMS" selecciona el modo Blitter usado para dibujar tus bobs
   en pantalla. Una mayor descripcion de los modos disponibles la po
   dras encontrar en la seccion SCREEN COPY. Minterms adopta de for-
   ma habitual alguno de estos 2 valores:
      1- %11100010    Si el bob se usa con una mascara
      2- %11001010    Si no se ha seleccionado mascara
                                                                135
      Experimenta libremente con las diferentes combinaciones. No
   hay peligro de dañar el ordenador si cometes un error. Los progra
   madores mas avanzados encontraran util la siguiente informacion:
      Fuente Blitter       Proposito
      --------------       ---------
            A              Mascara Blitter
            B              Objeto Blitter
            C              Pantalla destino
   Recuerda que recomendamos primero usar SET BOB antes que visuali-
   zarlos en pantalla. Si no lo haces asi, no se dañara el Amiga ni
   obtendras un mensaje de error, pero la visualizacion de pantalla
   aparecera alterada.
       NO  MASK    (anula la mascara Blitter)
   NO MASK ¡n¿
   Por defecto, una mascara blitter es creada automaticamente para
   cualquier bob que muestres en pantalla. Esta mascara se mezcla
   con el fondo de pantalla para crear el color 0 transparente. Esta
   tambien sera usada por los comandos de deteccion de colisiones.
      El comando anterior anula esta mascara, y obliga a toda la ima
   gen a dibujarse sobre la pantalla. Cualquier parte de la imagen
   de color 0 aparecera ahora directamente sobre el fondo existente.
      "N" es el numero de la imagen cuya mascara va a ser anulada.
   Esta mascara nunca podra ser borrada mientras la imagen permanez-
   ca en pantalla, de otro modo el bob asociado se destruiria. Si tu
   deseas anular una mascara de esta forma, es importante desactivar
   primero los bobs mediante el comando BOB OFF. He aqui un ejemplo:
      Centre "Click mouse button to remove mask"
      Double buffer: Load"AMOS_DATA:Sprites/Octopus.abk"
      Get Sprite Palette
      DO
        Bob 1,x Screen(x mouse),y screen(y mouse(,1
        if mouse click then bob off:no mask 1
      Loop
   Vease tambien el comando MAKE MASK
      AUTOBACK     (activa sistema automatico de copia de pantalla)
   AUTOBACK n
   Cuando este usando una pantalla con doble buffer, es esencial sin
   cronizar tus operaciones de dibujo con los movimientos de los Bli
   tter Objects (bobs). Recuerda que cada pantalla doble buffer con-
   tiene dos visualizaciones separadas. Existe una para el dibujo ac
   tual, y otra en donde se reconstruyen las imagenes. Si el fondo
   tras un bob, cambia mientras este esta siendo dibujado, el conte-
   nido de esa pantalla variara tambien, y aparecera un efecto vibra
   torio muy molesto.
                                                                136
      El exclusivo sistema AUTOBACK de AMOS te permite una perfecta
   solucion para este problema. Te facilita la creacion de graficos
   hasta en 3 modos graficos, dependiendo de la precision que requie
   ras. A continuacion los tienes en orden inverso:
   1- AUTOBACK 2     (modo por defecto)
      En este modo, todas las operaciones graficas se combinan auto-
   maticamente con las actualizaciones de bobs. Asi cualquier cosa
   que dibujes en pantalla aparecera, directamente por debajo de los
   bobs, como por arte de magia. Los principios de este sistema se
   comprenden con el siguiente listado:
      Bob Clear: Rem dibuja en pantalla , anulando los bobs
      Plot 150,100: Rem esto puede ser un ejemplo
      Bob Draw: Rem redibuja los bobs
      Screen Swap: Rem proxima pantalla
      Wait vbl
      Bob Clear
      Plot 150,100: Rem realiza la misma operacion otra vez
      Bob Draw
      Screen Swap: Rem recupera la primera pantalla
      Wait vbl
   Como puedes ver, todas las actualizaciones de pantalla se ejecu-
   tan exactamente en 2 ocasiones. Existe solo una operacion para 
   ambas pantallas (logica y fisica).
      Un problema obvio, es que tus graficos se ejecutan en el doble
   de tiempo. Ademas, el programa sufrira al menos 2 vaciados verti-
   cales (Wait vbl), cada vez que introduzcas algo en pantalla. Esto
   puedo ocasionar incomodos retrasos en la ejecucion de procesos
   criticos como la deteccion de una colision.
   2- AUTOBACK 1     (modo semiautomatico)
      Realiza cada operacion grafica en ambas pantallas (logica y fi
   sica). No cuenta para nada con tus bobs, con lo que deberas usar
   este sistema solo para la actualizacion del area actual de dibu-
   jos.
      A diferencia del modo estandard, no tienes que detener el pro-
   grama hasta el proximo VBL. El Modo 1 es ademas ideal para cier-
   tos objetos, como el control de paneles o tablas de records, que
   necesitan ser continuamente actualizadas durante un programa.
   3- AUTOBACK 0      (modo manual)
      Detiene el sistema AUTOBACK. Ahora, todos los graficos se eje-
   cutan en la pantalla logica y a la maxima velocidad posible. Debe
   rias usar esta opcion, si necesitas repetidamente redibujar una
   gran pantalla o seccion del fondo durante el curso de un programa
   Esto te permitira ejecutar facil y rapidamente tus rutinas para
   deteccion de colisiones a intervalos regulares, sin afectar la ca
   lidad general de la animacion. He aqui un ejemplo tipico:
                                                                 137
      Bob Update Off
      Repeat
      Screen Swap
      Wait VBL
      Bob Clear: Rem ahora redibujaras cualquier cambio grafico
               : Rem ejecuta tus rutinas de deteccion colisiones etc
      Bob Draw
      Until WIN
   Ten en cuenta que este procedimiento solo funcionara si hay una
   suave progresion de pantalla a pantalla. Queda a tu cargo por com
   pleto, la unificacion de las pantallas logica y fisica una en la
   otra.
      Supongamos por ejemplo, que deseas mostrar un bob sobre una se
   rie de bloques aleatorios. Entonces necesitas una rutina como la
   siguiente:
      Load "AMOS_DATA:Sprites/Sprites.abk": Flash Off
      Get Sprite Palette: Double Buffer: CLS 0: Autoback 0
      Update Off: Bob 1,160,100,1
      Do
        Bob Clear
        X=RND(320)+1: Y=RND(200)+1: W=RND(80)+1
        H=RND(50)+1:  I=RND(15)
        INK I: Bar x,y to x+w,y+h
        Rem ahora podras normalmente llamar a tus rutinas para la
            deteccion de colisiones, etc
        Bob Draw
        Screen swap: wait vbl
      Loop
     Pero dado que no existe relacion entre las pantallas fisica y
   logica, la visualizacion vibrara continuamente de una pantalla a
   otra. Para solucionar este inconveniente, necesitaras simular el
   sistema original AUTOBACK. Asi que cambia las lineas del ejemplo
   previo DO y LOOP como sigue:
      Rem actualizacion de la pantalla primera
      Screen swap:Wait vbl
      Bob clear
      X=RND(320)+1: Y=RND(200)+1: W=RND(80)+1
      H=RND(50)+1:  I=RND(15)
      Ink i:Bar x,y to x+w,y+h
      Bob draw
      Rem actualizacion de la pantalla segunda
      Screen swap:wait vbl
      Bob Clear
      Ink I:Bar x,y to x+w,y+h
      Bob Draw
                                                                138
      De este modo, las dos pantallas se actualizaran exactamente al
   mismo tiempo y la visualizacion aparecera uniforme, incluso si
   existe una gran cantidad de actividad en el fondo de pantalla.
      AUTOBACK puede ser libremente usado en cualquier punto de tus
   programas. Siendo perfectamente posible usarlo de forma separada
   para los distintos metodos graficos en distintas partes de tus
   programas. Es totalmente compatible con todas las operaciones gra
   ficas, incluyendo Blocks, Iconos y Ventanas.
   Comandos de control de BOBS
   ===========================
      BOB UPDATE   (controla los movimientos de un bob)
   BOB UPDATE ¡ON/OFF¿
   Normalmente todos los bobs se actualizan una vez cada cincuentavo
   de segundo usando una rutina de interrupciones. Pese a que esto
   es aconsejable en la mayoria de programas, existen algunas aplica
   ciones que requieren un control mucho mas exacto del proceso de
   dibujo.
     El comando anterior activa/desactiva el sistema de actualiza-
   cion de bobs. Podras ahora redibujar tus bobs en el momento mas
   adecuado de tu programa. Esto es ideal cuando estes animando un
   gran numero de objetos, permitiendote mover tus bobs a su posi-
   cion antes de que se dibujen en pantalla. Inevitablemente esto
   provoca una ralentizacion de los movimientos de tu programa.
     Una nota de atencion: la actualizacion de bobs solo se produci-
   ra en el siguiente VBL. Tambien recuerda que este comando siempre
   redibujara los bobs en la actual pantalla logica, por lo que no
   debes olvidar hacer un "swaping" mediante el comando SCREEN SWAP,
   de lo contrario no ocurrira nada aparentemente.
      BOB  CLEAR   (anula todos los bobs de pantalla)
   BOB CLEAR
   Este comando anula todos los bobs de pantalla, y redibuja el fon
   do subyacente a los mismos. Suele usarse con BOB DRAW como una
   alternativa al comando BOB UPDATE.
      BOB  DRAW    (Redibuja los bobs)
   BOB DRAW
   Cuando se han redibujado bobs en pantalla, se habran ejecutado
   los siguientes pasos:
                                                                139
   1- Todos los bobs activos se eliminan de la pantalla logica y se
      reemplazan las regiones de fondo. Este paso es ejecutado por
      la instruccion BOB CLEAR
   2- Se realiza una lista de todos los bobs que se han movido desde
      la ultima actualizacion
   3- Las regiones del fondo en las nuevas coordenadas de pantalla
      se almacenan en memoria
   4- Todos los bobs activos se redibujan  en dichas nuevas coordena
      das en la pantalla logica
   5- Si esta activado el sistema de DOUBLE BUFFER, se producira un
      swaping entre las pantallas fisica y logica
      El comando BOB DRAW ejecuta los pasos 2 al 4 del proceso ante
   rior. Suponiendo que deseas crear un scrolling en un juego de ar-
   cade. En esta situacion, sera absolutamente vital que las opera-
   ciones de scroll esten perfectamente sincronizadas con los proce
   sos de movimiento; ya que si los "aliens" se movieran en el preci
   so momento en el que el scroll se produce, entonces las ares del
   fondo se redibujaran en el lugar incorrecto. Esto alteraria por
   completo tu pantalla.
      =X  BOB    (obtiene la coordenada X de un bob)
   x1=X BOB(n)
   Devuelve la actual coordenada X del bob numero N. Esta coordenada
   es medida en relacion a la pantalla actual. Ver tambien Y SPRITE,
   X MOUSE e Y MOUSE.
      =Y BOB      (obtiene la coordenada Y de un bob)
   y1=Y BOB(n)
   Y BOB complementa al comando anterior devolviendo la coordenada Y
   del bob n. Este valor se mide en coordenadas normales de pantalla
      =I BOB      (devuelve la imagen actual de un bob)
   Image=I BOB(n)
   Esta funcion devuelve el numero de la imagen actualmente usada 
   por el bob n. Un valor de 0 indicara que el bob no esta siendo
   visualizado.
      LIMIT BOB   (Limita un bob a una zona rectangular de pantalla)
   LIMIT BOB ¡n,¿ x1,y1 to x2,y2
   Este comando restringe la visibilidad de tus bobs a una zona rec-
   tangular enmarcada por las coordenadas x1,y1 y x2,y2. Las coorde-
   nadas X se redondean hasta el primer pixel multiplo de 16. Ten en
   cuenta que la anchura de esta region debera ser siempre mayor que
   la anchura de tus bobs, de otro modo obtendras un mensaje de 
   error (Illegal Function Call).
                                                                140
      Si se incluye, "N" especifica el numero de un bob simple que
   sera el afectado por esta instruccion, de otro modo, seran TODOS
   los bobs los restringidos. Podras restituir el limite visible has
   ta la totalidad de la pantalla, tecleando:
      LIMIT BOB
      GET  BOB    (Carga seccion de pantalla en el banco de sprites)
   GET BOB ¡s,¿ i,x1,y1 to x2,y2
   Esta instruccion es identica al comando GET SPRITE. Graba una ima
   gen de la pantalla actual en el banco de sprites. "X1,Y1" y "X2,
   Y2" son las coordenadas de las esquinas supero-izquierda e infero
   -derecha del area rectangular que se grabara.
      "I" especifica el numero de imagen que sera cargada con este
   area. "S" selecciona un numero opcional de pantalla de la cual la
   imagen sera tomada. Vease GET SPRITE para mas detalles.
      PUT  BOB    (coloca una copia de un bob en pantalla)
   PUT BOB n
   Este comando es opuesto al previo (GET BOB). Su accion consiste
   en colocar una copia del bob "N" en la actual posicion de panta-
   lla. Funciona impidiendo que el area de fondo subyacente sea dibu
   jada durante el proximo VBL. Al objeto de sincronizar la actuali-
   zacion de bobs con la visualizacion de pantalla, deberas siempre
   seguir este comando con una instruccion WAIT VBL.
      Ten en cuenta que despues de que esta instruccion haya sido 
   ejecutada, el bob original puede ser movido o animado, sin que se
   produzcan alteraciones en pantalla.
      PASTE  BOB   (Dibuja imagen del banco de sprite en pantalla)
   PASTE BOB x,y,i
   Este comando dibuja una copia de la imagen numero "I" en las coor
   denadas de pantalla "X,Y". A diferencia del comando anterior, la
   imagen se dibuja inmediatamente en pantalla, y no se modifica el
   resto de reglas generales. Ver PASTE ICON.
      BOB  OFF      (Anula un bob de visualizacion)
   BOB OFF  ¡n¿
   Ocasionalmente, puedes necesitar anular ciertos bobs conjuntamen-
   te de la pantalla. Este comando borra el bob numero "N" de la pan
   talla y da por finalizada cualquier animacion asociada. Si el pa
   rametro "N" es omitido, todos los bobs seran anulados por esta
   instruccion.
                                                                141
              13:  C O N T R O L     D E     O B J E T O S 
      En esta seccion veras como se controlan los diferentes objetos
   generados por los comandos de bobs y sprites, dentro de un progra
   ma Basic escrito con AMOS. Los topicos de este tema son la detec
   cion de colisiones, utilizacion del cursor del raton y lectura
   del joystick.
   El puntero del raton
   ====================
      El cursor del raton ofrece al programador una valida alterna-
   tiva al joystick. Con el comando CHANGE MOUSE podras reemplazar
   la imagen del raton con otra proveniente del banco de sprites.
   Existe tambien un grupo de instrucciones que te permiten determi-
   nar la posicion y el status del raton en cualquier momento. Entre
   esas se incluyen: X MOUSE, Y MOUSE y MOUSE KEY.
      HIDE    (Anula el puntero del raton de la pantalla)
   HIDE ¡ON¿
   Este comando anula por completo de la pantalla el puntero del ra-
   ton. El sistema realiza un contaje del numero de ocasiones en que
   has llamado a esta funcion. Esto se consigue averiguando el nume-
   ro de instrucciones SHOW necesarias antes de que el puntero regre
   se a la pantalla.
      Otra version de esta instruccion puede ser utilizada mediante
   el comando HIDE ON. Este ignora ese contaje que antes mencionaba-
   mos y siempre anula el puntero, no importara cuantas veces hayas
   llamado al comando SHOW.
      Recuerda que HIDE solo transforma en invisible el puntero del
   raton. No tiene efecto sobre otros comandos AMOS, asi que podras
   usar perfectamente las funciones X e Y MOUSE para leer las coorde
   nadas del puntero.
      SHOW     (Activa el puntero del raton)
   SHOW ¡ON¿
   Devuelve a pantalla el puntero del raton despues de una instruc-
   cion HIDE. Funciona de igual forma a la anterior.
                                                               142
      CHANGE  MOUSE   (Cambia el aspecto del puntero del raton)
   CHANGE MOUSE M
   Este comando te permite cambiar el aspecto del puntero del raton
   en cualquier momento. Existen 3 modelos estandard que se asignan
   con los numeros 1-3.
      Si especificas un valor superior a 3, se supondra que te refie
   res a una imagen almacenada en el banco de sprites. El numero de
   esta imagen se determina usando la expresion: IMAGEN = M - 3. Asi
   la imagen numero 1 debera instalarse con el valor 4.
      Al objeto de usar esta opcion, tu imagen de sprite debera ser
   exactamente de 16 pixels de anchura y no tener mas de 4 colores,
   mientras que no existe limite para la altura de la misma.
      = MOUSE KEY    (lee el status de los botones del raton)
   K = MOUSE KEY
   Te capacita para rapidamente chequear si una o mas teclas del ra-
   ton han sido pulsadas. El resultado viene en un modelo-BIT que
   contiene el actual status del raton:
      BIT 0     Se pone a 1 si el  boton izquierdo ha sido pulsado
      BIT 1     Se pone a 1 si el  boton derecho   ha sido pulsado
      BIT 2     Se pone a 1 si el  boton central   ha sido pulsado
                (si estuviera presente en tu raton
      = MOUSE CLICK   (chequea si se ha pulsado un boton)
   C = MOUSE CLICK
   Chequea si el usuario ha pulsado un boton del raton. Usa el mismo
   modelo-BIT que el comando anterior. Se pondra a 1 solo cuando un
   boton sea pulsado. Esos bits se resetean automaticamente a 0 des-
   pues de que se haya verificado esta funcion. De este modo, solo
   es capaz de chequear una sola tecla y en una sola ocasion.
      = X MOUSE =     (da/establece la coordenada X del puntero)
   X1=X MOUSE
   Este comando devuelve la coordenada X del puntero del raton en
   coordenadas hardware. Podras usar tambien esta funcion para mover
   el raton a una determinada posicion de pantalla. Esto se puede
   lograr asignando X MOUSE con un valor, como si fuera una variable
   Basic, por ejemplo:
      X MOUSE= 150
      = Y MOUSE =     (da/establece la coordenada Y del puntero)
   Y1= Y MOUSE
   Similar a la anterior
                                                                143
      LIMIT  MOUSE     (limita el raton a una seccion de pantalla)
   LIMIT MOUSE x1,y1 to x2,y2
   Restringe el movimiento del raton al area rectangular definida
   por las coordenadas hardware (x1,y1 to x2,y2). Observa como a di-
   ferencia de LIMIT BOB, el raton esta completamente atrapado en
   esta zona y no puede ser movido fuera de ella. Simplemente podras
   usar esta instruccion sin parametros para reubicar el raton a to-
   da la pantalla.
   Lectura del joystick
   ====================
      AMOS Basic incluye 6 funciones que te permitiran chequear de
   forma inmediata los movimientos de un joystick insertado en cual-
   quiera de los puertos.
      = JOY   (lee el joystick)
   d=JOY(j)
   Esta funcion devuelve un numero binario que representa el actual
   status del joystick del puerto numero "J". Normalmente tu joy se
   suele poner en el izquierdo (numero 1). Sin embargo, puedes sacar
   el raton del derecho (numero 0) y reemplazarlo con un joy.
      El estado del joystick puede leerse inspeccionando el modelo
   binario de bits que lo representa. Cada bit indica si una accion
   determinada ha sido realizada por el usuario. Si un bit esta pues
   to a "1" entonces el test se considera positivo y el joystick ha-
   bra sido movido en esa direccion. He aqui una lista de los dife-
   rentes BITS y su significado:
      BIT     Significado
      ---     -----------
       0      Joy arriba
       1      Joy abajo
       2      Joy izquierda
       3      Joy derecha
       4      Fuego
      Si no estas habituado a la notificacion binaria, podras usar
   los siguientes comandos:
      =JLEFT (J)  (Chequea movimiento del joystick a la izquierda)
      =JRIGHT(J)  (    "       "             "       "  derecha)
      =JUP   (J)  (    "       "             "     arriba)
      =JDOWN (J)  (    "       "             "     abajo)
                                                                 144
   X=JLEFT(j)
   X=JRIGHT(j)
   X=JUP(j)
   X=JDOWN(j)
   Estas funciones devuelven un valor de -1 (cierto) si el joystick
   en el puerto J ha sido movido en la direccion definida. Un valor
   de 0 (falso) indicara que no se ha producido dicho movimiento.
   Deteccion de colisiones
   =======================
      Si estas diseñando un juego de arcade es vital asegurarse de
   chequear las colisiones que se produzcan entre diversos objetos 
   de la pantalla. AMOS Basic incluye cinco poderosas funciones que
   te permiten realizar ese chequeo de forma rapida y facil.
   1- Deteccion de colision con un sprite
      SPRITE COL   (detecta colisiones entre 2 sprites hardware)
   C=SPRITE COL (n¡,s TO e¿)
   Esta funcion te facilita un modo simple de comprobar si han coli-
   sionado en pantalla dos o mas sprites. "N" hace referencia a un
   sprite hardware activo sobre el que se comprueba la colision. Si
   esta ha ocurrido, un valor -1 (cierto) sera devuelto, de otra for
   ma, resultara un valor 0 (falso).
      El formato estandard de esta funcion chequea todas las colisio
   nes. Pero tu tambien podras verificar un determinado grupo de 
   sprites usando una version de este comando:
      C= SPRITE COL n,s to e
   La instruccion anterior chequea colisiones entre el SPRITE N y 
   los sprites S hasta E (inclusive). Una vez que se haya detectado
   una colision, podras conocer el numero individual de sprite que
   ha colisionado, utilizando la funcion COL.
      Recuerda que al usar esta funcion, necesitaras crear una masca
   ra de sprites previamente, mediante el comando MASK, de otra for-
   ma las colisiones no seran detectadas.
   2- Deteccion de colision con un bob
      BOB COL    ( detecta colisiones entre 2 o mas bobs)
   C=BOB (n,¡,s to e¿)
   La funcion BOB COL comprueba si el bob numero N ha colisionado 
   con otro bob. Si se detecta dicha colision, se devolvera un valor
   de -1 (cierto) en C; en otro caso sera 0 (falso).
      Normalmente el comando comprobara todas las colisiones, y en-
   tonces, tendras que especificar que bobs quieres comprobar usando
   los parametros S to E. El estado individual de esos bobs podra
   ser comprobado con el comando COL.
                                                                145
   3- Deteccion de colision entre bobs y sprites
      SPRITEBOB COL  (detecta colisiones entre sprites y bobs)
   c=SPRITEBOB COL (n¡,s to e¿)
   Esta funcion comprueba colisiones entre el SPRITE N y uno o mas
   bobs. El valor de C sera -1 si la colision se ha producido y 0 si
   esta no ha tenido lugar. Los puntos inicial y final que especifi
   can dichas colisiones solo se detectaran entre los bobs S y E. De
   no incluirse dichos puntos, se detectaran todas las colisiones.
   ATENCION: la deteccion de colisiones entre un sprite y un bob 
   solo es posible en una pantalla de BAJA RESOLUCION (LOWRES). En
   modo HIRES, el tamaño de los pixels usado para los bobs y sprites
   es totalmente diferente, y el resultado de esta funcion no es
   fiable.
      BOBSPRITE  COL  (detecta colisiones entre bobs y sprites)
   c=BOBSPRITE COL (N,¡,s to e¿)
   Esta funcion comprueba colisiones entre un bob simple y varios
   sprites. Funciona de forma similar a la anterior.
      = COL   (verifica el status de un sprite o bob despues de la
               deteccion de una colision)
   c=COL(n)
   La funcion COL contiene el status de todos los objetos que han
   sido previamente comprobados por las funciones de deteccion de
   colision.
     Cada objeto que hayas chequeado se asociara con un elemento de
   esta matriz (COL). Dicho elemento se cargara con -1 si la coli-
   sion ha afectado al objeto numero N, y con 0 si no lo fuera. El
   sistema de numeracion es simple: el primer elemento de la matriz
   contiene el status del objeto numero 1, el segundo representa al
   objeto numero 2, y asi sucesivamente.
      Si estas usando las funciones BOBSPRITE COL y SPRITE COL enton
   ces los objetos seran sprites hardware, de otro modo seran bobs.
   Al objeto de evitar confusiones, es aconsejable usar esta instruc
   cion inmediatamente despues de un comando de deteccion.
      HOT  SPOT  (establece el "hot spot" o punto caliente de una
                  imagen en el banco de sprite)
   HOT SPOT image,x,y
   HOT SPOT image,p
   Este comando establece el "hot spot" de una imagen almacenada en
   el actual banco de sprites. El "hot spot" de un objeto se utiliza
   como punto de referencia para todos los calculos de coordenadas.
                                                                146
   Existen 2 versiones de esta instruccion:
     HOT SPOT image,x,y
   "X" e"Y" son coordenadas medidas desde la esquina superior izqui-
   erda de la pantalla. Dichas coordenadas se añadiran en el banco
   de sprites para posicionar convenientemente un objeto (sprite o
   bob) en pantalla.
            Sprite image
            +----------+       Ten en cuenta que es perfectamente
            :          :      legal que el "hot spot" quede fuera
            : x        :      de la imagen actual.
            :<-->*     :
            :  hot spot:
            +----------+
      HOT SPOT image,p
   Esta es la forma reducida de la instruccion; en la que se mueve
   el "hot spot" a una posicion predefinida, y que se numera de 1 a
   9. Las posiciones se muestran en el diagrama de abajo, en donde
   el punto central de la imagen se representa por el valor $11.
       $00    $10    $20
       $01    $11    $21
       $02    $12    $22
      MAKE MASK  (hace una mascara alrededor de una imagen para
                  la deteccion de colisiones)
   MAKE MASK ¡n¿
   Define una mascara alrededor de la imagen numero "N" en el banco
   de sprites. Esto se usa por AMOS Basic para los comandos de detec
   cion de colision. Ademas, puedes crear una mascara para cada obje
   to que desees chequear. Si omites el parametro N, entonces se ge-
   nerara una mascara para cada objeto del banco de sprite. Esto pue
   de llevar un poco de tiempo.
      Es importante recordar que las mascaras se generan automatica-
   mente en el momento que un bob es dibujado por primera vez en la
   pantalla. Esto puede causar un significativo retraso en la ejecu-
   cion de tu programa; asi merece la pena, hacer una llamada a este
   comando durante el procedimiento de inicializacion de tu programa
   4- Colisiones con bloques rectangulares
      AMOS Basic incluye algunas funciones que te permiten comprobar
   rapidamente si un sprite o un bob ha entrado en una region rectan
   gular de la pantalla.
      Dichas zonas especiales de la pantalla son especialmente uti-
   les para la deteccion de colisiones en juegos de rebote como ARKA
   NOID, en donde a cada bloque se le debe asignar su propia zona
   individual de pantalla. Tambien podras usar dichas zonas para la
   construccion de botones e indicadores, tan necesarios para los 
   controles de panel y cajas de dialogos.
                                                                147
      RESERVE ZONE  (Reserva espacio como zona de deteccion)
   RESERVE ZONE ¡n¿
   Este comando asigna suficiente memoria para "N" zonas de detec-
   cion. Debera siempre ser usado antes de definir la zona mediante
   el comando SET ZONE.
      La unica limitacion al numero de zonas es la cantidad de memo-
   ria disponible, asi que es perfectamente factible definir cientos
   o incluso miles de zonas en cualquiera de tus programas. Para bo-
   rrar la actual definicion de zonas y reusar la memoria de nuevo
   para el programa principal, simplemente teclea:
      RESERVE ZONE (sin incluir parametros)
      SET  ZONE   (establece una zona para su comprobacion)
   SET ZONE z,x1,y1 to x2,y2
   Define una zona rectangular que sera posteriormente comprobada
   mediante los diversos comandos de ZONA. "Z" especifica el numero
   de la zona que va a ser creada. "x1,y1 TO x2,y2" son las coordena
   das de las esquinas del rectangulo.
      Antes de usar esta instruccion necesitaras previamente reser-
   var algun espacio de memoria mediante el comando anterior.
      = ZONE    (devuelve el numero de zona en que se encuentran
                 las coordenadas que se comprueban)
   T=ZONE(¡s¿,x,y)
   Este comando devuelve el numero de la zona de pantalla en donde
   se ubican las coordenadas graficas "X" e "Y". Normalmente las 
   coordenadas se refieren a la pantalla actual, pero tambien pue-
   des referirte a otra pantalla opcional (Parametro S de la ins-
   truccion).
      Despues de usar ZONE, "T" contendra el numero de la zona espe-
   cificada, o bien, un valor 0 (falso).
      Ten en cuenta que ZONE solo devuelve la primera zona en esas
   coordenadas, no detectando otras zonas que compartan tambien di-
   chas coordenadas.
      Es posible usar esta funcion conjuntamente con las funciones
   X BOB e Y BOB para detectar si un bob ha entrado en una zona espe
   cifica de pantalla. Esto puede ser realizado mediante la siguien-
   te linea:
       X=ZONE(X BOB(n),Y BOB(n))
                                                                 148
      =H ZONE    (devuelve el numero de zona en que sen encuentran
                  las coordenadas hardware que se comprueban)
   T=HZONE(¡s¿,x,y)
   Es identico al anterior, solo que la posicion de pantalla es me-
   dida ahora en coordenadas hardware. Podras ademas usar esta fun-
   cion para detectar si un sprite hardware ha entrado en alguna de
   tus zonas de pantalla. Por ejemplo:
      X=HZONE(X SPRITE(n),Y SPRITE(n))
   Vease tambien ZONE, MOUSE ZONE, SET ZONE y ZONE$
      =MOUSE  ZONE   (comprueba si el puntero del raton ha 
                      entrado en una zona especifica)
   X=MOUSE ZONE
   Esta funcion devuelve el numero de la zona de pantalla actualmen
   te ocupada por el puntero del raton. Es equivalente a la linea:
      X=HZONE(X MOUSE,Y MOUSE)
      RESET  ZONE   (borra una zona)
   RESET ZONE ¡z¿
   Este comando desactiva permanentemente cualquiera de las zonas 
   creadas por SET ZONE. Si el numero opcional "Z" es incluido, solo
   sera esa la zona reseteada, de otro modo, todas las zonas se rese
   tearan. 
      No olvides que RESET ZONE solo borra las zonas definidas, y no
   afecta a la memoria reservada por el comando RESERVE ZONE.
   Prioridad de bobs
   =================
      PRIORITY ON/OFF   (cambia la prioridad)
   PRIORITY ON/OFF
   Se asigna un valor de prioridad a cada bob que oscila entre 0 y 
   63. AMOS Basic usa este numero para decidir en que orden aparece-
   ran los objetos en pantalla. Como regla general, cualquier bob
   con la mas alta prioridad sera siempre mostrado sobre los demas
   objetos de menor prioridad. El valor de prioridad es directamente
   tomado del numero de un bob.
      Deberas recordar este hecho cuando estes asignando numeros a
   tus bobs. La eleccion del numero tendra importantes efectos sobre
   la apariencia de los objetos en pantalla.
                                                                149
      Ademas del sistema estandard, tambien es posible ordenar los
   bobs de acuerdo con su posicion en pantalla. PRIORITY ON otorga
   el mayor valor de prioridad a los bobs con las mas altas coordena
   das Y. Esto te permite crear una util ilusion de perspectiva en
   tus programas. Mira el ejemplo siguiente:
      Load "AMOS_DATA/Sprites/Monkey_right.abk":CLS:Flash off
      Get sprite palette
      Priority Off:Rem establece el modo normal
      Bob 1,160,100,2:Bob2,0,72,2:Bob3,320,128,2
      Channel 2 to bob 2:Channel 3 to bob 3
      Amal 2,"Loop: M 320,0,320 ; M -320,0,320 ; Jump loop"
      Amal 3,"Loop: M -320,0,320 ; M 320,0,320 ; Jump loop"
      Amal On
      Wait Key
      Priority on: Rem establece el modo Y
      Wait Key
      Normalmente, ambos movimientos de bobs pasan por debajo del
   objeto en el centro. Cuando estableces el modo Y de prioridad,
   los bobs se ordenan ahora en funcion de sus coordenadas Y. Asi,
   el bob 3 se mueve sobre el bob 1, mientras que el bob 2 pasa sua-
   vemente tras el.
   TRUCO: normalmente lo mejor es posicionar el "hot spot" del spri-
   te en su base. Esto se debe a que su coordenada Y, usada por este
   comando, se referira siempre a su "hot spot" en pantalla. Tambien
   tienes que advertir que la instruccion PRIORITY OFF puede ser usa
   da para resetear la prioridad hacia el modo normal.
   Comandos miscelanea
   ===================
      UPDATE   (cambia automaticamente la actualizacion de 
                bobs/sprites)
   UPDATE ¡ON/OFF¿
   Normalmente cualquier objeto que dibujes en pantalla sera automa-
   ticamente redibujado cada vez que sea animado o movido. Esto pue-
   de ser termporalmente desactivado usando el comando UPDAT OFF. 
      Mientras la actualizacion este desactivada, los comandos de
   SPRITES, BOB y AMAL aparentemente carecen de efecto. Actualmente,
   todas tus animaciones estan trabajando correctamente, solo que el
   resultado no aparece en pantalla. Entonces podras obligar a que 
   las operaciones de dibujo se realizan cuando lo desees mediante
   este comando.
                                                                150
      Existen 3 formatos distintos para este comando:
   1- UPDATE OFF
      Desactiva la actualizacion automatica
   2- UPDATE
      Redibuja cualquier sprite que haya cambiado su posicion origi-
      nal
   3- UPDATE ON
      Activa el sistema normal de actualizacion.
                                                                151
                              14:   A  M  A  L
      Si deseas generar los suaves movimientos necesarios para un
   programa arcade, es necesario que cada objeto de la pantalla se
   mueva docenas de veces por segundo. Esto es muy problematico, in-
   cluso en codigo maquina o en las versiones Basic mas potentes.
      AMOS evita este problema incorporando un potente lenguaje de
   animacion que se ejecuta de forma independiente a tus programas
   Basic. Este es capaz de generar efectos de animacion a alta velo-
   cidad que serian imposibles de crear en un Basic standard.
      El lenguaje de animacion de AMOS (en ingles AMos Animation
   Language -AMAL-) es exclusivo para AMOS Basic. Puede ser usado
   para animar cualquier cosa como sprites o una pantalla completa
   a una velocidad increible. Mediante interrupciones se podran eje-
   cutar hasta 16 programas AMAL de forma simultanea.
      Cada programa controla los movimientos de un objeto simple en
   la pantalla. Los objetos pueden moverse segun modelos complejos
   predefinidos, creados por un accesorio editor separado. Tambien
   podras controlar tus objetos directamente con el raton o el joys-
   tick si fuera necesario.
      La gran versatilidad del sistema AMAL debe ser vista para ser
   creida.
   Principios de AMAL
   ==================
      AMAL es, en efecto, solo una simple version de Basic que ha
   sido cuidadosamente mejorada hasta el maximo de velocidad posible
   Como el Basic, existen instrucciones para el control del programa
   (jump, etc); toma de decisiones (If..) y secciones de repeticion
   o bucles (For...next). La fuerza real se hace patente cuando se
   ejecuta un programa AMAL. No solo es mas rapido, sino que todos
   los programas AMAL pueden ser compilados antes de ejecutarse.
      Los comandos AMAL se introducen usando cortos tokems que con-
   sisten en una o dos letras mayusculas. Cualquier dato en minuscu-
   las sera completamente ignorado. Esto te permite "rellenar" las
   instrucciones AMAL con letras minusculas para hacer el comando
   facilmente distinguible. Asi el comando "M" debera introducirse
   como "Move" y la instruccion "X" como "eXit".
      Las instrucciones de AMAL puede ser separadas por cualquier
   caracter, incluyendo el espacio. No podras, sin embargo, usar los
   dos puntos (:) para este proposito, ya que se usan para la defini
   cion de etiquetas. Te aconsejamos que uses un punto y coma (;)
   para separar los comandos al objeto de evitar posibles errores de
   AMAL.
                                                                 152
      Existen dos formas de crear programas AMAL. La primera consis-
   te en producir tus secuencias de animacion con el programa acceso
   rio AMAL y grabarlas en un banco de memoria, o bien puedes defi-
   nir tus animaciones desde el propio AMOS Basic usando el comando
   AMAL. El formato general de esta funcion es:
      AMAL n,a$
   "N" es el numero de identificacion de tu nuevo programa AMAL. Por
   defecto se asigna el numero del sprite hardware correspondiente a
   todos los programas. Asi el primer programa AMAL controla al spri
   te numero uno, el segundo al sprite 2, y asi en adelante. Podras
   cambiar esta seleccion cuando lo desees usando el comando CHANNEL
   "a$" es una cadena que contiene un listado de instrucciones AMAL
   para ejecutarse en tu programa. He aqui un ejemplo simple:
      Load "AMOS_DATA:Sprites/Monkey_right.abk"
      Get sprite palette
      Sprite 8,130,50,1
      AMAL 8,"S: M 300,200,100 ; M -300,200,100 J S"
      AMAL On 8: Rem activa el programa AMAL numero 8
      Direct
      El programa regresa de nuevo al modo directo gracias al coman-
   do DIRECT. Intenta teclear algunos comandos Basic en esta linea.
   Como podras ver el patron de movimientos continua ejecutandose 
   pese a todo, sin interferir con el resto del sistema AMOS. Tam-
   bien debes notar que hemos usado el sprite 8 para obligar el uso
   de un sprite computerizado. Todos los sprites computerizados van
   desde el 8 al 15 y son automaticamente asignados al numero de ca-
   nal equivalente por el sistema AMAL. Asi, no hay necesidad de nin
   gun procedimiento especial de inicializacion. A menos que desees
   restringir el numero de sprites hardware, es preferible usarlos
   antes que los sprites computerizados en tus programas. Ten presen
   te como hemos activado el sistema AMAL usando el comando AMAL ON,
   que tiene el formato:
      AMAL ON ¡prog¿
   en donde "PROG" es el numero de un programa AMAL simple. Si este
   fuera omitido, entonces se ejecutarian a la vez la totalidad de
   programas AMAL.
                                                                153
   AMAL Tutorial
   =============
      A continuacion te mostraremos como trabajar en el sistema AMAL
   para que te vayas familiarizando con los mecanismos de los progra
   mas AMAL, sin tener que conocer detalles tecnicos.
      Hasta ahora nos hemos concentrado en los movimientos de spri-
   tes, pero los mismos principios pueden utilizarse para las anima-
   ciones de bobs y pantallas.
      Debes comenzar por cargar algunos ejemplos en memoria. Los po-
   dras encontrar en el cajon SPRITES del disco de datas AMOS. Ve al
   directorio del fichero de Sprites y teclea los siguiente en la
   ventana directa:
      Dir "AMOS_DATA"
   Para cargar un fichero de sprites, teclea la siguiente linea:
      Load "AMOS_DATA:Sprites/Octopus.abk"
   1- Moviendo un objeto
      Como cabria esperar en un lenguaje de animacion, AMAL facilita
   la movilizacion de tus objetos de diversas formas. La mas simple
   de ellas se realiza mediante el comando MOVE:
      Move    (mueve un objeto)
   M w,h,n
   El comando -M- mueve un objeto "w" unidades a la derecha y "h"
   unidades hacia abajo, exactamente en "n" pasos. Si las coordena-
   das de tu objeto fueran (X,Y), entonces el objeto se moveria pro
   gresivamente hacia X+W,Y+H.
      Supongamos que tengas un sprite en las coordenadas 100,100. La
   instruccion "M 100,100,100" lo movera hasta la posicion 200,200.
   La velocidad de esta animacion dependera del numero de pasos. Si
   "N" fuera grade cada movimiento individual del sprite sera mas
   pequeño y el sprite se movera muy lentamente. Por contra, un va-
   lor pequeño de "N" originara grandes pasos de movimiento que sacu
   diran el sprite a lo largo de la pantalla a alta velocidad. He
   aqui algunos ejemplos del comando MOVE:
      Rem esto mueve un pulpo por la pantalla mediante AMAL
      Load "AMOS_DATA:Sprites/octopus.abk"
      Sprite 8,300,0,1
      AMAL 8,"M 0,250,50":AMAL On 8:Wait Key
      Rem mueve el pulpo hacia abajo y a lo largo de la pantalla
      Load "AMOS_DATA:Sprites/Octopus.abk"
      Sprite 10,150,150,1
      AMAL 10,"M 300,-100,50":Amal On 10:Wait Key
                                                                 154
      Rem demuestra multiples comandos Move
      Load "AMOS_DATA:Sprites/Octopus.abk"
      M$="Move 300,0,50 ; Move -300,0,50"
      Sprite 11,150,150,1
      Amal 11,M$ : Amal On 11: Wait Key
      Ten presente que hemos escrito Move en lugar de M en ultimo
   ejemplo, y puesto que las letras "ove" estan en minusculas, seran
   ignoradas por el sistema AMAL.
      A primera vista, Move es una potente y poco atractiva instruc-
   cion. Es ideal para mover objetos como misiles, pero por lo demas
   es bastante simplona.
      Realmente, nada mas lejos de la verdad. Esto es debido a que
   los parametros de la instruccion Move no se limitan a numeros sim
   ples. Tambien podras incluir complejas expresiones aritmeticas 
   que incorporaran algunas de las mas utiles variedades de AMOS. 
   Por ejemplo:
      Load "AMOS_DATA:Sprites/Octopus.abk"
      Get sprite palette
      Sprite 12,150,150,1: Amal 12,"Move XM-X,YM-Y,32"
      Amal On 12:Wait Key
      Esta rutina mueve lentamente el sprite computerizado 12 hasta
   la actual posicion del raton. X e Y contienen las coordenadas de
   tu sprite, y XM e YM son funciones que devuelven las actuales
   coordenadas del raton.
      Es posible explotar este efecto en juegos como PACMAN para ha-
   cer que tus objetos "cacen" al del jugador. Ejemplo:
      Load Iff "AMOS_DATA:IFF/Frog_Screen.IFF",1
      Channel 1 to screen display 1
      Amal 1,"Move 0,-200,50 ; Move 0,200,50"
      Amal on 1: Direct
      CHANNEL asigna un programa AMOS a un objeto particular. Ya ve-
   remos este comando con mas detalle mas adelante, cuyo formato cla
   sico es:
      CHANNEL p TO object n
   "P" es el numero de tu programa AMAL. Se permiten valores que van
   desde 0 a 63, teniendo presente que solo los 16 primeros pueden
   ser ejecutados usando interrupciones. "Object" especifica el tipo
   de objeto que quieres controlar con tu programa AMAL. Se pueden
   controlar:
      Sprite          (valores superiores a 7 seran computerizados)
      Bob             (o blitter object)
      Screen display  (usado para mover la pantalla visible)
      Screen offset   (scrolling mediante hardware)
      Screen size     (cambia tamaño de pantalla con interrupciones)
      Rainbow         (anima un efecto arco iris)
                                                                155
   "N" es el numero del objeto que va a ser animado. Este objeto
   necesita ser seguidamente definido usando las instrucciones como
   SPRITE, BOB o SCREEN OPEN.
   2- Animacion
      Anim     (anima un objeto)
   A n,(image,delay)(image,delay)....
   La instruccion Anim cicla un objeto a traves de una secuencia de
   imagenes produciendo un suave efecto de animacion. "N" es el nume
   ro de veces que se repetira el ciclo. Un valor de 0 para este pa-
   rametro provocara que se realiza continuamente.
      "image" especifica el numero de una imagen a utilizar en cada
   secuencia de la animacion. "Delay" determina la cantidad de tiem-
   po que esa imagen aparecera en pantalla, medida en unidades de 
   cincuentavos de un segundo. Ejemplo:
      Load "AMOS_DATA:Sprite/Monkey_right.abk":Get sprite palette
      Sprite 9,150,50,11
      M$="Anim 12,(1,4)(2,4)(3,4)(4,4)(5,4)(6,4);"
      M$=M$+"Move 300,150,150 ; Move -300,-150,75"
      Amal 9,M$
      Amal On 9
      Direct
      Este programa combina el movimiento de un sprite con una anima
   cion. Advierte como hemos separado los comandos con un punto y co
   ma. Esto asegura que las dos operaciones seran totalmente indepen
   dientes una de la otra. Una vez que la secuencia de animacion ha-
   ya sido definida, AMAL saltara inmediatamente a la siguiente ins
   truccion, y la animacion comenzara.
      Es importante no olvidar que Anim solo funciona en conjuncion
   con sprites y bobs. Asi que no es posible animar pantallas ente-
   ras con este comando.
   3- Bucle simple
      Jump     (redirige un programa AMAL)
   J label
   Jump ofrece una forma simple de moverse desde una parte a otra de
   un programa AMAL. "label" es el destino de tu salto (jump) y debe
   haber sido definido en algun lugar del programa actual. Todas las
   etiquetas AMAL son definidas mediante una letra mayuscula seguida
   de los dos puntos (:), y como las instrucciones, puede rellenarse
   de letras minusculas para su entendimiento, aun cuando estas son
   ignoradas por el sistema.
                                                               156
      Recuerda que cada etiqueta se define usando una SOLA letra, de
   este modo "S:" y "Swoop:" se refieren a la misma etiqueta. Si tu
   intentas definir dos etiquetas que comiencen por la misma letra,
   aparecera un mensaje de error del tipo "label already defined in
   animation string".
      Cada programa AMAL puede tener su propio juego de etiquetas. Y
   es perfectamente valido el uso de etiquetas identicas en diferen
   tes programas AMAL. Ejemplo:
      Load "AMOS_DATA:Sprites/Octopus.abk"
      Get sprite palette
      For s=8 to 20 step 2:Rem establece 7 sprites computerizados
        Sprite s,200(s-7)*13+40,1
      next s
      rem: ahora crea 7 programas AMAL
      For s= 1 to 7
        Channel s to sprite 6+(S*2)
        M$="Anim 0,(1,2)(2,2)(3,2)(4,2);Label:Move"Str$(S*2)"+,0,7;"
        Amal s,M$
      Next S
      Rem O.K. ahora todos se animan!!
      Amal On:Direct
      Mientras que los comandos AMAL no se ejecuten mediante inte-
   rrupciones, los bucles infinitos pueden ser desastrosos. Asi un
   contador especial se encarga de contar el numero de saltos de tu
   programa. Cuando el contador pasa de 10, cualquier salto adicio-
   nal sera completamente ignorado por el sistema AMAL.
   NOTA: si dependes de este sistema para ciclar continuamente tu
   programa, gastaras una gran cantidad de la potencia de tu ordena
   dor. En la practica, es mucho mas eficiente limitarse solo a un
   salto por cada VBL. Esto puede evitarse añadiendo una simple pau-
   sa antes de cada salto de tu programa. Vease el comando PAUSE.
   4- Expresiones y variables
      Let    (asigna un determinado valor a un registro)
   L register=expresion
   La instruccion L asigna un valor a un registro AMAL. Esta accion
   es muy parecida al comando normal del Basic, excepto por el hecho
   de que todas las expresiones son estrictamente evaluadas de iz-
   quierda a derecha.
      Los registros son variables enteras usadas para contener los
   valores intermedios de tus programas AMAL. Los numeros permitidos
   oscilan desde -32768 hasta +32768. Existen 3 tipos fundamentales
   de registros:
                                                                157
   A) Registros internos
      Cada programa AMAL tiene su propio juego de 10 registros inter
   nos. Los nombres de esos registros comienzan por la letra "R", se
   guida de uno de los digitos 0 al 9 (R0 a R9). Los registros inter
   nos son como las variables locales dentro del AMOS Basic.
   B) Registros externos
      Los registros externos son muy diferentes porque contienen sus
   valores de forma separada al programa AMAL. Esto te permite usar
   esos registros para pasar informacion entre varias rutinas AMAL.
   El sistema AMAL te facilita hasta 26 registros externos, con nom-
   bres que van desde RA a RZ. Los contenidos de cualquier registro
   interno o externo puede ser conocido desde Basic mediante la fun-
   cion AMREG.
   C) Registros especiales
      Son un juego de tres valores que determinan el status de un 
   objeto. "X,Y" contienen las coordenadas del objeto. Cambiando di-
   chos registros, podras mover tu objeto a lo largo de la pantalla
   Por ejemplo:
      Load "AMOS_DATA:Sprites/Frog_Sprites.abk":Channel 1 to bob 1
      Flash off:Get sprite palette: Bob 1,0,0,1
      Amal 1,"Loop: Let x=x+1 ; Let y=y+1; Pause; Jump Loop"
      Amal on 1: Direct
   "A" almacena el numero de la imagen que va a mostrarse por un bob
   o sprite. Puedes alterar este valor generando tu propia secuencia
   de animacion, como sigue:
      Load "AMOS_DATA:Sprites/Frog_Sprites.abk":Get sprite palette
      Flash off: Channel 2 to bob 1: Bob 1,300,100,1
      M$="Loop: Let A=A+1 ;"
      M$=M$+"For r0=1 to 5 ; next r0 ; Jump Loop"
      Amal 2,M$
      Amal on 2: Direct
      El bucle For...Next sera explicado con mas detalles despues. 
   Aqui es usado para ralentizar cada cambio de imagen del bob. Cuan
   do se ejecuta cada "Next" del bucle, AMAL no continua hasta que
   se verifique un VBL. Tambien observa el uso del punto y coma (;)
   para separar las intrucciones AMAL, pese a que el espacio tambien
   serviria igualmente.
   5- Operadores
      Las expresiones AMAl pueden incluir todas las normales opera-
   ciones aritmeticas, excepto MOD. Tambien podras usar las siguien
   tes operaciones logicas en tus calculos:
      &     AND logico
      ñ     OR  logico
                                                                158
      Ten en cuenta que no es posible cambiar el orden de evaluacion
   cambiando los corchetes "()" puesto que esto ralentizaria tus
   calculos de forma considerable y reduciria el tiempo disponible
   para la interrupcion. Teclea el siguiente ejemplo:
      Load "AMOS_DATA:Sprites/Octopus.abk": Hide
      Get Sprite Palette
      Sprite 8,X Mouse,Y Mouse,1
      Amal 8,"Loop: Let X+XM ; Let Y+YM ; Pause ; Jump Loop"
      Amal On 8
      Load "AMOS_DATA:Sprites/Octopus.abk": Hide
      Get Sprite Palette
      Sprite 8,X Mouse,Y Mouse,1
      Amal 8,"Anim 0,(1,4)(2,4)(3,4)(4,4) ; Loop: Let X=XM ;
              Let Y=YM ; Pause : Jump Loop"
      Amal On
      Los ejemplos anteriores simulan efectivamente el comando CHAN
   GE MOUSE. Sin embargo, este sistema es mucho mas poderoso ya que
   podras facilmente mover bobs, sprites computerizados, o incluso
   pantallas usando exactamente la misma tecnica.
   6- Tomando decisiones
      If     (rama de decision dentro de una cadena AMAL)
   If test Jump L
   Esta instruccion te permite realizar simples comprobaciones den-
   tro de tu programa AMAL. Si el resultado de la expresion es -1
   (cierto) el programa saltara a la etiqueta "L", mientras que de
   otra forma, AMAL pasara a la siguiente instruccion. Observa como
   a diferencia de su equivalente Basic, aqui estas limitado a solo
   un salto despues de la instruccion de comprobacion.
      Es practica habitual rellenar esta instruccion con comandos en
   minusculas como "then" o "else". Esto hace mas "legible" la ins-
   truccion. He aqui un ejemplo:
      If X>100 then Jump Label else Let x=x+1
   Para la comprobacion se pueden emplear expresiones logicas como:
      <>    No igual
      <     Menor que
      >     Mayor que
      =     Igual
                                                                159
   Ejemplo:
      Load "AMOS_DATA:Sprites/Octopus.abk"
      Get Sprite Palette
      Sprite 8,130,50,1
      C$="Main: if XM>100 Jump Test: "
      C$=C$+"Let X=XM "
      C$=C$+"Test: If YM>100 Jump Main "
      C$=C$+"Let Y=YM Jump Main"
      Amal 8,C$: Amal on: Direct
   ATENCION: NO intentes combinar varios tests en una misma expre-
   sion AMAL utilizando "&" o "ñ". Puesto que las expresiones se
   evaluan de izquierda a derecha, esto generaria un mensaje de 
   error. Asi la expresion X>100ñY>100, debera ser evaluada en el
   siguiente orden:
    X>100   Puede ser cierto o falso
    ñY      OR  Y
    >100    chequea si Y>100
     El resultado de la expresion anterior no tendra, obviamente,
   relacion con el valor esperado. Los usuarios que sepan, podran
   evitar este problema utilizando el algebra booleana. Primero se
   asigna cada test a un registro AMAL simple, como sigue:
      Let R0=X>100 ; Let R1=Y>100
   A continuacion se combinan esos tests en una expresion simple
   usando "ñ" y "&" e incluyendolas directamente en la orden If:
      If R0 ñ R1 Jump L....
   Esto puede parecer un poco loco, pero funciona perfectamente en
   la practica.
      For  To   Next   (bucle dentro de AMAL)
   For reg=start To end
      :        :
   Next
   Consiste en un estandard FOR...NEXT, muy parecido a su equivalen-
   te Basic. Esos bucles se pueden explotar en tus programas para
   mover objetos en complejos modelos visuales. "REG" puede ser cual
   quier registro AMAL (R0-R9 o bien RA-RZ). Sin embargo, no puedes
   usar los registros especiales para este proposito.
      Como en el Basic, el registro despues de que el NEXT sea ejecu
   tado sera comparado con el contador que hayas especificado en FOR
   de otra forma aparecera un mensaje de error de sintaxis. Tambien
   observa que el tamaño del paso es siempre de uno en uno. Adicio-
   nalmente tambien es posible realizar bucles anidados, uno dentro
   de otro.
                                                                 160
      Recuerda que cada canal de animacion solo puede ejecutar un
   bucle simple por cada VBL. Esto sincroniza el efecto de tu bucle
   con la visualizacion de pantalla, y evita la necesidad de añadir
   un comando PAUSE antes de cada NEXT.
   7- Generando una onda de ataque para un programa
      Esos bucles pueden usarse para crear complejos sistemas de mo
   vimiento. El tipo mas facil de animacion es la linea recta. Esto
   puede lograrse con un simple For...Next, como sigue:
      Load"AMOS_DATA:Spraites/Octopus.abk":Get sprite palette
      Sprite 8,130,60,1
      C$=For R0=1 to 320 ; Let X=X+1 ; Next R0": Rem mueve sprite
      Amal 8,C$: Amal On 8: Direct
      Ahora puedes aumentar este programa, haciendo que tu objeto
   vaya de aca para alla a lo largo de la pantalla.
      Load"AMOS_DATA:Spraites/Octopus.abk":Get sprite palette
      Sprite 8,130,60,1
      C$="Loop:For R0= 1 To 320 ; Let X=X+1 : Next R0"
      C$=C$+" For R0=1 to 320 ; Let X=X-1 ; Next R0 ; Jump Loop"
      Amal 8,C$: Amal On 8: Direct
      El primer bucle mueve el objeto de izquierda a derecha, mien-
   tras que el segundo lo hace al reves. Hasta ahora la animacion ha
   sido restringida a solo movimientos horizontales. Al objeto de 
   crear una onda de ataque mas realista, es necesario incorporar un
   componente vertical a esta animacion. Esto puede conseguirse in-
   cluyendo en tu programa otro bucle:
      Load"AMOS_DATA:Spraites/Octopus.abk":Get sprite palette
      Sprite 8,130,60,1:C$=For R1=0 To 10 ;"
      C$=C$+" For R0= 1 To 320 ; Let X=X+1 : Next R0 ;"
      C$=C$+"Let Y=Y+8 ;"
      C$=C$+" For R0=1 to 320 ; Let X=X-1 ; Next R0 ;"
      C$=C$+"Let Y=Y+8 ; Next R1"
      Amal 8,C$: Amal On 8
      El programa anterior genera un suave patron de ataque bastante
   basico.
                                                                 161
   8- Grabacion de una compleja secuencia de movimiento
      PLay
   PLay path
   Si ya conoces las ondas suaves de ataque de los modernos juegos
   de arcade, y crees que nunca conseguiras algo parecido, piensate
   lo de nuevo. El comando PLay de AMAL te permite animar libremente
   tus objetos mediante practicamente cualquier secuencia de movimi-
   entos que puedas imaginar. Funciona ejecutando un movimiento pre-
   viamente definido y almacenado en el banco de memoria de AMAL.
      Ese modelo de movimiento puede crearse con el accesorio AMAL
   del disco AMOS. Y simplemente va a grabar una secuencia de los mo
   vimientos del raton y la introduce directamente en los bancos de
   memoria de AMAL. Una vez que hayas creado tus secuencias de movi-
   mientos de esta manera, podras facilmente asignarlas a cualquier
   objeto de pantalla, reproduciendo perfectamente su modelo origi-
   nal. Tanto la velocidad como la direccion de tu movimiento puede
   cambiarse en cualquier momento desde el programa AMOS Basic.
      La primera vez que AMAL encuentra uncomando PLay, chequea en
   el banco hasta encontrar el movimiento grabado que se especifica
   en el parametro ("PATH"). "PATH" es tan solo un numero que oscila
   desde 1 hasta el maximo numero de modelos que exista en el banco.
   Si surgiera algun problema durante esta fase, AMAL abortaria por
   completo la ejecucion de PLay, e iria a la siguiente instruccion
   de tu cadena de animacion.
      Despues de que el modelo haya sido inicializado, el registro 
   R0 se cargara con el "tempo" del movimiento. Esto determina el in
   tervalo de tiempo entre cada paso individual del movimiento. Todo
   el tiempo se medira en unidades de cincuentavos de segundo. Cambi
   ando este registro en tu programa AMAL, podras aminorar o acele-
   rar la velocidad de movimiento de tus objetos.
      Ten presente que cada paso de movimiento se añade a las actua-
   les coordenadas de tu objeto. Asi, si un objeto es posteriormente
   movido mediante las instrucciones para bobs o sprites, comenzara
   desde la nueva posicion de pantalla. Ademas, tambien es posible
   animar docenas de diferentes objetos en pantalla, utilizando una
   simple secuencia de movimientos.
      El registro R1 ahora contiene la bandera o "flag" que determi-
   nara la direccion de tus movimientos. Hay 3 posibles situaciones:
   1) R1 > 0  = Adelante
      Un valor de 1 para R1, especifica que el modelo de movimiento
     se ejecutara desde el principio hasta el final, exactamente en
     el orden en que ha sido creado (este es el valor por defecto).
                                                                 162
   2) R1 = 0  = Atras
      Muchas secuencias de animacion requieren que tus objetos se mo
     vilicen de aca para alla, a traves de tu pantalla en un comple-
     jo modelo de movimiento. Para cambiar la direccion, simplemente
     carga R1 con 0. Tu objeto ahora, girara y ejecutara su movimien
     to original hacia atras.
   3) R1 = -1 = Salida
      Si se detecta una colision en tu programa AMOS, necesitaras
     detener por completo el movimiento de tu objeto, y tal vez gene
     rar un efecto de explosion. Esto puede conseguirse colocando en
     R1 un valor de -1. AMAL entonces abortara la instruccion PLay,
     e inmediatamente saltara a la siguiente instruccion de tu se-
     cuencia de animacion.
      Una solucion ingeniosa es que dichos registros pueden alterar
   se directamente desde el Basic. Esto te facilita el control de tu
   modelo de movimientos directamente desde el programa principal.
   Existe tambien una instruccion especial AMPLAY para hacerte las
   cosas aun mas faciles.
      El comando PLay es ideal para el control de los aliens en los
   juegos de arcade. De hecho, es la instruccion simple mas potente
   de AMAL.
      AMAL    (llama a un programa AMAL)
   AMAL n,a$
   AMAL n,p
   AMAL n,a$ to address
   El comando AMAL asigna un programa AMAL a un canal de animacion.
   Este programa puede ser tomado desde la cadena "a$", o bien desde
   el banco de memoria de AMAL.
      La primera version de esta instruccion carga tu programa desde
   la cadena "a$" y la asigna al canal "N". a$ contiene una lista de
   instrucciones AMAL. De forma alternativa puedes cargar tu progra-
   ma desde una zona de memoria, sita en el banco de memoria 4.
      "N" es el numero del canal de animacion, y oscila desde 0 a 63
   Cada canal de AMOS se puede asignar independientemente a un bob,
   un sprite o una pantalla.
      Solo los primeros 16 programas AMAL pueden ejecutarse usando
   interrupciones. Al objeto de no exceder este limite, necesitas
   ejecutar tus programas directamente desde el Basic, usando el co-
   mando SYNCHRO.
      La version final de la instruccion AMAL es ideal para programa
   dores avanzados.  Simplemente copia el contenido de los registros
   X, Y e A en un area especifica de memoria. Podras usar ahora esa
   informacion directamente en tus rutinas de Basic. Ademas es posi-
   ble explotar el sistema AMAL para animar cualquier cosa, desde un
   bloque hasta un caracter. El formato es:
                                                                 163
      AMAL n,a$ to address
   "ADDRESS" debe ser constante y radicar en una zona libre de la me
   moria, preferiblemente en una cadena AMOS o en un banco de memo-
   ria. Cada vez que tu programa AMAL se ejecute (50 veces por segun
   do), se escribiran en ese area de memoria, los siguientes valores
       Lugar        Efecto
       -----        ------
      Address       Bit 0 se pone a 1 si X ha cambiado
                    Bit 1 indica que Y ha sido alterado
                    Bit 2 cambia si la imagen (A) ha cambiado desde
                          la ultima interrupcion
      Address+2     Es una palabra que contiene el ultimo valor de X
      Address+4     Contiene el actual valor de Y
      Address+6     Almacena el valor de A
   NOTA: se puede acceder a esos valores desde tu programa, utilizan
   do un simple DEEK. Esta opcion invalidara totalmente cualquier
   asignacion previa de CHANNEL.
   Comandos AMAL
   =============
      He aqui un listado completo de todos los comandos AMAL dispo-
   nibles:
   M   (Move)     Move deltaX,deltaY,steps
   A   (Anim)     Anim cycles,(image,delay)(image,delay)...
   L   (Let)      Let reg=exp
   J   (Jump)     Jump L
   I   (If)       If exp Jump L
   For To Next    For reg=start To end....Next reg
   PL  (PLay)     PLay path
   P   (Pause)    Pause
   AU  (AUtotest) AU (list of tests)  --Vease Sistema AUTOTEST--
   X   (eXit)     eXit    (Sale de AUtotest y vuelve al AMAL)
   W   (Wait)     Wait    (Congela el programa AMAL y solo
                           ejecuta el AUtotest)
   O   (On)       On      (Reactiva el programa despues de Wait)
   D   (Direct)   Direct  (Establece la parte del programa que se
                           ejecutara despues de un autotest)
                                                                 164
   Funciones AMAL
   ==============
   =XM          Devuelve la coordenada X del raton
   =YM          Devuelve la coordenada Y del raton
   =K1          Status de la tecla izquierda del raton (-1 =pulsada)
   =K2          Status de la tecla derecha
   =J0          Chequea joystick derecho.
   =J1          Chequea joystick izquierdo. Vease comando JOY
   =Z(n)        Numero aleatorio. Devuelve un numero aleatorio entre
              -32767 y 32768. Este numero puede limitarse a un rango
              especifico usando una mascara-BIT N. Una operacion lo-
              gica AND se realizara entre el numero aleatorio y la
              mascara para generar el resultado final. Asi, estable-
              ciendo N en un valor de 255, nos aseguraremos que los
              numeros oscilaran entre 0 y 255. Una vez que esta fun-
              cion haya sido optimizada por velocidad, el numero de-
              vuelto no sera totalmente aleatorio. Si realmente nece
              sitas numeros aleatorios, seria mejor generar valores
              numericos con la funcion Basic RND y luego cargarlos
              en un registro externo de AMAL con la funcion AMREG.
   =XH(s,x)   Convierte la coordenada de pantalla X en otra coorde-
              nada hardware
   =YH(s,y)   Convierte una coordenada de pantalla Y en formato hard
              ware
   =XS(s,x)   Conversion de coordenadas hardware a pantalla
   =YS(s,y)   Conversion de coordenadas hardware a pantalla
   =BC(n,s,e) Chequea colisiones entre bobs. BC es identico a la ins
              truccion equivalente de AMOS Basic BOB COL. Chequea el
              bob numero N para colisiones entre los bobs S hasta E.
              Si se detecta una colision, BC devolvera un valor de 
              -1, de otro modo sera 0. Esta instruccion no puede ser
              ejecutada dentro de una interrupcion. Asi solo es dis-
              ponible cuando estes ejecutando tus rutinas AMAL direc
              tamente desde el Basic con la instruccion SYNCHRO.
   =SC(n,s,e) Equivalente a la funcion SPRITE COL. Como la funcion 
              BC, solo se permite usar conjuntamente con la instruc
              cion SYNCHRO.
   =V(v)      VU-meter. La funcion VU muestra uno de los canales de
              sonido y devuelve la intensidad de la voz actual. Este
              es un numero que oscila entre 0-255. Puedes usar esta
              informacion para animar objetos a la vez que la musica
              Vease tambien la funcion VUMETER de AMOS Basic.
                                                                165
   Control de programas AMAL desde el Basic
   ========================================
      AMAL  ON/OFF   (empieza/detiene un programa AMAL)
   AMAL ON ¡n¿
   Una vez que hayas definido tu programa AMAL, necesitaras ejecutar
   lo usando el comando AMAL ON. Este activa el sistema AMAL y empie
   za tu programa desde la primera instruccion.
      AMAL ON activa todos tus programas. El parametro opcional "N"
   te permite iniciar una rutina en un determinado tiempo.
      AMAL OFF ¡n¿
   Detiene uno o todos los programas AMAL de su ejecucion. Esos pro
   gramas se reiniciaran cuando se desee redefiniendolos de nuevo
   con una llamada al comando AMAL.
      AMAL FREEZE   (congela temporalmente un programa AMAL)
   AMAL FREEZE ¡n¿
   Detiene la ejecucion de uno o mas programas AMAL. Tus programas
   podran reinicializarse en cualquier momento, usando una simple
   llamada AMAL ON. Advierte que esta instruccion debera ser siempre
   usada para detener a AMAL antes de que se ejecute un comando como
   DIR, de otro modo surgiran alteraciones visuales.
      = AMREG =     (da el valor de un registro externo AMAL)
   r=AMREG (n,¡channel¿)
   AMREG(n,¡channel¿)= expression
   Esta funcion te permite acceder al contenido de los registros in-
   ternos y externos de AMAL, de forma directa desde el Basic. "N"
   es el numero del registro. Los valores posibles van desde 0 a 25,
   el 0 representa al RA y el 25 al RZ.
      Utilizando el parametro opcional "channel"  podras hacer refe-
   rencia a cualquier registro interno de AMAL. En este caso, "N" va
   de 0 a 9, representando de R0 a R9.
      Los siguientes ejemplos muestran como es posible recuperar la
   posicion X del sprite actual desde el Basic:
      Load "AMOS_DATA:Sprites/Octopus.abk":Get sprite palette
      Channel 1 to Sprite 8: Sprite 8,100,100,1
      A$="Loop: Let RX=X+1 ; Let X+RX ; Pause ; Jump Loop"
      Amal 1,A$: Amal On : Curs Off
      Do
        Locate 0,0
        Z=ASC("X")-65: Rem advierte el uso de ASC para obtener el
                       registro pt
        Print Amreg(ASC("X")-65)
      Loop
                                                                166
      AMPLAY     (controla una animacion originada por PLay)
   AMPLAY tempo,direction (¡start to end¿)
   Cualquier secuencia de movimiento que hayas producido mediante el
   comando PL de AMAL se controla a traves de los registros internos
   R0 y R1. A cada objeto se le asignara su propio juego de regis-
   tros AMAL. Asi, si estas animando varios objetos, a menudo necesi
   taras cargar un numero de esos registros con exactamente los mis-
   mos valores.
      Pese a que esto puede solucionarse utilizando la funcion AMREG
   obviamente es mucho mas facil si fuera posible realizarlo median-
   te un simple instruccion que te permita cambiar R0 y R1 para la
   totalidad de objetos que se muevan a la vez. Este es el proposito
   del comando AMPLAY.
      AMPLAY contiene el "tempo" y la "direccion" de tus movimientos
   y los carga en los registros R0 y R1 en los canales seleccionados
   "TEMPO" controla la velocidad de tus objetos en pantalla. Estable
   ce un retraso (en cincuentavos de segundo) entre cada paso sucesi
   vo del movimiento. "DIRECCION" cambia la direccion del movimiento
   He aqui una lista con las diferentes opciones:
      Valor       Direccion
      -----       ---------
        >0        Mueve el objeto seleccionado en la direccion ori-
                 ginal del movimiento
        0         Invierte el movimiento y desplaza hacia atras al
                 objeto
        -1        Aborta el modelo de movimiento y  salta a la sigui
                 ente instruccion de tu secuencia de animacion AMAL
      Por defecto, esta instruccion afectara a todos los canales de
   animacion. Esto puede evitarse añadiendo los parametros especifi-
   cos "start" y "end". "START" es el numero de canal del primer ob-
   jeto a modificar y "END" contiene el numero de canal asignado al
   ultimo objeto a modificar. Ten en cuenta que tanto el "tempo" co-
   mo la "direccion" pueden ser omitidos si se desea. Ejemplos:
      Amplay ,0            : Rem invierte tus objetos
      Amplay 2,            : Rem ralentiza tu patron de movimientos
      Amplay ,-1, 3 to 6   : Rem detiene el movimiento de los cana-
                             les 3, 4, 5 y 6
      = CHANAN    (testea una animacion AMAL)
   s=CHANAN(channel)
   Esta es una simple funcion que chequea el status de una secuencia
   de animacion AMAL y devuelve -1 (cierto) si esta actualmente acti
   va o 0 (falso) si ya hubiera sido ejecutada. "CHANNEL" contiene
   el numero del canal a ser chequeado.
                                                                 167
      = CHANMV    (chequea si un objeto esta aun en movimiento)
   s= CHANMV(channel)
   Devuelve un valor de -1 si el objeto especificado por "channel"
   esta actualemente en movimiento, en caso contrario sera 0 (Falso)
     Este comando puede usarse conjuntamente con la instruccion Move
   de AMAL para chequear si una secuencia de movimiento ha agotado
   todos sus pasos. Ahora podras volver a empezar la secuencia en la
   nueva posicion con una cadena de movimiento mas apropiado si fue
   ra necesario. Ejemplo:
      Load "AMOS_DATA:Sprites/Monkey_right.abk":Get Sprite Palette
      Sprite 9,150,150,11
      M$=Move 300,150,150 ; Move -300,-150,75"
      Amal 9,M$ :Amal on
      While Chanmv (9)
      Wend
      Print "Movimiento completo"
   Errores de AMAL
   ===============
      = AMALERR    (devuelve la posicion de un error)
   p=AMALERR
   Devuelve la posicion en la actual cadena de animacion donde se
   ha producido un error. Una inspeccion cuidadosa de esta cadena te
   permitira rapidamente corregir tus errores. Ejemplo:
      Load "AMOS_DATA:Sprites/Octopus.abk"
      Sprite 8,100,100,1
      A$="L: IF X=300 them Jump L else X=X+1 ; Jump L"
      Amal 8,A$
      Este programa generara un mensaje de error de sintaxis porque
   IF sera interpretado como dos instrucciones, a saber I y F. Para
   encontrar la posicion dentro de la cadena de animacion de este
   error, teclea la siguiente instruccion desde la ventana directa:
      Print Mid$(A$,Amalerr,Amalerr+5)
   1- Mensajes de error
     Si cometes un error en alguno de tus programas AMAL, AMOS re-
   gresara al Basic mostrando un apropiado mensaje de error. He aqui
   una completa lista de dichos errores que pueden ser generados por
   este sistema, junto con una explicacion de sus causas mas frecuen
   tes:
                                                                168
   Bank not reserved: Este error aparece cuando intentas llamar a la
   instruccion PLay sin haber cargado primero un banco de memoria
   conteniendo los datos del movimiento. Este banco puede crearse 
   mediante un programa accesorio de AMAL. Si no se debe a PLay, en-
   tonces comprueba que hayas separado correctamente instrucciones
   como Pause y Let.
   Instruction only valid in Autotest: Has llamado por despite al
   modo Direct o la instruccion eXit.
   Illegal instruction in Autotest: El autotest solo podra usarse en
   conjuncion con ciertos comandos AMAL. No es posible mover o ani-
   mar nuestros objetos de cualquier forma dentro de un autotest.
   Asi que debes buscar comandos erroneos del tipo Move, Anim o un
   For...Next.
   Jump To/Within Autotest in animation string: Los comandos dentro
   de una funcion autotest estan completamente separados de tu pro-
   grama principal AMAL. Asi AMAL no te permitira saltar directamen-
   te a un procedimiento de autotest. Para abandonar un autotest y
   regresar a tu programa principal AMAL, debes usar los comandos
   eXit o Direct.
   Label already defined in animation string: Has intentado definir
   la misma etiqueta dos veces en tu programa AMAL. Todas las etique
   tas AMAL se componen de solo una letra mayuscula. Asi "Test" y 
   "Total" son dos versiones de la misma etiqueta "T". Este error se
   generara tambien si separas accidentalmente dos instrucciones por
   un par de puntos (:). Sera mejor que utilices el punto y coma.
   Label not defined in animation string: Este error se genera cuan-
   do intentas saltar a una etiqueta que no ha sido definida previa-
   mente en tu cadena de animacion.
   Next without For in animation string: Como su equivalente Basic,
   cada comando For debe ser igualado por su correspondiente Next.
   Comprueba todos los bucles, especialmente los anidados, en busca
   del Next sobrante.
   Syntax error in animation string: Has cometido un error al tecle-
   ar alguna de tus cadenas de animacion. Es facil cometer este tipo
   de errores de forma accidental al teclear una instruccion AMAL,
   como ocurre con su equivalente Basic.
   Canales de animacion
   ====================
      AMOS te permite ejecutar hasta 64 programas AMAL distintos y 
   de forma simultanea. Cada programa sera asignado a un canal espe-
   cifico de animacion. Solo los primeros 16 canales pueden ser eje-
   cutados mediante interrupciones. Si necesitas animar mas objetos,
   tendras que apagar las interrupciones usando el comando SYNCHRO
   OFF. Podras ahora correr los programas AMAL paso a paso usando 
   una explicita llamada al comando SYNCHRO en el bucle del programa
   principal. Por defecto, todos los canales de interrupcion se asig
   nan al sprite hardware relevante.
                                                                169
      CHANNEL    (asigna un objeto a un canal AMAL)
   CHANNEL n TO object s
   El comando CHANNEL asigna un canal de animacion a una pantalla en
   particular "object". En AMAL, no tendras restricciones para un
   solo canal por objeto. Cualquier simple pantalla puede ser fiel-
   mente animada con varios canales si fuera necesario. Existen va-
   rias formas de esta instruccion.
   1- Animacion de un sprite computerizado
      CHANNEL n TO SPRITE s
   Este comando asigna el sprite numero s al canal n. Por defecto,
   los canales 0-7 son automaticamente reservados para sus sprites
   hardwares equivalentes, mientra que los canales 8-15 se reservan
   para los apropiados sprites computerizados.
      Al objeto de animar los sprites computerizados del 16 en ade-
   lante, necesitaras posicionarlos directamente en un canal de ani-
   macion mediante el comando CHANNEL. Como es normal, los numeros 
   de sprite 8-63 especifican sprites computerizados en vez de spri-
   tes hardware. Por ejemplo:
      Channel 5 to sprite 8: Rem anima el sprite computerizado 8
                                 utilizando el canal 5
      Los registros X e Y de tu programa AMAL, ahora se refieren a
   las coordenadas hardware del sprite seleccionado. De forma simi-
   lar la imagen del sprite actual se almacena en el registro A.
   2- Animacion de un bob
      CHANNEL n TO BOB b
   Posiciona un bob en el canal de animacion "N". Este objeto sera
   considerado de forma identica al caso anterior. La unica diferen-
   cia radica en que los registros X e Y ahora contienen la posicion
   del bob en coordenadas de pantalla.
      Ten en cuenta que si has activado el "switching" de pantalla
   con el comando DOUBLE BUFFER, este sera usado automaticamente 
   para todas las animaciones de bobs.
   3- Moviendo una pantalla
      AMOS Basic te permite posicionar libremente la pantalla actual
   en cualquier lugar de tu monitor. Normalmente esto se controla 
   con la instruccion SCREEN DISPLAY. Sin embargo, a veces es util
   ser capaz de mover la pantalla mediante interrupciones:
                                                                 170
      CHANNEL n TO SCREEN DISPLAY d
   Este comando establece un canal "N" para la pantalla numero "D".
   La pantalla D puede ser definida en cualquier parte de tu progra-
   ma. Solo se producira un error si la pantalla no ha sido abierta
   cuando comiences la animacion.
     Las variables X e Y de AMAL, ahora contienen la posicion de tu
   pantalla en coordenadas hardware. El registro A NO sera utilizado
   por esta opcion y por tanto no podras animar pantallas mediante
   Anim. Por otro lado, todas las instrucciones estandards de AMAL 
   se ejecutaran normalmente. Podras facilmente usar este sistema
   para "botar" el dibujo a lo largo del monitor. Ejemplos:
      Load IFF "AMOS_DATA:IFF/Frog_Screen.IFF",1
      Channel 0 to screen display 1
      Amal 0, "Loop: Move 0,200,100 ; Move 0,-200,100 ; Jump Loop"
      Amal On 0: Direct
      Load IFF "AMOS_DATA:IFF/Frog_Screen.IFF",1
      Channel 0 to screen display 1
      :Rem la pantalla solo puede mostrarse en ciertas coordenadas X
      Amal 0,"Loop: Let X=XM ; Let Y=YM ; Pause ; Jump Loop"
      Amal On: Direct
   4- Scrolling mediante Hardware
      Pese a que el scrolling puede realizarse mediante el comando
   SCREEN OFFSET de AMOS Basic, es a menudo mas facil, animar tus 
   pantallas usando AMAL, ya que este produce un efecto mucho mas
   suave.
      CHANNEL    n TO  SCREEN  OFFSET d
   Esto asigna el programa AMAL numero N a la pantalla d, para la
   realizacion de un scrolling. Los registros X e Y ahora se referi-
   ran a la seccion de pantalla que sera mostrada en tu monitor. Si
   cambias esos registros se producira un scroll de la pantalla visi
   ble a lo largo de tu monitor. He aqui un ejemplo:
      Screen Open 0,320,500,32,lowres: Rem abre pantalla extralarga
      Screen Display 0,,45,320,250
      Load Iff "AMOS_DATA:IFF/Magic_screen.IFF"
      Screen copy 0,0,0,320,250 TO 0,0,251
      Screen 0: Flash off: Get Palette (0)
      Channel 0 to Screen Offset 0
      Amal 0,"Loop:Let X=XM-128 ; Let Y=YM-45 ; Pause ; Jump Loop"
      Amal On: Wait Key
      Este programa te permite realizar un scroll de la pantalla uti
   lizando para ello el raton. Intenta mover el raton en modo direc-
   to.
                                                                 171
   5- Cambio del tamaño de pantalla
      CHANNEL n TO SCREEN SIZE s
   Esto te permitira cambiar el tamaño de la pantalla utilizando pa-
   ra ello AMAL. "S" es el numero de la pantalla que va a ser manipu
   lada. Los registros X e Y ahora controlan la anchura y altura de
   la pantalla respectivamente. Son similares a los parametros W y H
   usados en el comando SCREEN DISPLAY. Ejemplo:
      Load Iff "AMOS_DATA:IFF/Magic_screen.IFF",0
      Channel 0 TO screen size 0
      Screen Display 0,,,320,1: Rem establece tamaño pantalla en 1
      A$="Loop: For R0=0 To 255 ; Let Y=R0 ; Next R0; "
      A$=A$+"For R0= 0 To 254; Let Y=255-R0; Next R0; Jump Loop"
      Amal 0,A$: Amal On: Direct
   6- Arcos iris
      CHANNEL n TO RAINBOW r
   Esta opcion genera un efecto de arco iris dentro de un programa
   AMAL. Como es habitual, "N" es el numero del canal de animacion 
   de 0 a 63. "R" es un numero de identificacion de tu arco iris (Va
   de 0 a 3).
      X contiene la BASE actual de tu arco iris. Este es el primer
   color de la paleta de tu arco iris que aparecera. Cambiandolo,
   este aparecera al reves. Y contiene la linea de pantalla en la 
   que el efecto arco iris tendra comienzo. Si cambias este valor,
   el efecto arco iris se movera de arriba a abajo. Todas las coorde
   nadas se miden en formato Hardware.
      El registro A almacena la altura de tu arco iris en pantalla.
   Vease el comando Basic RAINBOW para mas detalles.
   Tecnicas avanzadas
   ==================
   1- El sistema AUTOTEST
      Normalmente todos los programas AMAL se ejecutan en estricto
   orden desde el comienzo hasta el final. Inevitablemente algunos
   comandos como Move y For...Next requieren varios segundos para su
   realizacion. Pere a esto, en la mayoria de los casos no se produ-
   cen retrasos considerables en la ejecucion de los programas. Mira
   el siguiente ejemplo:
      Load "AMOS_DATA:Sprites/Octopus.abk": Get Sprite Palette
      Sprite 8,130,50,1
      Amal 8,"Loop: Let R0=XM-X ; Let R1=YM-Y ; Move R0,R1,50 ; J L"
      Amal On: Direct
                                                                 172
      Cuando muevas el raton, se supone que el sprite seguira este
   movimiento a lo largo de la pantalla. Sin embargo, en realidad la
   respuesta es bastante perezosa, debido a que los nuevos valores
   de XM y de YM se introducen solo despues de que el movimiento del
   sprite haya concluido. Intenta mover el raton en circulos. Ahora
   el pulpo esta completamente despistado.
      AUTOTEST resuelve este problema realizando tus tests al princi
   pio de cada VBL y antes de continuar con el programa principal.
   Tus tests se producen ahora a intervalos regulares de cincuentavo
   de segundo, obteniendo una respuesta practicamente instantanea.
   2- Comandos de AUTOTEST
      La sintaxis de Autotest es la siguiente:
   * AUtotest (test)
      Puede consistir en cualquiera de los siguientes comandos AMAL
   * Let reg=exp
      Esta es la instruccion AMAL estandard. Asigna el resultado de
     una expresion al registro reg.
   * Jump label
      Este comando salta a otra parte del actual autotest. "Label" 
     se define mediante dos puntos (:) y debe incluirse dentro del
     parentesis del autotest
   * eXit
     Abandona el autotest y regresa al programa principal.
   * Wait
     Desactiva completamente el programa AMAL, y solo ejecuta el
    autotest
   * If
     Al objeto de simplificar el proceso de testeo dentro de una ru
    tina de autotest, contamos con una version del comando If que ya
    vimos en AMAL. Esto te permite tomar alguna decision dependiendo
    del resultado de la expresion logica "exp":
     - If exp Jump L   (salta a otra parte de autotest)
     - If exp Direct L (Elige parte del programa a ejecutar tras AU)
     - If exp eXit     (Abandona el autotest -AU-)
   * On
     Reinicia el programa principal despues de una instruccion pre-
    via WAIT. Esto te permite esperar algun acontecimiento como pul-
    sar el raton, sin recurrir el procesador de tiempo.
   * Direct label
     Este comando cambia el punto en donde el programa principal con
    tinuara despues de un autotest. AMAL saltara automaticamente a
    ese punto en el siguiente VBL. Ten presente que debe ser defini-
    do fuera del parentesis del autotest.
                                                                 173
   3- Autotest Interno
      He aqui el ejemplo anterior reescrito utilizando el procedi-
   miento de Autotest
      Load "AMOS_DATA:Sprites/Octopus.abk"
      Sprite 8,130,50,1: Get Sprite Palette
      A$="AUtotest (If R0 <> XM Jump Update"
      A$=A$+"If R1 <> YM Jump Update else eXit"
      A$=A$+"Update: Let R0=XM ; Let R1=YM ; Direct M)":Rem Final AU
      A$=A$+"M: Move R0-X, R1-Y, 20 Wait;": Rem cambia el valor 20 
      Amal 8,A$: Amal On
      Ahora el sprite lentamente seguira al raton, no importa a la
   velocidad que lo muevas. La accion de este programa es la siguien
   te: cada cincuentavo de segundo las coordenadas del raton son com
   probadas mediante las funciones XM e YM. Si no se cambian hasta
   el ultimo test, el AUtotest se desactiva mediante el comando eXit
   El programa principal continuara precisamente donde se abandono.
      Sin embargo, el raton ha sido movido, la rutina de autotest
   reiniciara el programa principal otra vez desde el principio (la-
   bel M) usando las nuevas coordenadas de XM e YM respectivamente.
   Consideraciones sobre el tiempo
   ===============================
      UPDATE  EVERY    (reserva parte del tiempo para tus programas
                        Basic)
   UPDATE EVERY n
   Pese a que la mayoria de programas AMAL se ejecutan de forma casi
   instantanea, ciertos objetos que se manipulan necesitan ser expli
   citamente dibujados en la pantalla del Amiga.
     La cantidad de tiempo requerido para este proceso de actualiza-
   cion es impredecible y puede variar durante el curso de tu progra
   ma. Esto puede ocasionar un desagradable temblor en los patrones
   de movimiento de ciertos objetos.
     El comando UPDATE EVERY ralentiza el proceso de actualizacion
   de forma que incluso el mayor objeto pueda dibujarse durante una
   sola fase de actualizacion. Esto regula el sistema de animacion y
   genera agradables y suaves efectos de movimiento.
     "N" es el numero de VBL entre cada actualizacion de pantalla.
   En la practica podra comenzar con un valor de 2, y aumentarlo gra
   dualmente hasta suavizar el movimiento.
     Un util efecto colateral de este comando es que reserva tiempo
   para la realizacion de tu programa en Basic. Con un uso razonable
   de esta instruccion, es posible a veces, acelerar tus programas
   hasta un 30% sin afectar la suavidad de tus secuencias de anima-
   cion.
                                                                174
   Superando el limite de 16 objetos
   =================================
      SYNCHRO     (ejecuta directamente un programa AMAL)
   SYNCHRO ¡ON/OFF¿
   Normalmente AMOS Basic te permitira ejecutar hasta 16 diferentes
   programas AMAL de forma simultanea. Este limite es debido por la
   velocidad general que permite el Hardware del Amiga. Cada progra-
   ma de AMAL tiene su propia parte del procesador de tiempo. Asi si
   estas utilizando el sistema estandard de interrupciones, habra
   tiempo suficiente para ejecutar alrededor de 16 programas por se-
   parado.
      El comando SYNCHRO te permite sobrepasar esta limitacion al
   ejecutar programas AMAL directamente desde el Basic. Gracias al
   uso de las interrupciones, todos los programas AMAL se ejecutaran
   mediante una simple llamada al comando SYNCHRO. Dado que los pro-
   gramas AMAL se ejecutan mucho mas rapidos que las rutinas en Ba-
   sic, tus animaciones apareceran deliciosamente suaves. Y ahora
   podras decidir cuando y donde deseas que se realicen las rutinas
   AMAL dentro de tus programas.
     Otra ventaja adicional es que ahora puedes incluir comandos de
   deteccion de colisiones como BOB COL y SPRITE COL directamente en
   tus rutinas AMAL. Puesto que dichos comandos no estaban permiti-
   dos dentro del sistema de interrupciones puesto que ellos hacen
   uso del chip BLITTER del Amiga, y esto seria imposible si estuvie
   ramos usando interrupciones.
     Antes de llamar a SYNCHRO, primero necesitaras apagar las inte
   rrupciones mediante SYNCHRO OFF. Es importante hacer esto antes
   de definir tus programas AMAL, pues de otro modo no seria posible
   usar numeros de canal superiores a 15 a menos que desearamos obte
   ner un mensaje de error.
     Debido a la potencia del sistema de animacion, es casi posible
   escribir programas arcade completamente en AMAL. Dejando a la pro
   gramacion en Basic para las pequeñas tareas como el manejo de la
   tabla de records y la carga de las ondas de ataque desde el disco
   El resultado sera indistinguible del codigo maquina. Un buen ejem
   plo lo constituye CARTOON CAPERS, el primer juego comercial com-
   pletamente escrito con AMOS.
                                                                 175
   Comandos de animacion STOS-compatibles
   ======================================  
      El Basic original STOS incluia un potente sistema de animacion
   que permitia mover los sprites usando complejos patrones de movi-
   miento mediante interrupciones. Con el paso del tiempo, dichos co
   mandos se hicieron muy populares.
      Pese a que hoy en dia han sido superados por el sistema AMAL,
   ellos nos permiten una simple introduccion a la animacion en el
   Amiga. Asi AMOS quiere ofrecerte todo el sistema de animacion de
   STOS como un complemento extra.
      Si pretendes convertir programas STOS en AMOS, necesitaras sa-
   ber los siguientes puntos:
   - A diferencia de STOS, los patrones de movimiento en AMOS Basic
     se asignan al canal de animacion que tu desees. Los comandos M
     (Move) pueden usarse para mover bobs, sprites o pantallas, y
     siempre usando la misma tecnica.
      Por defecto, todos los canales de animacion son asignados a
     los sprites hardware equivalentes. En la practica, encontraras
     mas facil sustituir bobs por los sprites estandards de STOS.
      No olvides llamar al DOUBLE BUFFER durante el proceso de ini-
     cializacion, so pena de obtener un movimiento tembloroso de tus
     bobs.
   - El mismo canal puede ser usado para los programas de animacion
     de STOS Y AMAL. Asi es facil ejecutar tus programas, una vez
     que han sido traducidos a AMOS Basic. El orden de ejecucion es:
      AMAL
      MOVE X
      MOVE Y
      ANIM
      MOVE X      (mueve un sprite horizontalmente)
   MOVE X n,m$
   Define un listado de movimientos horizontales que sera ejecutados
   seguidamente en el canal de animacion numero "N". N puede oscilar
   desde 0 a 15 y se refiere a un objeto que has asignado previamen-
   te mediante el comando CHANNEL. "m$" contiene una secuencia de 
   instrucciones que juntas determinan tanto la velocidad como la di
   reccion de tu objeto. Esos comandos se encierran entre parentesis
   y se introducen siguiendo el formato:
     (speed,step,count)
   No existe limite para el numero de comandos que quieras incluir
   en una cadena simple de movimiento, sino la cantidad de memoria
   disponible. "Speed" determina un retraso en cincuentavos de segun
   do entre cada sucesivo paso del movimiento. La velocidad puede va
   riar desde 1 (muy rapido) hasta 3276 (increiblemente lento).
                                                                 176
     "Step" especifica el numero de pixels que se movera el objeto
   durante cada operacion. Si el paso es positivo, el sprite se move
   ra a la derecha, y si es negativo, lo hara a la izquierda.
     La velocidad aparente del objeto depende de una combinacion de
   "speed" y "step". Grandes desplazamientos con una velocidad mode-
   rada producira un rapido movimiento del objeto pero lo hara de 
   forma temblorosa a lo largo de la pantalla. De forma parecida, un
   tamaño de paso pequeño, combinado con una alta velocidad tambien
   movera rapidamente el objeto, pero el movimiento sera mucho mas
   suave. Las velocidades mas rapidas deben obtenerse con desplaza-
   mientos de 10 o -10.
     "Count" determina el numero de veces que el movimiento se repe-
   tira. Los valores posibles van desde 0 hasta 32767. Un valor de 0
   ejecuta el patron de movimientos de forma indefinida.
     Por añadidura al comando anterior, podras adjuntar cualquiera 
   de estas instrucciones al final de tu cadena de movimiento. Pero
   la mas importante de todas es la instruccion "L" (por Loop), que
   regresa al principio de la cadena y la ejecuta de nuevo por com-
   pleto. Ejemplo:
      Load "AMOS_DATA:Sprites/Octopus.abk": Get Sprite Palette
      Sprite 1,130,100,1: Rem define el sprite 5
      Move X 1,"(1,5,60)(1,-5,60)L"
      Move On
   La opcion E te permite detener tu objeto cuando este alcance un
   punto concreto de la pantalla. Cambia la tercera linea del ejem-
   plo anterior por
      Move X 1,"(1,5,30)E100"
   Ten en cuenta que ese punto final funcionara solo si la coordena
   da X del objeto alcanza exactamente el valor designado original-
   mente en la instruccion. Si este valor fuera incrementado, el ob-
   jeto continuara su movimiento pese a haber sobrepaso el punto
   final, y el test fallara. Ejemplo:
      Load "AMOS_DATA:Sprites/Octopus.abk": Get Sprite Palette
      Channel 1 to Sprite 8: Channel 2 to Sprite 10
      Print At(0,5)+"Looking OK"
      Sprite 8,130,100,1
      Move X 1,"(1,10,30)(1,-10,30)L"
      Move On
      Print At(0,10)+"Now press a key": Wait Key
      Sprite 10,140,150,2
      Move X 2,"(1,15,20)L": Move On 2
      Print At(0,15)+"Oh Dear!":Wait Key
                                                                 177
      MOVE  Y     (Mueve un objeto verticalmente)
   MOVE Y n,m$
   Este instruccion complementa al comando anterior al capacitarte
   para mover un objeto verticalmente a lo largo de la pantalla. Co-
   mo antes, "N" se refiere al numero de una secuencia de animacion
   que tu has posicionado con el comando CHANNEL, y que oscila entre
   0 y 15.
      "m$" contiene una cadena de movimiento con un formato identico
   al caso anterior. Los desplazamientos positivos ahora correspon-
   den a un movimiento de bajada, mientras que los valores negativos
   originan un movimiento hacia arriba. Ejemplo:
      Load "AMOS_DATA:Sprites/Octopus.abk": Get Sprite Palette
      Channel 1 to sprite 8: Sprite 8,130,10,1
      Move Y 1,"10(1,1,180)L"
      Channel 2 to screen display 0
      Move Y 2,"(1,4,25)(1,-4,25)"
      Move On: Wait Key
      MOVE ON / OFF    (inicia/detiene un movimiento)
   MOVE ON/OFF ¡n¿
   Antes que tu patron de movimientos haya sido ejecutado, primero
   debera activarse mediante el comando MOVE ON.
      "N" hace referencia a la secuencia de animacion que deseas co-
   menzar, y puede oscilar de 0 a 15. Si fuera omitido entonces la
   totalidad de tus movimientos seran activados simultaneamente.
      MOVE OFF tiene exactamente el efecto opuesto: detiene la ac-
   tual secuencia de movimiento.
      MOVE  FREEZE    (suspende temporalmente los movimientos de
                       un sprite)
   MOVE FREEZE ¡n¿
   Este comando detiene temporalmente el movimiento de uno o mas ob-
   jetos en pantalla. Esos objetos pueden volver a moverse de nuevo
   mediante el comando MOVE ON.
      "N" es completamente opcional y especifica el numero de un ob-
   jeto simple que sera afectado por esta instruccion.
      = MOVON     (devuelve el status de movimiento)
   X=MOVON(n)
   MOVON chequea si un objeto en particular esta siendo movido por
   las instrucciones MOVE X y MOVE Y. Devolvera un valor -1 si el ob
   jeto esta en movimiento, y 0 si estuviera estacionario. No confun
   dirlo con el comando MOVE ON. Ten en cuenta tambien que MOVON bus
   ca los patrones de movimiento generados mediante el comando MOVE,
   asi que no detectara ninguna animacion generada por AMAL.
                                                                 178
      ANIM     (anima un objeto)
   ANIM n,a$
   Hace que un objeto entre en una secuencia de imagenes que produce
   un suave efecto de animacion en pantalla. Esas animaciones se eje
   cutan 50 veces por segundo, mediante el uso de interrupciones, de
   modo que pueden realizarse de forma simultanea con tus programas
   Basic.
      "N" es el numero de canal en el que un sprite o bob especifico
   sera animado por esta instruccion. "a$" contiene una serie de ins
   trucciones que definen tu secuencia de animacion. Cada operacion
   se divide en 2 componentes separados, encuadrados entre parente-
   sis.
      "Image" es el numero de la imagen que sera mostrada durante 
   cada fase de la animacion. "Delay" especifica la cantidad de tiem
   po que esta imagen aparecera detenida en pantalla (en unidades de
   cincuentavos de segundo). Ejemplo:
     Load "AMOS_DATA:Sprites/Octopus.abk": Get Sprite Palette
     Channel 1 to sprite 8: Sprite 8,200,100,1
     Anim 1,"(1,10)(2,10)(3,10)(4,10)"
     Anim On: Wait Key
     Como en la instruccion MOVE, existe tambien una orden L que te
   capacita para repetir tus animaciones continuamente. Asi, basta
   con cambiar el comando ANIM en el ejemplo previo por el siguiente
      Anim 1,"(1,10)(2,10)(3,10)(4,10)L"
      ANIM  ON/OFF     (inicia una animacion)
   ANIM ON/OFF ¡n¿
   Este comando activa una serie de animaciones que han sido previa-
   mente creadas mediante el comando ANIM. "N" especifica el numero
   de una secuencia individual de animacion para ser inicializada. 
   Si esta fuera omitida, entonces todas las actuales secuencias de
   animacion se inicializarian simultaneamente.
      ANIM OFF ¡n¿
   Detiene una o mas secuencias de animacion iniciadas previamente
   con ANIM ON.
      ANIM  FREEZE    (congela una animacion)
   ANIM FREEZE ¡n¿
   Congela temporalmente la actual secuencia de animacion en panta-
   lla. "N" elige una simple secuencia de animacion a ser suspendida
   Si no es incluyera, entonces todas las animaciones se veran afec-
   tadas. Dichas animaciones podran volver a ejecutarse con una sim-
   ple llamada a la instruccion ANIM ON.
                                                                 164
   Funciones AMAL
   ==============
   =XM          Devuelve la coordenada X del raton
   =YM          Devuelve la coordenada Y del raton
   =K1          Status de la tecla izquierda del raton (-1 =pulsada)
   =K2          Status de la tecla derecha
   =J0          Chequea joystick derecho.
   =J1          Chequea joystick izquierdo. Vease comando JOY
   =Z(n)        Numero aleatorio. Devuelve un numero aleatorio entre
              -32767 y 32768. Este numero puede limitarse a un rango
              especifico usando una mascara-BIT N. Una operacion lo-
              gica AND se realizara entre el numero aleatorio y la
              mascara para generar el resultado final. Asi, estable-
              ciendo N en un valor de 255, nos aseguraremos que los
              numeros oscilaran entre 0 y 255. Una vez que esta fun-
              cion haya sido optimizada por velocidad, el numero de-
              vuelto no sera totalmente aleatorio. Si realmente nece
              sitas numeros aleatorios, seria mejor generar valores
              numericos con la funcion Basic RND y luego cargarlos
              en un registro externo de AMAL con la funcion AMREG.
   =XH(s,x)   Convierte la coordenada de pantalla X en otra coorde-
              nada hardware
   =YH(s,y)   Convierte una coordenada de pantalla Y en formato hard
              ware
   =XS(s,x)   Conversion de coordenadas hardware a pantalla
   =YS(s,y)   Conversion de coordenadas hardware a pantalla
   =BC(n,s,e) Chequea colisiones entre bobs. BC es identico a la ins
              truccion equivalente de AMOS Basic BOB COL. Chequea el
              bob numero N para colisiones entre los bobs S hasta E.
              Si se detecta una colision, BC devolvera un valor de 
              -1, de otro modo sera 0. Esta instruccion no puede ser
              ejecutada dentro de una interrupcion. Asi solo es dis-
              ponible cuando estes ejecutando tus rutinas AMAL direc
              tamente desde el Basic con la instruccion SYNCHRO.
   =SC(n,s,e) Equivalente a la funcion SPRITE COL. Como la funcion 
              BC, solo se permite usar conjuntamente con la instruc
              cion SYNCHRO.
   =V(v)      VU-meter. La funcion VU muestra uno de los canales de
              sonido y devuelve la intensidad de la voz actual. Este
              es un numero que oscila entre 0-255. Puedes usar esta
              informacion para animar objetos a la vez que la musica
              Vease tambien la funcion VUMETER de AMOS Basic.
                                                                165
   Control de programas AMAL desde el Basic
   ========================================
      AMAL  ON/OFF   (empieza/detiene un programa AMAL)
   AMAL ON ¡n¿
   Una vez que hayas definido tu programa AMAL, necesitaras ejecutar
   lo usando el comando AMAL ON. Este activa el sistema AMAL y empie
   za tu programa desde la primera instruccion.
      AMAL ON activa todos tus programas. El parametro opcional "N"
   te permite iniciar una rutina en un determinado tiempo.
      AMAL OFF ¡n¿
   Detiene uno o todos los programas AMAL de su ejecucion. Esos pro
   gramas se reiniciaran cuando se desee redefiniendolos de nuevo
   con una llamada al comando AMAL.
      AMAL FREEZE   (congela temporalmente un programa AMAL)
   AMAL FREEZE ¡n¿
   Detiene la ejecucion de uno o mas programas AMAL. Tus programas
   podran reinicializarse en cualquier momento, usando una simple
   llamada AMAL ON. Advierte que esta instruccion debera ser siempre
   usada para detener a AMAL antes de que se ejecute un comando como
   DIR, de otro modo surgiran alteraciones visuales.
      = AMREG =     (da el valor de un registro externo AMAL)
   r=AMREG (n,¡channel¿)
   AMREG(n,¡channel¿)= expression
   Esta funcion te permite acceder al contenido de los registros in-
   ternos y externos de AMAL, de forma directa desde el Basic. "N"
   es el numero del registro. Los valores posibles van desde 0 a 25,
   el 0 representa al RA y el 25 al RZ.
      Utilizando el parametro opcional "channel"  podras hacer refe-
   rencia a cualquier registro interno de AMAL. En este caso, "N" va
   de 0 a 9, representando de R0 a R9.
      Los siguientes ejemplos muestran como es posible recuperar la
   posicion X del sprite actual desde el Basic:
      Load "AMOS_DATA:Sprites/Octopus.abk":Get sprite palette
      Channel 1 to Sprite 8: Sprite 8,100,100,1
      A$="Loop: Let RX=X+1 ; Let X+RX ; Pause ; Jump Loop"
      Amal 1,A$: Amal On : Curs Off
      Do
        Locate 0,0
        Z=ASC("X")-65: Rem advierte el uso de ASC para obtener el
                       registro pt
        Print Amreg(ASC("X")-65)
      Loop
                                                                166
      AMPLAY     (controla una animacion originada por PLay)
   AMPLAY tempo,direction (¡start to end¿)
   Cualquier secuencia de movimiento que hayas producido mediante el
   comando PL de AMAL se controla a traves de los registros internos
   R0 y R1. A cada objeto se le asignara su propio juego de regis-
   tros AMAL. Asi, si estas animando varios objetos, a menudo necesi
   taras cargar un numero de esos registros con exactamente los mis-
   mos valores.
      Pese a que esto puede solucionarse utilizando la funcion AMREG
   obviamente es mucho mas facil si fuera posible realizarlo median-
   te un simple instruccion que te permita cambiar R0 y R1 para la
   totalidad de objetos que se muevan a la vez. Este es el proposito
   del comando AMPLAY.
      AMPLAY contiene el "tempo" y la "direccion" de tus movimientos
   y los carga en los registros R0 y R1 en los canales seleccionados
   "TEMPO" controla la velocidad de tus objetos en pantalla. Estable
   ce un retraso (en cincuentavos de segundo) entre cada paso sucesi
   vo del movimiento. "DIRECCION" cambia la direccion del movimiento
   He aqui una lista con las diferentes opciones:
      Valor       Direccion
      -----       ---------
        >0        Mueve el objeto seleccionado en la direccion ori-
                 ginal del movimiento
        0         Invierte el movimiento y desplaza hacia atras al
                 objeto
        -1        Aborta el modelo de movimiento y  salta a la sigui
                 ente instruccion de tu secuencia de animacion AMAL
      Por defecto, esta instruccion afectara a todos los canales de
   animacion. Esto puede evitarse añadiendo los parametros especifi-
   cos "start" y "end". "START" es el numero de canal del primer ob-
   jeto a modificar y "END" contiene el numero de canal asignado al
   ultimo objeto a modificar. Ten en cuenta que tanto el "tempo" co-
   mo la "direccion" pueden ser omitidos si se desea. Ejemplos:
      Amplay ,0            : Rem invierte tus objetos
      Amplay 2,            : Rem ralentiza tu patron de movimientos
      Amplay ,-1, 3 to 6   : Rem detiene el movimiento de los cana-
                             les 3, 4, 5 y 6
      = CHANAN    (testea una animacion AMAL)
   s=CHANAN(channel)
   Esta es una simple funcion que chequea el status de una secuencia
   de animacion AMAL y devuelve -1 (cierto) si esta actualmente acti
   va o 0 (falso) si ya hubiera sido ejecutada. "CHANNEL" contiene
   el numero del canal a ser chequeado.
                                                                 167
      = CHANMV    (chequea si un objeto esta aun en movimiento)
   s= CHANMV(channel)
   Devuelve un valor de -1 si el objeto especificado por "channel"
   esta actualemente en movimiento, en caso contrario sera 0 (Falso)
     Este comando puede usarse conjuntamente con la instruccion Move
   de AMAL para chequear si una secuencia de movimiento ha agotado
   todos sus pasos. Ahora podras volver a empezar la secuencia en la
   nueva posicion con una cadena de movimiento mas apropiado si fue
   ra necesario. Ejemplo:
      Load "AMOS_DATA:Sprites/Monkey_right.abk":Get Sprite Palette
      Sprite 9,150,150,11
      M$=Move 300,150,150 ; Move -300,-150,75"
      Amal 9,M$ :Amal on
      While Chanmv (9)
      Wend
      Print "Movimiento completo"
   Errores de AMAL
   ===============
      = AMALERR    (devuelve la posicion de un error)
   p=AMALERR
   Devuelve la posicion en la actual cadena de animacion donde se
   ha producido un error. Una inspeccion cuidadosa de esta cadena te
   permitira rapidamente corregir tus errores. Ejemplo:
      Load "AMOS_DATA:Sprites/Octopus.abk"
      Sprite 8,100,100,1
      A$="L: IF X=300 them Jump L else X=X+1 ; Jump L"
      Amal 8,A$
      Este programa generara un mensaje de error de sintaxis porque
   IF sera interpretado como dos instrucciones, a saber I y F. Para
   encontrar la posicion dentro de la cadena de animacion de este
   error, teclea la siguiente instruccion desde la ventana directa:
      Print Mid$(A$,Amalerr,Amalerr+5)
   1- Mensajes de error
      Si cometes un error en alguno de tus programas AMAL, AMOS re-
   gresara al Basic mostrando un apropiado mensaje de error. He aqui
   una completa lista de dichos errores que pueden ser generados por
   este sistema, junto con una explicacion de sus causas mas frecuen
   tes:
                                                                168
   Bank not reserved: Este error aparece cuando intentas llamar a la
   instruccion PLay sin haber cargado primero un banco de memoria
   conteniendo los datos del movimiento. Este banco puede crearse 
   mediante un programa accesorio de AMAL. Si no se debe a PLay, en-
   tonces comprueba que hayas separado correctamente instrucciones
   como Pause y Let.
   Instruction only valid in Autotest: Has llamado por despite al
   modo Direct o la instruccion eXit.
   Illegal instruction in Autotest: El autotest solo podra usarse en
   conjuncion con ciertos comandos AMAL. No es posible mover o ani-
   mar nuestros objetos de cualquier forma dentro de un autotest.
   Asi que debes buscar comandos erroneos del tipo Move, Anim o un
   For...Next.
   Jump To/Within Autotest in animation string: Los comandos dentro
   de una funcion autotest estan completamente separados de tu pro-
   grama principal AMAL. Asi AMAL no te permitira saltar directamen-
   te a un procedimiento de autotest. Para abandonar un autotest y
   regresar a tu programa principal AMAL, debes usar los comandos
   eXit o Direct.
   Label already defined in animation string: Has intentado definir
   la misma etiqueta dos veces en tu programa AMAL. Todas las etique
   tas AMAL se componen de solo una letra mayuscula. Asi "Test" y 
   "Total" son dos versiones de la misma etiqueta "T". Este error se
   generara tambien si separas accidentalmente dos instrucciones por
   un par de puntos (:). Sera mejor que utilices el punto y coma.
   Label not defined in animation string: Este error se genera cuan-
   do intentas saltar a una etiqueta que no ha sido definida previa-
   mente en tu cadena de animacion.
   Next without For in animation string: Como su equivalente Basic,
   cada comando For debe ser igualado por su correspondiente Next.
   Comprueba todos los bucles, especialmente los anidados, en busca
   del Next sobrante.
   Syntax error in animation string: Has cometido un error al tecle-
   ar alguna de tus cadenas de animacion. Es facil cometer este tipo
   de errores de forma accidental al teclear una instruccion AMAL,
   como ocurre con su equivalente Basic.
   Canales de animacion
   ====================
      AMOS te permite ejecutar hasta 64 programas AMAL distintos y 
   de forma simultanea. Cada programa sera asignado a un canal espe-
   cifico de animacion. Solo los primeros 16 canales pueden ser eje-
   cutados mediante interrupciones. Si necesitas animar mas objetos,
   tendras que apagar las interrupciones usando el comando SYNCHRO
   OFF. Podras ahora correr los programas AMAL paso a paso usando 
   una explicita llamada al comando SYNCHRO en el bucle del programa
   principal. Por defecto, todos los canales de interrupcion se asig
   nan al sprite hardware relevante.
                                                                169
      CHANNEL    (asigna un objeto a un canal AMAL)
   CHANNEL n TO object s
   El comando CHANNEL asigna un canal de animacion a una pantalla en
   particular "object". En AMAL, no tendras restricciones para un
   solo canal por objeto. Cualquier simple pantalla puede ser fiel-
   mente animada con varios canales si fuera necesario. Existen va-
   rias formas de esta instruccion.
   1- Animacion de un sprite computerizado
      CHANNEL n TO SPRITE s
   Este comando asigna el sprite numero s al canal n. Por defecto,
   los canales 0-7 son automaticamente reservados para sus sprites
   hardwares equivalentes, mientra que los canales 8-15 se reservan
   para los apropiados sprites computerizados.
      Al objeto de animar los sprites computerizados del 16 en ade-
   lante, necesitaras posicionarlos directamente en un canal de ani-
   macion mediante el comando CHANNEL. Como es normal, los numeros 
   de sprite 8-63 especifican sprites computerizados en vez de spri-
   tes hardware. Por ejemplo:
      Channel 5 to sprite 8: Rem anima el sprite computerizado 8
                                 utilizando el canal 5
      Los registros X e Y de tu programa AMAL, ahora se refieren a
   las coordenadas hardware del sprite seleccionado. De forma simi-
   lar la imagen del sprite actual se almacena en el registro A.
   2- Animacion de un bob
      CHANNEL n TO BOB b
   Posiciona un bob en el canal de animacion "N". Este objeto sera
   considerado de forma identica al caso anterior. La unica diferen-
   cia radica en que los registros X e Y ahora contienen la posicion
   del bob en coordenadas de pantalla.
      Ten en cuenta que si has activado el "switching" de pantalla
   con el comando DOUBLE BUFFER, este sera usado automaticamente 
   para todas las animaciones de bobs.
   3- Moviendo una pantalla
      AMOS Basic te permite posicionar libremente la pantalla actual
   en cualquier lugar de tu monitor. Normalmente esto se controla 
   con la instruccion SCREEN DISPLAY. Sin embargo, a veces es util
   ser capaz de mover la pantalla mediante interrupciones:
                                                                 170
      CHANNEL n TO SCREEN DISPLAY d
   Este comando establece un canal "N" para la pantalla numero "D".
   La pantalla D puede ser definida en cualquier parte de tu progra-
   ma. Solo se producira un error si la pantalla no ha sido abierta
   cuando comiences la animacion.
     Las variables X e Y de AMAL, ahora contienen la posicion de tu
   pantalla en coordenadas hardware. El registro A NO sera utilizado
   por esta opcion y por tanto no podras animar pantallas mediante
   Anim. Por otro lado, todas las instrucciones estandards de AMAL 
   se ejecutaran normalmente. Podras facilmente usar este sistema
   para "botar" el dibujo a lo largo del monitor. Ejemplos:
      Load IFF "AMOS_DATA:IFF/Frog_Screen.IFF",1
      Channel 0 to screen display 1
      Amal 0, "Loop: Move 0,200,100 ; Move 0,-200,100 ; Jump Loop"
      Amal On 0: Direct
      Load IFF "AMOS_DATA:IFF/Frog_Screen.IFF",1
      Channel 0 to screen display 1
      :Rem la pantalla solo puede mostrarse en ciertas coordenadas X
      Amal 0,"Loop: Let X=XM ; Let Y=YM ; Pause ; Jump Loop"
      Amal On: Direct
   4- Scrolling mediante Hardware
      Pese a que el scrolling puede realizarse mediante el comando
   SCREEN OFFSET de AMOS Basic, es a menudo mas facil, animar tus 
   pantallas usando AMAL, ya que este produce un efecto mucho mas
   suave.
      CHANNEL    n TO  SCREEN  OFFSET d
   Esto asigna el programa AMAL numero N a la pantalla d, para la
   realizacion de un scrolling. Los registros X e Y ahora se referi-
   ran a la seccion de pantalla que sera mostrada en tu monitor. Si
   cambias esos registros se producira un scroll de la pantalla visi
   ble a lo largo de tu monitor. He aqui un ejemplo:
      Screen Open 0,320,500,32,lowres: Rem abre pantalla extralarga
      Screen Display 0,,45,320,250
      Load Iff "AMOS_DATA:IFF/Magic_screen.IFF"
      Screen copy 0,0,0,320,250 TO 0,0,251
      Screen 0: Flash off: Get Palette (0)
      Channel 0 to Screen Offset 0
      Amal 0,"Loop:Let X=XM-128 ; Let Y=YM-45 ; Pause ; Jump Loop"
      Amal On: Wait Key
      Este programa te permite realizar un scroll de la pantalla uti
   lizando para ello el raton. Intenta mover el raton en modo direc-
   to.
                                                                 171
   5- Cambio del tamaño de pantalla
      CHANNEL n TO SCREEN SIZE s
   Esto te permitira cambiar el tamaño de la pantalla utilizando pa-
   ra ello AMAL. "S" es el numero de la pantalla que va a ser manipu
   lada. Los registros X e Y ahora controlan la anchura y altura de
   la pantalla respectivamente. Son similares a los parametros W y H
   usados en el comando SCREEN DISPLAY. Ejemplo:
      Load Iff "AMOS_DATA:IFF/Magic_screen.IFF",0
      Channel 0 TO screen size 0
      Screen Display 0,,,320,1: Rem establece tamaño pantalla en 1
      A$="Loop: For R0=0 To 255 ; Let Y=R0 ; Next R0; "
      A$=A$+"For R0= 0 To 254; Let Y=255-R0; Next R0; Jump Loop"
      Amal 0,A$: Amal On: Direct
   6- Arcos iris
      CHANNEL n TO RAINBOW r
   Esta opcion genera un efecto de arco iris dentro de un programa
   AMAL. Como es habitual, "N" es el numero del canal de animacion 
   de 0 a 63. "R" es un numero de identificacion de tu arco iris (Va
   de 0 a 3).
      X contiene la BASE actual de tu arco iris. Este es el primer
   color de la paleta de tu arco iris que aparecera. Cambiandolo,
   este aparecera al reves. Y contiene la linea de pantalla en la 
   que el efecto arco iris tendra comienzo. Si cambias este valor,
   el efecto arco iris se movera de arriba a abajo. Todas las coorde
   nadas se miden en formato Hardware.
      El registro A almacena la altura de tu arco iris en pantalla.
   Vease el comando Basic RAINBOW para mas detalles.
   Tecnicas avanzadas
   ==================
   1- El sistema AUTOTEST
      Normalmente todos los programas AMAL se ejecutan en estricto
   orden desde el comienzo hasta el final. Inevitablemente algunos
   comandos como Move y For...Next requieren varios segundos para su
   realizacion. Pere a esto, en la mayoria de los casos no se produ-
   cen retrasos considerables en la ejecucion de los programas. Mira
   el siguiente ejemplo:
      Load "AMOS_DATA:Sprites/Octopus.abk": Get Sprite Palette
      Sprite 8,130,50,1
      Amal 8,"Loop: Let R0=XM-X ; Let R1=YM-Y ; Move R0,R1,50 ; J L"
      Amal On: Direct
                                                                 172
      Cuando muevas el raton, se supone que el sprite seguira este
   movimiento a lo largo de la pantalla. Sin embargo, en realidad la
   respuesta es bastante perezosa, debido a que los nuevos valores
   de XM y de YM se introducen solo despues de que el movimiento del
   sprite haya concluido. Intenta mover el raton en circulos. Ahora
   el pulpo esta completamente despistado.
      AUTOTEST resuelve este problema realizando tus tests al princi
   pio de cada VBL y antes de continuar con el programa principal.
   Tus tests se producen ahora a intervalos regulares de cincuentavo
   de segundo, obteniendo una respuesta practicamente instantanea.
   2- Comandos de AUTOTEST
      La sintaxis de Autotest es la siguiente:
   * AUtotest (test)
      Puede consistir en cualquiera de los siguientes comandos AMAL
   * Let reg=exp
      Esta es la instruccion AMAL estandard. Asigna el resultado de
     una expresion al registro reg.
   * Jump label
      Este comando salta a otra parte del actual autotest. "Label" 
     se define mediante dos puntos (:) y debe incluirse dentro del
     parentesis del autotest
   * eXit
     Abandona el autotest y regresa al programa principal.
   * Wait
     Desactiva completamente el programa AMAL, y solo ejecuta el
    autotest
   * If
     Al objeto de simplificar el proceso de testeo dentro de una ru
    tina de autotest, contamos con una version del comando If que ya
    vimos en AMAL. Esto te permite tomar alguna decision dependiendo
    del resultado de la expresion logica "exp":
     - If exp Jump L   (salta a otra parte de autotest)
     - If exp Direct L (Elige parte del programa a ejecutar tras AU)
     - If exp eXit     (Abandona el autotest -AU-)
   * On
     Reinicia el programa principal despues de una instruccion pre-
    via WAIT. Esto te permite esperar algun acontecimiento como pul-
    sar el raton, sin recurrir el procesador de tiempo.
   * Direct label
     Este comando cambia el punto en donde el programa principal con
    tinuara despues de un autotest. AMAL saltara automaticamente a
    ese punto en el siguiente VBL. Ten presente que debe ser defini-
    do fuera del parentesis del autotest.
                                                                 173
   3- Autotest Interno
      He aqui el ejemplo anterior reescrito utilizando el procedi-
   miento de Autotest
      Load "AMOS_DATA:Sprites/Octopus.abk"
      Sprite 8,130,50,1: Get Sprite Palette
      A$="AUtotest (If R0 <> XM Jump Update"
      A$=A$+"If R1 <> YM Jump Update else eXit"
      A$=A$+"Update: Let R0=XM ; Let R1=YM ; Direct M)":Rem Final AU
      A$=A$+"M: Move R0-X, R1-Y, 20 Wait;": Rem cambia el valor 20 
      Amal 8,A$: Amal On
      Ahora el sprite lentamente seguira al raton, no importa a la
   velocidad que lo muevas. La accion de este programa es la siguien
   te: cada cincuentavo de segundo las coordenadas del raton son com
   probadas mediante las funciones XM e YM. Si no se cambian hasta
   el ultimo test, el AUtotest se desactiva mediante el comando eXit
   El programa principal continuara precisamente donde se abandono.
      Sin embargo, el raton ha sido movido, la rutina de autotest
   reiniciara el programa principal otra vez desde el principio (la-
   bel M) usando las nuevas coordenadas de XM e YM respectivamente.
   Consideraciones sobre el tiempo
   ===============================
      UPDATE  EVERY    (reserva parte del tiempo para tus programas
                        Basic)
   UPDATE EVERY n
   Pese a que la mayoria de programas AMAL se ejecutan de forma casi
   instantanea, ciertos objetos que se manipulan necesitan ser expli
   citamente dibujados en la pantalla del Amiga.
     La cantidad de tiempo requerido para este proceso de actualiza-
   cion es impredecible y puede variar durante el curso de tu progra
   ma. Esto puede ocasionar un desagradable temblor en los patrones
   de movimiento de ciertos objetos.
     El comando UPDATE EVERY ralentiza el proceso de actualizacion
   de forma que incluso el mayor objeto pueda dibujarse durante una
   sola fase de actualizacion. Esto regula el sistema de animacion y
   genera agradables y suaves efectos de movimiento.
     "N" es el numero de VBL entre cada actualizacion de pantalla.
   En la practica podra comenzar con un valor de 2, y aumentarlo gra
   dualmente hasta suavizar el movimiento.
     Un util efecto colateral de este comando es que reserva tiempo
   para la realizacion de tu programa en Basic. Con un uso razonable
   de esta instruccion, es posible a veces, acelerar tus programas
   hasta un 30% sin afectar la suavidad de tus secuencias de anima-
   cion.
                                                                174
   Superando el limite de 16 objetos
   =================================
      SYNCHRO     (ejecuta directamente un programa AMAL)
   SYNCHRO ¡ON/OFF¿
   Normalmente AMOS Basic te permitira ejecutar hasta 16 diferentes
   programas AMAL de forma simultanea. Este limite es debido por la
   velocidad general que permite el Hardware del Amiga. Cada progra-
   ma de AMAL tiene su propia parte del procesador de tiempo. Asi si
   estas utilizando el sistema estandard de interrupciones, habra
   tiempo suficiente para ejecutar alrededor de 16 programas por se-
   parado.
      El comando SYNCHRO te permite sobrepasar esta limitacion al
   ejecutar programas AMAL directamente desde el Basic. Gracias al
   uso de las interrupciones, todos los programas AMAL se ejecutaran
   mediante una simple llamada al comando SYNCHRO. Dado que los pro-
   gramas AMAL se ejecutan mucho mas rapidos que las rutinas en Ba-
   sic, tus animaciones apareceran deliciosamente suaves. Y ahora
   podras decidir cuando y donde deseas que se realicen las rutinas
   AMAL dentro de tus programas.
     Otra ventaja adicional es que ahora puedes incluir comandos de
   deteccion de colisiones como BOB COL y SPRITE COL directamente en
   tus rutinas AMAL. Puesto que dichos comandos no estaban permiti-
   dos dentro del sistema de interrupciones puesto que ellos hacen
   uso del chip BLITTER del Amiga, y esto seria imposible si estuvie
   ramos usando interrupciones.
     Antes de llamar a SYNCHRO, primero necesitaras apagar las inte
   rrupciones mediante SYNCHRO OFF. Es importante hacer esto antes
   de definir tus programas AMAL, pues de otro modo no seria posible
   usar numeros de canal superiores a 15 a menos que desearamos obte
   ner un mensaje de error.
     Debido a la potencia del sistema de animacion, es casi posible
   escribir programas arcade completamente en AMAL. Dejando a la pro
   gramacion en Basic para las pequeñas tareas como el manejo de la
   tabla de records y la carga de las ondas de ataque desde el disco
   El resultado sera indistinguible del codigo maquina. Un buen ejem
   plo lo constituye CARTOON CAPERS, el primer juego comercial com-
   pletamente escrito con AMOS.
                                                                 175
   Comandos de animacion STOS-compatibles
   ======================================  
      El Basic original STOS incluia un potente sistema de animacion
   que permitia mover los sprites usando complejos patrones de movi-
   miento mediante interrupciones. Con el paso del tiempo, dichos co
   mandos se hicieron muy populares.
      Pese a que hoy en dia han sido superados por el sistema AMAL,
   ellos nos permiten una simple introduccion a la animacion en el
   Amiga. Asi AMOS quiere ofrecerte todo el sistema de animacion de
   STOS como un complemento extra.
      Si pretendes convertir programas STOS en AMOS, necesitaras sa-
   ber los siguientes puntos:
   - A diferencia de STOS, los patrones de movimiento en AMOS Basic
     se asignan al canal de animacion que tu desees. Los comandos M
     (Move) pueden usarse para mover bobs, sprites o pantallas, y
     siempre usando la misma tecnica.
      Por defecto, todos los canales de animacion son asignados a
     los sprites hardware equivalentes. En la practica, encontraras
     mas facil sustituir bobs por los sprites estandards de STOS.
      No olvides llamar al DOUBLE BUFFER durante el proceso de ini-
     cializacion, so pena de obtener un movimiento tembloroso de tus
     bobs.
   - El mismo canal puede ser usado para los programas de animacion
     de STOS Y AMAL. Asi es facil ejecutar tus programas, una vez
     que han sido traducidos a AMOS Basic. El orden de ejecucion es:
      AMAL
      MOVE X
      MOVE Y
      ANIM
      MOVE X      (mueve un sprite horizontalmente)
   MOVE X n,m$
   Define un listado de movimientos horizontales que sera ejecutados
   seguidamente en el canal de animacion numero "N". N puede oscilar
   desde 0 a 15 y se refiere a un objeto que has asignado previamen-
   te mediante el comando CHANNEL. "m$" contiene una secuencia de 
   instrucciones que juntas determinan tanto la velocidad como la di
   reccion de tu objeto. Esos comandos se encierran entre parentesis
   y se introducen siguiendo el formato:
     (speed,step,count)
   No existe limite para el numero de comandos que quieras incluir
   en una cadena simple de movimiento, sino la cantidad de memoria
   disponible. "Speed" determina un retraso en cincuentavos de segun
   do entre cada sucesivo paso del movimiento. La velocidad puede va
   riar desde 1 (muy rapido) hasta 3276 (increiblemente lento).
                                                                 176
     "Step" especifica el numero de pixels que se movera el objeto
   durante cada operacion. Si el paso es positivo, el sprite se move
   ra a la derecha, y si es negativo, lo hara a la izquierda.
     La velocidad aparente del objeto depende de una combinacion de
   "speed" y "step". Grandes desplazamientos con una velocidad mode-
   rada producira un rapido movimiento del objeto pero lo hara de 
   forma temblorosa a lo largo de la pantalla. De forma parecida, un
   tamaño de paso pequeño, combinado con una alta velocidad tambien
   movera rapidamente el objeto, pero el movimiento sera mucho mas
   suave. Las velocidades mas rapidas deben obtenerse con desplaza-
   mientos de 10 o -10.
     "Count" determina el numero de veces que el movimiento se repe-
   tira. Los valores posibles van desde 0 hasta 32767. Un valor de 0
   ejecuta el patron de movimientos de forma indefinida.
     Por añadidura al comando anterior, podras adjuntar cualquiera 
   de estas instrucciones al final de tu cadena de movimiento. Pero
   la mas importante de todas es la instruccion "L" (por Loop), que
   regresa al principio de la cadena y la ejecuta de nuevo por com-
   pleto. Ejemplo:
      Load "AMOS_DATA:Sprites/Octopus.abk": Get Sprite Palette
      Sprite 1,130,100,1: Rem define el sprite 5
      Move X 1,"(1,5,60)(1,-5,60)L"
      Move On
   La opcion E te permite detener tu objeto cuando este alcance un
   punto concreto de la pantalla. Cambia la tercera linea del ejem-
   plo anterior por
      Move X 1,"(1,5,30)E100"
   Ten en cuenta que ese punto final funcionara solo si la coordena
   da X del objeto alcanza exactamente el valor designado original-
   mente en la instruccion. Si este valor fuera incrementado, el ob-
   jeto continuara su movimiento pese a haber sobrepaso el punto
   final, y el test fallara. Ejemplo:
      Load "AMOS_DATA:Sprites/Octopus.abk": Get Sprite Palette
      Channel 1 to Sprite 8: Channel 2 to Sprite 10
      Print At(0,5)+"Looking OK"
      Sprite 8,130,100,1
      Move X 1,"(1,10,30)(1,-10,30)L"
      Move On
      Print At(0,10)+"Now press a key": Wait Key
      Sprite 10,140,150,2
      Move X 2,"(1,15,20)L": Move On 2
      Print At(0,15)+"Oh Dear!":Wait Key
                                                                 177
      MOVE  Y     (Mueve un objeto verticalmente)
   MOVE Y n,m$
   Este instruccion complementa al comando anterior al capacitarte
   para mover un objeto verticalmente a lo largo de la pantalla. Co-
   mo antes, "N" se refiere al numero de una secuencia de animacion
   que tu has posicionado con el comando CHANNEL, y que oscila entre
   0 y 15.
      "m$" contiene una cadena de movimiento con un formato identico
   al caso anterior. Los desplazamientos positivos ahora correspon-
   den a un movimiento de bajada, mientras que los valores negativos
   originan un movimiento hacia arriba. Ejemplo:
      Load "AMOS_DATA:Sprites/Octopus.abk": Get Sprite Palette
      Channel 1 to sprite 8: Sprite 8,130,10,1
      Move Y 1,"10(1,1,180)L"
      Channel 2 to screen display 0
      Move Y 2,"(1,4,25)(1,-4,25)"
      Move On: Wait Key
      MOVE ON / OFF    (inicia/detiene un movimiento)
   MOVE ON/OFF ¡n¿
   Antes que tu patron de movimientos haya sido ejecutado, primero
   debera activarse mediante el comando MOVE ON.
      "N" hace referencia a la secuencia de animacion que deseas co-
   menzar, y puede oscilar de 0 a 15. Si fuera omitido entonces la
   totalidad de tus movimientos seran activados simultaneamente.
      MOVE OFF tiene exactamente el efecto opuesto: detiene la ac-
   tual secuencia de movimiento.
      MOVE  FREEZE    (suspende temporalmente los movimientos de
                       un sprite)
   MOVE FREEZE ¡n¿
   Este comando detiene temporalmente el movimiento de uno o mas ob-
   jetos en pantalla. Esos objetos pueden volver a moverse de nuevo
   mediante el comando MOVE ON.
      "N" es completamente opcional y especifica el numero de un ob-
   jeto simple que sera afectado por esta instruccion.
      = MOVON     (devuelve el status de movimiento)
   X=MOVON(n)
   MOVON chequea si un objeto en particular esta siendo movido por
   las instrucciones MOVE X y MOVE Y. Devolvera un valor -1 si el ob
   jeto esta en movimiento, y 0 si estuviera estacionario. No confun
   dirlo con el comando MOVE ON. Ten en cuenta tambien que MOVON bus
   ca los patrones de movimiento generados mediante el comando MOVE,
   asi que no detectara ninguna animacion generada por AMAL.
                                                                 178
      ANIM     (anima un objeto)
   ANIM n,a$
   Hace que un objeto entre en una secuencia de imagenes que produce
   un suave efecto de animacion en pantalla. Esas animaciones se eje
   cutan 50 veces por segundo, mediante el uso de interrupciones, de
   modo que pueden realizarse de forma simultanea con tus programas
   Basic.
      "N" es el numero de canal en el que un sprite o bob especifico
   sera animado por esta instruccion. "a$" contiene una serie de ins
   trucciones que definen tu secuencia de animacion. Cada operacion
   se divide en 2 componentes separados, encuadrados entre parente-
   sis.
      "Image" es el numero de la imagen que sera mostrada durante 
   cada fase de la animacion. "Delay" especifica la cantidad de tiem
   po que esta imagen aparecera detenida en pantalla (en unidades de
   cincuentavos de segundo). Ejemplo:
     Load "AMOS_DATA:Sprites/Octopus.abk": Get Sprite Palette
     Channel 1 to sprite 8: Sprite 8,200,100,1
     Anim 1,"(1,10)(2,10)(3,10)(4,10)"
     Anim On: Wait Key
     Como en la instruccion MOVE, existe tambien una orden L que te
   capacita para repetir tus animaciones continuamente. Asi, basta
   con cambiar el comando ANIM en el ejemplo previo por el siguiente
      Anim 1,"(1,10)(2,10)(3,10)(4,10)L"
      ANIM  ON/OFF     (inicia una animacion)
   ANIM ON/OFF ¡n¿
   Este comando activa una serie de animaciones que han sido previa-
   mente creadas mediante el comando ANIM. "N" especifica el numero
   de una secuencia individual de animacion para ser inicializada. 
   Si esta fuera omitida, entonces todas las actuales secuencias de
   animacion se inicializarian simultaneamente.
      ANIM OFF ¡n¿
   Detiene una o mas secuencias de animacion iniciadas previamente
   con ANIM ON.
      ANIM  FREEZE    (congela una animacion)
   ANIM FREEZE ¡n¿
   Congela temporalmente la actual secuencia de animacion en panta-
   lla. "N" elige una simple secuencia de animacion a ser suspendida
   Si no es incluyera, entonces todas las animaciones se veran afec-
   tadas. Dichas animaciones podran volver a ejecutarse con una sim-
   ple llamada a la instruccion ANIM ON.
                                                              192
      AMOS Basic te permite asignar al teclado algunos de tus items
   de menu. Al pulsar esas teclas se interpretara exactamente que el
   usuario ha accedido a una determinada opcion del menu. Esto puede
   utilizarse conjuntamente con los comandos de menus de AMOS, inclu
   so con ON MENU.
      MENU  KEY    (asigna una tecla a un item del menu)
   MENU KEY(,,) TO c$
   MENU KEY(,,) TO scan ¡,shift¿
   Este comando te permite asignar cualquier tecla a un item de un 
   menu previamente definido. La unica limitacion consiste en que
   este item que has especificado, debe radicar en el nivel mas infe
   rior de nuestro menu. Asi no podras usar teclas para acceder a un
   submenu, ya que a cada tecla debe corresponder una opcion simple
   del menu.
      "C$" es una cadena que contiene un caracter simple que sera
   asignado a la opcion del menu. Cualquier caracter adicional de la
   cadena sera ignorado.
      A cada tecla del teclado del Amiga se le asigna su propio codi
   go individual. Asi mediante la utilizacion de este codigo, podras
   utilizar teclas dentro de un menu, sin que estas tengan un equiva
   lente ASCII. Como ejemplo, aqui tienes una lista de codigos que
   pueden usarse en tus menus:
      Codigo        Tecla
      ------        -----
      80-89         F1-F10
       95            Help
       69            Esc
      "SHIFT" es un mapa-BIT opcional que te permite comprobar la
   existencia de combinaciones de teclas de control como por ejemplo
   ALT+HELP o CONTROL+D. El formato de shift es el siguiente:
      BIT     Tecla chequeada      Notas
      ---     ---------------      -----
       0      SHIFT izquierda      Solo un SHIFT puede chequearse al
       1      SHIFT derecha                             mismo tiempo
       2      Caps Lock            Si esta en ON o en OFF
       3      CTRL
       4      ALT izquierda
       5      ALT derecha
       6      AMIGA izquierda      O tecla C= en algunos aparatos
       7      AMIGA derecha
      Ten presente que si activas mas de un bit de este modelo,
   tendras que presionar varias teclas simultaneamente para conse-
   guir llamar al item. Cualquiera de esas asignaciones a teclas,
   podra ser anulada simplemente con usar MENU KEY sin ningun para-
   metro a continuacion. Por ejemplo:
      Menu Key(1,10)
                                                                 193
      Con la ayuda del comando MENU KEY, realizar asignaciones al
   teclado para un menu, es una tarea facil, asi que incluyas este
   tipo de funciones en tus programas. He aqui un ejemplo que com-
   prueba la tecla de funcion F-10:
      Menu$(1)=" Function Keys "
      For A=1 to 10
        OPT$=" F"+STR$(a)+"  "
        Menu$(1,A)=OPT$
        Menu Key(1,A) to 79+A
      Next A
      Menu On
      Do
         If Choice then print "Pulsada tecla de funcion ";Choice(2)
      Loop
   3- Comandos de control de menu
   MENU ON ¡bank¿
   Activa un meno que ha sido previamente definido en tu programa. 
   El menu se visualizara cuando el usuario presione el boton dere-
   cho del raton, y la opciones podran ser seleccionadas de la forma
   habitual. Si se añade un numero de banco ("BANK"), entonces el me
   nu se tomara del consiguiente banco de memoria. Vease MAKE MENU
   BANK para mas detalles.
   MENU OFF
   Opuesto al anterior, desactiva temporalmente un menu. Va a conge-
   lar temporalmente la accion de todo el menu. Dicho menu podra vol
   verse a usar mediante MENU ON.
   MENU DEL
   Borra el menu seleccionado de la memoria del Amiga habilitando la
   memoria para el resto del programa. Existen 2 formatos posibles:
   a) Menu Del
       Borra todo el menu. ATENCION: esta orden es irreversible
   b) Menu Del(,,)
       Borra solo una parte del menu. Los parametros (,,) contienen
      un listado de hasta 8 valores separados por comas, que indican
      la posicion precisa de items en la jerarquia del menu. Ejemplo
         Menu Del(1): Rem borra el titulo numero 1
         Menu Del(1,2): Rem borra la opcion 2 del titulo 1
                                                                 194
      MENU  TO  BANK     (graba las definiciones de un menu dentro
                          de un banco de memoria)
   MENU TO BANK n
   Esta instruccion te permite grabar un arbol completo de menu en
   el banco de memoria "N". Si dicho banco ya existiera, obtendras
   un mensaje de error (Bank already reserved).
      Una vez almacenado un menu de este modo, se grabara automatica
   mente con el resto de tu programa Basic. El almacenamiento de las
   definiciones de menu en un banco de memoria, reducira significati
   vamente el tamaño del listado de tu programa. Esto dejara espacio
   disponible en la memoria de edicion, y te permitira escribir un
   mayor programa Basic usando la misma cantidad de memoria.
      BANK  TO  MENU     (recupera un menu grabado en un banco)
   BANK TO MENU N
   Recupera las definiciones de un menu desde el banco de memoria N.
   Tu menu sera habilitado exactamente en el mismo lugar de donde
   fue originalmente grabado. Si el menu es complejo, este proceso
   llevara algun tiempo. Para activar tu nuevo menu tendras que lla-
   mar a la instruccion MENU ON.
      MENU  CALC    (calcula otra vez un menu)
   MENU CALC
   Una de las mas atractivas caracteristicas de los menus AMOS es 
   que pueden facilmente cambiar a lo largo de un programa. Despues
   de que hayas creado tus definiciones iniciales, podras añadir nue
   vos items y reemplazar las opciones existentes.
      Todos tus items se reposicionaran automaticamente cuando se
   seleccione el menu con el boton derecho del raton. Si tus menus
   son extremadamente grandes, esto puede llevar algun tiempo. Este
   comando te permite realizar este proceso en el momento mas apro-
   piado de tu programa, evitando asi retrasos innecesarios.
      Ten presente que para evitar que el usuario haga llamadas al
   menu, mientras este esta siendo cambiado, se te avisara de que
   los menus estan congelados mediante el comando MENU OFF al inicio
   de este proceso. Posteriormente se podra acceder libremente con
   el comando MENU ON. Los menus desarrollados son particularmente
   utiles en los juegos de aventuras, ya que en cada situacion pue-
   den contener sus propias opciones que se actualizarian dependien-
   do de las diversas situaciones.
                                                                 195
   Comandos adicionales de menu
      Cualquier cadena de menu puede incluir opcionalmente un poten
   te juego de comandos adicionales que te permitiran personalizar
   la forma de tus menus hasta un punto increible. La lista de coman
   dos deben enmarcarse entre parentesis y separarse por dos puntos
   (:). Por ejemplo:
       Menu$(1)="(Locate 10,10 : Ink 1,1) Hello"
   Cada instruccion consiste en un par de caracteres que pueden es-
   tar tanto en mayusculas como en minusculas. Cualquier otra cosa
   sera ignorada completamente. La mayoria de los comandos requieren
   que indiques uno o dos parametros. Dichos numeros NUNCA se consi-
   deraran como expresiones. A continuacion presentamos el listado 
   de comandos.
      Recuerda que la sintaxis hemos puesto a los dos caracteres re-
   levantes en mayusculas o en negrita.
      BOb     (dibuja un bob) 
   BOb n
   El comando BOb dibuja el bob numero N en la actual posicion del
   cursor. No se tiene en cuenta al "hot spot" del bob y todas las
   coordenadas se mediran en funcion de la esquina supero-izquierda
   Tambien recuerda que el color 0 es habitualmente considerado como
   transparente. Esto se podra cambiar usando el comando NO MASK des
   de AMOS Basic. Por ejemplo:
      Load "AMOS_DATA:Sprites/Octopus.abk"
      Menu$(1)="(BOb 1) 1": Menu$(1,1)="(BOb 2) 2"
      Menu$(1,2)=(Bob 3) 3"
      Menu On: Wait Key
      ICon     (dibuja un icono)
   ICon n
   Dibuja el icono N en la actual posicion del cursor. Ten en cuenta
   que a diferencia de los bobs, el color 0 NO es habitualmente tras
   parente. Vease el comando Basic MAKE ICON MASK para mas detalles.
      LOcate   (mueve el cursor grafico)
   LOcate x,y
   Este comando mueve el cursor grafico a las coordenadas x,y medi-
   das en relacion a la esquina supero-izquierda de la linea de menu
   Ten presente que despues una instruccion el cursor grafico siem-
   pre sera reposicionado en la parte infero-derecha del objeto que
   acaba de dibujar. Esas coordenadas tambien seran usadas para de-
   terminar la posicion de cualquier otro item de tu menu, como:
                                                                 196
      Menu$(1)="Example ":Menu$(1,1)="Locate (Lo 50,50) in action "
      Menu$(1,2)="Guess my cords"
      Menu On: Wait Key
      INk     (establece color para tinta y papel)
   INk n,value
   El comando INK asigna los indices de color a usar por los colores
   PEN, PAPER y OUTLINE. He aqui una lista con las posibilidades:
      N       Efecto
     ---      ------
      1       Establece color de PEN
      2          "        "      PAPER
      3          "        "      OUTLINE
      SFont    (establece fuente)
   SFont n
   Este comando establece la actual fuente en la fuente GRAFICA nume
   ro N. Esto sera utilizado en todas los futuros items. Ten presen-
   te que debes llamar a GET FONTS antes de ejecutar este comando,
   de otro modo solo podras usar 2 fuentes. Ver ejemplo 16.5.
      SStyle    (establece estilo)
   SStyle N
   Este comando establece el estilo de la actual fuente en N, que se
   trata de un modelo-BIT con el siguiente formato:
        BIT     Efecto
        ---     ------
         0      Subrayado
         1      Negrita
         2      Italica
      LIne   (dibuja una linea)
   LIne x,y
   Este comando dibuja una linea desde la actual posicion del cursor
   hasta las coordenadas graficas X,Y. Ver ejemplo 16.6.
                                                                 197
      SLine   (establece el patron de linea)
   SLine p
   Establece el estilo de linea a usar en los siguientes comandos 
   LINE segun un modelo-BIT contenido en "P". Si no se incluye nin-
   guna expresion, este modelo sera siempre convertido a notacion
   decimal antes de usarse. Una demostracion simple de los posibles
   estilos de linea los podras encontrar en el ejemplo 16.7.
      BAr     (dibuja una barra)
   BAr x,y
   Este comando dibuja una barra rectangular desde las coordenadas
   actuales del cursor hasta X,Y. Ver ejemplo 16.8.
      OUtline    (enmarca una barra)
   OUtline flag
   Dibuja un borde en la actual color de outline (INK 3) alrededor
   de todas las siguientes barras. Un valor de 1 activa el borde y
   0 lo elimina.
      ELlipse    (dibuja una elipse)
   ELlipse r1,r2
   Dibuja un ovalo con los radios r1 y r2 en las coordenadas actua-
   les del cursor. Para dibujar un circulo basta con hacer coincidir
   el valor de r1 y r2. Vease ejemplo 16.9.
      PRoc      (llama a un procedimiento)
   PRoc name
   Esta instruccion te permite llamar a un procedimiento Basic direc
   tamente desde un menu. El procedimiento en cuestion no debe conte
   ner parametros, o de otra forma se produciria un mensaje de error
      Este comando permite personalizar el menu de acuerdo a tus pro
   pias necesidades sin tener que limitarte a los comandos disponi-
   bles de menu. Al objeto de explotar todas sus caracteristicas, ne
   cesitaras comprender un poco de teoria:
      Al comienzo de tu procedimiento los siguientes valores son al-
   macenados en los registros del procesador 68.000:
      Dreg(0)         X-Coord
   Este contiene la coordenada grafica X de la esquina supero-izqui-
   erda del actual item del menu. No debes dibujar tus graficos mas
   a la izquierda de este punto, ya que alterarias el proceso de re-
   dibujo del menu ocasionando efectos no deseados.
                                                                 198
      Dreg(1)         Y-Coord
   Este registro contiene la coordenada Y de dicho item. Como antes,
   deberas limitar tus operaciones graficas a la region por debajo
   de este punto para evitar posibles errores.
      Dreg(2)         Status de las operaciones graficas
   Este registro contiene el actual status de las operaciones del
   menu. Si tiene un valor de 0 (falso), el item del menu estara 
   siendo dibujado. En este caso necesitaras cargar Dreg(0) y Dreg
   (1) con las coordenadas de la esquina infero-derecha de tu zona
   de menu y volver inmediatamente del procedimiento. Si Dreg(0) es
   -1 (cierto) tendras plena libertad para realizar tus operaciones
   graficas en dicho procedimiento. Despues de que hayas acabado, 
   deberas reponer las coordenadas de la esquina infero-derecha del
   item en los registros Dreg(0) y Dreg(1).
      Dreg(3)         Status del item de menu
   Se cargara con un valor -1 si el menu esta sobreimpresionado y se
   esta mostrando la primera cadena del menu, de otro modo contiene
   el valor 0.
      Dreg(4)
   Se pone en -1 (cierto) cuando el ramal del menu es inicializado
      Areg(1)         Direccion de la zona reservada
   Esta es la direccion de la zona creada con RESERVE. Se usa para
   permitir que varios procedimientos se comuniquen entre si. Vease
   RESERVE para mas detalles.
      La estructura general de un procedimiento de menu es:
      Procedure ITEM
        If Dreg(2)
           X=Dreg(0):Y=Dreg(1)
           .... dibuja el item ...
        Endif
        Dreg(0)=BX
        Dreg(1)=BY
      End Proc
      Las dimensiones del item de menu visualizado en pantalla se
   obtienen en las coordenadas BX,BY. Dichos valores deben ser car-
   gados en los registros D0 y D1 antes de abandonar el procedimien
   to ya que ellos necesitan crear el final de la barra de menu.
      Mientras dentro de tu procedimiento, podras realizar la mayor
   parte de las instrucciones AMOS, incluyendo otros procedimientos.
   Pero algunas instrucciones estan totalmente prohibidas!! Si usas
   esos comandos, no obtendras mensaje de error, pero tu Amiga puede
   dañarse.
                                                                 199
   * NUNCA cambies de pantalla actual desde un menu
   * No establezcas o resetees una zona de pantalla
   * Evitar el uso de instrucciones como WAIT, WAIT KEY, INPUT o
     INKEY$
   * Las operaciones con discos estan completamente prohibidas
      REserve  (reserva area para las datas de un procedimiento)
   REserve n
   Reserva "N" bytes de memoria pra este item de menu. A esta area
   se podra acceder desde dentro de tu menu, usando la direccion con
   tenida en AREG(1). El area de datos creada, puede usarse para las
   cadenas del menu actual. Puede usarse para cambiar parametros en-
   tre los diversos procedimientos llamados por un item.
      MENU  CALLED   (Redibuja un item continuamente)
   MENU CALLED(,,)
   Redibuja automaticamente el item seleccionado 50 veces por segun-
   do cuando sea visualizado en pantalla. Usualmente se utiliza con-
   juntamente con un procedimiento de menu para generar items anima
   dos que cambian delante de tus ojos.
      Cuando uses esta funcion, primero necesitaras definir un proce
   dimiento de menu, usando los principios citados anteriormente. 
   Luego añades una llamada a este procedimiento en el titulo desea-
   do usando un comando MENU CALL. Cuando el usuario visualiza el 
   item elegido, se accedera repetidamente a tu procedimiento por el
   sistema de menu,
      Dado que se accede a tu procedimiento 50 veces por segundo,
   debe existir, obviamente, algo que haga regresar tan rapidamente
   como sea posible al menu. Esto te permitira tiempo suficiente 
   para ejecutar el resto de instrucciones del menu.
      Tambien ten presente que el procedimiento añadido al menu, pue
   de libremente animar item mediante bobs o sprites. Sin embargo,
   como los items de menu NO aceptan el DOUBLE BUFFER, tus bobs pue-
   den temblar levemente en pantalla. Asi sera mejor usar sprites 
   computerizados para este proposito. Otra posibilidad consiste en
   dibujar tu pantalla mediante los comandos graficos de AMOS. Un
   ejemplo de esto puede apreciarse en el ejemplo 16.11.
      MENU  ONCE     (anula el sistema automatico de redibujo)
   MENU ONCE(,,)
   Desactiva el sistema automatico de actualizaciones puesto en mar-
   cha con el comando anterior.
                                                                 200
   Estilos alternativos de menu
      Normalmente los titulos de un menu se muestran como una linea
   horizontal y las opciones se ordenan por debajo de el en una co-
   lumna vertical de opciones. Si deseas crear algo un poco original
   puedes cambiar el formato de cada nivel de tu menu, usando las
   siguientes 3 instrucciones:
      MENU  LINE  (Muestra un menu en una barra horizontal de items)
   MENU LINE level
   MENU LINE (,,)
   Este comando muestra las opciones del menu en el nivel deseado en
   forma de barra horizontal. Esta linea de menu comienza en la es-
   quina izquierda del primer titulo y alcanza la esquina inferior-
   derecha del ultimo.
   MENU LINE level
   Define el estilo de menu de todo un nivel de un menu. Solo podra
   llamarse durante la definicion de menu.
   MENU LINE(,,)
   Normalmente solo se podra usar el formato anterior. Pero a veces,
   es interesante remarcar algunos items individuales de la barra de
   menu, en dichos casos sera util este formato.
      MENU  TLINE   (Muestra un menu como una linea total)
   MENU TLINE level
   MENU TLINE(,,)
   Muestra una seccion del menu como una "linea total" que se extien
   de desde la parte mas izquierda de la pantalla hasta la parte mas
   a la derecha. Toda la linea sera dibujada incluso cuando el item
   deseado se encuentre en el centro de la pantalla.
      "LEVEL" es un numero que oscila entre 1-8 que especifica la
   parte del menu que sera afectada. Esta es la forma estandard de
   la instruccion, y debera ser usada solo durante las definiciones
   de menu, o de otro modo no producira efecto alguno.
      Tambien puedes cambiar la apariencia de un menu despues de que
   este haya sido creado, utilizando un segundo formato de esta ins-
   truccion. Por ejemplo:
      Menu Line(1,1): Rem muestra menu 1,1 como una linea)
                                                                 201
      MENU  BAR   (Muestra una seccion del menu como una barra)
   MENU BAR level
   MENU BAR (,,)
   Este comando muestra el item seleccionado en forma de columna o
   barra vertical. La anchura de esta barra se establece automatica-
   mente segun las dimensiones del mayor de los items de tu menu.
      "LEVEL" es el numero que indica que parte del menu actual va a
   ser afectada. Por defecto, esta opcion se usa para los niveles 2
   al 8 de tu menu. Ten presente que esta forma de instruccion solo
   puede emplearse durante la fase de definicion de tu programa.
      ",," es una lista de parametros que te permitiran cambiar el
   estilo de tus menus una vez que hayan sido instalados. He aqui un
   ejemplo de Menu Bar y Menu Tline:
      Flag=0
      SET_MEN
      Do
        If Choice and Choice(1)=2 And Choice(2)=1 then ALTER
      Loop
      Procedure SET_MEN
        Menu$(1)=" Bar Demo " : Menu$(2)=" Selecciona abajo "
        Menu$(1,1)=" No pasa nada !"
        Menu$(2,1)=" Si, pulsala  !"
        Menu On
      End Proc
      Procedure ALTER
        Shared ALTER
        Menu Del
        If Flag=0 then Menu Bar 1 :Flag=1 else Menu TLine 1 :Flag=0
        SET_MEN
      End Proc
      MENU  INACTIVE   (Desactiva un item de menu)
   MENU INACTIVE level
   MENU INACTIVE (,,)
   Como su nombre indica, este comando desactiva una serie de opcio
   nes de tu menu. Cualquier intento posterior de seleccionar dichos
   items sera totalmente ignorado. "LEVEL" te permitira desactivar
   una seccion completa del menu, pero tambien podras desactivar op-
   ciones individuales del menu con los paramtros (,,), que indica-
   ran la posicion exacta del item dentro de la jerarquia del menu.
      Ten presente que los items que hayas desactivado con esta ins-
   truccion seran sustituidos por la cadena INACTIVE$ que ya habras
   especificado durante el proceso de definicion de menus. Si dicha
   cadena fuera omitida, las opciones no disponibles o desactivadas
   del menu apareceran (por defecto) en italicas.
                                                                 202
      MENU  ACTIVE    (Activa un item de menu)
   MENU ACTIVE level
   MENU ACTIVE (,,)
   Simplemente invierte el efecto del comando anterior. Despues de
   que ejecutes esta instruccion, las opciones seleccionadas aparece
   ran automaticamente con sus titulos originales.
   Menus moviles
   =============
      Los menus de AMOS pueden presentarse en cualquier punto de la
   pantalla. Tambien, los menus podran moverse explicitamente por el
   usuario o bien desde tu programa.
      MENU  MOVABLE    (Activa el movimiento automatico de menu)
   MENU MOVABLE level
   MENU MOVABLE (,,)
   Informa al sistema de menus que los items del menu, del nivel es-
   pecificado por "LEVEL" pueden moverse directamente por el usuario
   Siendo este el valor por defecto.
     Existe un segundo formato del comando que te permite establecer
   el status de cada item individual de un menu. Los parametros en-
   tre parentesis pueden indicar una posicion cualquiera de la jerar
   quia del menu.
     Cualquier menu puede ser reubicado simplemente colocando el pun
   tero del raton sobre el primer item del menu pulsando el boton iz
   quierdo del raton. Una caja rectangular aparecera ahora sobre el
   item seleccionado, y este se movera a cualquier punto de la panta
   lla actual. Cuando sueltes el boton del menu se redibujara en la
   nueva posicion con todos los demas items asociados.
      Ten presente que este comando no te permite cambiar el ordena-
   miento de los items por debajo de este nivel. Si deseas manipular
   las opciones individuales del menu, necesitaras un comando MENU
   ITEM. Vease el ejemplo 16.12. para una demostracion de este siste
   ma.
      MENU  STATIC     (Fija un menu en un lugar)
   MENU STATIC level
   MENU STATIC (,,)
   Define el nivel ("LEVEL") de un menu que sera inamovible por el
   usuario. Uno de los problemas de los menus moviles es la cantidad
   de memoria que consumen al cambiar durante el curso de tu progra-
   ma. Si tus menus son particularmente grandes, o si la memoria de
   que dispones es escasa, esto podra ocasionar problemas para el
   usuario, con la obtencion de un mensaje de error (OUT OF MEMORY).
   Con la ayuda de este comando podras evitar esta dificultad por
   completo.
                                                                 203
      MENU  ITEM  MOVABLE   (Mueve opciones individuales de un menu)
   MENU ITEM MOVABLE level
   MENU ITEM MOVABLE (,,)
   Este comando es similar al comando MENU MOVABLE, con la unica di-
   ferencia de que te permite reordenar las diferentes opciones den
   tro de un nivel. De este modo, todos los items dentro de una ba-
   rra de menu podran ser individualmente reposicionados por el usua
   rio.
      Habitualmente es ilegal mover los items fuera de la barra de 
   menu, pero esto puede evitarse con el comando MENU SEPARATE. Al
   objeto de movilizar los items de un menu, TODA la barra de menu
   debera poderse mover. Asi si fijas en un lugar el menu mediante 
   el comando MENU STATIC, este comando no tendra tampoco efecto. De
   forma adicional, no puedes mover el primer item de una barra de
   menu hasta que no muevas toda la linea. Otro efecto es que movien
   do el ultimo item del menu se reducira permanentemente el tamaño
   de tu barra de menu. Para esto, existen 2 soluciones posibles:
   * Encerrar toda la barra con una caja rectangular, como sigue:
     Menu$(1,1)=,,,"(Bar 40,100)(Lov0,0)"
     En donde MENU$(1,1) es el primer item de tu barra actual
   * Fijar el ultimo item con MENU ITEM STATIC
      MENU  ITEM  STATIC   (Fija un item)
   MENU ITEM STATIC level
   MENU ITEM STATIC (,,)
   Este comando fija uno o mas items en un determinado lugar, y es
   el formato por defecto.
      MENU  SEPARATE      (Separa una lista de items de menu)
   MENU SEPARATE level
   MENU SEPARATE (,,)
   Indica a AMOS que separe todos los items de un nivel. Cada item
   del menu se tratara de forma completamente independiente del res-
   to. Si no has definido una cadena de fondo, cada item aparecera
   con dos pixels sobre el anterior. Esto crea un atractivo efecto 
   de escalera que puede eliminarse editando el menu con el acceso-
   rio MENU.
     Los parametros opcionales de esta instruccion te permiten divi-
   dir la barra de menu en cualquier parte de la linea. Una vez ha-
   yas separado un item, el solo se afectara por los comandos MENU
   MOVABLE, en vez de las instrucciones de ITEM.
                                                                 204
      MENU  LINKED      (une un juego de menus)
   MENU LINKED level
   MENU LINKED (,,)
   Este comando une uno o mas items de menu. Es la orden opuesta a
   MENU SEPARATE.
      = MENU X      (devuelve la coordenada grafica X de un item)
   X=MENU X(,,)
   Esta funcion te permite la posicion de un item determinado con
   respecto a una previa opcion de pantalla. Puedes usar informacion
   complementaria en el ejemplo 16.13.
      = MENU Y      (devuelve la coordenada grafica Y de un item)
   Y=MENU Y(,,)
   Devuelve la coordenada Y de una opcion de menu. Advierte que to-
   das las coordenadas se miden en relacion al item previo. Por esto
   no se trata de coordenadas estandard de pantalla!!
   1- Moviendo un menu dentro de un programa
      MENU  BASE     (mueve el punto de comienzo de un menu)
   MENU BASE x,y
   Este comando mueve el punto de comienzo del primer nivel de tus
   menus a las coordenadas de pantalla X,Y. Todos los items subordi
   nados del menu, se visualizaran por tanto en relacion a la parte
   mas alta de este menu. Ver ejemplo 16.14 para una demostracion de
   este comando.
      SET  MENU       (mueve un menu)
   SET MENU (,,) TO x,y
   Establece las coordenadas de la esquina supero-izquierda de un
   item de menu. Esas coordenadas se miden de forma relativa al ni-
   vel previo. El punto de comienzo de todo el menu   (coordenadas 
   0,0) debe establecerse con el comando MENU BASE.
      Todos los niveles inferiores del menu tambien se desplazaran
   por esta instruccion. Sus posiciones relativas no cambiaran. Dado
   que X,Y pueden ser numero negativos, es posible mostrar los items
   de la barra de menu en la forma de un panel de control. Vease el
   ejemplo 16.15.
                                                                 205
   2- Ejecucion de un menu en la posicion del cursor
      MENU  MOUSE      (Muestra el menu bajo el raton)
   MENU MOUSE ON/OFF
   Este comando muestra automaticamente todos los menus comenzando
   en la actual posicion del cursor del raton. Las coordenadas del
   raton se transfieren a MENU BASE para obtener la posicion final,
   asi es posible instalar el menu a una determinada distancia del
   puntero del raton, si asi lo deseas. Ver ejemplo 16.16.
                                                                 206
                  17:  S O N I D O     Y     M U S I C A
      El sistema sonoro del Amiga esta capacitado para generar efec
   tos sonoros en estereofonia, imposibles de oir hace tan solo unos
   pocos años. Los resultados son impresionantes incluso a traves 
   del altavoz de tu televisor, pero si conectas tu Amiga a un equi-
   po Hi-Fi, los sonidos pueden hacer temblar la habitacion!!
      Como podras imaginarte, AMOS ha evolucionado mucho desde aquel
   viejo comando BEEP. De hecho, hemos conseguido aportar todo cuan-
   to necesitas para incorporar increibles efectos sonoros a tus pro
   pios programas. Todos los comandos sonoros de AMOS se ejecutan in
   dependientemente de tu programa Basic. Asi tus "bandas sonoras"
   podran sonar continuamente, sin afectar lo mas minimo la calidad
   general del programa.
      Los 'samples' o tonos pueden crearse usando alguno de los dife
   rentes accesorios disponibles en el mercado, y pueden ser oidos
   con la simple instruccion SAMPLAY. Cada "sample" puede ejecutarse
   a diferentes velocidades, y pueden repetirse infinidad de veces,
   siendo incluso posible tocar un "sample" como si fuera una nota
   musical.
      La musica puede tomarse de otros programas como SONIX, SOUND-
   TRACKER o GMC. El sistema musical de AMOS es inteligente y te per
   mitira sin el menor esfuerzo combinar "samples" y musica por el
   mismo canal de sonido, sin riesgo de interferencias.
      Cada cancion puede incorporar hasta 256 instrumentos separados
   el unico limite para el numero de canciones es la cantidad de me-
   moria disponible. Al objeto de ahorrar el maximo posible de memo-
   ria, todos los tonos se construyen con un cierto numero de patro-
   nes separados. Asi cuando se crea un patron, lo podras incorporar
   a cualquier parte de tu musica usando tan solo un par de bytes.
   Definiendo solo algunas teclas-patron, podras ademas crear doce-
   nas de diferentes melodias sin demasiado consumo de memoria.
      La principal ventaja del sistema sonoro AMOS, es sin embargo,
   que se puede ampliar. Asi toda la fuente de codigos se encuentra
   en el disco de datas para examinar o cambiar. Asi nunca te queda-
   ras 'colgado' con los futuros desarrollos del Amiga.
                                                                 207
   Efectos sonoros simples
      BOOM     (genera un sonido ruidoso parecido a una explosion)
   BOOM
   Usa este comando para producir el apropiado efecto sonoro estereo
   en tus programas. Tradicionalmente, este tipo de "ruido blanco"
   ha sido bastante dificil de reproducir en el Amiga, sin embargo,
   AMOS usa un habil sistema de interrupciones que produce un efecto
   muy real de explosion. Ejemplo:
      Boom: Print "You're dead!"
      SHOOT     (crea un sonido parecido al disparo de un arma)
   SHOOT
   Este comando genera un simple disparo. Como BOOM, SHOOT no detie-
   ne de ningun modo la ejecucion de tu programa. De este modo, si
   estas disparando varias veces, deberias añadir un pequeño retraso
   utilizando el comando WAIT:
      Shoot: Wait 6: Shoot: Print "You're dead!"
      BELL     (efecto sonoro de campana)
   BELL ¡f¿
   Este comando reproduce un tono puro con frecuencia "F". Este para
   metro establece el tono de la nota, desde 1 (muy bajo) hasta 96
   (muy alto).
   Canales de sonido
   =================
      El Hardware del Amiga podra, sin el menor esfuerzo, tocar has-
   ta 4 sonidos simultaneamente. Esto te permitira añadir atractivos
   armonicos a tus efectos sonoros.
      Cada sonido puede salir por una de las 4 VOICES numeradas de 0
   a 3. Puedes imaginarte esas voces como instrumentos separados que
   pueden tocar independientemente su propia secuencia de notas, sam
   ples o musica. Las 4 voces se combinan internamente para generar
   el sonido final que oiras a traves del sistema de megafonia.
      Los comandos sonoros de AMOS podran tocar tus canciones usando
   el ordenamiento de voces que prefieras. Todos estos comandos usan
   una forma estandard de entrada para cada voz. Asi se le asigna a
   cada voz un BIT, en el parametro VOICE, como sigue:
                                                                 208
      BIT 0   =  Voice 0
      BIT 1   =  Voice 1
      BIT 2   =  Voice 2
      BIT 3   =  Voice 3
      Para activar las voces deseadas, coloca el apropiado BIT a 1.
   He aqui una lista de los valores mas frecuentes para hacer las co
   sas un poco mas faciles:
      Valor     Voz usada    Efecto
      -----     ---------    ------ 
       15       0,1,2,3      Usa las 4 voces
        9       0,3          Salida por el altavoz izquierdo
        8       3
        6       2,4          Salida por el altavoz derecho
        4       2
        2       1
        1       0
       Para poder comprobar esto y a la vez hacer justicia al Amiga,
   prueba a conectar tu ordenador con un equipo Hi-Fi. La mayoria de
   los televisores no son capaces de reproducir la totalidad de soni
   dos que pueden generarse por el Hardware del Amiga.
      VOLUME     (cambia el volumen de sonoridad)
   VOLUME ¡v,¿ intensity
   Este comando cambia el volumen de los sonidos que esten siendo
   reproducidos por uno o mas canales de sonido.
      "INTENSITY" se refiere a la intensidad o fuerza de este sonido
   que normalmente puede oscilar desde 0 (silencio) hasta 63 (maxi-
   mo). Por defecto, el volumen se coloca a la misma intensidad para
   todos los canales disponibles. El nuevo volumen se usara para to-
   dos los futuros efectos sonoros, incluyendose tambien la musica.
      El parametro "V" te permite cambiar el volumen de cada voz in-
   dependientemente. V ahora indica que combinacion de voces sera re
   gulada. Esta segunda opcion se usa solo para los efectos sonoros.
   No tiene efecto sobre cualquier musica que toques. Las voces se
   seleccionan mediante un mapa-BIT en su formato estandard, en don-
   de cada BIT representa el status de un simple canal de sonido. Si
   el BIT se pone a 1, entonces el volumen de esta voz se cambiara,
   de otro modo no se afectara. Ejemplo:
      Volume %0001,63: Boom : Wait 100
      Volume %1110,10: Boom : Wait 50
      Play 40,0 : Wait 30
      Volume 50 : Play 40,0
                                                                 209
   Sonido por samples
      Si tienes que generar todos los efectos sonoros que necesitas,
   directamente desde tu ordenador, tendras que prepararte para una
   tarea imposible. En la practica, a menudo es mucho mas facil to-
   mar un sonido real desde una fuente externa, como un cassette, y
   convertirlo en una lista de numeros que pueda ser contenido en la
   memoria de tu ordenador.
      Cada numero representa el volumen de un sample particular del
   sonido. Si se reproducen rapidamente esos sones o "samples" por
   los chips del Amiga, se podra conseguir un impresionante y realis
   ta sonido. Esta tecnica conforma la base de los efectos sonoros
   por samples en la mayoria de los modernos juegos de ordenador.
      Si deseas crear tus propios samples, estaras obligado a adqui-
   rir un equipo complementario conocido como "Sampleador" o Cartu-
   chos de Samples. Pese a que dichos cartuchos son excelentes, en
   realidad no son esenciales. AMOS Basic esta perfectamente dotado
   para reproducir cualquier sample, sin la necesidad de adquirir
   costosos equipos complementarios.
      Actualmente existen cientos de efectos sonoros disponibles en
   el dominio publico, capaces de reproducir la mayoria de los efec-
   tos sonoros que requieren tus programas. Hemos incluido tambien,
   una seleccion de utiles samples en el disco de datas de AMOS para
   que vayas experimentando con ellos.
      SAM  PLAY     (reproduce un sample desde un banco de samples)
   SAM PLAY s
   SAM PLAY v,s
   SAM PLAY v,s,f
   Esta instruccion reproduce un sample directamente desde tu siste
   ma de altavoz. Todos los samples se almacenan habitualmente en el
   banco 5, pero esto puede ser libremente alterado usando el coman-
   do SAM BANK.
      "S" es el numero del banco de samples que va a ser reproducido
   No existe limite de samples a almacenar en un banco, salvo la me-
   moria disponible. Si deseas usar tus propios samples con esta ins
   truccion, necesitaras incorporarlos en el banco de memoria AMOS. 
   Encontraras mas detalles al final de esta seccion.
      "V" es un mapa-BIT que contiene una lista de las voces que va
   a usar tu sample. Como es habitual, existe un BIT para cada voz.
   Para activar dicha voz basta con poner a 1 su BIT correspondiente
      "F" contiene la velocidad de reproduccion de tu sample, medido
   en Hertzios. Esto especifica el numero de samples que deben tocar
   se en cada segundo. Las velocidades habituales para samples osci-
   lan desde 4.000, para ruidos como explosiones, hasta 10.000 para
   efectos reconocibles como voz humana. Cambiando esta frecuencia 
   de reproduccion, podras facilmente ajustar el tono de tu sonido
   con un amplio margen. Asi, un simple sample puede usarse para ge-
   nerar docenas de diferentes sonidos. Ejemplo:
                                                                 210
      Load "AMOS_DATA:Samples/Sample_Demo.abk"
      For S=1 to 11
         Locate 0,0 : ? "Playing sample ";S
         Sam Play S
         Locate 0,24 : Centre"":Wait Key:Cline
      Next S
      Wait Key
      Sam Play 1,11 : Wait 5 : Sam Play 2,11
      Wait Key
      Sam Play 1,1,2000
      Wait Key
      Sam Play 1,1,15000
      Una mas amplia demostracion de este comando lo podras encon-
   trar en el ejemplo 17.1.
      SAM  BANK     (cambia el actual banco)
   SAM BANK n
   Asigna un nuevo banco de memoria para usar por tus samples. Todas
   las instrucciones SAM PLAY futuras tomaran sus sonidos directamen
   te de este banco.
      Es posible explotar esta caracteristica para contener varios
   juegos completos de samples, uno al lado del otro.
       SAM  RAW     (toca un sample de memoria)
   SAM RAW voice,address,length, frequency
   Toca un aspero sample almacenado en cualquier parte de la memoria
   del Amiga. "VOICE" es un modelo-BIT en su formato estandard que
   especifica la lista de voces que usara tu sample. Cada BIT de es-
   te modelo selecciona un simple canal de sonido.
      "ADDRESS" contiene la direccion del sample. Normalmente, se
   refiere a una zona de los bancos de memoria de AMOS. "LENGTH" con
   tiene la longitud del sample que deseas tocar. "FREQUENCY" indica
   la velocidad del sample a usar en la reproduccion (medida en sam-
   ples por segundo o Hertzios). Esta puede ser muy diferente a la
   frecuencia original en la que fue grabado el sample.
      SAM RAW te permite tocar estandard samples de Amiga directamen
   te desde tu altavoz, sin necesidad de crear un banco especial
   de memoria (ver Creacion de un banco de samples). Es ahora solo
   cuestion tuya el manejar esos samples en memoria, e introducir 
   los parametros manualmente. SAM RAW es ideal para revisar los fi-
   cheros de tus discos. Usa BLOAD para cargar un fichero en un ban-
   co y luego usa SAM RAW para tocar las datas. Con suerte consegui-
   ras muchos e interesantes sonidos. Ejemplos:
      Reserve As Work 10,55000
      Bload "Samples/Samples.abk",start(10)
      Sam Raw 15,start(10),length(10),10000
                                                                 211
      SAM  LOOP     (repite un sample)
   SAM LOOP ON/OFF
   Este comando informa a AMOS Basic que todos los siguientes sam-
   ples se repetiran continuamente. Ejemplos:
      Load "AMOS_DATA:Samples/Sampledemo.abk"
      Sam Loop On
      For S=1 to 11
         Locate 0,0: Print "Tocando el sample ";S
         Sam Play S
         Locate 0,24: Centre "":Wait Key:Cline
      Next S
      Sam Loop Off
      Este efecto de repeticion puede desactivarse con una simple
   llamada al comando SAM LOOP OFF.
   1- Creando un banco de samples
      Si pretendes utilizar tus propios samples mediante SAM PLAY,
   primero necesitaras cargarlos en un banco de memoria. Esto puede
   lograrse con el programa SAMMAKER suministrado con el disco de
   datas AMOS.
      En el start-up, SAMMAKER aparece como un selector estandard de
   ficheros AMOS. Introduce el nombre del fichero del primer sample
   a almacenar en el nuevo banco, y pulsa RETURN. Si AMOS no encon-
   trara la frecuencia de sampling, tendras que introducirlo direc-
   tamente. No supone un problema que cometas un error en este caso,
   ya que podras volver a tocar tus samples a la velocidad adecuada.
      Despues de un pequeño retraso, se te solicitara otro sample
   para instalar en el banco. Cuando termines con los samples teclea
   SAVE en el fichero selector para grabar tus samples al disco. Se
   te solicitara de nuevo el nombre del fichero destino de tu nuevo
   banco. Esto puede introducirse con AMOS Basic con el comando LOAD
   como sigue:
      Load "Sample.abk"
      Load "Sample.abk",6 : Rem Carga un sample en el banco 6
   Musica
   ======
      El sistema de musica AMOS te permite añadir facilmente un fon-
   do musical para tus programas. La musica puede ser creada desde
   una variedad de fuentes, incluyendo GMC, SOUNDTRACKER o SONIX.
      Al objeto de convertir esas musicas al formato especial AMOS,
   necesitaras usar uno de los programas traductores incluidos en el
   disco de datas AMOS. La musica GMC tendria que haber sido salvada
   usando el icono SAVE DATA, de esta forma se copia tanto la musica
   como las definiciones de los instrumentos en un solo fichero.
                                                                 212
      MUSIC      (toca una pieza de musica)
   MUSIC n
   El comando MUSIC comienza a tocar una pieza musical del banco de
   musica (pt 3). Esta musica sera tocada independientemente de tu
   programa Basic, sin afectarlo en lo mas minimo.
      Normalmente, es posible almacenar varias canciones completas
   en el mismo banco. A cada composicion se le asigna su propio nume
   ro de musica. La unica excepcion a esta regla es la musica creada
   con GMC, que solo permite colocar una cancion por cada banco. Por
   ejemplo:
      Load "MUSIC/Musicdemo.abk"
      Music 1
   El sistema musical AMOS es inteligente, y suspendera automatica-
   mente cualquier sonido en el canal actual. Cuando el sonido haya
   finalizado, tu tono comenzara a tocar desde su posicion previa.
   Hasta 3 tonos separados pueden comenzar a la vez. Cada nuevo co-
   mando musical detiene la actual cancion, y coloca su estatus en
   una pila. Una vez la cancion haya concluido, la vieja musica co-
   menzara desde donde se dejo.
      MUSIC  STOP     (detiene una simple seccion de musica)
   MUSIC STOP
   Detiene la reproduccion de la actual pieza musical. Si otra musi-
   ca es activada, esta se resetea inmediatamente.
      MUSIC  OFF     (desactiva todas las musicas)
   MUSIC OFF
   Este comando desactiva la musica por completo. Al objeto de poder
   tocar de nuevo, necesitaras ejecutar la original serie de instruc
   ciones MUSIC de nuevo.
      TEMPO           (Cambia la velocidad de un sample)
   TEMPO s
   Este comando modifica la velocidad en la que un tono esta siendo
   reproducido con el comando MUSIC. "S" es la nueva velocidad, y os
   cila entre 1 (muy lenta) hasta 100 (muy rapida). No todos los ins
   trumentos pueden tocarse a este maximo de velocidad. El limite 
   practico esta alrededor de 50. Para una demostracion, coloca el
   disco de datas AMOS en el drive y teclea:
      Load "AMOS_DATA:Music/Musicdemo.abk"
      Music 1
      Tempo 35
      Tempo 5
                                                                 213
      Ten en cuenta que la musica creada con GMC a menudo contiene
   etiquetas que directamente establecen el TEMPO. Esas etiquetas 
   anulan el tempo establecido por AMOS. Por tanto no es aconsejable
   usarla en tu propia musica.
      MVOLUME       (establece el volumen de una pieza musical)
   MVOLUME n
   Cambia el volumen de toda la pieza musical de intensidad n (0-63)
      VOICE        (activa una o mas voces de una pieza musical)
   VOICE mask
   Activa una o mas voces de una musica independientemente. De forma
   habitual, cada voz contiene su propia melodia que sera combinada
   en salida (altavoces) para generar la musica normal.
      "MASK" es una mascara-BIT en el formato normal AMOS que especi
   fica que voces deseas tocar. Cada BIT representa el estado de una
   voz en la musica. Si se pone a 1, la voz sera representada, de
   otro modo no se usara en absoluto.
      Load "AMOS_DATA:Music/Musicdemo.abk"
      Music 1
      For V=0 to 15
      Locate 0,0: Print "Voice ";v
      Voice V
      Wait 100
      Next V
      Direct
      Voice %0001: Rem activa voz 0
      Voice %0010: Rem activa voz 1
      Voice %1001: Rem activa voces 3 y 0
      Voice %1111: Rem activa voz 4
      = VUMETER     (volume-metro)
   s=VUMETER(v)
   Esta funcion chequea la voz V y devuelve el volumen de la nota ac
   tual que esta siendo tocada por tu musica. "S" es un valor de in-
   tensidad que oscila entre 0 y 63. "V" es el numero de una voz sim
   ple que va a ser comprobada (0-3).
      Usando esta funcion, podras hacer danzar a tus sprites una pie
   za de musica!! Carga el ejemplo 17.2 para una demostracion.
      Ten en cuenta que tambien una version de AMAL de esta instruc-
   cion te permitira crear VU-metros utilizando interrupciones. Vea-
   se el comando VU para mas informacion.
                                                                 214
   1- Tocando una nota 
      PLAY    (toca una nota)
   PLAY ¡voice,¿ pitch,delay
   Este comando toca una simple nota a traves del altavoz de tu tele
   visor o equipo de Hi-FI. "PITCH" establece el tono de este sonido
   que puede oscilar desde 0 (bajo) hasta 96 (alto). Mejor que usar
   un numero arbitrario, cada tono debe equivaler o estar en rela-
   cion con una nota musical que en ingles se definen como A, B, C,
   D, E, F, G  (equivalen a Do, Re, Mi, ...). 
   Esto lo podras comprobar en la siguiente tabla:
                           Octava
            ------------------------------------------
               0    1    2    3    4    5    6    7
     Nota                  Tono
     ----   ------------------------------------------
      C        1   13   25   37   49   61   73   85
      C#       2   14   26   38   50   62   74   86
      D        3   15   27   39   51   63   75   87
      D#       4   16   28   40   52   64   76   88
      E        5   17   29   41   53   65   77   89
      F        6   18   30   42   54   66   78   90
      F#       7   19   31   43   55   67   79   91
      G        8   20   32   44   56   68   80   92
      G#       9   21   33   45   57   69   81   93
      A       10   22   34   46   58   70   82   94
      A#      11   23   35   47   59   71   83   95
      B       12   24   36   48   60   72   84   96
      Como podras observar las notas van ciclando cada 12 tonos. Es-
   te ciclo es conocido con el nombre de OCTAVA.
      El parametro de voz opcional te permite tocar tus notas con 
   cualquier combinacion de las 4 voces del Amiga, que como siempre
   se descompone en un ya conocido mapa-BIT con el siguiente formato
       Bit     Voz
       ---     ---
        0       0         Activando un BIT a 1 se tocara la voz equi
        1       1       valente. "DELAY" establece la longitud de la
        2       2       la pausa entre el comando PLAY y la siguien-
        3       3       te instruccion Basic. Esto te permite tocar
                        cada nota antes de que comience la proxima.
   Un "delay" 0 inicia la nota e inmediatamente salta a la proxima
   instruccion Basic. Tocando varias notas, una tras otra, podras 
   facilmente generar algunos efectos armonicos muy atractivos. Por
   ejemplo:
                                                                 215
      Play 1,40,0: Play 2,50,0
      Wait Key
      Play 1,40,15: Play 2,50,15
      Do
         T=Rnd(96): V=Rnd(15): Play V,T,3
      Loop
      PLAY no se limita tan solo a las notas puras. Sino que tambien
   es posible asignarle complejas ondas al generador de sonido, usan
   do los potentes comandos WAVE y NOISE.
   2- Formas de onda y envolvente 
      SET  WAVE      (define una forma de onda)
   SET WAVE wave,shape$
   Esta instruccion te ofrece la posibilidad de definir tus propios
   instrumentos para utilizar con la instruccion PLAY de AMOS Basic.
   El sonido de tu instrumento dependera del tipo de onda contenido
   en la memoria del Amiga, en donde existe una "plantilla" que se
   repite hasta conseguir la nota final.
      "WAVE" es el numero de la forma de onda que deseas definir.
   Los valores permitidos van desde 2 en adelante. Esto es debido a
   que 0 y 1 ya estan preinstalados. La onda 0 contiene un modelo de
   sonido aleatorio para la produccion de efectos de explosion, mien
   tras que la onda 1 es una suave onda que genera tonos puros usa-
   dos para la instruccion PLAY.
      Los tipos de onda se establecen en una lista de hasta 256 nume
   ros que se introducen mediante el parametro "SHAPE$". Ahora mira
   el diagrama siguiente:
                                                     ONDA
       +---------------------------------------             
                                                    TRIANGULO
                                                      ONDA
       +---------------------------------------
                                                    SINUSOIDAL
                                                      ONDAS
       +--------------------------------------- 
                                                    COMPLEJAS
                                                                216
      Cada numero representa la intensidad de una seccion individual
   de la forma de onda. Esto es equivalente a la altura de un solo
   punto en el diagrama. Los valores posibles para la intensidad van
   desde -128 a 127. Puesto que las cadenas AMOS solo admiten cifras
   positivas (0-255), necesitaras convertir los valores negativos a
   un formato especial interno antes de usarlos. El valor deseado se
   puede calcular simplemente añadiendo 256 a los numeros negativos
   de tu lista.
      He aqui un programa que demuestra como la onda triangular del
   diagrama previo puede ser creada mediante AMOS Basic:
      S$=""
      For I= -128 to 127
        X=I : If X<0 then Add X,256
        S$=S$+CHR$(x)
      Next I
      Set Wave 2,S$
      Antes de tocar tu forma de onda, tienes que informar a AMOS 
   que canales se asignaran a tu onda. Esto puede lograrse usando el
   comando WAVE. Añade la siguiente linea a la rutina previa:
      Wave 2 to 15: For S=10 to 60: Play S,10: Next S
      La mejor forma de reproducir el efecto de un instrumento real
   consiste en combinar varias ondas conjuntamente. Un ejemplo de
   una de esas ondas se puede apreciar en el diagrama anterior (onda
   compleja).
      Añadiendo varias ondas conjuntamente, con puntos de inicio di-
   ferentes y separados, se consiguen dichos efectos. Esto consigue
   los armonicos suaves necesarios para tocar tus notas. He aqui un
   ejemplo:
      SHAPE$="": Degree
      For S=0 to 255
        V=INT((Sin(S)/2+Sin(S*2+45)/4)*128)+127
        SHAPE$=SHAPE$+CHR$(V)
      Next S
      Set Wave 2,Shape$: Wave 2 to 15
      For N=10 to 60: Play N,10: Next N
      WAVE     (asigna una onda a uno o mas canales de sonido)
   WAVE asigna un numero de onda "W" a uno o mas canales de sonido.
   "V" contiene un mapa-BIT en el formato estandard. Si un bit de 
   ese mapa se pone a 1, entonces la voz apropiada sera utilizada 
   por PLAY, de otro modo no se afecta en absoluto.
      Por defecto, la onda 0 se reserva para el canal de ruido y la
   onda 1 contiene una onda sinusoidal. He aqui algunos ejemplos:
                                                                 217
      Wave 0 to %0001
      Play 1,40,0
      Wave 0 to %1100
      Play 20,10
      Wave 1 to %1111
      Play 60,0
      NOISE      (asigna una onda de ruido a un canal)
   NOISE to voices
   Aplica un efecto de ruido blanco (onda 0) a la voz seleccionada.
   Carga el ejemplo 17.3 para una demostracion.
      "voices" es un estandard modelo-BIT. Los primeros 4 Bits repre
   sentan las 4 voces posibles, comenzando desde 0. NOISE es equiva-
   lente al comando
      WAVE 0 to voices.
   Ejemplos:
      Noise to 15
      Play 60,0
      Play 30,0
      DEL  WAVE     (borra una onda)
   DEL WAVE n
   Borra una onda previamente definida mediante SET WAVE. "N" es el
   numero de la onda y comienza en 2. Es imposible borrar las ondas
   prefabricadas (noise y sine, 0 y 1) con esta instruccion. Despues
   que la onda haya sido eliminada, todas las voces se resetearan a
   la onda estandard (sine), onda 1 u onda por defecto.
      SAMPLE        (asigna un sample a una onda)
   SAMPLE n to voices
   Esta es la version mas potente de todos los comandos de onda. Va
   a asignar un sample almacenado en un banco de samples a la onda
   actual. El comando PLAY podra ahora tomar un instrumento directa
   mente del banco de samples y reproducir un sonido.
      Load "Samples/Sample1.abk"
      Sample 1 to 15
      For I=20 to 50
          Play I,50
      Next I
   Como es habitual, "VOICES" te permite seleccionar entre varias vo
   ces para ser afectadas por esta instruccion, mediante un clasico
   mapa-BIT.
                                                                218
      RECUERDA, que el abanico de notas en el que un sample puede 
   tocarse, dependera de la frecuencia de su grabacion original. Si
   una nota es demasiado alta, AMOS no sera capaz de tocarla por com
   pleto. El rango aceptable varia de un sample a otro, pero es habi
   tual entre 10 y 50.
      SET  ENVEL     (crea un volumen envolvente)
   SET ENVEL wave,phase TO duration,volume
   Este comando cambia lentamente el volumen de una nota mientras,
   esta siendo tocada. En el mundo real, los sonidos no estan comple
   tamente preformados, sino que tienden a evolucionar dentro de un
   periodo de tiempo, que es conocido como VOLUMEN ENVOLVENTE. La 
   forma de este envolvente varia dependiendo del tipo de instrumen-
   to que estes tocando. Un ejemplo tipico de uno de estos envolven-
   tes aparece en el siguiente diagrama:
        V |
        O |
        L |
        U |
        M |      /\
        E |     / |\
        N |    /  | \
          |   /   |  |------------------+\ 
          |  /    |  |                  | \
          | /     |  |                  |  \
          +---------------------------------------
               1    2         3           4    TIEMPO
      1.- Ataque
      2.- Decaimiento
      3.- Mantenimiento
      4.- Relajacion
      El sonido se divide en las 4 fases arriba citadas. AMOS Basic
   te permite definir tus propios envolventes usando hasta 7 pasos
   separados. Cada paso representa un cambio constante en el volumen
   de la nota actual.
      "WAVE" es el numero de la forma de onda que sera afectada por
   esta instruccion. Es posible usar cualquier forma de onda que de-
   sees para este proposito, incluyendo los generadores prefabrica-
   dos NOISE y SINE.
      "PHASE" contiene el numero de la fase particular que va a ser
   definida, y va desde 0 a 6. "DURATION" especifica la longitud del
   paso actual en unidades de cincuentavos de segundo. Esto determi-
   nara la aparente velocidad del cambio de volumen generado en esta
   fase. Por ultimo, "VOLUME" especifica el volumen que se alcanzara
   al final de esta fase. Los niveles permitidos van de 0 a 63.
      Es importante, comprender que este volumen se relaciona con la
   intensidad que previamente has establecido con el comando VOLUME.
   Asi, incluso si la nota es tranquila, la forma del envolvente se-
   ra tambien del mismo modo. Ahora algunos ejemplos:
                                                                219
      Set Envel 1,0 to 200,63: Rem establece el primer paso
      Play 40,0
      Como podras oir, el volumen de tu sonido comienza de 0, y au-
   menta hasta la maxima intensidad durante la longitud de la nota.
   Ahora intenta definir algo mas compicado:
      Set Envel 1,0 to 15,60
      Play 40,0: Wait Key
      Set Envel 1,1 to 1,50
      Play 40,0: Wait Key
      Set Envel 1,2 to 10,50
      Play 40,0: Wait Key
      Set Envel 1,3 to 50,0
      Play 40,0
      Finalmente, he aqui otro ejemplo de un envolvente de ruido:
      Noise to 15
      Set Envel 0,0 to 1000,30
      Play 40,0 
      Wait Key
      Music Off
      No confundas ondas con envolventes. Una onda establece los com
   ponentes de frecuencia de tus notas, mientras que un envolvente
   simplemente cambia su volumen de acuerdo a un patron definido.
   Lenguaje
   ========
      Tu Amiga esta dotado con un poderoso sintetizador de voz huma-
   na que puedes encontrar en el disco Workbench. Con la ayuda de
   esta rutina, tus programas AMOS podran hablar. La voz es especial
   mente util para la educacion, puesto que la mayoria de los chicos
   jovenes, responden mejor a la palabra hablada que a la escrita.
      Una cosa a recordar; puesto que el paquete narrador es indepen
   diente de AMOS Basic, no podemos asegurar su fiabilidad por com-
   pleto.
      SAY     (pronuncia una frase)
   SAY t$¡,mode¿
   Este comando es increiblemente facil de usar. Introduce tu texto
   en ingles normal, concluyendo tu frase con un signo de puntuacion
   como un punto. SAY a continuacion traducira tus palabras a un for
   mato interno y las dira directamente por tu altavoz. Ejemplo:
      Say "AMOS Basic can really speak"
                                                                220
      La primera vez que uses esta instruccion, el narrador sera car
   gado automaticamente desde el disco. Asi que es vital asegurarse
   de que el disco apropiado esta ubicado en la disquetera antes de
   usar el sistema, de otro modo aparecera un 'requester'.
      "MODE" opta entre dos separados modos de pronunciacion. Por
   defecto, tu programa durante la pronunciacion, de modo que toda
   musica o efecto sonoro sera suspendido temporalmente. Colocando
   "mode" en un valor de un sistema multitarea activo te permitira
   reproducir lenguaje en tanto continua el programa AMOS. Inevita-
   blemente, esto ralentizara considerablemente tus rutinas. Para
   regresar al modo normal de lenguaje (sin otro sonido acompañante)
   debes ponder "mode" a 0.
      Si el sistema narrador no puede comprender lo que estas inten
   tando hablar no aparecera ningun mensaje de error, pero la orden
   sera automaticamente cancelada. Tambien, date cuenta, que el na-
   rrador puede liarse a veces con palabras muy cortas. Puesto que
   restos de una frase previa se incluyen en la siguiente. Este pro
   blema se soluciona añadiendo espacios al final de tu texto.
      SET  TALK     (establece efectos de locucion)
   SET TALK sex, mode, pitch, rate
   Este comando te permite cambiar el tipo de voz que se usara con
   el comando SAY. "SEX" elige entre masculino (0) o femenino (1).
   Con toda honestidad, no existe una gran diferencia entre ambas.
   Mejores efectos se podran crear simplemente aumentando la frecuen
   cia de la voz usando el parametro "pitch".
      "MODE" añade un patron de ritmo a la voz. Este puede ser acti-
   vado colocandolo en 1.
      "PITCH" cambia la frecuencia de la voz. Su rango oscila desde
   65 a 320.
      "RATE" especifica la velocidad, medida en palabras por minuto,
   va de 40 a 400.
      Cualquiera de los parametros anteriores puede ser omitido si
   se desea. Basta con que coloques comas en sus posiciones normales
   para que puedas variar las opciones independientement
                                                                221
   Efectos de filtro
      LED     (Activa un filtro de paso y ademas apagara el chivato 
               de puesta en marcha)
   LED ON/OFF
   Este comando tiene dos acciones completamente separadas. No solo
   apaga/enciende el chivato de funcionamiento de la consola de tu
   Amiga (en las versiones KickStart 1.3 no se apaga sino que se po-
   ne un poco mas oscuro), sino que tambien controla un filtro espe
   cial de paso.
      Este filtro cambia los sonidos de alta frecuencia tratados por
   este sistema. Normalmente, esos sonidos se filtran para evitar el
   riesgo de aparicion de sonidos distorsionados. Por desgracia, 
   este filtro ocasiona perdida del timbre de muchos instrumentos de
   percusion. Por ello desactivando el filtro, podras recuperar toda
   la calidad de sonido de muchos de esos instrumentos
                                                                 222
                      18:  E L     T E C L A D O
      AMOS Basic incorpora docenas de utiles comandos de teclado que
   pueden usarse en cualquier programa de aventuras o de arcade. E
   incluso es posible escribir un completo procesador de textos por
   completo con AMOS Basic.
      = INKEY$     (funcion que obtiene una tecla pulsada)
   K$=INKEY$
   Esta funcion comprueba si el usuario a pulsado una tecla, y de-
   vuelve su valor en la cadena K$.
      Observa que este comando no espera tu respuesta en ningun caso
   puesto que si el usuario no introduce ninguna letra, INKEY$ devol
   vera una simple cadena vacia "".
      INKEY$ solo es capaz de leer teclas que tengan un especifico
   caracter ASCII en el teclado. ASCII es un lenguaje estandard usa-
   do para representar todos los caracteres que pueden ser imprimi-
   dos o visualizados en pantalla.
      Es importante darse cuenta que algunas teclas, como el boton
   HELP o las teclas de funcion, tienen un formato distinto. Si este
   comando las detecta, devolvera un caracter con valor 0. Sin embar
   go podras encontrar la codificacion interna de estas teclas usan-
   do una funcion separada llamada SCAN CODE.
      = SCANCODE   (obtiene la codificacion de la ultima tecla
                    incluida en la cadena INKEY$)
   s=SCANCODE
   Esta funcion devuelve la codificacion interna de la tecla que 
   acaba de introducirse mediante la funcion INKEY$. Esto te permiti
   ra comprobar la presencia de teclas que no se correspondan con 
   una letra (HELP, ESC, Teclas de funcion) del teclado. Teclea el
   siguiente ejemplo:
      DO
        While K$=""
          K$=Inkey$
        Wend
        If ASC(K$)=0 then Print "Has pulsado tecla sin codigo ASCII"
        Print "La codificacion interna es ";Scancode
      Loop
                                                                 223
      = KEY  STATE    (chequea si una tecla en concreto ha sido
                       pulsada)
   t=KEY STATE(s)
   Chequea si una tecla especifica ha sido pulsada en el teclado del
   Amiga. "S" es la codificacion interna de la tecla que queremos
   chequear. Si la tecla esta actualmente pulsada el comando devolve
   ra un valor cierto (-1), en caso contrario resultara falso (0).
      = KEY  SHIFT     (devuelve el estado de las teclas SHIFT)
   Keys=KEY SHIFT
   Esta funcion devuelve el estado actual de varias teclas de con-
   trol. Dichas teclas (como SHIFT o ALT) no pueden detectarse usan
   do el sistema anterior de INKEY$ o SCANCODE. Pero tu puedes facil
   mente comprobar cualquier combinacion de teclas de control que se
   produzca con una simple llamada a esta funcion. "KEYS" es un Mapa
   -BIT con el siguiente formato:
      BIT     Tecla chequeada          Notas
      ---     ---------------          -----
       0      SHIFT izquierda      
       1      SHIFT derecha
       2      Caps Lock                Si esta ON/OFF
       3      CTRL
       4      ALT izquierda
       5      ALT derecha
       6      AMIGA izquierda
       7      AMIGA derecha            Tecla C= en algunos modelos
      Si algun BIT es puesto a 1, entonces el boton asociado debe ha
   ber sido pulsado por el usuario.
      INPUT$(n)      (Funcion que introduce N caracteres en
                      una cadena)
   x$=INPUT$(n)
   Esta funcion introduce N caracteres directamente desde el teclado
   por turnos, uno a uno. Como ocurria con INKEY$, esos caracteres
   no aparecen en la pantalla.
      "X$" es una variable de cadena que sera cargada con tus nuevos
   caracteres. "N" contiene el numero de caracteres que se introduci
   ran. Ejemplo:
      Clear Key: Print "Teclea 10 caracteres"
      C$= INPUT$(10): Print "Tu eleccion ha sido ";C$
      Esta instruccion NO es la misma que el INPUT estandard. Ambos
   son completamente distintos. Tambien advierte que existe una ver-
   sion especial de INPUT$ que puede usarse para leer caracteres en
   el disco.
                                                                 224
      WAIT  KEY     (espera a que se pulse una tecla)
   WAIT KEY
   Espera a que se pulse una tecla.
      KEY  SPEED    (cambia la velocidad de repeticion de tecla)
   KEY SPEED lag,speed
   Este comando te permite adaptar la velocidad del teclado a tus 
   pulsaciones particulares. La nueva velocidad sera usada en todas
   las partes del sistema AMOS, incluyendo el editor.
      "LAG" es el tiempo, en cincuentavos de segundo, que transcurri
   ra entre que se pulse una tecla y el comienzo de la secuencia de
   repeticion de dicha tecla.
      "SPEED" es el retraso entre cada sucesivo caracter.
      CLEAR  KEY    (inicializa el buffer del teclado)
   CLEAR KEY
   Cuando introduces un caracter desde el teclado, sus codigo ASCII
   es colocado en un area de memoria que se denomina "Buffer del Te
   clado". Es de este buffer donde se obtiene la muestra para la fun
   cion INKEY$.
      CLEAR KEY borra completamente dicho buffer y devuelve el tecla
   do a su estado original. Es especialmente util al comienzo de un
   programa, ya que el buffer puede estar repleto de informacion no
   deseada. Tambien podras usar este comando inmediatamente antes de
   un comando WAIT KEY para asegurarte de que el programa espera una
   respuesta mediante la pulsacion de una tecla.
      PUT  KEY   (coloca una cadena en el buffer del teclado)
   PUT KEY a$
   Carga una cadena de caracteres directamente en el interior del
   buffer del teclado. Incluso puede incluirse un retorno de carro
   usando el caracter CHR$(13).
      El uso mas habitual de este comando es para la carga de mensa-
   jes por defecto en tus rutinas de INPUT. He aqui un ejemplo:
      Do
        Put Key "No"
        Input "Otro juego";a$
        if A$="No" then Exit
      Loop
                                                                 225
   Entrada/Salida
      INPUT  (carga un valor del usuario y lo asigna a una variable)
   INPUT
   Te permite una forma estandard de entrada de informacion en una o
   mas variables. Existen 2 formatos posibles para esta instruccion:
   INPUT vars¡;¿
   Introduce una lista de variables directamente desde el teclado.
   "VAR" puede contener el juego de variables que desees, separadas
   por comas. Un signo de interrogacion se visualizara automaticamen
   te en lugar del cursor.
   INPUT "Prompt";variable list¡;¿
   Imprime una cadena de "apunte" antes de la entrada de tu informa-
   cion. Ten en cuenta que debes colocar siempre un punto y coma en-
   tre tu texto y la lista de variables. NO estando permitido el uso
   de la coma para este proposito.
      Un punto y coma opcional (;), al final de la lista de varia-
   bles especifica que el cursor de texto no se afectara por la ins-
   truccion INPUT, y mantendra su posicion original despues de que
   las datas hayan entrado.
      Cuando ejecutas uno de esos comandos, Basic esperara a que in-
   troduzcas la informacion requerida desde el teclado. Cada varia-
   ble de tu lista debe emparejarse con un determinado valor del usu
   ario. Esos valores deben ser los originales y estar separados por
   comas.
      LINE  INPUT    (solicita una lista de variables separadas
                      por un retorno de carro)
   LINE INPUT
   Es igual que el anterior, excepto por el hecho de que usa un re-
   torno de carro (RETURN) en lugar de una coma para separar cada va
   lor de los que introduces desde el teclado.
                                                                226
                19:  O T R O S     C O M A N D O S 
      PRINT / ?     (imprime una lista de variables en pantalla)
   PRINT items
   Esta instruccion visualiza cualquier informacion en pantalla, co-
   menzando en la posicion del cursor. Cada elemento de tu lista 
   debe estar separado por una coma o un punto y coma. Un punto y co
   ma, imprimira los datos inmediatamente uno detras de otro, mien-
   tras que la coma primero mueve el cursor hasta la proxima posi-
   cion de tabulacion de pantalla.
      Normalmente, el cursor avanzara una sola linea hacia abajo, 
   despues de cada instruccion PRINT. Esto puede eliminarse añadien-
   do un punto y coma despues de dicha instruccion:
      Print 10,20*10,"Ho";
      Print "la"
      USING     (formateado de salida)
   PRINT USING format$;variable list
   El comando USING se usa conjuntamente con PRINT para conseguir un
   mejor control del formato de salida.
      "Format$" especifica una lista de caracteres que definen la 
   forma en que tus variables se visualizaran en pantalla. Cualquier
   texto normal de esta cadena se imprimira directamente, pero si in
   cluyes uno de los caracteres -- ~ # + - . ;   -- entonces se eje
   cutara un determinado tipo de formateo.
   (~) Formatea una variable de cadena. Cada ~ sera reemplazado por
       un caracter de tu cadena de salida, tomados de izquierda a
       derecha.
       PRINT USING "Esto es una ~~~~~ demostracion de USING";"Corta"
   (#) Cada uno de estos caracteres especifican un digito simple que
       va a imprimirse de tu variable. Cualquier digito no usado de
       esta variable sera automaticamente reemplazado por espacios.
   (+) Añade un signo mas a un numero si este es positivo, y un sig-
       no menos si fuera negativo.
       PRINT USING "+##";10: PRINT USING "+##";-10
   (-) Solo incluye un signo si el numero es negativo. Los numeros
       positivos se preceden por un espacio.
                                                                 227
   (.) Coloca un punto decimal en el numero, centrandolo en pantalla
   (;) Centra el numero pero sin ponerle notacion decimal
   ( ) Imprime un numero en su formato exponencial
       PRINT USING "He aqui el numero  ";12345.678
      REM   / '          (Comentario)
   REM comment
      Esta instruccion se usa para añadir comentarios a tus progra-
   mas Basic. Cualquier texto tecleado a continuacion de un REM sera
   completamente ignorado por AMOS Basic.
      REM this is a comment
      '   this is a comment
      Tambien, un apostrofe (') se puede utilizar, pero DEBERA colo-
   carse al principio de la linea.
      DATA        (coloca una lista de datos para un programa Basic)
      Esta instruccion te permite incorporar completos listados de
   util informacion directamente dentro de un programa Basic. Estos
   datos pueden ser posteriormente cargados como una o mas variables
   mediante la instruccion READ. Cada variable de tu lista debera ir
   separada con una COMA.
      DATA 1,2,3,"Hola"
      A diferencia de la mayoria de Basics, la version AMOS de esta
   instruccion, tambien te permite incluir expresiones como parte de
   tus datas. Asi las siguientes lineas de programa serian igualmen-
   te aceptables:
      DATA $FF50,$890
      DATA %111111111111,%1101010101
      DATA A
      Label: DATA A+3/2.0-Sin(B)
      DATA "Hola"+" soy yo!"
      Es importante darse cuenta que "A" en la etiqueta Label debe 
   ser el contenido de la variable A, y no la letra A. La expresion
   sera calculada automaticamente durante la operacion de lectura 
   con READ, utilizandose los ultimos valores de A y B.
      Tambien es importante que cada instruccion DATA sea el unico
   comando de la linea. Cualquier comando posterior sera totalmente
   ignorado!! Las instrucciones DATAs se pueden colocar en cualquier
   parte de tu programa Basic. Sin embargo, los DATAs almacenados 
   dentro de un procedimiento AMOS no seran accesibles desde el pro-
   grama principal.
                                                                228
      READ        (transfiere informacion desde las lineas
                   DATA hasta una variable)
   READ list of variables
   Carga la informacion contenida en las lineas DATA dentro de una
   lista de variables. READ utiliza un puntero especial que determi-
   nara la situacion de la siguiente DATA a leer. Al comienzo de tu
   programa, el puntero o marcador se situa en el primer DATA. Y una
   vez que se ha leido este, pasa a apuntar al siguiente de la lista
   Como puedes imaginarte, las variables que leas deberan ser exacta
   mente del mismo tipo que los datas. Ejemplo:
      T=10
      Read A$,B,C,D$
      Print A$,B,C,D$
      DATA "String",2,T*20+RND(100),"AMOS"+" Basic"
      RESTORE       (situa el puntero de READ)
   RESTORE Label
   RESTORE LABEL$          Este comando cambia el puntero al que se
   RESTORE Line         dirigira la siguiente operacion READ para 
   RESTORE number       encontrar la proxima instruccion DATA. Cada
                        procedimiento de AMOS tiene su propio punte-
   ro de DATAS. Asi cualquier llamada a este comando solo afectara 
   al procedimiento actual.
      "Label" es una etiqueta que especifica la posicion de la prime
   ra instruccion DATA a leer. El nombre de esta etiqueta puede cal-
   cularse como parte de la expresion, por lo que los siguientes co-
   mandos son legales:
      RESTORE L
      RESTORE "L"+"A"+"B"+"E"+"L"
      De forma parecida, "LINE" selecciona el numero de linea de la
   proxima instruccion DATA. Como "label", dicho numero puede intro-
   ducirse mediante una expresion:
      RESTORE TEST+2
      Por lo que podras saltar a traves de las instrucciones DATA de
   tu programa, permitiendote elegir la informacion a seleccionar en
   funcion de la actuacion del usuario. Cada habitacion de una aven-
   tura, por ejemplo, podria tener su informacion almacenada en una
   lista de simples instrucciones DATA. Para leer esta descripcion,
   bastaria usar algo como:
      RESTORE Room*5+1000:  Rem cada habitacion tiene 5 lineas DATA
      Read DESC$ : Print DESC$
          :      :      :
                                                                229
      Obviamente, si una instruccion DATA no existe en la linea espe
   cificada por RESTORE, se generara un apropiado mensaje de error.
   Ten cuidado al usar este comando dentro de un procedimiento. Al
   objeto de asegurar su funcionamiento, tus instrucciones DATA debe
   ran encontrarse dentro de dicho procedimiento.
      WAIT         (demora en cincuentavos de segundo)
   WAIT n
   Suspende la ejecucion de un programa AMOS Basic durante "N" cin-
   cuentavos de segundo. Cualquier funcion que utilice interrupcio-
   nes, como MOVE y MUSIC, continuaran funcionando normalmente duran
   te este periodo.
      = TIMER =        (contador)
   v=TIMER
   TIMER=v
   TIMER es una variable reservada que se incrementa en 1 cada cin-
   cuentavo de segundo. Es habitualmente utilizada para establecer
   la semilla del generador de numeros aleatorios, como sigue:
      Randomize TIMER
      NOT       (operacion logica NOT)
   v=NOT(d)
   Esta funcion cambia cada digito binario en un numero de 1 a 0 y
   viceversa. Suponiendo que cierto es -1 (binario %1111111111111) y
   falso es 0, NOT(cierto)=Falso. Ejemplo:
      Print BIN$(Not(%1010),4)
      (Resultado: 0101)
      If NOT (True)=False then Print "False"
      TRUE       (operacion logica TRUE  --cierto--)
   v=TRUE
   Cuando se realiza un Test del tipo X>10, se produce un valor. Si
   esa condicion es cierta entonces este numero se pone a -1, de 
   otro modo sera 0.
      If -1 then Print "Menos 1 es CIERTO"
      If TRUE then Print "y TRUE es ";TRUE
                                                                 230
      FALSE       (operacion logica FALSE)
   v=FALSE
   Devuelve un valor 0. Se usa por todas las operaciones condiciona-
   les como IF...THEN y REPEAT...UNTIL para representar el FALSO.
      Print FALSE
      (Resultado: 0)
                                                             231
                20:  A C C E S O     A L     D I S C O  
      Los comandos de disco de AMOS te ofrecen un total acceso al
   sistema de ficheros del Amiga. Esta posibilidad, puede ser explo-
   tada para crear desde un simple lector de datos hasta completas
   bases de datos.
   Drives & volumes
      Como sabes, tu Amiga te permite etiquetar tus discos de diferen-
   tes maneras. Si no estas familiarizado con el CLI, es posible que
   encuentres todo esto un poco confuso. De modo que te brindaremos
   una breve explicacion de los nombres usados
   1- Drives 
      O unidades de discos, a las que se les asignan nombres con el
   siguiente formato
      DFn
   en donde "N" es un digito simple que contiene el numero de tu uni
   dad de discos. El primer floppy de tu sistema (normalmente el in-
   terno) es conocido como DF0, luego vendran DF1, DF2, DF3, etc si
   estuviesen instalados.
      Los discos duros o 'Hard Drives' se especifican mediante
      DHn
   en donde "N" es el numero de tu disco duro (o parte de el).
   2- Volumes 
      El Amiga tambien crea un nombre separado (VOLUME) para identi-
   ficar cada disco individual. Esta etiqueta puede ser sustituida
   por el nombre del drive en cualquiera de tus comandos AMOS. Asi,
   AMOS detectara automaticamente cada drive en busca del disco nece
   sario. Si no lo encontrara, aparecera  un mensaje de error "drive
   not mounted".
      Cuando prepares un nuevo disco desde el Workbench, el disco re
   cibira el nombre de vacio 'Empty". Para cambiar esta etiqueta des
   de el Workbench, simplemente selecciona la opcion RENAME e intro-
   duce tu nuevo nombre el la oportuna caja de dialogos. Este nombre
   podra ser practicamente cualquier cadena de caracteres que desees
   pero debera terminar con un par de puntos (:) cuando se usada en
   tus programas. He aqui algunos ejemplos:
                                                                 232
      AMOS:
      AMOS_DATA:
   ATENCION!!: si creas varios discos con el mismo nombre o con sus
   nombres intercambiados de forma indiscriminada, el Amiga podra fa
   cilmente confundirse de disco. En dichas circunstancias, necesita
   ras especificar el numero de drive. De este modo, AMOS sabra que
   disco manejar.
      Te aconsejamos asignar diferentes nombres para cada disco en
   uso. Esto no cuesta trabajo y simplifica las cosas enormemente.
   3- Dispositivos logicos 
      Finalmente, existe un juego de objetos conocidos como disposi-
   tivos logicos (LOGICAL DEVICES), utilizados por el Amiga para sus
   rutinas operativas para determinar con precision la posicion de
   importantes ficheros del sistema como los manipuladores de dispo-
   sitivos (DEVICE HANDLERS) o las fuentes (FONTS). Cada dispositivo
   se asigna habitualmente a un directorio especifico de la actual
   secuencia de arranque (Start-Up-Sequence). He aqui algunos casos:
      FONTS: Es un directorio que contiene diferentes fuentes
      LIBS:  Contiene ficheros libreria necesarios para el comando
            SAY de AMOS
   4- Cross DOS 
      Si has comprado un paquete DOS separado y lo has instalado en
   memoria, tambien seras capaz de acceder a discos formateados por
   otros sistemas operativos (IBM o ST) desde AMOS Basic. Esos dis-
   cos reciben nombres que comienzan por las letras DI:
      DIn:      (En donde N es el numero del drive)
   Al objeto de convertir tus programas STOS a AMOS Basic, necesita-
   ras grabarlos en formato ASCII utilizando el comando FSAVE"*.ASC"
   de STOS. Luego inserta el disco en el floppy del Amiga que haya
   sido montado por Cross DOS o en un drive de IBM.
     Debido a las diferencias entre STOS y AMOS, muchos programas de
   STOS necesitaran ligeras modificaciones antes de funcionar con el
   sistema AMOS.
                                                                233
   Cambio de directorio
      DIR   (Muestra el directorio del presente disco)
   DIR ¡path$¿ ¡/w¿
   Lista todos los ficheros del presente disco. Si se incluye el pa-
   rametro opcional "PATH", solo los ficheros que cumplan ciertas
   condiciones se podran visualizar. Cualquier cajon del listado se
   podra distinguir por ir precedido del caracter "*".
      El listado puede detenerse en cualquier momento, bastando con
   pulsar la barra espaciadora. Para continuar, pulsala de nuevo.
      Ten en cuenta que si cambiar discos e intentas obtener el lis-
   tado del directorio, obtendras un mensaje de error del tipo "devi
   ce not mounted". Esto se debe a que has sacado el disco sin infor
   mar de ello a AMOS Basic. La solucion es simplemente actualizar
   el nombre del directorio actual al nuevo, usando una linea como
   DIR$="DF0:" antes de llamar al comando DIR.
      /W lista los ficheros en dos columnas en pantalla. Esto dobla
   el numero de ficheros que pueden verse al mismo tiempo. La cadena
   PATH consiste en 3 elementos principales:
         ¡ Disc:¿¡Directory/¿Filter
   FILTER define unas condiciones que deberan cumplir los ficheros 
   de tu listado. En el texto, cada caracter de tu texto debe equiva
   ler exactamente a cada caracter del fichero visualizado. Ejemplo:
      Dir "Music"
      (Resultado: Music)
   El asterisco (*) equivale a una lista de letras de los nombres de
   tus ficheros hasta el proximo caracter control:
      Dir "M*"
   Por defecto, esta opcion ignorara cualquier fichero que alguna
   letra de extension MS-DOS. Asi un fichero como Mad.ASC del disco
   no sera listado.
   El punto (.) equivale a la extension de un fichero. Es habitual-
   mente usado conjuntamente con el asterisco para listar todos los
   ficheros de un determinado tamaño.
   El signo de interrogacion equivale a un caracter simple en la po
   sicion actual.
                                                                 234
      = DIR$ =     (cambia el directorio actual)
   s$=DIR$
   DIR$=s$
   Esta funcion contiene el directorio que sea usado en el punto de
   comienzo para todas las siguientes operaciones de disco, tanto de
   carga como de escritura. Es muy similar al comando CD del CLI,
   con la ventaja adicional de permitirte leer el directorio a la 
   vez que puedes cambiarlo. Ejemplos de su uso:
      Print DIR$
      Dir$="AMOS:Iff/"
      PARENT       (reestablece el guion de un directorio)
   PARENT
   La accion de PARENT consiste en cargar el directorio actual con
   el patron del cajon actual. Usando repetidamente este comando,
   rapidamente iras llegando hasta el directorio origen.
      SET  DIR     (establece el estilo usado por DIR)
   SET DIR n¡,filter$¿
   Establece el estilo de los listados. "N" es el numero de caracte-
   res que oscilan desde 1 a 100, y que apareceran en cada fichero.
   Ten presente que esta ubicacion NO tiene efecto sobre la actual
   longitud de tus nombres. Solo cambia la forma en que dichos nom-
   bres aparecen en pantalla.
      "FILTER" es una lista de nombres que seran excluidos del direc
   torio. Todos los ficheros que coincidan con este filtro seran com
   pletamente ignorados y no apareceran como parte del directorio.
   Esto puede usarse para suprimir los inutiles ficheros ".INFO" que
   contienen las definiciones de los iconods usados por el Workbench
      Ten en cuenta que es posible ignorar todos los nombres. Simple
   mente termina cada nombre con un simple "/". Por defecto, el fil-
   tro se estable en:
      ".INFO/*.INFO/*.*.INFO"
   Operaciones habituales de discos
   ================================
      DFREE     (espacio libre de un disco)
   f=DFREE
   Devuelve la cantidad de espacio libre en bytes que resta en el
   disco actual.
                                                                 235
      MKDIR     (crea un cajon)
   MKDIR f$
   Crea un nuevo cajon en el disco con el nombre "F$". Ejemplo:
      Mkdir "DF0:TEST"
      KILL       (borra un fichero del disco)
   KILL f$
   Borra el fichero "F$" del disco actual
      RENAME      (renombra un fichero)
   RENAME old$ to new$
   Cambia el nombre de un fichero
   Seleccion de un fichero
   =======================
      = FSEL$     (selecciona un fichero)
   f$=FSEL$(path$¡,default$¿¡,title1$,title2$¿)
   Esta funcion te permite elegir tus ficheros directamente desde el
   disco, usando el selector de ficheros estandard de AMOS. "PATH$"
   establece el patron de busqueda que determinara que fichero sera
   visualizado en tu listado.
      Despues de que hayas seleccionado un fichero, FSEL$ informara
   su nombre completo o una cadena vacia si has seleccionado QUIT.
      "DEFAULT$" elige un fichero para usar por defecto.
      "TITLE1$" y "TITLE2$" son cadenas de texto opcionales que des
   criben el titulo a visualizar en la parte superior del selector
   de ficheros. Ejemplo:
      F$=FSEL$("*.IFF","","Load un fichero IFF")
      If F$="" then Edit: Rem regresa al editor si no se selecciona
                          un fichero
      Load IFF F$,0
                                                               236
   Ejecucion de un programa AMOS desde el disco
      RUN     (ejecuta un programa de AMOS Basic)
   RUN ¡file$¿
   Pese a que es bastante facil ejecutar tus programas directamente
   desde el editor, hemos incluido un comando separado RUN. Esta ver
   sion del comando con el parametro FILE$ solo puede ser usado des
   de el modo directo.
      Pero la orden RUN FILE$ tambien puede situarse dentro de un
   programa en Basic. Esto te permitira encadenar una lista de pro-
   gramas uno detras de otro. Ten presente que cuando tu ejecutas un
   programa de esta forma, el programa existente sera retirado de la
   memoria y cualquier variable se perdera. Sin embargo, cualquier
   pantalla de datas que se haya creado permanecera intacta hasta 
   que las siguientes pantallas sean visualizadas.
      Este comando es enormemente util, ya que te permite dividir
   cualquier programa AMOS en un numero de niveles que pueden ser
   cargados separadamente desde el disco. Cada nivel podra ahora es-
   cribirse de forma separada como un programa completamente indepen
   diente. Asi, el unico limite para el tamaño de tus programas, es
   la cantidad de espacio disponible en el disco.
      Vease tambien PRUN.
   Comprobando la existencia de un fichero
   =======================================
      = EXIST     (comprueba si existe un fichero determinado)
   flag=EXIST(f$)
   Este comando verifica si en el directorio actual existe el fiche-
   ro F$. Si este es encontrado, entonces se devuelve un valor -1,
   en caso contrario es 0. La funcion EXIST es capaz de chequear la
   existencia de cualquier fichero en un disco completo. Ejemplo:
      Print Exist("DF1:"): Rem ¿Se ha conectado un segundo floppy?
      = DIR  FIRST$   (obtiene el primer fichero del directorio
                       que coincida con un patron dado)
   file$=DIR FIRST$(path$)
   Devuelve una cadena que contiene el nombre y longitud del primer
   fichero del disco que cumpla con el actual patron de busqueda, es
   pecificado en "PATH$". Cuando esta funcion es usada, todo el lis-
   tado del directorio se cargara en memoria.
      Una vez aparezca un resultado, podras acceder al siguiente fi
   chero que reuna esas caracteristica mediante el comando DIR NEXT$
   Un ejemplo:
      Print Dir First$("*.*")
                                                                237
      = DIR  NEXT$     (obtiene el siguiente fichero que coincida
                        con el patron dado)
   file$=DIR NEXT$
   Devuelve el siguiente fichero del directorio creado por el coman-
   do anterior. Despues de que el ultimo item haya sido leido de la
   lista, aparecera una cadena conteniendo el caracter vacio ("").
   Todo el directorio sera ahora borrado y la memoria ocupada sera 
   habilitada para el programa. He aqui un ejemplo que muestra todos
   los ficheros del directorio actual:
      F$=Dir First$("*.*")
      While F$<>""
        Print F$: Bell: Wait 30
        F$=Dir Next$
      Wend
   Ficheros de disco
   =================
      Los ficheros son un conjunto de informacion que ha sido agrupa
   da junta en algun lugar del disco. A cada fichero se le asigna un
   nombre que puede contener desde 1 a 255 caracteres.
      Antes de que puedas usar alguno de esos ficheros, primero nece
   sitaras inicializarlos mediante las instrucciones OPEN IN, OPEN
   OUT o APPEND. Cuando abras un fichero, lo asignaras a un canal 
   cuyo numero va de 1 a 10. Este numero se utilizara en las futuras
   operaciones de disco para identificar el fichero con el que estas
   trabajando. El Amiga opera con dos tipos de ficheros de disco:
    - Ficheros secuenciales
    - Ficheros de acceso aleatorio
   1- Ficheros secuenciales 
      Constituyen los ficheros estandard usados en el Amiga. La ra-
   zon de su nombre es que solo se permite leer la informacion en la
   precisa secuencia en que fue originalmente creado. Esto significa
   que si deseas cambiar solo un dato de la parte media de uno de
   estos ficheros, tendras que leer todo el fichero y luego volver a
   escribir todo el fichero otra vez en el disco.
      AMOS Basic te permite el acceso a los ficheros secuenciales ya
   sea para lectura o escritura, pero NUNCA para ambas cosas al mis-
   mo tiempo.
      Open Out1,"file.seq"
      Input "Como te llamas?";N$
      Print #1, N$
      Close 1
      Esto crea un fichero llamado FILE.SEQ que contendra tu nombre.
   Al objeto de leer luego esta informacion, tecla las lineas:
                                                                238
      Open In 1,"file.seq"
      Input #1,N$
      Print "Recuerdo tu nombre. Es ";N$
      Close 1
      Observa como ambos programas ejecutan 3 operaciones separadas:
   - Apertura del fichero usando OPEN IN, OPEN OUT o APPEND
   - Acceso al fichero con INPUT# o PRINT#
   - Cierre del fichero mediante CLOSE. Ten presente que si olvidas
     hacer esto, cualquier cambio del fichero se perdera.
      Estos 3 pasos necesitan completarse exactamente en este orden,
   cada vez que accedas a un fichero secuencial.
      OPEN  OUT      (apertura de un fichero para salida)
   OPEN OUT channel,n$
   Abre un fichero secuencial para escritura. Si este fichero ya
   existe seria borrado. "CHANNEL" es un numero entre 1 y 10 y se
   usara para identificar tu nuevo fichero en los siguientes coman-
   dos PRINT#. "N$" es el nombre del fichero que sera abierto.
      APPEND         (añade informacion a un fichero existente)
   APPEND channel,name$
   Abre un fichero secuencial para salida. Si este fichero ya existe
   los datos nuevos se añadiran al final del fichero. Esto te permi-
   te aumentar tus ficheros ya definidos.
      OPEN  IN       (apertura de un fichero para entrada)
   OPEN IN channel,f$
   Establece un fichero de lectura. Si este fichero no existiera,
   seria creado automaticamente. "CHANNEL" es un numero que oscila
   entre 1 y 10 y que se usara para las varias instrucciones INPUT
   sobre tu fichero abierto.
      CLOSE          (cierra un fichero)
   CLOSE n
   Cierra el fichero numero N. ATENCION, si olvidas cerrar un fiche-
   ro despues de que hayas terminado de actuar sobre el, cualquier
   cambios que hayas realizado se perdera!!
                                                                239
      PRINT #       (imprime una lista de variables en un fichero
                      o dispositivo)
   PRINTpt channel,variable list
   Este comando es identica la instruccion normal PRINT, salvo que
   la informacion no se visualiza en pantalla, sino en el fichero o
   el dispositivo especificado por el numero de canal. He aqui un
   ejemplo:
      Open Out 1,"Testfile"
      Print#,"Hello"
      Close 1
   Como pasaba con PRINT, podras usar la abreviatura ?#
      INPUT #       (entra una lista de variables desde un fichero
                      o dispositivo)
      Lee informacion desde un fichero secuencial o dispositivo como
   el puerto de serie. Como el comando estandard INPUT, se introduce
   una lista de variables que se cargaran en un juego de variables
   Basic. Como siempre, cada valor de la lista debera separarse con
   comas. De forma adicional, cada linea de datos tambien necesitara
   concluir con su propio caracter . Este es equivalente
   al retorno de carro que se ejecuta al introducir las lineas desde
   el teclado.
      LINE  INPUT #   (entra una lista de variables no separadas
                        por comas)
   LINE INPUT #channel,variable list
   LINE INPUT #channel,separators,variable list
   Esta funcion es identica a INPUT#, excepto que te permite sepa-
   rar tu lista de datas usando cualquier caracter, en vez de comas.
   Si se omite el separador, automaticamente se establece como tal
   al retorno de carro (RETURN). Cuando estas leyendo el texto, LINE
   INPUT# siempre es la opcion preferida, debido a que el lenguaje
   normal incluye comas que pudieran ser interpretadas por AMOS como
   si fueran separadores, lo que provocaria una gran confusion.
      SET  INPUT     (establece el final de una linea de caracteres)
   SET INPUT c1,c2
   Establece el caracter fin de linea que sera utilizado para la con
   clusion de una linea de datos. El Amiga espera un simple  al final de cada linea, mientras que la mayoria de ordenado
   res (incluido ST) requieren RETURN + . Asi si utilizas
   ficheros ST, necesitaras finalizar cientos de lineas de tu progra
   ma. Por fortuna, puedes evitar este problema utilizando este co-
   mando
                                                                 240
      "C1,C2" contiene un par de valores ASCII que seran usados como
   separadores. Si deseas un solo caracter, simplemente carga C2 con
   un valor negativo como un -1. He aqui un par de ejemplos:
      Set Input 10,-1: Rem formato Amiga estandard
      Set Input 13,10: Rem formato ST
      = INPUT$       (introduce un numero de caracteres desde 
                      un dispositivo)
   X$=INPUT$(f,count)
   Lee "COUNT" caracteres desde el dispositivo o fichero numero "F".
      = EOF          (comprueba el final de un fichero)
   flag=EOF(channel)
   EOF es una util instruccion que comprueba si se ha alcanzado el
   final de un fichero en la actual posicion de lectura. Si eso ocu-
   rre, EOF devuelve un resultado -1, en caso contrario sera 0.
       LOF            (longitud del fichero abierto)
   length=lof(channel)
   Devuelve la longitud de un fichero abierto. No tiene sentido usar
   esta funcion conjuntamente con dispositivos distintos del disco.
      POF             (contiene una variable con la actual posicion
                       del puntero de fichero)
   pos=POF(channel)
   Esta funcion cambia la actual posicion de lectura o escritura de
   un fichero abierto, por ejemplo:
      POF(1)=1000
   Este comando establece la posicion de lectura/escritura en 1000
   caracteres despues del comienzo del fichero. Por muy raro que pa-
   rezca, POF puede usarse de este modo para simular un acceso alea-
   torio con ficheros secuenciales. La razon de esto es simplemente
   que las unidades de disco son intrinsecamente aleatorias y todas
   las operaciones secuenciales se realizan mediante acceso randomi-
   zado.
                                                                241
   2- Ficheros de acceso randomizado  
      Estos ficheros se denominan asi porque puedes acceder a la in-
   formacion contenida en el disco, en el orden que desees. Al obje-
   to de usar esos ficheros, primeronecesitaras un poquito de teoria
      Todos los ficheros aleatorios se componen de unidades llamadas
   "RECORDS", cada uno con su propio numero. Esos 'records' se divi-
   den a su vez en un numero determinado de campos. Cada campo con-
   tiene una pieza individual de informacion. Cuando usas ficheros
   secuenciales, esos campos pueden tener cualquier longitud que de-
   sees, ya que el fichero solo podra ser leido en una sola direc-
   cion. Los ficheros randomizados o aleatorios, sin embargo, siem-
   pre requieren que especifiques el maximo tamaño de avamnce en
   esos campos.
      Supongamos que desees producir un fichero que contenga una lis
   ta de nombres y numeros de telefonos. En este caso, podras usar
   los campos:
      Campo        Longitud Maxima
      -----        ---------------
      Apellido          15
      Nombre            15
      Codigo            10
      Numero            10
      Ahora podras definir dichos campos usando la siguiente linea:
      Field #1,15 as APELLIDO$,15 as NOMBRE$,10 as CODIGO$,10 
                   as NUMERO$    
      Es importante darse cuenta que las cadenas especificadas por
   la instruccion FIELD tambien pueden usarse como variables norma-
   les de cadena. Esto te permite leer y escribir informacion en 
   cualquier campo. Por ejemplo:
      APELLIDO$="Perez"
      TEST$=APELLIDO$: Print TEST$
      Despues de que hayas cargado un 'record' con informacion, la
   podras escribir en disco mediante el comando PUT. Ejemplo:
      Put 1,10
      Larga datas en el record 10 del fichero abierto en el canal 1.
   De forma parecida, podras leer un 'record' mediante la instruc-
   cion GET:
      Get 1,10
      OPEN  RANDOM     (abre un canal para un fichero aleatorio)
   OPEN RANDOM channel,n$
   Abre un fichero de acceso aleatorio llamado n$. Cuando uses esta
   instruccion, deberas definir siempre la estructura del 'record'
   inmediatamente despues mediante el comando FIELD$.
                                                                242
       FIELD$            (define la estructura de un 'record')
   FIELD channel,length1 AS field1$,length2 AS field2$....
   Este comando te permite definir un 'record' que se usara por un
   fichero de acceso aleatorio. Este record puede tener hasta 65535
   bytes de longitud. Ejemplo:
       Field 1,15 as APELLIDO$,15 as NOMBRE$,10 as NUMERO$
       PUT              (incluye un record en un fichero aleatorio)
   PUT channel,r
   Este comando traslada un record de memoria hacia el record numero
   "R" de un fichero de acceso aleatorio. Antes de usarlo, el conte-
   nido del nuevo record debera primero ser colocado en el campo de
   cadena definido por FIELD, usando una instruccion como:
      APELLIDO$="Perez"
   Pese a que puedes escribir los records existentes en el orden que
   desees, no esta permitido dispersar los records en el disco de mo
   do totalmente aleatorio. Esto significa que si tienes que crear
   un fichero, no podras teclear algo como esto:
      Put 1,1
      Put 1,5
   En este caso, la instruccion PUT 1,5 generara un error, puesto 
   que no existen records en el fichero con los numeros entre 2 y 5.
   El record 2 debe ser el proximo record a incluir en el fichero,
   luego 3, 4, Ejemplo:
      Open Random 1,"TELEFONO"
      Field 1,30 as NOMBRE$,30 as TELEFONO$
      Index=1 
      Do 
        Input "Introduce un nombre";NOMBRE$
        Exit if NOMBRE$=""
        Input "Introduce telefono";TELEFONO$
        Put 1,Index:Inc Index
      Loop
      Close 1
      GET     (introduce un record desde un fichero aleatorio)
   GET channel,r
   Lee el record numero "R" almacenado en un fichero aleatorio abier
   to mediante OPEN. Luego se cargara este record en la cadena de 
   campo creado por FIELD. Las cadenas podran manipularse en la for-
   ma habitual. Ten presente que solo puedes usar GET para recuperar
   un record que esta actualmente en el disco. Si intentas grabar un
   numero de record que no existe, entonces se generara un mensaje
   de error. Ejemplo:
                                                                243
      Open Random 1,"TELEFONO"
      Field 1,30 as NOMBRE$,30 as TELEFONO$
      Do
        Input"Introduce numero de record";Index
        Exit if index=0
        Get 1,index: Print NOMBRE$: Print TELEFONO$
      Loop
      Close 1
   La impresora
   ============
      LLIST       (imprime parte o todo un programa)
   LLIST
   Este comando imprime todo el programa por impresora. Prueba a im
   primir alguno de los programas Basic que se incluyen en el disco
   de datas AMOS. Ellos te facilitaran una perfecta demostracion de
   las diferentes tecnicas de programacion necesarias para escribir
   tus propios programas AMOS Basic. Modifica libremente y experimen
   ta.
      LPRINT       (imprime una lista de variables)
   LPRINT variable list
   Esto es lo mismo que PRINT pero envia datos a la impresora en vez
   de a la pantalla. Ejemplo:
      Lprint "Hola"
   Vease tambien PRINT, USING, PRINT #
      LDIR          (imprime un directorio en impresora)
   LDIR ¡path$¿ ¡W/¿
   Lista el directorio del disco actual, imprimiendolo. Vease DIR
   para mas detalles.
                                                               244
   Dispositivos externos
      OPEN  PORT    (abre un canal hacia un puerto I/O o de
                     entrada/salida)
   OPEN PORT channel,"PAR:"  (abre canal para Interface Paralelo)
   OPEN PORT channel,"SER:"  (abre canal para Interface RS-232)
   OPEN PORT channel,"PRT:"  (abre canal para la impresora)
      Este comando te permite comunicarte con los dispositivos exter
   nos como es el caso del RS-232. Todos los comandos estandards de
   fichero pueden ejecutarse normalmente, excepto los comandos LOF o
   POF, que obviamente solo actuan en las operaciones de disco. Por
   ejemplo:
      Open Port 1,"SER:"
      For X=0 to 10
        Print #1,"AMOS Basic"
      Next X
      Close 1
      Este programa imprime 10 lineas de texto en el dispositivo co-
   nectado por RS-232. Si tu impresora usa un interface en paralelo,
   cambia la primera linea por
      Open Port 1,"PRT:"
   De forma parecida, puedes obtener informacion de un dispositivo
   como un modem con una linea como:
      Input #1,A$: Print A$
   Cuando se accede a dispositivos externos todas las instrucciones
   normales de entrada son disponibles para su uso, esto incluye a
   INPUT$ o LINE INPUT.
      = PORT         (comprueba si el canal esta esperando)
   n=PORT(channel)
   Comprueba si un dispositivo externo esta esperando alguna infor-
   macion. Si el dispositivo esta esperando para ser leido, un valor
   de -1 sera devuelto por esta funcion, o 0 en caso contrario.
   ================================================================
                                                                 245
         21: C O M P A C T A C I O N     D E     P A N T A L L A 
      SPACK      (compacta una pantalla)
   SPACK s to n ¡tx,ty,bx,by¿
   Este comando compacta la pantalla "S" en la memoria del banco "N"
   Se grabaran todos los datos de la pantalla, incluyendo su modo,
   tamaño de pantalla, posicion de visualizacion. Esto te permite re
   cuperar tu pantalla exactamente en su estado original.
      "S" es el numero de la pantalla que contiene tu imagen. "N" 
   contiene el numero de un banco de memoria que va de 1 a 16. Si
   este  banco no existiera, sera reservado automaticamente. Tu nue-
   vo banco se almacenara en la memoria FAST si estuviera disponible
   y se grabara con tu programa Basic. Despues de que hayas llamado
   a esta funcion, el tamamño de tu pantalla puede conocerse median-
   te la funcion LENGTH. Ejemplo:
      F$=FSEL$("*","","Load a picture")
      Load IFF F$,0
      Spack o to 1
      Print "La longitud de tu nuevo banco es";Length(1);"Bytes"
      Wait key
      Screen Close 0
      Unpack 1 to 0: Rem recupera la pantalla compactada
      No afectaras toda la pantalla con esta instruccion. Los parame
   tros opcionales te permiten comprimir cualquier seccion rectangu-
   lar de la pantalla que desees.
      "TX,TY" ahora contienen las coordenadas de la esquina superior
   izquierda de esta region. "BX,BY" establece la posicion de la es-
   quina infero-derecha. Todas las coordenadas X se redondearan has-
   ta el pixel multiplo de 8 mas cercano.
      Ten en cuenta que al objeto de conseguir la maxima reduccion 
   de memoria, SPACK intentara compactar tu imagen utilizando varias
   estrategias diferentes. Luego comprimira tu imagen usando los dis
   tintos metodos que consumen la menor memoria posible. Una de las
   consecuencias de este proceso es el tiempo, ya que se necesitan
   unos 6 segundos para comprimir cada imagen.
      Por contra, la descompactacion se realiza en menos de 1 segun-
   do, por lo que no hay riesgo de interferencia con tus programas.
   De hecho, esto acelera su velocidad, asi que es logico que desees
   usar este sistema CBLOCK. Vease para mas detalles Graficos de Fon
   do.
                                                                 246
      Por otro lado, si comparas el tamaño compactado de tus fiche-
   ros con su longitud original, puede ser que no te creas la ines-
   timable reduccion de memoria. Es importante darse cuenta que la
   gran mayoria de esos ficheros ya han sido COMPRIMIDOS mediante
   las rutinas estandards de compactacion IFF. Pero aun asi, es muy
   posible que AMOS pueda reducirlas un 20%.
      Las pantallas compactadas son ideales para titulos y tablas de
   records tan necesarias en un juego de arcade, ya que te permiten
   introducir bonitos efectos de pantalla sin consumir grandes canti
   dades de memoria. Tambien pueden incluirse en RPG y aventuras.
      PACK    (comprime una pantalla)
   PACK s TO n ¡tx,ty,bx,by¿
   Comprime una pantalla "S" en el banco numero "N". A diferencia 
   del comando previo SPACK, solo se comprimiran los datos de la ima
   gen. Asi tu pantalla compactada siempre debera ser descompactada
   directamente a una pantalla existente.
      Debido al modo en que se descomprimen las imagenes, existira
   un notable efecto brillante a menos que previamente hayas introdu
   cido el DOUBLE BUFFER en tus pantallas. Intenta evitarlo usando
   el comando PACK con pantallas de un solo buffer. Es mucho mas sen
   sible el sistema SPACK para este proposito.
      Si las coordenadas opcionales se incluyen, solo una parte de 
   la imagen sera comprimida.
      Puesto que PACK es completamente compatible con el sistema AU-
   TOBACK, es facil combinar imagenes con pantallas moviles. Si usas
   el AUTOBACK modo 2, incluso seras capaz de descompactar tus ima-
   genes DETRAS de los bobs existentes. Ademas es posible explotar
   esta instruccion conjuntamente con el comando SCREEN OFFSET para
   crear fantasticos scrolling de fondo para tus programas.
      UNPACK   (descomprime una pantalla)
   Descomprime una pantalla que ha sido previamente compactada con
   las instrucciones PACK o SPACK. Cada rutina de compactacion tiene
   su propia forma especifica de descompactar:
   A) Para SPACK:
      UNPACK b TO s
      Abre una pantalla y habilita la pantalla compactada del banco
   "B". Si esta pantalla ya existiera, sera completamente reemplaza-
   da por la nueva imagen. Una vez la pantalla ha sido descompactada
   sera claramente vibrante a la vista.
                                                                247
   B) Para PACK:
      Las pantallas compactadas mediante PACK pueden ser descompacta
   das usando dos instrucciones distintas. Dichas instrucciones to-
   man una imagen de un banco de memoria y la cargan en una pantalla
   existente. ATENCION!! la pantalla destino DEBE estar en el mismo
   formato que el dibujo compactado, de otro modo obtendras un mensa
   je de error "illegal function call".
      Unpack b
   Descompacta la pantalla en su posicion original
      Unpack b,x,y
   Redibuja tu imagen comenzando en las coordenadas "X,Y". Si la nue
   va imagen no cabe en la pantalla actual, obtendras un mensaje de
   error.
   ================================================================
                                                                 248
        22:  I N S T R U C C I O N E S     D E     N I V E L  
   Conversion numerica
      = HEX$       (convierte un numero a hexadecimal)
   h$=HEX$(v)
   h$=HEX$(v,n)
   Esta funcion convierte el entero "V" en una notacion decimal o de
   base 16 devolviendo una secuencia de "N" caracteres hexadecimales
   en la cadena "H$". Ejemplo:
      Print HEX$ (Colour(1),3)
      = BIN$       (convierte un numero en una cadena binaria)
   b$=BIN$(v)
   b$=BIN$(v,n)
   Convierte un numero en una notacion binaria o de base 2.
   Manipulacion de memoria
   =======================
      = PEEK        (obtiene el byte de una direccion)
   v=PEEK(address)
   Devuelve el byte (8-bits) almacenado en la direccion "ADDRESS".
      POKE          (Cambia el byte de una direccion)
   POKE address,v
   Copia el numero "V" en la direccion "ADDRESS". V siempre debe es-
   tar en el rango 0-255. Pero ATENCION: POKE puede ser muy peligro-
   so. Si 'pokeas' indiscriminadamente, podrias dañar tu ordenador!!
      = DEEK        (obtiene una palabra de una direccion)
   v=DEEK(address)
   Lee la palabra de 2 bytes en la direccion "ADDRESS". Dicha direc-
   cion debe ser PAR, o aparecera un error.
                                                                 249
      DOKE           (Cambia una palabra en una direccion)
   DOKE address,value
   Este comando carga un numero de dos bytes entre 0 y 65535 en la
   direccion de memoria "ADDRESS". En manos expertas esta funcion
   puede ser muy util. Pero como hasta el mejor de todos comete erro
   res alguna vez, es preferible copiar tus programas a disco antes
   de usar esta funcion en una rutina. Ejemplo:
      Doke Phybase(1)+1000,65535
      = LEEK         (lee una gran palabra en una direccion)
   v=LEEK(address)
   Devuelve una gran palabra de 4 bytes almacenada en la direccion
   "ADDRESS". Como DEEK, la direccion usada con esta funcion debe
   ser siempre PAR.
      LOKE           (cambia una gran palabra en una direccion)
   LOKE address,n
   LOKE copia el numero de 4 bytes en la direccion ADDRESS. Ejemplo:
      Loke Phybase(1)+10000,$FFFFFFFF
   El uso indiscriminado de esta funcion puede afectar terriblemente
   a tu ordenador, ten cuidado!!
      = VARPTR       (obtiene la direccion de una variable)
   address=VARPTR(variable)
   Devuelve la direccion en memoria de una variable de Basic. Cada
   tipo de variable se almacena usando su propio formato:
   a) Enteras: VARPTR encuentra la direccion de 4 bytes que contiene
      tu variable
   b) Coma flotante: VARPTR devuelve la localizacion de los 4 bytes
      que contienen el valor de la variable en un formato de preci-
      sion
   c) Cadena: La direccion VARPTR apunta hacia el primer caracter de
      la cadena. Una vez AMOS termine su cadena con un CHR$(0), po-
      dras obtener la longitud de la misma, como sigue:
      DEEK(VARPTR(A$)-2), en donde A$ es el nombre de la variable.
      Ademas, tambien podras usar LEN(A$).
                                                                 250
      COPY          (copia un bloque de memoria)
   COPY start,finish TO destination
   Este comando se usa para mover rapidamente grandes secciones de
   la memoria del Amiga de un lugar a otro. "START" y "FINISH" son
   las direcciones de los bytes de comienzo y final respectivamente.
      "DESTINATION" apunta a un area de memoria que se cargara con
   los nuevos datos. Todas esas direcciones deben ser PARES, o de lo
   contrario aparecera un mensaje de error.
      FILL          (rellena un bloque de memoria con un patron)
   FILL start TO finish, pattern
   Este comando rellena el area de memoria especificada por "START"
   y "FINISH" con los 4 bytes contenidos en "PATTERN". Dichas direc
   ciones deben ser PARES!
      "PATTERN" es una gran palabra contenida en una patron de relle
   no de 4 bytes. Esto se copiara en cada grupo de 4 bytes de la me-
   moria elegida.
      = HUNT        (encuentra una cadena en memoria)
   f=HUNT(start TO finish,s$)
   Busca en la memoria del Amiga por la secuencia de caracteres que
   se encuentra en s$. "START" es la direccion del primer byte de la
   memoria que se va a investigar, y "FINISH" es el ultimo. El resul
   tado viene en "F", y sera 0 (si la cadena no aparece) o el numero
   de posicion de s$.
   Operaciones con BITS
   ====================
      ROL           (rota hacia la izquierda)
   ROL.B n,v
   ROL.W n,v
   ROL.L n,v
   Esta es una version Basic de la instruccion ROL del lenguaje en-
   samblador. Su funcion consiste en tomar la representacion binaria
   de un numero en "V" y rotarlo hacia la izquierda exacatamente "N"
   lugares.
      Si "V" es una variable simple, entonces el numero rotado se to
   mara directamente de V. Pero si "V" fuera una expresion, entonces
   se tratara como la direccion de tu numero. Ejemplo:
      A=8
      Ror 1,A
      Print A
      (resultado: 4)
                                                                 251
   ROR es capaz de dividir cualquier valor positivo por 2. El resul-
   tado del calculo debera ejecutarse mucho mas rapidamente que la
   operacion equivalente (/).
      ROR            (rota hacia la derecha)
   Esta funcion es muy parecida a la anterior, pero rotara el numero
   en la direccion opuesta.
      = BTST         (comprueba un bit)
   b=BTST n,v
   Comprueba un digito binario en la posicion "N" de la variable "V"
   Si "V" es una expresion, sera usada como la direccion del bit que
   va a ser chequeado. En este caso, a "N" le sera automaticamente
   aplicada la funcion AND con 7 antes de continuar.
      Despues de que BTST haya sido ejecutado, "B" se cargara con -1
   si el bit de la posicion N esta puesto a 1, de otro modo sera 0.
      BSET            (pone un bit a 1)
   BSET n,v
   Pone el bit de la posicion N a 1, en la variable V
      BCHG            (cambia un bit)
   BCHG n,v
   Cambia el bit numero N en la variable V. Si el bit esta a 1 enton
   ces el nuevo valor sera 0 y viceversa
      BCLR            (limpia un bit)
   BCLR n,v
   Limpia del bit numero N en la variable V, poniendolo a 0. Como
   todas las operaciones con BITs, si V fuera una expresion, se usa
   ria la localizacion del dato en memoria.
   Lenguaje ensamblador
   ====================
      AMOS Basic incluye algunas facilidades especiales que te permi
   tiran combiar rutinas en lenguaje ensamblador con tus programas
   Basic. Hay que resaltar esto, debido a que la potencia de AMOS
   hace rara vez util el codigo maquina. Hemos añadido estas carac-
   teristicas solamente para aquellos programadores que suelan traba
   jar con codigo maquina que deseen optimizar sus programas con al-
   gunas rutinas en lenguaje ensamblador.
                                                                 252
      PLOAD        (reserva un banco de memoria para codigo maquina)
   PLOAD "filename",bank
   Reserva un banco de memoria y lo carga con un programa en codigo
   maquina desde el disco. "BANK" es el numero del banco de memoria
   que va a ser reservado para tu programa. Si fuera negativo, en-
   tonces el banco se calcularia utilizando el valor absoluto del nu
   mero, y el area de memoria se situaria en memoria CHIP.
      Una vez que hayas cargado tu programa de este modo, podras sal
   varlo a disco normalmente como un fichero del tipo ".abk". Creado
   el banco con esta funcion, este sera permanente y tambien se gra-
   bara directamente con tu programa AMOS.
      Tu programa puede consistir en un fichero en codigo maquina en
   el formato estandard del Amiga. En la practica, puede contener lo
   que quieras, con las siguientes limitaciones:
      - El codigo maquina DEBE ser totalmente reposicionable
      - Solo el codigo empleado por tu programa sera cargado
      - El programa debe terminar en una instruccion RTS
      CALL         (llama a un programa en codigo maquina)
   CALL address¡,params¿
   CALL bank¡,params¿
   Ejecuta un programa en lenguaje ensamblado contenido en la memo-
   ria del Amiga. "ADDRESS" puede ser tanto una localizacion de memo
   ria o el numero de un banco de memoria AMOS previamente creado
   con PLOAD.
      Al introducir tu programa, los registros D0 a D7 y A0 a A2 se
   cargaran con los valores contenidos en las matrices DREG y AREG.
   Tu programa ensamblador podra ahora cambiar cualquier registro si
   lo desea. Al comienzo de la rutina, el registro A3 apuntara a la
   opcional lista de parametros y A5 contendra la direccion del area
   principal de datos de AMOS. Cuando tu programa haya terminado, po
   dras regresar al Basic con solo una instruccion RTS.
      "PARAMS" es una lista de parametros que sera colocada en la
   pila del registro A3 por el comando CALL. Esos parametros necesi-
   tan salir en orden inverso al de entrada. Asi el ultimo valor en
   entrar sera el primero de la pila. Dependiendo del tipo de tus
   parametros, los valores de A3 seran de uno de los siguientes for-
   matos:
   a) Enteros: contiene una gran palabra que es un entero AMOS
   b) Coma flotante: contiene un numero decimal en formato precision
      IEEE
   c) Cadena: almacena la direccion de una cadena. Todas las cadenas
      comienzan con una simple palabra que contiene su longitud.
   ATENCION: Nunca se debera pokear directamente una cadena! Cuando
   una cadena se inicializa a una constante, la direccion de cadena
   apuntara a su punto original dentro del actual listado del progra
   ma! Asi si tu cambias este valor, afectaras a su fuente original.
   Esto es poco aconsejable y debera evitarse. Ver ejemplo 21.1.
                                                                 253
      = AREG =     (variable usada para transmitir informacion a
                    los registros del procesador 68.000)
   a=AREG(r)
   AREG(r)=a
   AREG es una matriz de 6 seudo-variables que se usan para contener
   una copia de los primeros 6 registros de direcciones del 68.000.
   "R" puede oscilar desde 0 a 6, e indica el numero de esos regis-
   tros de variables que sera afectado.
      Cuando se ejecuta el comando CALL, el contenido de esta matriz
   se cargara automaticamente en los registros de direccion A0 a A2.
   Al final de la funcion, se grabaran con cualquier nueva informa-
   cion que haya sido ubicada en sus apropiados registros.
      = DREG =       (variable usada para transmitir informacion
                      a los registros de datas del 68.000)
   d=DREG(r)
   DREG(r)=d
   Esta es una matriz de 8 enteros que contienen una copia del conte
   nido de los registros de datas del procesador 68.000. "R" hace re
   ferencia al numero de registro y puede oscilar de 0 a 7 para los
   registros D0-D7 respectivamente.
   Acceso a las librerias del sistema
   ==================================
      AMOS tambien te permite llamar a la mayoria de los sistemas de
   librerias internas del Amiga directamente desde la ROM. Esto no
   es particularmente util, si no fuera por AMOS!
      No uses estas rutinas a menos que sepas lo que estes haciendo.
   El Amiga es bastante dificil de programar, pero es muy facil de
   estropear el sistema y generar el infame error GURU.
      = DOSCALL         (DOS libreria)
   r=DOSCALL(function)
   Ejecuta una funcion directamente desde una libreria del DOS. Aqui
   "FUNCTION" es copia de dicha funcion. Vease el manual de la ROM
   KERNAL del Amiga para mas detalles.
      Antes de usar esta funcion, necesitaras tener controlados los
   registros D0-D7 y A0-A2 mediante las funciones AREG y DREG. Con
   la rutina sales de nuevo al Basic, y el contenido de D0 es devuel
   to por "R". Ten presente que el valor devuelto no esta cargado en
   AREG ni en DREG.
                                                                 254
      = EXECALL         (EXEC libreria)
   r=EXECALL(function)
   Ejecuta una llamada a la libreria EXEC del Amiga. De entrada, D0-
   D7 y A0-A2 se cargan con las matrices de control AREG y DREG, y
   "R" devolvera el valor contenido en D0.
       = GFXCALL         (Libreria grafica)
   r=GFXCALL(function)
   Llama a una rutina desde la libreria grafica usando los valores
   de control almacenados en las matrices AREG y DREG
       = INTCALL          (Libreria Intuition)
   r=INTCALL(function)
   Ejecuta un comando de la libreria Intuition. Como es habitual los
   valores de control son cargados de las matrices AREG y DREG, y 
   "R" contiene el resultado de la llamada.
      Puesto que AMOS no usa la rutina estandard de Intuition, esta
   funcion es especialmente peligrosa. Debes usarla solo si estas 
   familiarizado con esta libreria.
   Interior del AMOS Basic
   =======================
      Al objeto de permitirte un completo acceso al funcionamiento
   interno del sistema AMOS, hemos incluidos varios "huecos" en las
   diferentes areas de datas. Esto no tendra interes para el progra-
   mador casual, pero si sera muy util para crear tus propias utili-
   dades AMOS.
      = SCREEN BASE        (obtiene la tabla de las pantalla)
   table=SCREEN BASE
   Devuelve la direccion base de la tabla interna usada para conte-
   ner el numero y posicion de tus pantallas AMOS. Ver ejemplo 21.2
      = SPRITE  BASE       (obtiene la tabla de sprites)
   table=SPRITE BASE(n)
   Te permite la direccion de la lista interna de datos pra el spri-
   te N. Si este, no existiera, entonces la direccion de la tabla
   sera 0.
                                                                255
      Valores negativos para N, devolveran la direccion de una masca
   ra opcional asociada con este sprite. "TABLE" contendra ahora uno
   de los 3 siguientes valores posibles, dependiendo del status de
   esta mascara:
   *) table <0  Indica que no existe mascara para este sprite
   *) table =0  El sprite N tiene mascara, pero no ha sido generada
   *) table >0  Esta es la direccion de la mascara en memoria. La
                primera palabra de esta area, contiene la longitud
                de la mascara, y la siguiente se sigue de la actual
                definicion. 
      Ver ejemplo 21.3.
      = ICON  BASE        (obtiene la tabla de iconos)
   table=ICON BASE(n)
   Devuelve la direccion del icono N. El formato de esta informacion
   es exactamente igual al de la funcion anterior.
                                                             256
              23:  I N D I C E      D E      C O M A N D O S   
     ABS...............92           ACOS...............91
     ADD...............34           AMAL...............162
     AMAL FREEZE.......165          AMAL ON/OFF........165
     AMALERR...........167          AMPLAY.............166
     AMREG.............165          ANIM...............178
     ANIM FREEZE.......178          ANIM ON/OFF........178
     APPEAR............113          APPEND.............238
     AREG..............253          ASC................48
     AT................75           ATAN...............91
     AUTO VIEW ON/OFF..97           AUTOBACK...........135
     BANK TO MENU......194          BAR................56
     BCHG..............251          BCLR...............251
     BELL..............207          BGRAB..............27
     BIN$..............248          BLOAD..............44
     BOB...............132          BOB CLEAR..........138
     BOB COL...........144          BOB DRAW...........138
     BOB OFF...........140          BOB UPDATE.........138
     BOBSPRITE COL.....145          BOOM...............207
     BORDER............83           BORDER$............80
     BOX...............54           BREAK ON/OFF.......69
     BSAVE.............44           BSET...............251
     BTST..............251          CALL...............252
     CDOWN.............77           CDOWN$.............77
     CENTRE............79           CHANAN.............166
     CHANGE MOUSE......142          CHANMV.............167
     CHANNEL...........169          CHOICE.............186
     CHR$..............48           CIRCLE.............55
     CLEAR KEY.........224          CLEFT..............77
     CLEFT$............77           CLINE..............79
     CLIP..............59           CLOSE..............238
     CLOSE EDITOR......27           CLOSE WORKBENCH....27
     CLS...............107          CLW................84
     CMOVE.............75           COL................145
     COLOUR............52           COP LOGIC..........120
     COP MOVE..........119          COP MOVEL..........120
     COP RESET.........120          COP WAIT...........120
     COPPER OFF........119          COPPER ON..........119
     COPY..............250          COS................91
     CRIGHT............78           CRIGHT$............78
     CUP...............77           CUP$...............77
     CURS ON/OFF.......78           CURS PEN...........79
     DATA..............227          DEC................34
     DEEK..............248          DEF FN.............95
     DEF SCROLL........109          DEFAULT............98
     DEFAULT PALETTE...107          DEGREE.............90
     DEL BLOCK.........183          DEL CBLOCK.........183
     DEL ICON..........181          DEL WAVE...........217
     DFREE.............234          DIM................32
                                                                  257
     DIR...............233          DIR FIRST$.........236
     DIR NEXT$.........237          DIR$...............234
     DIRECT............67           DO  LOOP...........66
     DOKE..............249          DOSCALL............253
     DOUBLE BUFFER.....133          DRAW...............54
     DREG..............253          DUAL PLAYFIELD.....104
     DUAL PRIORITY.....105          EDIT...............67
     ELLIPSE...........55           END................67
     EOF...............240          ERASE..............42
     ERRN..............72           ERROR..............72
     EVERY n GOSUB.....68           EVERY n PROC.......69
     EVERY ON/OFF......69           EXECALL............254
     EXIST.............236          EXIT...............67
     EXIT IF...........67           EXP................92
     FADE..............113          FALSE..............230
     FIELD$............242          FILL...............250
     FIRE  -No viene-               FIX................94
     FLASH.............114          FLIP$..............48
     FN................95           FONT$..............87
     FOR  NEXT.........64           FREE...............45
     FSEL$.............235          GET................242
     GET BLOCK.........182          GET BOB............140
     GET CBLOCK........183          GET DISC FONTS.....87
     GET FONTS.........87           GET ICON...........180
     GET ICON PALETTE..181          GET PALETTE........107
     GET ROM FONTS.....87           GET SPRITE.........129
     GET SPRITE PALETE.128          GFXCALL............254
     GLOBAL............39           GOSUB..............62
     GOTO..............61           GR LOCATE..........53
     GR WRITING........58           HCOS...............91
     HEX$..............248          HIDE...............141
     HOME..............77           HOT SPOT...........145
     HSCROLL...........80           HSIN...............91
     HSLIDER...........85           HTAN...............92
     HUNT..............250          HZONE..............148
     I BOB.............139          I SPRITE...........131
     ICON BASE.........255          IF  THEN  ELSE.....63
     IF  ¡ELSE¿  ENDIF.63           INC................34
     INK...............51           INKEY$.............222
     INPUT.............225          INPUT #............239
     INPUT$............240          INPUT$()...........223
     INSTR.............47           INT................92
     INTCALL...........254          INVERSE ON/OFF.....73
     JDOWN.............143          JLEFT..............143
     JOY...............143          JRIGHT.............143
     JUP...............143          KEY SHIFT..........223
     KEY SPEED.........224          KEY STATE..........223
     KILL..............235          LDIR...............243
     LED...............221          LEEK...............249
     LEFT$.............46           LEN................48
     LENGTH............43           LIMIT BOB..........139
     LIMIT MOUSE.......143          LINE INPUT.........225
                                                                  258
     LINE INPUT #......239          LIST BANK..........42
     LLIST.............243          LN.................92
     LOAD..............43           LOAD IFF...........100
     LOCATE............75           LOF................240
     LOG...............92           LOGBASE............111
     LOGIC.............112          LOKE...............249
     LOWER$............48           LPRINT.............243
     MAKE ICON MASK....181          MAKE MASK..........146
     MATCH.............50           MAX................94
     MEMORIZE X/Y......78           MENU$..............185
     MENU ACTIVE.......202          MENU BAR...........201
     MENU BASE.........204          MENU CALC..........194
     MENU CALLED.......199          MENU DEL...........193
     MENU INACTIVE.....201          MENU ITEM MOVABLE..203
     MENU ITEM STATIC..203          MENU KEY...........192
     MENU LINE.........200          MENU LINKED........204
     MENU MOUSE........205          MENU MOVABLE.......202
     MENU ON/OFF.......186          MENU ONCE..........199
     MENU SEPARATE.....203          MENU STATIC........202
     MENU TLINE........200          MENU TO BANK.......194
     MENU X............204          MENU Y.............204
     MID$..............46           MIN................94
     MKDIR.............235          MOUSE CLICK........142
     MOUSE KEY.........142          MOUSE ZONE.........148
     MOVE FREEZE.......177          MOVE ON/OFF........177
     MOVE X............175          MOVE Y.............177
     MOVON.............177          MUSIC..............212
     MUSIC OFF.........212          MUSIC STOP.........212
     MVOLUME...........213          NO MASK............135
     NOISE.............217          NOT................229
     ON ERROR GOTO.....70           ON ERROR PROC......71
     ON MENU DEL.......191          ON MENU GOSUB......190
     ON MENU GOTO......191          ON MENU ON/OFF.....191
     ON MENU PROC......189          ON   GOSUB.........68
     ON   GOTO.........68           ON   PROC..........67
     OPEN IN...........238          OPEN OUT...........238
     OPEN PORT.........244          OPEN RANDOM........241
     PACK..............246          PAINT..............56
     PALETTE...........52           PAPER..............73
     PAPER$............73           PARAM..............40
     PARENT............234          PASTE BOB..........140
     PASTE ICON........180          PEEK...............248
     PEN...............73           PEN$...............73
     PHYBASE...........111          PHYSIC.............111
     PI #..............90           PLAY...............214
     PLOAD.............252          PLOT...............54
     POF...............240          POINT..............54
     POKE..............248          POLYGON............56
     POLYLINE..........55           POP................62
     POP PROC..........40           PORT...............244
                                                                  259
     PRG FIRST$........28           PRG NEXT$..........28
     PRINT #...........239          PRINT / ?..........226
     PRIORITY ON/OFF...148          PROCEDURE..........36
     PRUN..............28           PSEL$..............28
     PUT...............242          PUT BLOCK..........182
     PUT BOB...........140          PUT CBLOCK.........183
     PUT KEY...........224          RADIAN.............90
     RAIN..............117          RAINBOW............117
     RANDOMIZE.........93           READ...............228
     REM / ' ..........227          REMEMBER X/Y.......79
     RENAME............235          REPEAT$............79
     REPEAT   UNTIL....66           RESERVE............41
     RESERVE ZONE......147          RESET ZONE.........148
     RESTORE...........228          RESUME.............71
     RETURN............62           RIGHT$.............46
     RND...............93           ROL................250
     ROR...............251          RUN................236
     SAM BANK..........210          SAM LOOP...........211
     SAM PLAY..........209          SAM RAW............210
     SAMPLE............217          SAVE...............44
     SAVE IFF..........101          SAY................219
     SCAN$.............26           SCANCODE...........222
     SCIN..............106          SCREEN.............105
     SCREEN BASE.......254          SCREEN CLONE.......103
     SCREEN CLOSE......97           SCREEN COLOUR......106
     SCREEN COPY.......108          SCREEN DISPLAY.....101
     SCREEN HEIGHT.....106          SCREEN HIDE........106
     SCREEN OFFSET.....103          SCREEN OPEN........96
     SCREEN SHOW.......106          SCREEN SWAP........111
     SCREEN TO BACK....105          SCREEN TO FRONT....105
     SCREEN WIDTH......106          SCROLL.............110
     SET BOB...........134          SET BUFFER.........45
     SET CURS..........78           SET DIR............234
     SET ENVEL.........218          SET FONT...........88
     SET INPUT.........239          SET LINE...........55
     SET MENU..........204          SET PAINT..........57
     SET PATTERN.......56           SET RAINBOW........115
     SET SLIDER........85           SET SPRITE BUFFER..128
     SET TAB...........79           SET TALK...........220
     SET TEMPRAS.......59           SET TEXT...........88
     SET WAVE..........215          SET ZONE...........147
     SGN...............93           SHADE ON/OFF.......74
     SHARED............39           SHIFT DOWN.........115
     SHIFT OFF.........115          SHIFT UP...........115
     SHOOT.............207          SHOW...............141
     SIN...............91           SORT...............49
     SPACE$............48           SPACK..............245
     SPRITE............123          SPRITE BASE........254
     SPRITE COL........144          SPRITE OFF.........128
     SPRITEBOB COL.....145          SPRITE UPDATE......129
     SQR...............92           START..............42
     STR$..............49           STRING$............48
     SWAP..............94           SYNCHRO............174
     TAB$..............79           TAN................91
                                                                   260
     TEMPO.............212          TEXT...............86
     TEXT BASE.........88           TEXT LENGTH........88
     TEXT STYLE........88           TIMER..............229
     TITLE BOTTOM......83           TITLE TOP..........83
     TRUE..............229          UNDER ON/OFF.......74
     UNPACK............246          UPDATE.............149
     UPDATE EVERY......173          UPPER$.............47
     USING.............226          VAL................49
     VARPTR............249          VIEW...............98
     VOICE.............213          VOLUME.............208
     VSCROLL...........81           VSLIDER............85
     VUMETER...........213          WAIT...............229
     WAIT KEY..........224          WAIT VBL...........112
     WAVE..............216          WHILE   WEND.......65
     WIND CLOSE........84           WIND MOVE..........84
     WIND SIZE.........84           WINDON.............84
     WINDOPEN..........81           WINDOW.............84
     WINDOW FONT.......82           WINDSAVE...........82
     WRITING...........74           X BOB..............139
     X GRAPHIC.........76           X HARD.............130
     X MOUSE...........142          X SCREEN...........130
     X SPRITE..........129          XCURS..............78
     XGR...............53           XTEXT..............76
     Y BOB.............139          Y GRAPHIC..........76
     Y HARD............130          Y MOUSE............142
     Y SCREEN..........130          Y SPRITE...........129
     YCURS.............78           YGR................53
     YTEXT.............76           ZONE...............147
     ZONE$.............80           ZOOM...............118
Volver al principio de página