   ; Programm : Sound Effect Machine
   ; Modul    : Load Data File
   ; by       : Dan Dark Software / Jörg Schließer
   ; Version  : V1.0 / November 1989
   ; Assembler: Kick-Ass V1.20

   ; Modul zum Laden eines Datenfiles incl. Speicherallocierung

   ; Übergabeparameter beim Aufruf:

   ; a0 = Zeiger auf (Pfad-)Namen des Files
   ; d0 = Memory-Type:
   ;      d0 = $01    => Public-Mem
   ;      d0 = $02    => Chip-Mem
   ;      d0 = $04    => Fast-Mem
   ;      d0 = $10000 => Clear-Mem
   ;      d0 = $20000 => Largest-Mem
   ; ( Mehrfachbedingungen durch Oder-Verknüpfung der Mem-Types )

   ; Rückgabeparameter:

   ; a0 => Zeiger auf RAM-Adresse der Daten
   ; d0 = 0 => Error ... File nicht gefunden oder kein Speicher
   ; d0 > 0 => Länge des Files in Byte

   ; Betriebsystem-Routinen
AllocMem   = -198         ; Exec-Library
FreeMem   = -210
CloseLibrary   = -414
OpenLibrary   = -552
Open   = -30          ; Dos-Library
Close   = -36
Read   = -42
Lock   = -84
UnLock   = -90
Examine   = -102

   ; Konstanten:
execbase   = $4           ; Exec Basisadresse

   ; Load Data File - Modul zum Laden eines Datenfiles, inklusive
   ; Allocierung des nötigen Speichers und Angabe des Memory-Types

   even
loadfile:
   movem.l d1-d7/a1-a6,-(sp) ; Registerinhalte retten
   move.l a0,a5             ; Zeiger auf Namen retten
   move.l d0,d5             ; Mem-Type retten

   ; dos.library öffnen
   move.l execbase.s,a6     ; Exec-Basisadresse in a6
   lea dosname,a1           ; Zeiger auf Libraryname
   moveq #0,d0              ; Version: egal !
   jsr OpenLibrary(a6)      ; Library öffnen
   move.l d0,a4             ; Zeiger auf Library retten
   beq loaderror2           ; Zeiger = 0 ... Error !

   ; File-Lock ermitteln
   move.l d0,a6             ; Dos-Basisadresse in a6
   move.l a5,d1             ; Zeiger auf Namen in d1
   moveq #-2,d2             ; Lock-Mode = -2 ... Lesen !
   jsr Lock(a6)             ; Filelock ermitteln
   move.l d0,d7             ; Zeiger auf Filelock in d7
   beq loaderror1           ; Zeiger = 0 ... Error !

   ; Speicher für Info-Block anfordern
   move.l execbase.s,a6     ; Exec-Basisadresse
   move.l #260,d0           ; benötigter Speicher
   moveq  #3,d1             ; Speicherart: Chip
   jsr    AllocMem(a6)      ; Speicher anfordern
   move.l d0,d6             ; Zeiger auf Speicher nach d6
   beq    loaderror1        ; Zeiger = 0 ? ... Error !

   ; Info-Data des Files examinieren
   move.l a4,a6             ; Zeiger auf Dos-Lib
   move.l d7,d1             ; Zeiger auf Filelock in d1
   move.l d0,d2             ; Zeiger auf Fileinfospeicher
   jsr Examine(a6)          ; Fileinfodaten lesen
   tst.l d0                 ; d0 = 0 ? ... Error !
   beq loaderror1

   ; File-Lock freigeben
   move.l d7,d1             ; Zeiger auf Filelock in d1
   jsr UnLock(a6)           ; Filelock freigeben

   ; Speicher allocieren
   move.l d6,a3             ; Zeiger auf Fileinfospeicher in a3
   move.l 124(a3),d0        ; Länge des Files lesen
   move.l execbase.s,a6     ; Exec-Basisadresse in a6
   move.l d5,d1             ; Mem-Type nach d1
   jsr AllocMem(a6)         ; Speicher allocieren
   move.l d0,a2             ; Zeiger auf Speicher retten
   beq loaderror1           ; Zeiger = 0 ? ... Error !

   ; File öffnen
   move.l a5,d1             ; Zeiger auf Filenamen in d1
   move.l #1005,d2          ; Open-Mode: Mode_old ('altes File')
   move.l a4,a6             ; Dos-Basisadresse in a6
   jsr Open(a6)             ; File öffnen
   move.l d0,d4             ; Filehandle retten
   beq loaderror1           ; Filehandle = 0 ? ... Error !

   ; File lesen
   move.l d0,d1             ; Filehandle in d1
   move.l a2,d2             ; Zeiger auf Speicher in d2
   move.l 124(a3),d3        ; Länge des Files in d3
   jsr Read(a6)             ; Fileinhalt lesen

   ; File schließen
   move.l d4,d1             ; Filehandle in d1
   jsr Close(a6)            ; File schließen

   move.l execbase.s,a6     ; Execbasisadresse nach a6
   move.l a4,a1             ; Zeiger auf Dos-Library nach a1
   jsr CloseLibrary(a6)     ; Library schließen
   move.l d6,a1             ; Zeiger auf Fileinfospeicher
   move.l #260,d0           ; Länge des Speicherblocks
   jsr FreeMem(a6)          ; Speicher freigeben
   move.l a2,a0             ; Zeiger auf Speicher in a0
   move.l 124(a3),d0        ; Länge des Files in d0
exitloadfile:
   movem.l (sp)+,d1-d7/a1-a6
   rts

loaderror1:
   move.l execbase.s,a6     ; Execbasisadresse nach a6
   move.l a4,a1             ; Zeiger auf Dos-Library nach a1
   jsr CloseLibrary(a6)     ; Library schließen
   moveq #0,d0              ; d0 = 0 ... Error !
loaderror2:
   bra exitloadfile         ; und Fertig !

   ; Speicher für Strukturen, Variablen, Zähler und Flags
   even
dosname:   dc.b 'dos.library',0
   even

