###   Projekte und Informationen rund um den KC85   ### 

Dudeldidö - Melodien mit Interrupt

von Dirk Walther

Ich möchte hier ein Programmier-Tool vorstellen, zu dessen Fertigstellung mich ein Brief von Maik Freitag aus Rostock bewegte. Von dieser Stelle nochmals heftigste Entschuldigungen an Dich, Maik, für die ungebührliche Verzögerung meiner Antwort.

DUDEL bietet Routinen, die das interruptgesteuerte Abspielen von Tonfolgen realisieren. Es kann ohne weiteres in andere Programme eingebunden werden. Auf eine beliebige Adresse geladen (Ladeoffset=Zieladresse), belegt DUDEL 211 (D3H) Byte. Die Schnittstelle zum übergeordneten Programm sieht wie folgt aus ($=Ladeadresse):

$+0 Einsprung PLAY  
$+2 Einsprung STOP  
$+4 Einsprung RESET  
$+6 Merkbyte :  Bit 0 - gesetzt = Musik wird gerade gespielt
    Bit 1 - gesetzt = Stück wird wiederholt
    Bit 2 - internes Merkbit - letzter Ton des Stückes
$+7 Zeiger auf aktuellen Ton  
$+9 Zeiger auf den Datenanfang  

 

Für jeden Ton werden sechs Byte benötigt, genau wie im Systemhandbuch für UP 35H beschrieben. Eine Melodie setzt sich also aus beliebig vielen solcher sechs Byte langen Blöcke zusammen. Nach dem letzten Ton muß als Endemarkierung das Doppelbyte FFFFH eingetragen sein. Als Tondauer darf bei keinem der Töne eine Null (Dauerton) stehen, weil dann kein Interrupt ausgelöst wird.

Um DUDEL aus einem anderen Programm heraus aufzurufen, ist die Anfangsadresse der Daten in ($+9) zu laden sowie die RESET-Routine aufzurufen, die diesen Eintrag auf ($+7) kopiert. Der Aufruf von PLAY löst dann das Abspielen aus. Die Routine STOP hält das Spielen an, ein erneuter Aufruf von PLAY setzt das Abspielen an derselben Stelle fort.

Mittels RESET kann der Datenzeiger jederzeit auf den Stückanfang zurückgesetzt werden. Ist das Programm am letzten Ton angelangt, wird RESET ausgeführt. Danach wird Bit l, ($+6) getestet. Ist das Bit gesetzt, wird das Abspielen am Datenanfang fortgesetzt, ansonsten wird STOP ausgeführt.

MENDUDEL ist eine um drei Menüworte erweiterte Version von DUDEL, die ebenfalls relocatibel ist (Ladeoffset=Zieladresse; Länge: 278 = 116H Byte). Die Menüworte haben folgende Syntax:
RESET [mm] Ist ein Parameter angegeben, so wird dieser in ($+9) geladen und RESET ausgeführt, ansonsten wird nur RESET ausgeführt.
PLAY [m] Ist ein Parameter angegeben, so wird das Bit l,($+6) verändert: Ist der niederwertige Teil des Parameters gleich Null, so wird das Bit rückgesetzt, sonst wird es gesetzt. Anschließend wird PLAY ausgeführt.
STOP führt die STOP-Routine aus.

 

Die Gewinnung der Daten gestaltet sich recht einfach, wenn schon ein BASIC-Programm existiert, das die Sounddaten in DATA-Zeilen enthält. Dann muß einfach nur die SOUND-Anweisung durch sechs POKE-Befehle ersetzt werden. Ein Datenzeiger kann dann nach jedem Ton um 6 hochgezählt werden. Anschließend muß noch FFFFH mit MODIFY an das Stück angefügt, sowie das Ganze mit FSAVE abgespeichert werden. So jedenfalls habe ich die Daten zu den vier auf der Diskette enthaltenen Melodiebeispielen erstellt. Ich habe einfach mal so den Typ .SND für diese Art von Daten festgelegt. Meine .SND-Dateien sind Speicherabzüge ab 2000H, dieser Wert ist beim Ladeoffset zu beachten.

DUDEL hat seine Grenzen, wenn das übergeordnete Programm den IRM abschaltet (z.B. BASIC). Findige Köpfe werden das Programm sicher dahingehend modifizieren können. Die Quelltexte sind auf der Beilagendiskette enthalten.