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