home *** CD-ROM | disk | FTP | other *** search
-
- Hintergrundwissen zu den Libraries:
- -----------------------------------
-
- In der pOS-Pre-Version wird die pExec-Library über zwei
- Zeiger abgebildet. Die 'Base' verhält sich wie beim Amiga.
- Der Hilfszeiger '...LibFunction' dient der einfachen Auffindung
- der Sprungtabelle, wobei beide Zeiger auf das gleiche Speichersegment
- zeigen. Die 'Base' zeigt immer auf (struct pOS_Library*) und
- '...LibFunction' zeit auf
- (ULONG)'Base' - sizeof('...LibFunction')
-
- In p:pExec/Library.h befindet sich die _pOS_GetStdLibraryFunction(lib) und
- _pOS_GetStdLibFunc(type,lib) - Defines, die diesem Sachverhalt Rechnung tragen.
-
-
-
- Damit die pOS-Pre-Version arbeitet muß immer:
-
- gb_ExecBase=exec;
- gb_ExecLib=*((struct pOS_ExecLibFunction**)lib->my_Lib.lib_Segm->sel_Seg.seg_Reserved2);
-
- gesetzt werden.
-
-
-
- Bau einer eigenen Library:
- --------------------------
-
- pOS-Pre-Version:
-
- Zuerst wird die Sprungtabelle als Struktur definiert, die später
- für den C-Compiler wichtig ist.
- ACHTUNG, FuncTable[] ist gespiegt zu (struct TestLibFunction*).
-
- struct TestLibFunction
- {
- VOID (*FuncB_func)(_R_LB pOS_Library*);
- UBYTE _d1[8];
- VOID (*FuncA_func)(_R_LB pOS_Library*);
- UBYTE _d0[8];
-
- struct pOS_StdLibraryFunction StdLib;
- }; /* => Base */
-
-
-
- In der Library wird die Sprungtabelle in Tabellernform dargestellt.
- Das pOS-System kreiert daraus die Library-Struct und erzeugt die
- echte Sprungtabelle.
-
- ULONG *FuncTable[]=
- {
- (ULONG*)Open_func,
- (ULONG*)Close_func,
- (ULONG*)Expunge_func,
- // ------------ reserviert für spätere OS-Erweiterungen
- (ULONG*)Reserved_func,
- (ULONG*)Reserved_func,
- (ULONG*)Reserved_func,
- (ULONG*)Reserved_func,
- (ULONG*)Reserved_func,
- (ULONG*)Reserved_func,
- (ULONG*)Reserved_func,
- (ULONG*)Reserved_func,
- // ------------ eigene Funktionen
- (ULONG*)FuncA_func,
- (ULONG*)FuncB_func,
- // ------------
-
- (ULONG*)~0 // Ende-Marke
- };
-
-
-
- Eine Library-Funktion kann wie folgt aufgerufen werden:
-
- {
- pOS_Library *TestBase;
-
- if(TestBase=pOS_OpenLibrary("test.library",0)) {
- ...
- _pOS_GetStdLibFunc(TestLibFunction,TestBase)->FuncA_func(TestBase);
-
- ...
-
-
- Der wirkliche Aufbau einer Library im Speicher:
-
- struct {
- struct TestLibFunction LibFuncTabelle;
- struct pOS_Library Base;
- struct xxx LibOwnDatas;
- };
-
- Der _pOS_GetStdLibFunc-Define verschiebt den Pointer von &Base auf
- &LibFuncTabelle und korrigiert den Zeiger auf die wirkliche Sprungtabelle.
-
- Base.lib_NegSize ist die wirkliche Länge der Sprungtabelle. Man sollte aber
- den _pOS_GetStdLibFunc-Define nicht durch eine andere Variante, mit Verwendung
- von lib_NegSize, ersetzen. Verändert sich die Größe der Sprungtabelle, würde
- ein nicht korrigierter Aufruf über lib_NegSize eine falsche Func abbilden.
-
- Base.lib_PosSize ist die Summe von sizeof(Base) + sizeof(LibOwnDatas) und somit
- ergibt sich, Base.lib_NegSize+Base.lib_PosSize ist die Gesamtlänge der Library
- im Speicher. Beim Entfernen von Libraries kann der _pOS_FreeLibraryMem(exec,lib)-
- Define als 'Abkürzung' eingesetzt werden.
-
-
- (siehe p:pLib/Sp#?.h)
-
- ©proDAD
-