Revistas en disco
 Fanzine Nº2 - Noviembre 1992
Anterior
Menú
Logotipo

Fanzine
Número 2 - NOVIEMBRE 1992

CURSO BÁSICO DE ENSAMBLADOR

<< LIBRERIAS >>

(c) Warlord/Impulse

Tras nuestro número anterior, algunas personas me han comentado que preferían que les comentara temas más avanzados que un curso de ensamblador. La verdad es que es cierto. Los comandos del 68000 los podéis encontrar en algunos libros, incluso en Español. Os recomiendo el de Anaya, por su claridad (y por venir en Español, claro)

Así pues, voy a saltarme todo lo que queda de comandos y hoy voy a hablar de un tema fundamental en el Amiga, como lo son las librerías. Muchos de vosotros venís del Z80 del Spectrum y este tema de las librerías quizás os coja un poco "fuera de juego". En este ordenador, por ejemplo, si querías cargar un programa, cargabas el comienzo y longitud en ciertos registros y luego hacías un CALL a una cierta dirección de la ROM. (¿1306 quizás?). En el amiga, todo este tema de ventanas, pantallas y cosas así, se controlan a través de las librerías, que son unas rutinas, suministradas por el sistema operativo del Amiga, y que nos harán la vida más fácil.

En primer lugar, voy a dar una breve descripción de las librerías:

- "exec.library". Esta librería es fundamental. Se necesita para abrir el resto de librerías y se encuentra ya en memoria, con lo cual no necesita ser cargada. Por cierto, las librerías se cargan siempre enteras, quiero decir, aunque sólo necesitéis una función, tendréis que leerla completamente.

- "dos.library". Contiene todas las funciones normales de entrada y salida de datos (pantalla, disco...)

- "intuition.library". Se utiliza cuando trabajamos con menús y cosas por el estilo.

- "clist.library". Para trabajar con el copper.

- "console.library". Contiene ciertas rutinas gráficas.

- "diskfont.library". El nombre lo dice todo.

- "graphics.library". Determinadas funciones del Blitter.

- "icon.library" ejem, ejem.

- "mathffp.library". Funciones matemáticas en coma flotante.

- "mathieeedoubas.library". ídem, pero enteras.

- "mathrans.library". Ídem pero más complejas.

Otras menos utilizadas: layers.library, timer.library, translator.library, y potgo.library.

Recuerda que es conveniente que sepas que necesitas para saber que librerías debes abrir, pues esto ocupa tiempo y dinero.

Veamos, supongamos que queremos abrir una librería ... pongamos la dos.library. Primero, hay que decir que cada función tiene un "offset" ... esto viene a ser una especie de dirección relativa de la función ...Mmmmm, no sé como explicar todo esto claramente. Os pongo un ejemplo y se acabó:

  Execbase   = 4      ; Dirección base de la exec.library
  Openlib    = -408   ; este es el "offset" de la función Openlib (abrir li-
                      ; brería), una función de la exec.library
  move.l   Execbase,a6
  lea      dosname(pc),a1
  moveq    #0,d0
  jsr      Openlib(a6)
  move.l   d0,dosbase
  beq      error
  error:
           ......
  dosname:
          dc.b    'dos.library',0,0    ; ¡ojo!, ¡escribir  correctamente  el
          even                         ; nombre!
  dosbase:
          bl.l    1
          end

Esta es la forma general de abrir una librería.

- Primero cargamos la dirección base de la "Execbase" en a6.

- En dosname (al final) tenemos el nombre de la librería que queremos abrir. Con la orden "lea dosname(pc),a1" cargamos la dirección de esta librería en a1. Ponemos d0=0 y llamamos a la librería. En d0 obtendremos la dirección base de la dos.library, que almacenamos en "dosbase" o cero en caso de error. ¿Es fácil de entender no?. Para cargar otra librería bastará hacer los cambios necesarios en "dosname".

Por último, y para acabar, necesitarás cerrar la librería abierta antes de salir al cli. Hay pues que insertar lo siguiente:

   Closelib = -414 ;¡Offset!
    .....
   move.l     Execbase,a6
   move.l     dosbase,a1
   jsr        Closelib(a6)

Los "offsets" los podéis encontrar en cualquier buen libro de código máquina del Amiga, pero si tenéis algún problema, ponéos en contacto conmigo

Vaya, este artículo me ha salido algo corto ... Mmmmm ... bueno, no tengo más ganas de escribir, así que para rellenar, os voy a incluir una rutina que copié hace bastante tiempo de algún libro y que aunque es una chorrada podéis ver bastante bien lo que he dicho. ¡Ah!, ¡no garantizo que funcione!

¡Ah!, antes de seguir os diré que en el próximo número os enseñaré a hacer unos sencillitos glenz-vectors de 128 faces ... vale, mejor lo dejo y paso a lo que os he dicho.

Ahí va ...

openlib        =-30-378        ; Todos estos son offsets
closelib       =-414       
open           =-30            ; más offsets de funciones de la dos.library
close          =-30-6
write          =-48
ioerr          =-122
mode_old       =1005
alloc_abs      =-$cc
run:
       bsr     init            ; comienza la rutina
       bsr     test
       nop
       bra qu
test:
       move.l  #title,d0
       bsr     pmsg
       bsr     pcrlf
       bsr     pcrlf
       rts
init:                          ; ¿Véis?, aquí se abre la dos.library
       move    execbase,a6 
       lea     dosname(pc),a1
       moveq   #0,d0
       jsr     openlib(a6)
       move.l  d0,dosbase
       beq     error
       lea     consolname(pc),a1
       move.l  #mode_old,d0
       bsr     openfile
       beq     error
       move.l  d0,conhandle
       rts
pmsg:
       movem  d0-d7/a0-a6,-(sp)
       move.l  d0,a0
       move.l  a0,d2
       clr.l   d3
ploop:
       tst.b   (a0)+
       beq     pmsg2
       addq.l  #1,d3
       bra     ploop
pmsg2:
       move.l  conhandle,d1
       move.l  dosbase,a6
       jsr     write(a6)          ; aquí  llama  a  la función "write" de la
       movem.l (sp)+,d0-d7/a0-a6  ; dos.library, su offset es -48.
       rts
pcrlf:
       move    #10,d0
       bsr     pchar
       move    #13,d0
pchar:
       movem d0-d7/a0-a7,-(sp)
       move    conhandle,d1
pchl:
       move.w  outline,d1
       move.b  d0,(a1)
       move.l  a1,d2
       move.l  #1,d3
       move.l  dosbase,a6
       jsr     write(a6)
       movem.l (sp)+,d0-d7/a0-a6
       rts
error:
       move.l  dosbase,a6
       jsr     ioerr(a6)
       move.l  d0,d5
       move.l  #-1,d7
qu:
       move.l  conhandle,d1
       move.l  dosbase,a6           ; aquí cierra la dos.library
       jsr     close(a6)
       move.l  dosbase,a1
       move.l  execbase,a6
       jsr     closelib(a6)
openfile:
       move.l  #1,d1
       move.l  d0,d2
       move.l  dosbase,a6
       jsr     open(a6)
       tst.l   d0
       rts
dosname:dc.b   'dos.library',0,0
align.w
dosbase:dc.l   0
consolname:dc.b 'CON:0/100/640/100/*HOLA MUNDO CRUEL',0
align.b
conhandle:dc.l 0
title:dc.b 'esto es el texto cli'
titleend:
align
outline:dc.w 0
end

Envía esta página web a un amigo:
Esta opción está desactivada temporalmente, rogamos disculpen las molestias

Volver a la página anterior

Al menú principal