; * ************************************************************************ *
; * Module           : SV_AsmPart.a                                          *
; * Version          : V12.5 - V3                                            *
; * Last updated     : 10.12.1995                                            *
; * Includes         : NDUK V40 asm includes                                 *
; * Compiler         : SAS/C V6.56 (ASM)                                     *
; * Compiler-Options : (smakefile)                                           *
; * ************************************************************************ *

  INCLUDE "exec/types.i"
  INCLUDE "exec/execbase.i"
  INCLUDE "exec/initializers.i"
  INCLUDE "exec/libraries.i"
  INCLUDE "exec/resident.i"
  INCLUDE "exec/funcdef.i"
  INCLUDE "exec/exec_lib.i"

  XREF _LinkerDB


  XREF _SVLI_InitSVOList          ; library-internal initialization function
  XREF _SVLI_OpenLibs
  XREF _SVLI_CloseLibs
  XREF _SysBase
  XREF _DataTab

  XREF _SVO_AllocHandle
  XREF _SVO_FreeHandle
  XREF _SVO_Show
  XREF _SVO_Write
  XREF _SVO_CloseDisplay
  XREF _SVO_FreeResources
  XREF _SVO_SetAccessMode
  XREF _SVO_SetWriteSubType
  XREF _SVO_SetScreenType
  XREF _SVO_SetWindowFlags
  XREF _SVO_SetWindowIDCMP
  XREF _SVO_GetScreenAddress
  XREF _SVO_GetWindowAddress
  XREF _SVO_SetScreenAddress
  XREF _SVO_SetWindowAddress
  XREF _SVO_SetWriteName
  XREF _SVO_SetReadName
  XREF _SVO_FileInfoRequest
  XREF _SVO_CheckFileType
  XREF _SVO_ReadToGfxBuffer ; added in V2
  XREF _SVO_GetGfxBuffer
  XREF _SVO_SetGfxBuffer
  XREF _SVO_UnLinkGfxBuffer ; added in V3
  XREF _SVO_GetTypeExtension
  XREF _SVO_SetProgressFunc



  STRUCTURE SVObjectBase,0
   STRUCT svb_LibNode,LIB_SIZE
   ULONG  svb_SVObject

   ULONG  svb_Reserved,32

   ULONG  svb_SegList
   ULONG  svb_SysBase

   ULONG  svb_DecodeUsed
   ULONG  svb_EncodeUsed

  LABEL  svb_SIZEOF

  SECTION svb_lib,CODE
;-------------- `Notausgang` ------------------------------------------------
Start:  moveq #0,d0
        rts

;-------------- Funktionstabellen fuer InitStruct u.a. ----------------------
_InitTab:
         dc.l svb_SIZEOF      ; LibBase-Size
         dc.l FuncTab         ; Function-Table begin
         dc.l _DataTab        ; Data-Table begin
         dc.l InitLib         ; ptr to InitLib
FuncTab:
         dc.l OpenLib         ; internal functions
         dc.l CloseLib
         dc.l ExpungeLib
         dc.l ExtFuncLib

         dc.l _SVO_AllocHandle
         dc.l _SVO_FreeHandle
         dc.l _SVO_Show
         dc.l _SVO_Write
         dc.l _SVO_CloseDisplay
         dc.l _SVO_FreeResources
         dc.l _SVO_SetAccessMode
         dc.l _SVO_SetWriteSubType
         dc.l _SVO_SetScreenType
         dc.l _SVO_SetWindowFlags
         dc.l _SVO_SetWindowIDCMP
         dc.l _SVO_GetScreenAddress
         dc.l _SVO_GetWindowAddress
         dc.l _SVO_SetScreenAddress
         dc.l _SVO_SetWindowAddress
         dc.l _SVO_SetWriteName
         dc.l _SVO_SetReadName
         dc.l _SVO_FileInfoRequest
         dc.l _SVO_CheckFileType
         dc.l _SVO_ReadToGfxBuffer ; added in V2
         dc.l _SVO_GetGfxBuffer
         dc.l _SVO_SetGfxBuffer
         dc.l _SVO_UnLinkGfxBuffer ; added in V3
         dc.l _SVO_GetTypeExtension
         dc.l _SVO_SetProgressFunc

         dc.l -1

;-------------- InitLib (Initialisieren der Library) ---------------------------
;        A0 : &SegList
;        A6 : &SysBase
;        D0 : &SVLibrary

InitLib:
          movem.l a1/a4-a5,-(sp)       ; a4 und a5 auf Stack retten

	  lea	 _LinkerDB,a4	    ; _LinkerDB  -> A4
	  move.l d0,a5		    ; &SVLibrary -> A5

	  move.l a6,svb_SysBase(a5)  ; &SysBase   -> SVLibrary.svb_SysBase
	  move.l a0,svb_SegList(a5)  ; &SegList   -> SVLibrary.svb_SegList
	  move.l a5,_SVObjectBase    ; save Base Address for internal use

          jsr _SVLI_OpenLibs
          
          tst.l d0
          beq InitLib_Fail

          jsr _SVLI_InitSVOList

	  move.l a5,d0		            ; return &SVObjectBase

          jmp InitLib_RTS

InitLib_Fail:

          jsr _SVLI_CloseLibs
	  moveq #0,d0			    ; NULL !

InitLib_RTS:

          movem.l (sp)+,a1/a4-a5
          rts


;-------------- OpenLib (Oeffnen der Library) ----------------------------------
OpenLib:
                addq.w #1,LIB_OPENCNT(a6)          ; LIB_OPENCNT ++
                bclr   #LIBB_DELEXP,LIB_FLAGS(a6)  ; clear LIBF_DELEXP
                move.l a6,d0                       ; return &SVObjectBase

                rts

;-------------- CloseLib (Schliessen der Library) ------------------------------
CloseLib:
                moveq #0,d0
                subq.w #1,LIB_OPENCNT(a6)          ; LIB_OPENCNT --
                bne.s EndCloseLib                  ; wenn nicht null, Abbruch
                btst #LIBB_DELEXP,LIB_FLAGS(a6)    ; Test auf LIBF_DELEXP
                beq.s EndCloseLib                  ; wenn Null, Abbruch
                bsr.s ExpungeLib                   ; wenn gesetzt, ExpungeLib
EndCloseLib:
                rts

;-------------- ExpungeLib (Entfernen der Library) ----------------------------
ExpungeLib:
                movem.l d2/a1/a5-a6,-(sp)

                move.l a6,a5                       ; &SVLibrary retten
                move.l _SysBase,a6                 ; ExecBase to A6
                tst.w LIB_OPENCNT(a5)              ; test LIB_OPENCNT
                beq.s NoOpenLib                    ; ...
                bset #LIBB_DELEXP,LIB_FLAGS(a5)    ; set LIBF_DELEXP flag
                moveq #0,d0                        ; Ptr auf Segmentliste
                bra.w ExpungeLibEnd                ;
NoOpenLib:
                move.l svb_SegList(a5),d2           ; SegList retten

                move.l a5,a1                       ; &SVLibrary nach A1 (Par.)
                jsr _LVORemove(a6)                 ; Library-Node entfernen

                jsr _SVLI_CloseLibs

                moveq  #0,d0                       ; D0 loeschen
                move.l a5,a1                       ; &SVLibrary nach A1 (Par.)
                move.w LIB_NEGSIZE(a5),d0          ; Groesse der
                sub.l d0,a1                        ; Library
                add.w LIB_POSSIZE(a5),d0           ; ermitteln !!!

                jsr _LVOFreeMem(a6)                ; Speicher freigeben
                move.l d2,d0                       ; &SegList zurueckgeben
ExpungeLibEnd:
                movem.l (sp)+,d2/a1/a5-a6
                rts

;-------------- ExtFuncLib (bis einschl. OS V2.04 unbenutzt) ---------------
ExtFuncLib:

                moveq #0,d0          ; Ist nie falsch ........ - oder ?
                rts

;-------------- Eigene Funktionen ------------------------------------------

  SECTION __MERGED,BSS

_SVObjectBase:  ds.l 1

_XCEXIT:        ds.l 1    ; dummy-values to get the compiler's libs work :
__XCEXIT:       ds.l 1
_ONBREAK:       ds.l 1
__ONBREAK:      ds.l 1
__base:         ds.l 1
___base:        ds.l 1
_ProgramName:   ds.l 1
__ProgramName:  ds.l 1
_StackPtr:      ds.l 1
__StackPtr:     ds.l 1
_oserr:         ds.l 1
__oserr:        ds.l 1
_OSERR:         ds.l 1
__OSERR:        ds.l 1

  XDEF _SVObjectBase
  XDEF _InitTab 

  XDEF _XCEXIT
  XDEF __XCEXIT
  XDEF _ONBREAK
  XDEF __ONBREAK
  XDEF __base
  XDEF ___base
  XDEF _ProgramName
  XDEF __ProgramName
  XDEF _StackPtr
  XDEF __StackPtr
  XDEF _oserr
  XDEF __oserr
  XDEF _OSERR
  XDEF __OSERR
                END
