|
|||||
![]() 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:
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.
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 |
|