home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Programming / Misc / OB3.2D2.DMS / in.adf / LibLink / SDLibraryHead.asm < prev   
Encoding:
Assembly Source File  |  1993-11-02  |  5.2 KB  |  195 lines

  1. ;*-------------------------------------------------------------------------*
  2. ;*                                                                         *
  3. ;*  Oberon Library Kopf                                    17-Sep-90       *
  4. ;*                                                                         *
  5. ;*               für SMALLDATA-Libraries                                   *
  6. ;*                                                                         *
  7. ;*  © 1990 by Fridtjof Siebert                                             *
  8. ;*                                                                         *
  9. ;* Diese Assemblerprogramm muß assembliert und unter dem Namen             *
  10. ;* LibraryHead.objs in eines in der Datei OBERON:Path angegebenem          *
  11. ;* Directory kopiert werden                                                *
  12. ;*                                                                         *
  13. ;*-------------------------------------------------------------------------*
  14.  
  15. ; Globale Variablen:
  16.  
  17.         XDEF    LibraryHead.SegList;      unsere Segmentliste
  18.         XDEF    LibraryHead.LibBase;      Librarybase (A6)
  19.         XDEF    LibraryHead.OpenOk;       wurden OPEN-Teile ohne HALT ausgeführt?
  20.         XDEF    LibraryHead.Globals       Zeiger auf globale Variablen
  21.  
  22. ; Standard Library Routinen
  23.  
  24.         XDEF    LibraryHead.Open;
  25.         XDEF    LibraryHead.Close;
  26.         XDEF    LibraryHead.Expunge;
  27.         XDEF    LibraryHead.Init;
  28.  
  29.         XDEF    LibraryHead.SetTrue;      intern verwendet
  30.  
  31. ; Externe Oberon-Prozeduren
  32.  
  33.         XREF    LibraryHead.OpenAll;      BEGIN-Teil des Hauptmoduls
  34.         XREF    LibraryHead.CloseAll;     CLOSE-Teil des Hauptmoduls
  35.         XREF    LibraryHead.LibOpen;      Open-Prozedur
  36.         XREF    LibraryHead.LibClose;     Close-Prozedur
  37.  
  38. ; Memory-Größe und Requirements für SMALLDATA
  39.  
  40.         XREF    Globals_MemSize;
  41.         XREF    Globals_MemReqs;
  42.  
  43. ; ein paar Konstanten:
  44.  
  45. ln_succ  EQU 0;
  46. ln_pred  EQU 4;
  47. ln_type  EQU 8;
  48. ln_pri   EQU 9;
  49. ln_name  EQU 10;
  50. ln_SIZE  EQU 14;
  51.  
  52. lib_flags    EQU 14;
  53. lib_pad      EQU 15;
  54. lib_negsize  EQU 16;
  55. lib_possize  EQU 18;
  56. lib_version  EQU 20;
  57. lib_revision EQU 22;
  58. lib_idstring EQU 24;
  59. lib_sum      EQU 28;
  60. lib_opencnt  EQU 32;
  61. lib_size     EQU 34;
  62.  
  63. delexp       EQU 3;
  64.  
  65. Remove       EQU -252
  66. FreeMem      EQU -210
  67. AllocMem     EQU -198
  68.  
  69.  
  70. ; los geht's
  71.  
  72.  
  73.         section "LibraryHead",code
  74.  
  75.  
  76. LibraryHead.Init:
  77.  
  78.         movem.l d2-d7/a2-a6,-(a7)
  79.  
  80.         move.l  a0,LibraryHead.SegList
  81.         move.l  d0,LibraryHead.LibBase
  82.  
  83.         move.l  #Globals_MemSize,D0;    Speicher für Globals holen
  84.         move.l  #Globals_MemReqs,D1;
  85.  
  86.         move.l  4,A6;
  87.         jsr     AllocMem(A6);
  88.         tst.l   D0;
  89.         beq.s   \ciao;                  das war nix
  90.         move.l  D0,LibraryHead.Globals; Zeiger auf Globals retten
  91.         move.l  D0,A5;                  und in A5
  92.  
  93.         lea     -4(A7),A0;
  94.         jsr     LibraryHead.OpenAll;    Oberon-Openteil aufrufen
  95.  
  96.         moveq   #0,d0
  97.         tst.b   LibraryHead.OpenOk;     alles klar?
  98.         beq.s   \ciao;
  99.         move.l  LibraryHead.LibBase,d0  ja, dann LibBase zurück
  100.  
  101. \ciao:  movem.l (a7)+,d2-d7/a2-a6
  102.         rts
  103.  
  104.  
  105.  
  106. LibraryHead.Open:
  107.  
  108.         addq.w  #1,lib_opencnt(a6);     opencnt 1 höher
  109.         movem.l d2-d7/a2-a6,-(sp);
  110.         jsr     LibraryHead.LibOpen;    Library öffnen (A5 muß noch geladen werden)
  111.         movem.l (sp)+,d2-d7/a2-a6;
  112.         tst.b   d0;                     ok?
  113.         bne.s   openok;
  114.         subq.w  #1,lib_opencnt(a6);     opencnt wieder verringern, da Öffnen erfolglos
  115.         bra.s   ciao;
  116. openok: bclr    #delexp,lib_flags(a6);
  117.         move.l  a6,d0;                  dann LibBase zurück
  118.         rts;
  119.  
  120.  
  121. LibraryHead.Close:
  122.  
  123.         movem.l d2-d7/a2-a6,-(sp);
  124.         jsr     LibraryHead.LibClose;   schließen (A5 fehlt auch hier)
  125.         movem.l (sp)+,d2-d7/a2-a6;
  126.         subq.w  #1,lib_opencnt(a6);     opencnt 1 runter
  127.         bne.s   ciao;                   > 0, dann bleiben wir noch da
  128.         btst    #delexp,lib_flags(a6);  delexp gesetzt
  129.         bne.s   LibraryHead.Expunge;    ja, dann expunge
  130. ciao:   moveq   #0,d0;
  131.         rts;
  132.  
  133.  
  134. LibraryHead.Expunge:
  135.  
  136.         movem.l d2-d7/a2-a6,-(a7)
  137.         tst.w   lib_opencnt(a6)
  138.         beq.s   \l
  139.         bset    #delexp,lib_flags(a6)
  140.         moveq   #0,d0
  141.         bra.s   \ciao
  142. \l:     move.l  a6,a4;
  143.         move.l  4,a6;
  144.         move.l  a4,a1;
  145.         jsr     Remove(A6);
  146.  
  147.         move.l  a4,-(a7);
  148.         move.l  LibraryHead.Globals,a5; Globals nach A5
  149.         jsr     LibraryHead.CloseAll;   alles schließen
  150.  
  151.         move.l  a5,a1;
  152.         move.l  #Globals_MemSize,d0;
  153.         move.l  4,a6;
  154.         jsr     FreeMem(a6)
  155.  
  156.         moveq   #0,d0;
  157.         move.l  (a7)+,a1;
  158.         move.l  a1,a4;
  159.         move.w  lib_negsize(a4),d0;
  160.         sub.l   d0,a1
  161.         add.w   lib_possize(a4),d0;
  162.         jsr     FreeMem(a6);
  163.  
  164.         move.l  LibraryHead.SegList,d0
  165. \ciao:  movem.l (a7)+,d2-d7/a2-a6
  166.         rts
  167.  
  168.  
  169.         section "LibData",data
  170.  
  171.  
  172. id:     dc.b    "Oberon Library",0
  173.         even
  174.  
  175.  
  176.         section "LibGlobals",bss
  177.  
  178.  
  179. LibraryHead.SegList dc.l    0;
  180. LibraryHead.LibBase dc.l    0;
  181. LibraryHead.OpenOk  dc.w    0;
  182. LibraryHead.Globals dc.l    0;
  183.  
  184.  
  185.         section "LibExtra",code
  186.  
  187. LibraryHead.SetTrue:
  188.  
  189.         st      d0;
  190.         rts;
  191.  
  192.         END;
  193.  
  194.  
  195.