; * ************************************************************************ *
; * Module           : SP_AsmPart.a                                          *
; * Version          : V4.5 - V2                                             *
; * Last updated     : 27.05.1996                                            *
; * 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 _SPLI_InitSPOList          ; library-internal initialization function
  XREF _SPLI_OpenLibs
  XREF _SPLI_CloseLibs
  XREF _SysBase
  XREF _DataTab

  XREF _SPO_AllocHandle
  XREF _SPO_FreeHandle

  XREF _SPO_StartReplay
  XREF _SPO_Read
  XREF _SPO_Write
  XREF _SPO_StopReplay
  XREF _SPO_FreeResources
  XREF _SPO_SetAccessMode
  XREF _SPO_SetWriteSubType
  XREF _SPO_SetWriteName
  XREF _SPO_SetReadName
  XREF _SPO_FileInfoRequest
  XREF _SPO_CheckFileType
  XREF _SPO_SetReqIOWindow
  XREF _SPO_ContinueReplay
  XREF _SPO_FastForward
  XREF _SPO_FastBackward
  XREF _SPO_GetSampleBuffer
  XREF _SPO_GetSampleInfo
  XREF _SPO_GetSampleList         ; added in V2
  XREF _SPO_SetSampleList


  STRUCTURE SPObjectBase,0
   STRUCT svb_LibNode,LIB_SIZE
   ULONG  svb_SPObject

   ULONG  svb_Reserved,32

   ULONG  svb_SegList       ; private part of Base Data
   ULONG  svb_SysBase
   ULONG  svb_DOSBase
   ULONG  svb_IntuitionBase
   ULONG  svb_IFFParseBase
  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 _SPO_AllocHandle
         dc.l _SPO_FreeHandle
         dc.l _SPO_Read
         dc.l _SPO_StartReplay
         dc.l _SPO_Write
         dc.l _SPO_StopReplay
         dc.l _SPO_FreeResources
         dc.l _SPO_SetAccessMode
         dc.l _SPO_SetWriteSubType
         dc.l _SPO_SetWriteName
         dc.l _SPO_SetReadName
         dc.l _SPO_FileInfoRequest
         dc.l _SPO_CheckFileType
         dc.l _SPO_SetReqIOWindow
         dc.l _SPO_ContinueReplay
         dc.l _SPO_FastForward
         dc.l _SPO_FastBackward
         dc.l _SPO_GetSampleBuffer
         dc.l _SPO_GetSampleInfo
         dc.l _SPO_GetSampleList         ; added in V2
         dc.l _SPO_SetSampleList

         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,_SPObjectBase    ; save Base Address for internal use

          jsr _SPLI_OpenLibs
          
          tst.l d0
          beq InitLib_Fail

          jsr _SPLI_InitSPOList

	  move.l a5,d0		            ; return &SPObjectBase

          jmp InitLib_RTS

InitLib_Fail:

          jsr _SPLI_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 &SPObjectBase

                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 _SPLI_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

_SPObjectBase:  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 _SPObjectBase
  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
