;********************************************************************
;        Interruptroutine zur Einbindung in eigene Programme
;                 SOUNDFACTORY (c) 1989 by PROFITEAM
;********************************************************************

Einsprung:
   bra.s Start_Music	;Startet die Musik im Vertical Blanking Interrupt
   bra.s Stop_Music	;Stoppt die Musik und restauriert alten IRQ-Vektor

Musikadr:		;Hier muß die Adresse der Musik-Objektdatei
   dc.l 0		;eingetragen werden

IRQ_Music_Code:		;Hier muß die Adresse der Abspielroutine
   dc.l 0		;(IRQ_Music.Code) eingetragen werden

Parameter:		;Hier werden die Funktionsparameter und
   dc.w 0		;-ergebnisse eingetragen (Offset vom Anfang: 12)

   bra FadeOut		;Leitet FadeOut ein
   bra GetRequest	;Holt Synchronisationszählerwert nach Parameter
   bra SetRequest	;Setzt Synchronisationszähler
   bra GetVoices	;Holt alle laufenden Stimmen nach Parameter
   bra SetMask		;Setzt Maske für die hörbaren Stimmen

Stop_Music:
   move.l $6c,a0        ;läuft überhaupt eine SOUNDFACTORY-Musik ?
   cmp.w #$4e71,(a0)	;Erkennungszeichen: der NOP-Befehl ($4e71)
   bne.s Nix		;Es läuft keine Musik, Funktion nicht ausführen
   move.l IRQ_Music_Code(pc),a1
   jsr 8(a1)		;Musik stoppen (IRQ_Music.Code + 8)
   move.l HilfIRQ+2(pc),$6c ;alten IRQ-Vektor wieder herstellen
Nix:
   rts

Start_Music:
   move.l $6c,a0	;läuft schon eine SOUNDFACTORY-Musik ?
   cmp.w #$4e71,(a0)	;Erkennungszeichen: NOP-Befehl am Anfang
   beq.s Nix		;Es läuft schon eine Musik, Funktion nicht ausf.
   clr.l d0
   move.b Parameter(pc),d0 ;in Parameter steht Song# (1-16)
   move.l Musikadr(pc),a0  ;Zeiger auf Musik nach A0
   move.l IRQ_Music_Code(pc),a1
   jsr (a1)		;Musik initialisieren (IRQ_Music.Code + 0)
   lea HilfIRQ+2(pc),a2 ;alten IRQ-Vektor ans Ende der neuen
   move.l $6c,(a2)	;Interruptroutine schreiben
   lea IRQ(pc),a0	;IRQ-Vektor auf die neue Interruptroutine
   move.l a0,$6c	;umbiegen
   rts

FadeOut:
   move.l $6c,a0	;läuft überhaupt eine SOUNDFACTORY-Musik ?
   cmp.w #$4e71,(a0)	;Erkennungszeichen: NOP-Befehl am Anfang
   bne.s Nix_FadeOut    ;Es läuft keine Musik, Funktion nicht ausführen
   clr.l d0
   move.b Parameter(pc),d0 ;in Parameter steht FadeOut-Geschwindigkeit
   move.l IRQ_Music_Code(pc),a1
   jsr 12(a1)		;FadeOut einleiten (IRQ_Music.Code + 12)
Nix_FadeOut:
   rts

GetRequest:
   lea Parameter(pc),a0
   clr.w (a0)		;Parameter löschen
   move.l IRQ_Music_Code(pc),a1
   jsr 16(a1)		;GetRequest aufrufen (IRQ_Music.Code + 16)
   lea Parameter(pc),a0
   move.b d0,(a0) 	;Ergebnis in Parameter speichern
   rts

SetRequest:
   clr.l d0
   move.b Parameter(pc),d0 ;in Parameter steht Synchronisationszählerwert
   move.l IRQ_Music_Code(pc),a1
   jsr 20(a1)		;SetRequest aufrufen (IRQ_Music.Code + 20)
   rts

GetVoices:
   lea Parameter(pc),a0
   clr.w (a0)		;Parameter löschen
   move.l IRQ_Music_Code(pc),a1
   jsr 24(a1)		;GetVoices aufrufen (IRQ_Music.Code + 24)
   lea Parameter(pc),a0
   move.b d0,(a0) 	;Ergebnis in Parameter speichern
   rts

SetMask:
   clr.l d0
   move.b Parameter(pc),d0 ;in Parameter steht Maske für hörbare Stimmen
   move.l IRQ_Music_Code(pc),a1
   jsr 28(a1)		;SetMask aufrufen (IRQ_Music.Code + 28)
   rts

IRQ:			;Neue Interruptroutine
   nop			;Erkennungszeichen: SOUNDFACTORY-Musik läuft
   movem.l d0-d7/a0-a6,-(sp) ;alle Register retten
   move.w $dff01e,d0	;Ist der ausgelöste Interrupt ein
   btst #5,d0		;Vertical Blanking Interrupt ?
   beq.s Nix_VBI	;Nein, dann Abspielroutine überspringen
   move.l IRQ_Music_Code(pc),a1
   jsr 4(a1)		;Musik spielen (IRQ_Music.Code + 4)
Nix_VBI:
   movem.l (sp)+,d0-d7/a0-a6 ;alle Register wieder vom Stapel holen
HilfIRQ:
   jmp $fc0cd8		;und zurück zur alten Interrupt-Routine

Ende:

