         INCLUDE 'exec/initializers.i'
         INCLUDE 'exec/libraries.i'
         INCLUDE 'exec/resident.i'
         INCLUDE 'exec/alerts.i'

         INCLUDE 'exec.i'

         xref      FCC_VERSION
         xref      FCC_REVISION
         xref      _FCC_Name
         xref      _FCC_ID
         xref      _FCC_Info
         xdef      ___base

         SECTION   'text',CODE

;;Library Info
         STRUCTURE   FCCBase,LIB_SIZE
            UBYTE    fcc_Flags
            UBYTE    fcc_Reserved
            ULONG    fcc_Seglist
            APTR     fcc_SysBase
         LABEL       FCCBase_SIZE

         MOVEQ     #-1,D0
         RTS

RomTag   Dc.w  RTC_MATCHWORD           ; UWORD RT_MATCHWORD
         Dc.l  RomTag                  ; APTR  RT_MATCHTAG
         Dc.l  EndCode                 ; APTR  RT_ENDSKIP
         Dc.b  RTF_AUTOINIT            ; UBYTE RT_FLAGS
         Dc.b  FCC_VERSION             ; UBYTE RT_VERSION  (defined in sample_rev.i)
         Dc.b  NT_LIBRARY              ; UBYTE RT_TYPE
         Dc.b  0                       ; BYTE  RT_PRI
         Dc.l  _FCC_Name               ; APTR  RT_NAME
         Dc.l  _FCC_ID                 ; APTR  RT_IDSTRING
         Dc.l  InitTable               ; APTR  RT_INIT  table for InitResident()

EndCode:

         Even

InitTable          Dc.l FCCBase_SIZE
                   Dc.l FuncTable
                   Dc.l DataTable
                   Dc.l LibInit

DataTable
         INITBYTE  LN_TYPE,NT_LIBRARY
         INITLONG  LN_NAME,_FCC_Name
         INITBYTE  LIB_FLAGS,LIBF_SUMUSED!LIBF_CHANGED
         INITWORD  LIB_VERSION,FCC_VERSION
         INITWORD  LIB_REVISION,FCC_REVISION
         INITLONG  LIB_IDSTRING,_FCC_ID
         Dc.l      0
;*
;;Library Table
FuncTable
         Dc.l  LibOpen
         Dc.l  LibClose
         Dc.l  LibExpunge
         Dc.l  LibNull

         Dc.l  _FCC_Info

         Dc.l  -1
;*

;;LibInit                              (FCCBase,Seglist,ExecBase)(d0,a0,a6)
LibInit:
         MOVE.L    a5,-(sp)
         MOVEA.L   d0,a5               ; a5 = FCCBase
         MOVE.L    a0,(fcc_Seglist,a5)
         MOVE.L    a6,(fcc_SysBase,a5)
         MOVE.L    a5,d0
         MOVEA.L   (sp)+,a5
         RTS
;*
;;LibOpen                              (FCCBase,Version)(a6,d0)
LibOpen:
         ADDQ.W    #1,(LIB_OPENCNT,a6)
         BCLR      #LIBB_DELEXP,(fcc_Flags,a6)
         MOVE.L    a6,d0
         RTS
;*
;;LibClose                             (FCCBase)(a6)
LibClose:
         MOVEQ     #0,d0
         SUBQ.W    #1,(LIB_OPENCNT,a6)
         BNE.B     1$
         BTST      #LIBB_DELEXP,(fcc_Flags,a6)
         BEQ.B     1$

         BSR       LibExpunge
1$       RTS
;*
;;LibExpunge                           (FCCBase)(a6)
LibExpunge:
         MOVEM.L   d2/a5-a6,-(sp)
         MOVEA.L   a6,a5
         MOVEA.L   (fcc_SysBase,a5),a6

         TST.W     (LIB_OPENCNT,a5)
         BEQ.B     1$

         BSET      #LIBB_DELEXP,(fcc_Flags,a5)
         MOVEQ     #0,d0
         BRA.B     .end

1$       MOVE.L    (fcc_Seglist,a5),d2
         MOVEA.L   a5,a1
         Call      Remove

         MOVEQ     #0,d0
         MOVEA.L   a5,a1
         MOVE.W    (LIB_NEGSIZE,a5),d0
         SUBA.L    d0,a1
         ADD.W     (LIB_POSSIZE,a5),d0
         Call      FreeMem

         MOVE.L    d2,d0
.end     MOVEM.L   (sp)+,d2/a5-a6
         RTS
;*
;;LibNull
LibNull:
         MOVEQ     #0,d0
         RTS
;*

         SECTION   '__MERGED',DATA

___base  Dc.l      0

         END
