;*-------------------------------------------------------------------------*
;*                                                                         *
;*  Oberon Library Kopf                                    17-Sep-90       *
;*                                                                         *
;*                                                                         *
;*  © 1990 by Fridtjof Siebert                                             *
;*                                                                         *
;* Diese Assemblerprogramm muß assembliert und unter dem Namen             *
;* LibraryHead.obj in eines in der Datei OBERON:Path angegebenem           *
;* Directory kopiert werden                                                *
;*                                                                         *
;*-------------------------------------------------------------------------*

        XDEF    LibraryHead.SegList
        XDEF    LibraryHead.LibBase
        XDEF    LibraryHead.Open
        XDEF    LibraryHead.Close
        XDEF    LibraryHead.Expunge
        XDEF    LibraryHead.Init
        XDEF    LibraryHead.OpenOk

        XDEF    LibraryHead.SetTrue;      intern verwendet

        XREF    LibraryHead.OpenAll
        XREF    LibraryHead.CloseAll
        XREF    LibraryHead.LibOpen
        XREF    LibraryHead.LibClose

ln_succ  EQU 0;
ln_pred  EQU 4;
ln_type  EQU 8;
ln_pri   EQU 9;
ln_name  EQU 10;
ln_SIZE  EQU 14;

lib_flags    EQU 14;
lib_pad      EQU 15;
lib_negsize  EQU 16;
lib_possize  EQU 18;
lib_version  EQU 20;
lib_revision EQU 22;
lib_idstring EQU 24;
lib_sum      EQU 28;
lib_opencnt  EQU 32;
lib_size     EQU 34;

delexp       EQU 3;

Remove       EQU -252
FreeMem      EQU -210

        section "LibraryHead",code

LibraryHead.Init:
        movem.l d2-d7/a2-a6,-(a7)

        move.l  a0,LibraryHead.SegList
        move.l  d0,LibraryHead.LibBase

        lea     -4(A7),A0;
        jsr     LibraryHead.OpenAll

        moveq   #0,d0
        tst.b   LibraryHead.OpenOk
        beq.s   \ciao
        move.l  LibraryHead.LibBase,d0

\ciao:  movem.l (a7)+,d2-d7/a2-a6
        rts

LibraryHead.Open:
        addq.w  #1,lib_opencnt(a6)
        movem.l d2-d7/a2-a6,-(sp);
        jsr     LibraryHead.LibOpen
        movem.l (sp)+,d2-d7/a2-a6;
        tst.b   d0;
        bne.s   \ook
        subq.w  #1,lib_opencnt(a6)
        bra.s   ciao
\ook:   bclr    #delexp,lib_flags(a6)
        move.l  a6,d0
        rts;

LibraryHead.Close:
        movem.l d2-d7/a2-a6,-(sp);
        jsr     LibraryHead.LibClose
        movem.l (sp)+,d2-d7/a2-a6;
        subq.w  #1,lib_opencnt(a6);
        bne.s   ciao
        btst    #delexp,lib_flags(a6);
        bne.s   LibraryHead.Expunge
ciao:   moveq   #0,d0;
        rts;

LibraryHead.Expunge:
        movem.l d2-d7/a2-a6,-(a7)
        tst.w   lib_opencnt(a6)
        beq.s   \l
        bset    #delexp,lib_flags(a6)
        moveq   #0,d0
        bra.s   \ciao
\l:     move.l  a6,a5;
        move.l  4,a6;
        move.l  a5,a1;
        jsr     Remove(A6);

        move.l  a5,-(a7);
        jsr     LibraryHead.CloseAll

        move.l  4,A6
        moveq   #0,d0;
        move.l  (a7)+,a1;
        move.l  a1,a5;
        move.w  lib_negsize(A5),d0;
        sub.l   d0,a1
        add.w   lib_possize(a5),d0;
        jsr     FreeMem(a6);

        move.l  LibraryHead.SegList,d0
\ciao:  movem.l (a7)+,d2-d7/a2-a6
        rts

        section "LibData",data

id:     dc.b    "Oberon Library",0
        even

        section "LibGlobals",bss

LibraryHead.SegList dc.l    0;
LibraryHead.LibBase dc.l    0;
LibraryHead.OpenOk  dc.w    0;

        section "LibExtra",code

LibraryHead.SetTrue:

        st      d0;
        rts;

        END;
