Wenn ein Programm nicht gerade den Zweck hat, ein Musikstueck oder 'Geräusch-Kulisse' wiederzugeben, wird man die Sound-Programmierung mit möglichst wenig verbrauchter Zeit nebenher erledigen wollen.
Die Abteilungen des Betriebssystems: Der Sound ManagerDer Sound Manager verfügt pro Kanal über eine Der Key Manager: WarteschlangeWarteschlange für vier Töne, wobei der erste normalerweise gerade abgespielt wird. Man kann also zunächst einmal 4 Töne an Die Abteilungen des Betriebssystems: Der Sound Managerden Sound Manager übergeben, ohne mit einer Verzögerung rechnen zu müssen. Schiebt man dann aber auch gleich den fünften nach (oder versucht man das zumindest), so muss das Programm warten, bis wieder ein Platz in der Der Key Manager: WarteschlangeWarteschlange frei wird.
Bei ungeschickter Programmierung kann man die Die ICs im Überblick: Die CPU Z80 Das Innenleben der CPC-Rechner: Die CPU Z80 Die Anschlussbelegungen der wichtigsten ICs im CPC: Die CPU Z80CPU dazu verdonnern, die meiste Zeit zu warten, um nun endlich wieder 'mal einen Sound-Befehl loszuwerden.
Die einfachste Möglichkeit (für die Programmierer des Einleitung: Sound MAIN FIRMWARE JUMPBLOCK: SOUND MANAGER Die Firmware des Schneider CPC: SOUND MANAGERSound Managers) besteht zunächst einmal darin, mit der Die Fließkomma-Routinen: FunktionenFunktion SQ(kanal) (Vektor &SOUND MANAGER: BCAD: SOUND CHECKBCAD SOUND CHECK in Maschinensprache) regelmäßig nachzufragen, ob in einem Kanal wieder ein Platz frei ist, um nur dann den nächsten Sound-Befehl nachzuschieben.
Der Wert, den man dabei erhält, ist bitsignifikant und liefert folgende Informationen:
Datenbreite: Bits Port B - Input: &F5xx: Bit 0: Port B - Input: &F5xx: Bit 4: Port B - Input: &F5xx: Bit 5: Port B - Input: &F5xx: Bit 6: Port B - Input: &F5xx: Bit 7: Port C - Output: &F6xx: Bit 4: Port C - Output: &F6xx: Bit 5:Bits 0,1,2 --> Anzahl freier Plätze
Datenbreite: Bits Port B - Input: &F5xx: Bit 0: Port B - Input: &F5xx: Bit 4: Port B - Input: &F5xx: Bit 5: Port B - Input: &F5xx: Bit 6: Port B - Input: &F5xx: Bit 7: Port C - Output: &F6xx: Bit 4: Port C - Output: &F6xx: Bit 5:Bits 3,4,5 --> Ist eins dieser Datenbreite: Bits Port B - Input: &F5xx: Bit 0: Port B - Input: &F5xx: Bit 4: Port B - Input: &F5xx: Bit 5: Port B - Input: &F5xx: Bit 6: Port B - Input: &F5xx: Bit 7: Port C - Output: &F6xx: Bit 4: Port C - Output: &F6xx: Bit 5:Bits gesetzt, so wartet der erste Ton des
getesteten Kanals auf ein Rendezvous mit einem anderen. Dabei
sind die einzelnen Kanäle in ihrer üblichen Reihenfolge
kodiert: 2,4,5 <=> Erklärung der Anschlussbelegung: A, B, CA,B,C.
Datenbreite: Bits Port B - Input: &F5xx: Bit 0: Port B - Input: &F5xx: Bit 4: Port B - Input: &F5xx: Bit 5: Port B - Input: &F5xx: Bit 6: Port B - Input: &F5xx: Bit 7: Port C - Output: &F6xx: Bit 4: Port C - Output: &F6xx: Bit 5:Bit 6 = 1 --> Der erste Ton in der Der Key Manager: WarteschlangeWarteschlange befindet sich im
Haltezustand (Hold-Bit gesetzt).
Datenbreite: Bits Port B - Input: &F5xx: Bit 0: Port B - Input: &F5xx: Bit 4: Port B - Input: &F5xx: Bit 5: Port B - Input: &F5xx: Bit 6: Port B - Input: &F5xx: Bit 7: Port C - Output: &F6xx: Bit 4: Port C - Output: &F6xx: Bit 5:Bit 7 = 1 --> Der erste Ton der Schlange wird gerade gespielt. Port B - Input: &F5xx: Bits 1, 2 und 3: Port C - Output: &F6xx: Bit 6 und 7:Bit 6 und 7
können nicht gleichzeitig gesetzt sein. Ebenso ist bei einem
gesetzten Datenbreite: Bits Port B - Input: &F5xx: Bit 0: Port B - Input: &F5xx: Bit 4: Port B - Input: &F5xx: Bit 5: Port B - Input: &F5xx: Bit 6: Port B - Input: &F5xx: Bit 7: Port C - Output: &F6xx: Bit 4: Port C - Output: &F6xx: Bit 5:Bit 7 die Information in den Port C - Output: &F6xx: Bits 0 bis 3:Bits 3 bis 5
bedeutungslos.
Der Nachteil bei dieser Methode, dem sogenannten Polling ist, dass man an jeder nur denkbaren Stelle im Hauptprogramm einen solchen Erklärung der Anschlussbelegung: TestTest einfügen muss. Dadurch wird das Programm nicht nur länger, sondern auch langsamer. Und die nahtlose Versorgung des Soundmanagers ist trotzdem nicht immer sichergestellt.
Deshalb ist es auch möglich, den Sound-Manager via Software-Interrupt zu programmieren. Dabei kann man für jeden Kanal eine Routine bestimmen, die aufgerufen werden soll, wenn in seiner Der Key Manager: WarteschlangeWarteschlange ein Platz frei wird.
In Maschinensprache muss man dem Vektor &SOUND MANAGER: BCB0: SOUND ARM EVENTBCB0 SOUND ARM EVENT einen BCEF: KL INIT EVENT: EventblockEventblock übergeben, den Die Abteilungen des Betriebssystems: Der Sound Managerder Sound Manager dann in seine Einleitung: Sound MAIN FIRMWARE JUMPBLOCK: SOUND MANAGER Die Firmware des Schneider CPC: SOUND MANAGERSOUND Datenspeicherung und Datenstrukturen: ChainsCHAIN einreiht.
In Einleitung: BASIC Anhang: BasicBasic dient dafür der Befehl 'ON_SQ(kanal)_GOSUB'.
Dabei muss man beachten, dass Diese Alle noch folgenden Anschlüsse fallen unter die Rubrik STEUER- oder auch CONTROLBUS:: INT - InterruptInterrupts nur jeweils einmal ausgeführt werden, und sich deshalb ständig selbst initialisieren müssen, nachdem (!) ein neuer Befehl programmiert wurde. Der Alle noch folgenden Anschlüsse fallen unter die Rubrik STEUER- oder auch CONTROLBUS:: INT - InterruptInterrupt für einen speziellen Kanal wird nämlich aufgehoben, wenn
1) der Alle noch folgenden Anschlüsse fallen unter die Rubrik STEUER- oder auch CONTROLBUS:: INT - InterruptInterrupt erzeugt wurde,
2) ein Sound-Befehl in den entsprechenden Kanal nachgeschoben wurde oder
3) der Bedienen bei Bedarf: Kanalstatus: BCAD: SOUND CHECK: Kanalstatus:Kanalstatus getestet wird (SOUND MANAGER: BCAD: SOUND CHECKSOUND CHECK oder Die Fließkomma-Routinen: FunktionenFunktion SQ(kanal)).
Da die Programmierung der drei Kanäle so vollkommen unabhängig voneinander erfolgt, kann ihre Synchronisierung mit der Zeit aus dem Tritt geraten. Am sinnvollsten ist es deshalb, alle Kanäle einmal pro Alle noch folgenden Anschlüsse fallen unter die Rubrik STEUER- oder auch CONTROLBUS:: Takt Erklärung der Anschlussbelegung: Takt Erklärung zu den verwendeten Bezeichnungen: TaktTakt mit Hilfe der Rendezvous-Technik zu synchronisieren.
|