6 #include <exec/types.h>
7 #include <exec/initializers.h>
9 #include <exec/resident.h>
11 #include <proto/exec.h>
18 //----------------------------------------------------------------------------
20 extern struct ExecBase
*SysBase
;
22 //----------------------------------------------------------------------------
24 static LIB_SAVEDS(struct Library
*) LIB_ASM LIB_INTERRUPT
Initlib(LIB_REG(d0
, struct Library
*libbase
),
25 LIB_REG(a0
, struct SegList
*seglist
), LIB_REG(a6
, struct ExecBase
*sysbase
));
27 static LIBFUNC_PROTO(Openlib
, libbase
, struct Library
*);
28 static LIBFUNC_PROTO(Closelib
, libbase
, struct SegList
*);
29 static LIBFUNC_PROTO(Expungelib
, libbase
, struct SegList
*);
30 static LIBFUNC_PROTO(Extfunclib
, libbase
, ULONG
);
32 //----------------------------------------------------------------------------
36 static APTR functable
[] =
39 (APTR
) FUNCARRAY_32BIT_NATIVE
,
49 /* Init table used in library initialization. */
50 static ULONG inittab
[] =
52 sizeof(struct IconObjectDtLibBase
),
60 struct Resident ALIGNED romtag
=
66 RTF_PPC
| RTF_AUTOINIT
,
82 //----------------------------------------------------------------------------
84 static LIB_SAVEDS(struct Library
*) LIB_ASM LIB_INTERRUPT
Initlib(LIB_REG(d0
, struct Library
*libbase
),
85 LIB_REG(a0
, struct SegList
*seglist
), LIB_REG(a6
, struct ExecBase
*sysbase
))
87 struct IconObjectDtLibBase
*dtLib
= (struct IconObjectDtLibBase
*) libbase
;
90 dtLib
->nib_ClassLibrary
.cl_Lib
.lib_Revision
= LIB_REVISION
;
91 dtLib
->nib_ClassLibrary
.cl_Lib
.lib_Node
.ln_Pri
= SCHAR_MIN
;
92 dtLib
->nib_SegList
= seglist
;
94 if (!InitDatatype(dtLib
))
96 CALLLIBFUNC(Expungelib
, &dtLib
->nib_ClassLibrary
.cl_Lib
);
100 return dtLib
? &dtLib
->nib_ClassLibrary
.cl_Lib
: NULL
;
104 static LIBFUNC(Openlib
, libbase
, struct Library
*)
106 struct IconObjectDtLibBase
*dtLib
= (struct IconObjectDtLibBase
*) libbase
;
108 dtLib
->nib_ClassLibrary
.cl_Lib
.lib_OpenCnt
++;
109 dtLib
->nib_ClassLibrary
.cl_Lib
.lib_Flags
&= ~LIBF_DELEXP
;
111 if (!OpenDatatype(dtLib
))
113 CALLLIBFUNC(Closelib
, &dtLib
->nib_ClassLibrary
.cl_Lib
);
117 return &dtLib
->nib_ClassLibrary
.cl_Lib
;
122 static LIBFUNC(Closelib
, libbase
, struct SegList
*)
124 struct IconObjectDtLibBase
*dtLib
= (struct IconObjectDtLibBase
*) libbase
;
126 dtLib
->nib_ClassLibrary
.cl_Lib
.lib_OpenCnt
--;
128 if (0 == dtLib
->nib_ClassLibrary
.cl_Lib
.lib_OpenCnt
)
130 if (dtLib
->nib_ClassLibrary
.cl_Lib
.lib_Flags
& LIBF_DELEXP
)
132 return CALLLIBFUNC(Expungelib
, &dtLib
->nib_ClassLibrary
.cl_Lib
);
141 static LIBFUNC(Expungelib
, libbase
, struct SegList
*)
143 struct IconObjectDtLibBase
*dtLib
= (struct IconObjectDtLibBase
*) libbase
;
145 if (0 == dtLib
->nib_ClassLibrary
.cl_Lib
.lib_OpenCnt
)
147 ULONG size
= dtLib
->nib_ClassLibrary
.cl_Lib
.lib_NegSize
+ dtLib
->nib_ClassLibrary
.cl_Lib
.lib_PosSize
;
148 UBYTE
*ptr
= (UBYTE
*) dtLib
- dtLib
->nib_ClassLibrary
.cl_Lib
.lib_NegSize
;
149 struct SegList
*libseglist
= dtLib
->nib_SegList
;
151 Remove((struct Node
*) dtLib
);
152 CloseDatatype(dtLib
);
158 dtLib
->nib_ClassLibrary
.cl_Lib
.lib_Flags
|= LIBF_DELEXP
;
165 static LIBFUNC(Extfunclib
, libbase
, ULONG
)
169 d1(kprintf(__FUNC__
"/%ld: libbase=%08lx\n", __LINE__
, libbase
));