In Basic werden Töne mit Interrupts, die jede 1/50 Sekunde aufgerufen werden, programmiert. Allerdings gibt es in den Tonwarteschlangen nur Platz für fünf Töne pro Kanal. Sollen mehr als fünf Töne erzeugt werden, dann wartet der Basic-Interpreter in der entsprechenden Zeile, bis wieder Platz frei ist Will man dies umgehen, dann muß man ein Programm haben, das automatisch den nächsten Ton in die Register des Tongenerators schreibt und dessen Länge beachtet. In Basic würde dies mit den EVERY- oder ON SQ GOSUB-Funktionen zu lange dauern, deshalb muß das Steuerprogramm in Maschinensprache geschrieben sein. Der Betriebssystemkern (Kernel) durchläuft fünfzigmal in der Sekunde (bei jedem Bildaufbau) eine Liste von Ereignissen, die jedesmal aufgerufen werden müssen. Mit drei solchen Ereignissen, für jeden Tonkanal eines, wird die interruptgesteuerte Musik realisiert. Man könnte alle drei Kanäle mit einem einzigen Interrupt steuern, nur gäbe es dann nicht die Möglichkeit, einzelne Kanäle aus-bzw. einzuschalten. Eine Zählroutine zieht vom Zähler bei jedem Aufruf 1 ab. Ist der Zähler gleich 0, dann wird der Tongenerator (PSG) mit dem nächsten Ton versorgt. Ist bei der Tonhöhe das 16. Bit gesetzt (z.B. 32768), dann wird der Tontabellenzeiger wieder auf den Ausgangswert gesetzt und die Tontabelle wieder von vorne durchgearbeitet. Ist das 15. Bit gesetzt (z.B. 16384), dann wird der Interrupt für den entsprechenden Kanal gelöscht und das Ereignis nicht mehr aufgerufen. Bei der Tonhöhe werden nur die unteren zwölf Bits beachtet, eine Prüfung, ob das 13. oder 14. Bit gesetzt ist, findet nicht statt Folgendes sollte beachtet werden: - Beim Einrichten einer Tontabelle (Reihenfolge: Tonhöhe, Tonlänge) muß beachtet werden, daß zur gleichen Zeit keine Interruptroutine auf den entsprechenden Speicherbereich zugreifen darf, weil dadurch das Steuerprogramm eventuell durcheinander gerät. (Vorher mit OFF abschalten!) -Zum POKEn der 16-Bit-Werte steht ein RSX-Befehl DOKE zur Verfügung.
- Beim Abschalten eines Tonkanals wird der jeweils letzte Ton beibehalten. Er kann gelöscht werden, indem man die Lautstärke mit dem VOL-Befehl auf Null setzt
- Bei der Basic-Programmierung (z.B. Zeileneingabe) oder bei der Benutzung der Basic-Soundbefehle werden die Interrupt-Töne zerstört ( auch bei PRINT CHR$(7)).
- Ein mit OFF abgeschalteter Interrupt kann mit ON wieder aktiviert werden, indem man hier keine Adresse angibt. Wurde die Lautstärke oder sonst ein maßgebliches Register zerstört, dann muß es vorher wieder auf den richtigen Wert gebracht werden. War vorher kein Interrupt vorhanden, oder wurde der Interruptblock verändert, so kann dies unvorhersehbare Folgen haben.
- Damit ein Ton erklingen kann, muß die Lautstärke des Kanals mindestens 1, das Register Nr. 7 richtig geladen und eine Tontabelle vorhanden sein.
- Die Tonlänge wird in 1/50 Sekunden angegeben, die Tonhöhe wie im Handbuch in Anhang 7 (Seite 1 ff.) beschrieben.
Für die Programmierung stehen RSX-Befehle zur Verfügung: OFF Abschalten aller drei Interrupts |OFF,A Abschalten des Interrupts für Kanal A |OFF,B Abschalten des Interrupts für Kanal B |OFF,C Abschalten des Interrupts für Kanal C |ON,A, adresse Einschalten des Interrupts für Kanal A |ON.B, adresse Einschalten des Interrupts für Kanal B |ON.C, adresse Einschalten des Interrupts für Kanal |VOL,A, lautstarke Lautstärke für Kanal A setzen |VOL,B, lautstarke Lautstärke für Kanal B setzen |VOL,C, lautstarke Lautstärke für Kanal C setzen |PSG, register, 8-bit-wert Register des Tongenerators beschreiben |DOKE, adresse, 16-bit-wert 16-Bit-Wert poken (Intel-Format) Der Wert des PSG-Registers darf sich zwischen 0 und 13 bewegen, der für die Lautstärke zwischen 0 und 16. Ist die Lautstärke auf 16 gesetzt dann bestimmt der Hüllkurvengenerator die Lautstärke des Tones. Der Hüllkurvengenerator kann mit drei Registern des Tongenerators beeinflußt werden: 11 Feineinstellung Hüllkurvenperiode 0 - 255 12 Grobeinstellung Hüllkurvenperiode 0 - 255 13 Hüllkurvenform (8 Verschiedene) 0-15 (siehe Abb. 1) AY-3-8912 Huellkurvenformen Register Nr. 7: Das Register Nr. 7 steuert das Sperren von Tönen oder Rauschen auf den einzelnen Kanälen. Ist ein Bit gesetzt, dann wird die entsprechende Funktion gesperrt sonst zugelassen. Bit 6 und 7 sind für die Steuerung der I/O-Ports des PSG zuständig. Sie sind für die Soundprogrammierung uninteressant und werden deshalb auf Null gesetzt. Bit 76543210 Kanal 00CBACBA Die Bits 0-2 steuern die Töne, die Bits 3 - 5 das Rauschen. Der Assembler-Quellcode befindet sich aus technischen Gründen auf der zugehörigen CPC-Databox. Einsprung-Referenz: Für die Anpassung des Programms an CPC 664 und CPC 6128 hier die Einsprünge in die Firmware und ins Basic-ROM: - B900 KL UROM ENABLE oberes ROM öffnen
- BCD1 KL LOG EXT RSX einbinden
- BCD7 KL NEW FRAME FLY neuen Frame Fly Interrupt initialisieren und einbinden
- BCDD KL DEL FRAME FLY Frame Fly Interrupt löschen
- BD34 MC SOUND REGISTER Sound-Register laden
- CA94 BAS ERROR : Basic-Fehlermeldung ausgeben
Hermann Röscheisen, CPCAI 8608 ★ AMSTRAD CPC ★ DOWNLOAD ★ |
|
CPCrulez[Content Management System] v8.7-desktop/c Page créée en 220 millisecondes et consultée 1692 foisL'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko. |
|
|