
; ***********************************************************
; *                                                         *
; *              P L A Y   I F F   S A M P L E              *
; *                                                         *
; *                      Version 1.0                        *
; *                                                         *
; *                   (c) Juni 1989 by                      *
; *                                                         *
; *                   DAN DARK SOFTWARE                     *
; *                                                         *
; *                     Jörg Schließer                      *
; *                   Hasenbergsteige 15                    *
; *                    7000 Stuttgart 1                     *
; *                      West-Germany                       *
; *                                                         *
; ***********************************************************
; *                                                         *
; *                ASSEMBLER SOURCE-LISTING                 *
; *                                                         *
; ***********************************************************


; *** Amiga-Betriebsystemroutinen-Offsets ***

Forbid = -132                  ;exec-library
SetIntVector = -162
AddIntServer = -168
RemIntServer = -174
AllocMem = -198
FreeMem = -210
FindTask = -294
Wait = -318
Signal = -324
AllocSignal = -330
FreeSignal = -336
GetMsg = -372
ReplyMsg = -378
WaitPort = -384
OldOpenLibrary = -408
CloseLibrary = -414
Open = -30                     ;dos-library
Close = -36
Read = -42
Lock = -84
UnLock = -90
Examine = -102
CurrentDir = -126
Exit = -144
GetDiskObject = -78            ;icon-library

; *** Konstanten für CustomChip-Register ***

tasten = $bfec01       ; Register enthält Sondertastencode
dmacon = $dff096       ; Register für DMA ( direct memory access )
intena = $dff09a       ; Register für Ints erlauben
intreq = $dff09c       ; Register für Ints gefordert
aud0lch = $dff0a0
aud1lch = $dff0b0      ; Chipregister: Zeiger auf Sampledaten
aud2lch = $dff0c0
aud3lch = $dff0d0
aud0len = $dff0a4
aud1len = $dff0b4      ; Chipregister: Länge des Samples
aud2len = $dff0c4
aud3len = $dff0d4
aud0vol = $dff0a8
aud1vol = $dff0b8      ; Chipregister: Lautstärke
aud2vol = $dff0c8
aud3vol = $dff0d8
aud0per = $dff0a6
aud1per = $dff0b6      ; Chipregister: Sampleperiod
aud2per = $dff0c6
aud3per = $dff0d6

; *** Basisadresse ***

exbase = 4             ; Exec Basisadresse

; *** Variblen/Konstanten Speicherstellen ***

; => am Ende des Listings

; *** Vorbereitungen, CLI oder Workbenchstart  ***

start:
       move.l  sp,startsp              ;Startzeiger retten
       move.l  a0,zwi1                 ;Zeiger auf Text bei CLI-Start
       move.l  d0,zwi2                 ;Länge des Texts bei CLI-Start
       move.l  exbase,a6
       suba.l  a1,a1
       jsr     FindTask(a6)            ;Addresse des Tasks ermitteln
       move.l  d0,thistask

       lea     dosname,a1
       jsr     OldOpenLibrary(a6)      ;Dos_Library öffnen
       move.l  d0,dosbase
                                       ;2KByte Chip-Mem als Arbeitsspeicher
       move.l  #2000,d0                ;für Diskoperationen
       moveq   #$3,d1                  ;und Interrupt-Server
       jsr     AllocMem(a6)            ;reservieren
       move.l  d0,lockmem              ;Speicher als Lockspeicher
       beq     ende0                   ;keine Speicher >>> Ende
       move.l  d0,filename
       add.l   #1900,filename          ;Adresse für Zwischenspeicher

       move.l  thistask,a4
       tst.l   $ac(a4)                 ;Start vom CLI aus ?
       bne     clistart                ;JA ! also Sprung
       clr.b   cliflag                 ;Nein: Kennflag auf WB_Start

       lea     iconname,a1
       jsr     OldOpenLibrary(a6)      ;Icon_Library öffnen
       move.l  d0,iconbase
       beq     ende1                   ;hat nicht geklappt ! >>> Ende

       lea     $5c(a4),a0
       jsr     Waitport(a6)            ;StartMessage abwarten
       lea     $5c(a4),a0
       jsr     GetMsg(a6)              ;Message holen
       move.l  d0,startmsg
       beq     ende0                   ;keine Message => Error !

       move.l  d0,a0                   ;Message_Zeiger nach a0
       move.l  $24(a0),a0              ;Zeiger auf Daten für
       beq     ende0                   ;das angeklickte Icon

       move.l  12(a0),filepoint        ;Zeiger auf Filenamen
       move.l  8(a0),d1                ;und auf Directory
       move.l  dosbase,a6
       jsr     CurrentDir(a6)          ;Directory wird aktuelles

       move.l  iconbase,a6
       move.l  filepoint,a0
       jsr     GetDiskObject(a6)       ;DiskObject ('Info-Daten') holen
       move.l  d0,a1

       move.l  $36(a1),a1              ;Zeiger auf ToolType-Text
       move.l  (a1),a0                 ;Inhalt nach a0 und auf
       cmp.l   #0,a0                   ;Inhalt prüfen
       beq     dofile                  ;>>> Keine Optionen als weiter
       bra     lookfornum              ;Optionen auswerten

; *** Start von CLI ***

clistart:
       move.b  #255,cliflag            ;Flag für CLI_Start setzen
       move.l  zwi1,a0                 ;Zeiger auf Text
       move.l  zwi2,d0                 ;Länge des Texts
       subq.l  #1,d0                   ;Keine Text ???
       beq     endeprog                ;>>> also kein Soundfile > Ende
       move.l  filename,filepoint      ;Zeiger auf Filenamenspeicher
       move.l  filename,a1
lforname:
       cmpi.b  #$20,(a0)+              ;Suchen nach 'Space' für den
       bne     foundname               ;Anfang des Samplenamens
       dbra    d0,lforname             ;Weitersuchen ...
       bra     endeprog                ;nix war's >>> kein Soundfile
foundname:
       suba.l  #1,a0                   ;Samplename gefunden
copyname:
       move.b  (a0)+,d1                ;nächstes Zeichen lesen
       cmpi.b  #10,d1                  ; 'Return' ???
       beq     eofnamenoops            ;>>> Name fertig, keine Optionen
       cmpi.b  #32,d1                  ; 'Space' ???
       beq     eofnamenoops            ;>>> Name fertig, keine Optionen
       cmpi.b  #44,d1                  ; 'Komma' ???
       beq     eofnameandops           ;>>> Name fertig und (!) Optionen
       move.b  d1,(a1)+                ;'normales' Zeichen, gehört
       bra     copyname                ;zum Samplenamen, weiter kopieren
eofnameandops:
       clr.b   (a1)                    ;Null-Byte am Ende des Namen
                                       ;und weiter geht's ...

; *** Abspieloptionen / Werte ermitteln ***

lookfornum:
       move.b  (a0)+,d1                ;nächstes Zeichen lesen
       beq     dofile                  ;Null-Byte >>> also Ops fertig
       cmpi.b  #32,d1
       beq     dofile                  ;'Space' >>> also Ops fertig
       cmpi.b  #10,d1
       beq     dofile                  ;'Return' >>> also Ops fertig
       cmpi.b  #35,d1
       beq     gotnum                  ; '#' >>> Zahl der Wiederholungen
       cmpi.b  #84,d1
       beq     gottime                 ; 'T' >>> Abspielzeit
       cmpi.b  #116,d1
       beq     gottime                 ; 't' >>> Abspielzeit
       cmpi.b  #80,d1
       beq     gotpaus                 ; 'P' >>> Pausenzeit
       cmpi.b  #112,d1
       beq     gotpaus                 ; 'p' >>> Pausenzeit
       bra     lookfornum
gottime:
       bsr     getnextopchar           ;nächstes Zeichen holen
       cmp.b   #255,d3                 ;Unerlaubtes Zeichen ?
       beq     lookfornext             ;nächste Option
       move.b  d3,time                 ;Zeitwert geholt
       bra     lookfornext             ;nächste Option
gotpaus:
       bsr     getnextopchar           ;nächstes Zeichen holen
       cmp.b   #255,d3                 ;Unerlaubtes Zeichen ?
       beq     lookfornext             ;nächste Option
       move.b  d3,paus                 ;Zeitwert geholt
       bra     lookfornext             ;nächste Option
gotnum:
       bsr     getnextopchar           ;nächstes Zeichen holen
       cmp.b   #255,d3                 ;Unerlaubtes Zeichen ?
       beq     lookfornext             ;nächste Option
       move.b  d3,howoften             ;Zeitwert geholt
lookfornext:
       move.b  (a0)+,d1                ;Noch eine Option ???
       beq     dofile                  ;Null-Byte >>> keine weitere Option
       cmpi.b  #10,d1                  ;'Return'
       beq     dofile                  ;>>> keine weitere Option
       cmpi.b  #32,d1                  ;'Space'
       beq     dofile                  ;>>> keine weitere Option
       cmpi.b  #44,d1                  ;',' (Komma)
       beq     lookfornum              ;also eine weitere Option
       bra     lookfornext             ;weitersuchen

; Zahlenwert der gefundenen Option ermitteln
getnextopchar:                         ;nächsten Zahlenwert lesen
       move.b  (a0)+,d1                ;Nächstes Zeichen
       cmpi.b  #47,d1                  ;Prüfen, ob es sich
       bls     nonumnext               ;um einen Zahlenwert
       cmpi.b  #58,d1                  ;handelt, sonst
       bge     nonumnext               ;eben >>> kein gültiger Wert
       sub.b   #48,d1                  ;Erste Stelle ermitteln (ASCII-48)
       move.b  d1,d2                   ;und zwischenspeichern
       move.b  (a0)+,d1                ;Nächstes Zeichen
       cmpi.b  #47,d1                  ;und prüfen, ob es sich
       bls     oneposopt               ;nochmal um einen Zahlenwert
       cmpi.b  #58,d1                  ;handelt, sonst
       bge     oneposopt               ;Einstelliger Wert
       sub.b   #48,d1                  ;zweite Stelle ermitteln (ASCII-48)
       moveq   #0,d3                   ;Erste Stelle als Zehnerstelle
       move.b  d2,d3                   ;interpretieren und zweite
       mulu    #10,d3                  ;Stelle dazu
       add.b   d1,d3                   ;addieren
       rts                             ;und fertig
oneposopt:
       move.b  d2,d3                   ;es war nur eine einstellige
       suba.l  #1,a0                   ;Optionsangabe und
       rts                             ;fertig
nonumnext:
       move.b  #255,d3                 ;Illegaler Wert
       rts                             ;und fertig

; *** Soundfilelänge ermitteln und File laden ***

eofnamenoops:
       clr.b   (a1)                    ;Null-Byte am Ende des Namen

dofile:

       move.l  dosbase,a6              ;Filelock des SampleFiles
       move.l  filepoint,d1
       move.l  #-2,d2                  ;ermitteln
       jsr     Lock(a6)
       move.l  d0,d7                   ;gibt's kein Lock
       beq     ende0                   ;>>> Ende

       move.l  d0,d1
       move.l  lockmem,d2              ;FileLock examinieren
       move.l  d2,a3
       jsr     Examine(a6)
       tst.l   d0                      ;hat nicht geklappt >>> Ende
       beq     ende0

       move.l  d7,d1                   ;FileLock wieder freigeben
       jsr     UnLock(a6)

       move.l  124(a3),d0              ;Länge des SampleFiles
       move.l  d0,longmem              ;ermitteln und
       moveq   #$3,d1
       move.l  exbase,a6               ;entsprechenden Speicher
       jsr     AllocMem(a6)            ;reservieren
       move.l  d0,soundmem
       beq     ende0                   ;kein Speicher >>> Ende

       move.l  dosbase,a6
       move.l  filepoint,d1            ;SampleFile öffnen
       move.l  #1005,d2
       jsr     Open(a6)
       move.l  d0,filehandle
       beq     ende                    ;geht nicht >>> Ende

       move.l  d0,d1
       move.l  soundmem,d2             ;SampleFile lesen
       move.l  longmem,d3
       jsr     Read(a6)

       move.l  filehandle,d1           ;SampleFile schließen
       jsr     Close(a6)

;Nach 'BODY'-Chunk im IFF-File suchen
       move.l  soundmem,a5
       moveq   #0,d4                   ;Sicherheitszähler auf 0 setzen
ermnewbody:
       cmp.l   #140000,d4              ;Immer noch kein BODY-Chunk ???
       bge     ende                    ;war wohl kein IFF-File
       adda.l  #2,a5
       addq.l  #2,d4                   ;ein Wort weiter
       move.l  (a5),d5
       cmpi.l  #"BODY",d5              ;steht da vielleicht 'BODY' ???
       bne     ermnewbody              ;ne ! noch nicht
       adda.l  #4,a5                   ;ja da steht 'BODY' !!!
       move.l  a5,bodymem              ;also ham'wer die Addresse

; *** Startwerte setzen ***

       move.w  #15,dmacon              ;DMA erst noch aus !
       clr.b   playflag
       clr.b   itsonflag               ;Flags löschen

       tst.b   time                    ;gibt es eine Zeitbegrenzung ?
       beq     notimetoset             ;nein >>> also weiter unten
       moveq   #0,d0
       move.b  time,d0                 ;Zeitwert * 50 um auf die
       mulu    #50,d0                  ;Sekunden zu kommen, da die
       move.w  d0,timecount            ;Routine je 1/50stel sec. läuft

notimetoset:
       tst.b   paus                    ;gibt es eine Pause ?
       beq     nopaustoset             ;nein >>> also weiter unten
       moveq   #0,d0
       move.b  paus,d0                 ;Zeitwert * 5 um auf die
       mulu    #5,d0                   ;10tel Sekunden zu kommen, da die
       move.w  d0,pauscount            ;Routine je 1/50stel sec. läuft

nopaustoset:
       tst.b   howoften                ;gibt's ne Anzahl der Abspielungen ?
       beq     getints                 ;nein >>> also weiter unten
       move.b  howoften,counter

       tst.b   paus                    ;Pause und Anzahl der Abspielungen ?
       bne     getints                 ;nein >>> also weiter unten
       addq.b  #1,counter              ;sonst 1 Abspielung mehr

; *** Abspielroutinen in den Vertical_Blanking_Interrupt ***

getints:
       move.l  exbase,a6
       move.l  #31,d0                  ;SignalbitNr. 31 anfordern
       jsr     AllocSignal(a6)         ;da Signalbit 31 Abspiel beendet
       cmp.l   #-1,d0                  ;Signal frei ?
       beq     ende                    ;is eigentlich immer frei !
       move.l  lockmem,a1
       adda.l  #500,a1                 ;Speicher für Interrupt-Server
       move.l  a1,d0
       add.l   #32,d0                  ;Werte für Interrupt
       move.l  d0,14(a1)
       move.b  #-60,9(a1)              ;initialisieren
       move.b  #2,8(a1)
       lea     playroutinen,a2         ;näheres siehe z.Bsp.
       move.l  a2,18(a1)               ;Amiga Intern von DB
       moveq   #5,d0
       jsr     AddIntServer(a6)        ;Interrupt-Server einhängen

; *** Zählroutinen in den Audio_Interrup ***

       move.l  exbase,a6
       move.l  lockmem,a1
       adda.l  #1200,a1                ;Speicher für Interrupt-Handler
       move.l  a1,d0
       add.l   #32,d0                  ;Werte für Interrupt
       move.l  d0,14(a1)
       move.b  #-60,9(a1)              ;initialisieren
       move.b  #2,8(a1)
       lea     countplays,a2           ;näheres siehe z.Bsp.
       move.l  a2,18(a1)               ;Amiga Intern von DB
       moveq   #7,d0
       jsr     SetIntVector(a6)        ;Interrupt-Vector setzen

; *** Der Rest läuft im Interrupt also warten !!! ***

       clr.l   d0
       bset    #31,d0                  ;Task in Waiting-State versetzen
       jsr     Wait(a6)

; *** Nach der Rückkehr aus dem Waiting_State ***

       move.w  #%0000000010000000,intena       ;Interrupt für Countplays
                                               ;ausschalten
       move.w  #0,aud0vol
       move.w  #0,aud1vol              ;Lautstärke auf 0
       move.w  #0,aud2vol
       move.w  #0,aud3vol
       move.w  #15,dmacon              ;Audio_DMA ausschalten
       move.l  lockmem,a1
       adda.l  #500,a1
       move.l  #5,d0
       move.l  exbase,a6               ;Interrupt abschalten
       jsr     RemIntServer(a6)
       move.l  #31,d0
       jsr     FreeSignal(a6)          ;Signal wieder freigeben

; *** Programmende ***

ende:
       move.l  exbase,a6               ;Speicher der Sounddaten
       move.l  longmem,d0
       move.l  soundmem,a1             ;wieder freigeben
       jsr     FreeMem(a6)
       move.l  #2000,d0                ;Arbeitsspeicher für Disk_Ops
       move.l  lockmem,a1
       jsr     FreeMem(a6)             ;und Interrupts freigeben
ende0:
       move.l  exbase,a6
       move.l  dosbase,a1              ;Dos-Lib schließen
       jsr     CloseLibrary(a6)
ende1:
       tst.l   startmsg                ;gibt's ne' Start_Message ?
       beq     endeprog
       tst.b   cliflag
       bne     endeprog
       move.l  exbase,a6               ;bei Start von Workbench
       move.l  iconbase,a1
       jsr     CloseLibrary(a6)        ;Icon-Lib schließen
       jsr     Forbid(a6)
       move.l  startmsg,a1             ;Message beantworten
       jsr     ReplyMsg(a6)
endeprog:
       clr.l   d0
       clr.l   d1
       move.l  startsp,sp
       rts                             ;und Ende

; *********************************************************
; *** Eingentliche Abspielroutinen / Interrupt-Routinen ***
; *********************************************************

; *** Int_Routine zum Beginn des Abspiels und Überprüfen der Optionen

playroutinen:
       move.l  a3,-(sp)                ;Registerwerte auf dem
       move.l  a6,-(sp)
       move.l  d1,-(sp)                ;Prozessorstack sichern
       move.l  d0,-(sp)
       move.l  a1,-(sp)
       move.l  a0,-(sp)
       tst.b   startintflag            ;Prüfen ob Interrupt zum Zählen
       beq     nostartint              ;der Abspielungen gebraucht wird
       move.w  #%1000000010000000,intena       ;Interrupt erlauben
       clr.b   startintflag
nostartint:
       tst.b   playflag                ;Prüfen ob Abspiel schon im Gang
       bne     playing
       move.w  #0,aud0vol
       move.w  #0,aud1vol              ;Lautstärke erst noch auf 0
       move.w  #0,aud2vol
       move.w  #0,aud3vol              ;und DMA ausschalten, falls ein
       move.w  #15,dmacon              ;anderer Sound noch spielt
       move.l  soundmem,a3
       move.l  20(a3),d1               ;Länge des OneShotPart des Sound
       add.l   24(a3),d1               ;plus Länge des LongPart in Byte
       divu    #2,d1                   ;durch 2 teilen, da Wordlänge nötig
       move.w  d1,aud0len
       move.w  d1,aud1len              ;und in die Chipregister
       move.w  d1,aud2len
       move.w  d1,aud3len              ;schreiben
       moveq   #0,d1
       move.w  32(a3),d1               ;Samples_Per_Second lesen
       move.l  #3579546,d0             ;und durch Konstante
       divu    d1,d0                   ;teilen, ergibt Sample_Period
       move.w  d0,aud0per
       move.w  d0,aud1per              ;und wird in die Chip-
       move.w  d0,aud2per
       move.w  d0,aud3per              ;Register geschrieben
       move.l  bodymem,aud0lch
       move.l  bodymem,aud1lch         ;Dann Adresse der Sampledaten
       move.l  bodymem,aud2lch
       move.l  bodymem,aud3lch         ;in Chipregister schreiben
       move.w  #64,aud0vol
       move.w  #64,aud1vol             ;Lautstärke einstellen
       move.w  #64,aud2vol
       move.w  #64,aud3vol
       move.w  #$8215,dmacon           ;und Audi_DMA einschalten
       move.b  #255,startintflag       ;Flag für Interrupstart und
       move.b  #255,playflag           ;Abspiel läuft setzen

; Überprüfung der verschiedenen Optionen während des Abspiels
playing:
       tst.w   pausdown                ;prüfen, ob Pause im Gang
       beq     nopausing               ;nein >>> unten weiter
       subq.w  #1,pausdown             ;Pausenzähler vermindern und
       bne     nopausing               ;prüfen ob Pause vorbei ist
       move.w  #64,aud0vol
       move.w  #64,aud1vol             ;Pause vorbei >>> Lautstärke
       move.w  #64,aud2vol             ;wieder einstellen und
       move.w  #64,aud3vol
       move.w  #$8215,dmacon           ;DMA wieder einscalten
       move.b  #255,startintflag       ;Flag für Int_Neustart setzen
       tst.b   howoften                ;Prüfen, ob auch Anzahl der
       beq     nopausing               ;Abspielungen angegeben ist
       subq.b  #1,counter              ;wenn ja, Zähler vermindern
       beq     timeover                ;und notfalls Abspiel beenden

nopausing:
       tst.b   pausflag                ;Prüfen ob Pause angefordert ist
       beq     nopausreq               ;nein >>> unten weiter
       clr.b   pausflag                ;ja >>> Flag löschen und Zähler
       move.w  pauscount,pausdown      ;für Pause initialisieren

nopausreq:
       tst.b   time                    ;Prüfen ob Zeitbegrenzung aktiv
       beq     notimetest              ;nein >>> unten weiter
       subq.w  #1,timecount            ;ja >>> Zeitzähler vermindern
       beq     timeover                ;und bei 0 Abspiel beenden

notimetest:
       cmp.b   #$39,tasten             ;Sondertaste CTRL abfragen
       bne     endirq                  ;nein >>> unten weiter

timeover:
       move.l  exbase,a6               ;Zeit vorbei, Abspielungen fertig
       move.l  thistask,a1             ;oder CTRL-Taste gedrückt
       clr.l   d0
       bset    #31,d0                  ;=> Signalbit 31 setzen, was den
       jsr     Signal(a6)              ;Task reaktiviert und dann beendet

endirq:
       move.l  (sp)+,a0                ;Register vom
       move.l  (sp)+,a1
       move.l  (sp)+,d0                ;Prozessorstack
       move.l  (sp)+,d1
       move.l  (sp)+,a6                ;zurückholen
       move.l  (sp)+,a3
       rts                             ;und Interrupt verlassen

; *** Interrupt_Rountine zum Zählen der Abspielungen ***

; Die Routine wird angesprungen, wenn AudiDaten fertig ausgegeben
; wurden, oder wenn der Audio_DMA geschaltet wird
countplays:
       move.l  a1,-(sp)                ;Register auf dem
       move.l  d0,-(sp)
       move.l  d1,-(sp)                ;Prozessorstack sichern
       move.l  a6,-(sp)

       tst.b   paus                    ;Prüfen, ob Pause im Gange
       bne     unlimitplays            ;ja >>> Int wird nicht gezählt

       tst.b   howoften                ;Prüfen, ob Spielzahl unbegrenzt
       beq     unlimitplays            ;ja >>> Zählen ist unnötig
       subq.b  #1,counter              ;sonst Zähler vermindern und
       bne     unlimitplays            ;wenn <> 0 unten weiter
       move.l  exbase,a6
       move.l  thistask,a1             ;sonst  ...
       clr.l   d0
       bset    #31,d0                  ;=> Signalbit 31 setzen, was
       jsr     Signal(a6)              ;zum schließlich zum Ende führt

unlimitplays:
       tst.b   paus                    ;Prüfen, ob gleichzeitig Pause
       beq     nopausset               ;nach dem Abspiel erforderlich ?
       tst.b   itsonflag               ;Prüfen, ob Abspiel überhaupt im
       beq     noitson                 ;Gang war, oder ob der Int vom
       clr.b   itsonflag               ;Schalten des Audio_DMA kommt
       move.w  #0,aud0vol              ;Wenn Abspiel im Gang war und
       move.w  #0,aud1vol              ;also Pause erforderlich ist,
       move.w  #0,aud2vol              ;Lautstärke ausschalten und
       move.w  #0,aud3vol
       move.w  #%0000000010000000,intena       ;Interrupt sperren
       move.w  #15,dmacon              ;Audio_DMA ausschalten
       move.b  #1,pausflag             ;Flag für Pause setzen
       bra     nopausset
noitson:                               ;Abspiel war nicht im Gang, sondern
       move.b  #255,itsonflag          ;der Int kam gerade vom Einschalten
nopausset:
       move.l  (sp)+,a6                ;Register vom
       move.l  (sp)+,d1
       move.l  (sp)+,d0                ;Prozessorstack zurückholen
       move.l  (sp)+,a1
       move.w  #%0000000010000000,intreq       ;Interrupt_Request löschen,
       rts                             ;sonst kommt gleich der nächste
                                       ;und Interrupt beenden

; *** Variablen/Konstanten/Zwischenspeicher usw. ***

dosname:       dc.b    "dos.library",0
               align
iconname:      dc.b    "icon.library",0
               align
filename:      dc.l    0
filepoint:     dc.l    0
thistask:      dc.l    0
startmsg:      dc.l    0
startsp:       dc.l    0
dosbase:       dc.l    0
iconbase:      dc.l    0
lockmem:       dc.l    0
filehandle:    dc.l    0
zwi1:          dc.l    0
zwi2:          dc.l    0
soundmem:      dc.l    0
bodymem:       dc.l    0
longmem:       dc.l    0
timecount:     dc.w    0
pauscount:     dc.w    0
pausdown:      dc.w    0
cliflag:       dc.b    0
playflag:      dc.b    0
howoften:      dc.b    0
counter:       dc.b    0
time:          dc.b    0
paus:          dc.b    0
pausflag:      dc.b    0
itsonflag:     dc.b    0
startintflag:  dc.b    0
               align
copyrighttxt:  dc.b    "*(c) 6/89 J.Schließer*"
               align

 END


