

  ­­­ C U R S O  B A S I C O  D E  E N S A M B L A D O R ­­­­­­­­­­­­­­­­­­


  << LIBRERIAS >>

 (c) Warlord/Impulse


   Tras nuestro número  anterior, algunas personas me han comentado que pre-
  ferí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  que-
  rías cargar un programa, cargabas el comienzo y longitud en ciertos regis-
  tros 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, sumninistra-
  das 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 completa-
  mente.

  - "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". idem, pero enteras.

  - "mathrans.library". Idem 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 libre-
  ráis 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 bas
  tará 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

