Una vez elegido
el macro-
ensamblador
"perfecto",
es hora
de arrancar
nuestras
máquinas
para dar los
primeros pasos. |
Los cuadernos del
Ensamblador
Por F. Javier Rodríguez |
|
CAPÍTULO IX |
Hasta ahora hemos repasado gran parte de la teoría en cuanto a la programación en EnSamblador del Amiga. Hemos visto el set de instrucciones (Mnemotécnicas), las partes en las que se encuentra dividida la memoria, las 'responsabilidades' de los principales chips... Ahora es el momento de empezar a realizar nuestros primeros programas, así como ver sus resultados.
El primer programa
Antes de nada recordarles que los listados fuente se encuentran realizados con DevPack 2, por lo que los usuarios que posean un MacroEnsamblador diferente deberán remitirse a su manual de instrucciones para sustituir algunas de las funciones aquí descrita por las similares que realice el suyo propio.
Nuestro primer programa podría realizar complejas operaciones, como por ejemplo operar con primitivas o algo similar, sin embargo buscaremos algo más sencillo y sobre todo que se vea, como por ejemplo... abrir nuestra propia pantalla sobre la del WorkBench. He elegido este programa por dos motivos: el primero es que se trata de un programa muy sencillo que nos servirá para aclarar algunos conceptos, el segundo es que se trata de una operación que seguramente realizará la mayoría de los programas que usted quiera hacer.
En muchas ocasiones hemos visto como otros programas realizaban esta operación, a primera vista parece sencillo (es sencillo) pero lo que seguramente no sabrán es que para realizar esta operación necesitamos crear una lista (la llamaremos estructura) que contenga varios parámetros, como por ejemplo resolución y tamaño de la pantalla, título de la misma, etc. Esta estructura es requerida por el sistema para que una función realice la operación de abrir la pantalla por nosotros. Pero antes de nada es necesario aclarar algunos puntos.
El sistema se encuentra formado por librerías, las cuales contienen a su vez diversas funciones, siendo estas las encargadas de realizar tareas como abrir ventanas, abrir pantallas, crear un menú, crear polígonos, hacer directorios... De esta forma dependiendo del tipo de operación que deseemos realizar deberemos abrir una librería u otra. Por ejemplo para la operación que vamos a realizar necesitaremos acceder a la 'Intuition.library' y dentro de esta llamar a la función OpenScreen(). Actualmente se esta publicando 'Las librerías del Amiga', una serie de artículos donde se recogen y explica la forma de acceder a cada una de las funciones de todas las librerías.
Ahora volveremos a nuestro primer programa. El primer paso será definir la estructura de pantalla, dicha estructura tendrá la siguiente forma:
 |
Align ; Fuerza direcci�n par.
NuevaPantalla: dc.w 0 ; Posici�n en X.
dc.w 0 ; Posici�n en Y.
dc.w 320 ; Anchura.
dc.w 200 ; Altura.
dc.w 2 ; N�mero de Bitplanes.
dc.b 0 ; Color del texto.
dc.b 1 ; Color del fondo.
dc.w 2 ; Modo de representaci�n.
dc.w 15 ; Tipo de pantalla: Custom.
dc.l PanNombre ; Puntero a titulo de pantalla.
dc.l 0 ; Sin Gadgets definidos (usar los del sistema).
dc.l 0 ; Sin Bitmap.
PanNombre: dc.b 'Mi Pantalla',0 ; T�tulo de la pantalla.
- La estructura tambi�n podr� tener la siguiente apariencia, haciendo m�s corto el listado:
Align
NuevaPantalla: dc.w 0,0,320,200,2
dc.b 0,1
dc.w 2,15
dc.l 0,PanNombre,0,0
PanNombre dc.b 'Mi Pantalla',0 |
|
 |
Después de ver esta estructura seguramente no se habrán aclarado mucho, y se preguntarán de donde han salido los números que definen los diferentes parámetros. A continuación podremos ver, con más detalle, cómo se obtienen y de donde salen los números de los parámetros.
La primera instrucción que nos encontramos es un 'Align', esto quiere decir que forzaremos una dirección par, ya que las definiciones no pueden comenzar en dirección impar; es muy importante que no se le olvide incluir esta instrucción al principio de su propia estructura, ya que de omitirla podría aparecer uno de estos preciosos GURU MEDITATION.
A continuación comienza la propia estructura en sí con dos valores: 0,0. Estos indican la posición origen en la que se abrirá la pantalla, en esta ocasión se trata de la esquina superior izquierda. Los siguientes dos valores indican el ancho y el alto de la pantalla, o lo que es igual la resolución de la misma. El siguiente valor indica el número de bitplanes que formarán la pantalla, lo cual repercute directamente en el número de colores que podremos utilizar en la misma; en esta ocasión sólo se podrán utilizar 2^2 = 4 colores.
Los siguientes dos valores indican los colores que se utilizarán tanto para el texto como para el color de fondo en la pantalla. El siguiente valor lo que indica es la representación de la pantalla, es decir si queremos que se abra en modo interlazado, baja resolución, etc. Este valor se obtiene partiendo de la siguiente base:
 |
| BIT |
Valor |
Nombre |
| 1 |
3 |
Normal. |
| 2 |
4 |
Interlazado. |
| 6 |
$40 |
PFBA. |
| 7 |
$80 |
Extra HalfBrite. |
| 8 |
$100 |
Genlock_Audio. |
| 10 |
$400 |
Divide la pantalla en un área de caracteres y |
| 11 |
$800 |
Define el modo HAM (Hold And Modify). |
| 13 |
$2000 |
VP_HIDE. |
| 14 |
$4000 |
Sprites: permite el uso de sprites. |
| 15 |
$8000 |
Se pone en modo 640x400 (la mayor resulución gráfica para la pantalla). |
|
 |
|
|
| Mediante |
 |
| las definiciones |
 |
| de pantalla |
 |
| se podrán definir |
 |
| con sencillez |
 |
| el número |
 |
| de bitplanes, |
 |
| así como |
 |
| la resolución. |
 |
|
Después de observar esta tabla comprobará que el valor se corresponde con el modo normal de representación. El siguiente valor indica el tipo de pantalla que se abrirá, en este caso es la nuestra propia (Custom); este valor puede ser sustituido por tipo WorkBench. El siguiente valor indica el tipo de fuente que será utilizado, en esta ocasión 0 = por defecto.
 |
ExecBase = 4
OpenLib = -408
move.l ExecBase.a6 ; Carga Exec.Library.
lea IntNombre,a1 ; Dirección del nombre de la
; librería.
Jsr OpenLib(a6) ; Abrir librería.
beq error ; Si ocurre algún error en el
; proceso, salir.
move.l d0,IntBase ; Intuition.Library.
.
.
.
error: rts ; Salimos del programa.
IntNombre: dc.b 'Intuition.Library',0 ; Nombre de la librería
; (siempre se pone un cero
; al final, para indicar que es
; el final de la cadena).
Align ; Forzamos dirección par.
IntBase: dc.l 0 ; Aquí se guardará la Base
; de la Intuition.Library. |
|
 |
|
El siguiente valor representa un puntero que indica la dirección en la que se encuentra el título de la pantalla. En el siguiente paso se definen los gadgets que contendrá la pantalla; la nuestra no tiene ninguno. A continuación indicamos que no deseamos utilizar ningún bitmap de fondo. Por último se encuentra el título de la pantalla.
Como se indicó anteriormente necesitaremos abrir la 'Intuition.Library', esta operación se realiza de la siguiente forma:
En este pequeño listado nos encontramos con algo nuevo: ExecBase y OpenLib. La ExecBase es la base (siempre fija) en la cual se encuentra la Exec.Library (residente en memoria). Es necesario acceder a esta librería para poder utilizar el resto de librerías. Por otro lado OpenLib (-408) es el offset (desplazamiento), en el cual se encuentra el salto a la rutina del sistema encargada de abrir una librería. La librería a la cual se debe acceder debe pasarse en el registro A1 en forma de puntero a la dirección en la cual se encuentra el nombre de dicha librería.
 |
OpenScreen = -198
.
.
.
move.l IntBase,a6
lea NuevaPantalla,a1
jsr OpenScreen(a6)
beq error
move.l d0,Pantahd
error: rts
Pantahd dc.l 0 |
|
 |
|
Al llamar a la librería (jsrOpenLib(a6)) nos devolverá un valor, en caso de que este haya sido 0 significará que se ha producido un error; por lo cual no se ha abierto la librería, en tal caso en nuestro programa saldremos. En caso de que no se haya producido ningún error, el valor devuelto en D0 será el puntero de la Base en la que se encuentra dicha librería, con lo cual deberemos guardarlo para posteriormente poder acceder a las funciones contenidas en esta. Una vez realizado este proceso podremos acceder a la función que abrirá nuestra pantalla.
| La ExacBase |
 |
| es la base |
 |
| (siempre fija) |
 |
| en la cual |
 |
| se encuentra |
 |
| la Exec.Library |
 |
| (residente |
 |
| en memoria). |
 |
| Es necesario |
 |
| acceder a esta |
 |
| librería para |
 |
| poder utilizar |
 |
| el resto |
 |
| de librerías. |
 |
|
Empezamos pasando la base de la Intuition.Library, anteriormente abierta, al registro A6; a continuación cargamos el registro A1 con el puntero a la dirección en la que se encuentra la estructura de definiciones para la pantalla, el siguiente paso es llamar a la rutina de la Intuition.Library encargada de abrir una pantalla (offset = -198). El valor que devuelve esta rutina en D0 será un puntero a un bloque de datos sobre la pantalla abierta, o 0 en caso de que se haya producido un error. Al igual que en el anterior proceso si se produce un error saldremos del programa.
Una vez ensamblado este listado y ejecutado, podremos comprobar como una nueva pantalla se abre delante de nuestros ojos: es nuestra propia pantalla. Por supuesto podremos pasar la pantalla a último o primer plano. Por otra parte, para cerrar la pantalla y salir al CLI o WorkBench, se ha incluído un pequeño bucle en el cual se comprueba si se ha pulsado el botón izquierdo del ratón; en caso afirmativo se cerrará la pantalla, así como la Intuition.Library, para salir del programa mediante el conocido 'rts'.
Igualmente habrán observado que nos encontramos ante un nuevo elemento; me refiero al bloque de datos sobre la pantalla. Dicho bloque de información incluye direcciones muy interesantes como por ejemplo... los punteros a los distintos BitPlanes que componen la pantalla. Algunos elementos interesantes en la estructura del bloque son los siguientes:
| Número |
Tamaño |
Definición |
| 0 |
L |
Puntero a siguiente pantalla. |
| 4 |
L |
Puntero a primera estructura de ventana. |
| 8 |
W |
Posición de la esquina izquierda. |
| $A |
W |
Posición de la esquina superior. |
| $C |
W |
Ancho. |
| $E |
W |
Altura. |
| $10 |
W |
Coordenada Y del ratón. |
| $12 |
W |
Coordenada X del ratón. |
| $14 |
W |
Flags de la pantalla. |
| $16 |
L |
Puntero a título de la pantalla. |
| $1A |
L |
Puntero a título por defecto. |
| $28 |
L |
Puntero a juego de caracteres. |
| $C0 |
L |
Puntero a primer Bitplane. |
| $C4 |
L |
Puntero a segundo Bitplane. |
| $C8 |
L |
Puntero a tercer Bitplane. |
| $CC |
L |
Puntero a cuarto Bitplane. |
|
|
 |
Por �ltimo el programa completo, encargado de abrir una pantalla, ser� el siguiente:
; ABRIR PANTALLA CUSTOM (Usuario)
;
; 10/5/91, Screen V1.0
;
; (c) 1991 Francisco Javier Rodr�guez.
;
; Este programa abre una pantalal Custom, sobre la existente,
; Utilizando la funci�n espec�fica de la Intuition.Library.
; Como par�metros por defecto se ha definido en baja
; resoluci�n (320x200) y modo normal de representaci�n. No
; utiliza estructura Bitmap y se define el juego de caracteres
; contenido en el sistema.
execbase = 4
openlibrary = -408
closelibrary = -414
openscreen = -198
closescreen = -66
move.l execbase,a6
lea intname,a1
jsr openlibrary(a6)
move.l d0,intbase
move.l intbase,a6
lea screendefs,a0
jsr openscreen(a6)
move.l d0,screenhd
loop: btst #6,$bfe001
bne.s loop
move.l screenhd,a0
jsr closescreen(a6)
move.l intbase,a1
move.l execbase,a6
jsr closelibrary(a6)
rts
even
screendefs: dc.w 0
dc.w 0
dc.w 320
dc.w 200
dc.w 2
dc.b 0
dc.b 1
dc.w 2
dc.w 15
dc.l 0
dc.l sname
dc.l 0
dc.l 0
sname: dc.b 'Mi Pantalla',0
even
intname: dc.b 'intuition.library'.0
even
intbase: dc.l 0
screenhd: dc.l 0
end |
|
 |
|