home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Misc / DC-POS24.LZX / pOS / pOS_RKRM.lzx / pOS_RKRM / _Txt / Lib.txt < prev    next >
Encoding:
Text File  |  1997-03-18  |  2.9 KB  |  113 lines

  1.  
  2. Hintergrundwissen zu den Libraries:
  3. -----------------------------------
  4.  
  5. In der pOS-Pre-Version wird die pExec-Library über zwei
  6. Zeiger abgebildet. Die 'Base' verhält sich wie beim Amiga.
  7. Der Hilfszeiger '...LibFunction' dient der einfachen Auffindung
  8. der Sprungtabelle, wobei beide Zeiger auf das gleiche Speichersegment
  9. zeigen. Die 'Base' zeigt immer auf (struct pOS_Library*) und
  10. '...LibFunction' zeit auf
  11. (ULONG)'Base' - sizeof('...LibFunction')
  12.  
  13. In p:pExec/Library.h befindet sich die _pOS_GetStdLibraryFunction(lib) und
  14. _pOS_GetStdLibFunc(type,lib) - Defines, die diesem Sachverhalt Rechnung tragen.
  15.  
  16.  
  17.  
  18. Damit die pOS-Pre-Version arbeitet muß immer:
  19.  
  20.   gb_ExecBase=exec;
  21.   gb_ExecLib=*((struct pOS_ExecLibFunction**)lib->my_Lib.lib_Segm->sel_Seg.seg_Reserved2);
  22.  
  23. gesetzt werden.
  24.  
  25.  
  26.  
  27. Bau einer eigenen Library:
  28. --------------------------
  29.  
  30. pOS-Pre-Version:
  31.  
  32. Zuerst wird die Sprungtabelle als Struktur definiert, die später
  33. für den C-Compiler wichtig ist.
  34. ACHTUNG, FuncTable[] ist gespiegt zu (struct TestLibFunction*).
  35.  
  36. struct TestLibFunction
  37. {
  38.   VOID (*FuncB_func)(_R_LB pOS_Library*);
  39.   UBYTE _d1[8];
  40.   VOID (*FuncA_func)(_R_LB pOS_Library*);
  41.   UBYTE _d0[8];
  42.  
  43.   struct pOS_StdLibraryFunction StdLib;
  44. }; /* => Base */
  45.  
  46.  
  47.  
  48. In der Library wird die Sprungtabelle in Tabellernform dargestellt.
  49. Das pOS-System kreiert daraus die Library-Struct und erzeugt die
  50. echte Sprungtabelle.
  51.  
  52. ULONG *FuncTable[]=
  53. {
  54.  (ULONG*)Open_func,
  55.  (ULONG*)Close_func,
  56.  (ULONG*)Expunge_func,
  57. // ------------         reserviert für spätere OS-Erweiterungen
  58.  (ULONG*)Reserved_func,
  59.  (ULONG*)Reserved_func,
  60.  (ULONG*)Reserved_func,
  61.  (ULONG*)Reserved_func,
  62.  (ULONG*)Reserved_func,
  63.  (ULONG*)Reserved_func,
  64.  (ULONG*)Reserved_func,
  65.  (ULONG*)Reserved_func,
  66. // ------------         eigene Funktionen
  67.  (ULONG*)FuncA_func,
  68.  (ULONG*)FuncB_func,
  69. // ------------
  70.  
  71.  (ULONG*)~0  // Ende-Marke
  72. };
  73.  
  74.  
  75.  
  76. Eine Library-Funktion kann wie folgt aufgerufen werden:
  77.  
  78. {
  79.   pOS_Library *TestBase;
  80.  
  81.   if(TestBase=pOS_OpenLibrary("test.library",0)) {
  82.     ...
  83.     _pOS_GetStdLibFunc(TestLibFunction,TestBase)->FuncA_func(TestBase);
  84.  
  85. ...
  86.  
  87.  
  88. Der wirkliche Aufbau einer Library im Speicher:
  89.  
  90. struct {
  91.   struct TestLibFunction LibFuncTabelle;
  92.   struct pOS_Library     Base;
  93.   struct xxx             LibOwnDatas;
  94. };
  95.  
  96. Der _pOS_GetStdLibFunc-Define verschiebt den Pointer von &Base auf
  97. &LibFuncTabelle und korrigiert den Zeiger auf die wirkliche Sprungtabelle.
  98.  
  99. Base.lib_NegSize ist die wirkliche Länge der Sprungtabelle. Man sollte aber
  100. den _pOS_GetStdLibFunc-Define nicht durch eine andere Variante, mit Verwendung
  101. von lib_NegSize, ersetzen. Verändert sich die Größe der Sprungtabelle, würde
  102. ein nicht korrigierter Aufruf über lib_NegSize eine falsche Func abbilden.
  103.  
  104. Base.lib_PosSize ist die Summe von sizeof(Base) + sizeof(LibOwnDatas) und somit
  105. ergibt sich, Base.lib_NegSize+Base.lib_PosSize ist die Gesamtlänge der Library
  106. im Speicher. Beim Entfernen von Libraries kann der _pOS_FreeLibraryMem(exec,lib)-
  107. Define als 'Abkürzung' eingesetzt werden.
  108.  
  109.  
  110. (siehe p:pLib/Sp#?.h)
  111.  
  112. ©proDAD
  113.