Es will mir einfach nicht gelingen, den Overscan-Modus des Falcon einzuschalten. Zwei Bomben sind stets die Folge eines Versuchs. Was mache ich falsch?
Der Overscan-Modus des Falcon ist nur mit einem RGB-Monitor oder Fernseher darstellbar. Außerdem müssen Sie folgendes beachten: Der Bildschirmspeicher einer Overscan-Auflösung ist natürlich größer und benötigt entsprechend mehr Speicher. Bevor Sie also die Auflösung wechseln, müssen Sie daher einen ausreichend großen Speicherblock reservieren und diesen als neuen Bildschirmspeicher definieren.
Der Falcon unterstützt auch 16-Bit-Samples. Gibt es bereits ein Standard-Format für solche Dateien?
Die Firma Mitchtron verwendet seit einiger Zeit das sogenannte AVR-Format für Samples. Den Aufbau entnehmen Sie Tabelle 1. Beachten Sie: Die Länge des Samples (»laenge«) wird stets in Anzahl der Samples angegeben, nicht in Byte. Der linke und rechte Kanal eines Stereo-Samples zählt dabei als ein Sample.
Beispiel: Ist die Aufnahme-Datei bei 8 Bit Stereo 1000 Byte lang, enthält sie 500 Samples, bei 16 Bit Stereo nur 250. Entsprechend zeigen »loop_anfang« und »loop_ende« auf das Anfangs- und Endsample der zu loopenden Sequenz.
Der CODEC des Falcon liefert immer »signed« Samples. Möchten Sie eine AVR-Datei anderer Sampler spielen, die »unsigned« Samples erzeugen, müssen Sie diese vorher umrechnen. Die Samplefrequenz belegt nur die unteren drei Byte der Variable »frequenz«. Das obere Wort ist für spezielle Abtastraten der Sampler von Mitchtron vorbehalten und sollte daher ausmaskiert werden. Mitchtron empfiehlt, vor jedem Eintragen neuer Werte die gesamte Struktur zu löschen, um vorhandenen Datenmüll damit zu entfernen.
Laut Atari dient die Funktion »setinterrupt()« dem Erzeugen eines Interrupts am Ende eines mittels »setbuffer()« definierten Aufnahme- oder Wiedergabepuffers. Bei mir rührt sich aber gar nichts.
Mit dem alleinigen Aufruf von »setinterrupt()« ist es nicht getan. Abhängig von der gewählten Interruptquelle (MFP i7 oder Timer A), benötigen Sie noch eine Interrupt-Routine, die beim Auftreten eines Interrupts ein Flag setzt. Dieses Flag prüft das Hauptprogramm in regelmäßigen Abständen und reagiert entsprechend. Das Listing zeigt zwei Routinen zur Installation des MFPi7-Interrupts. In C sieht der Aufruf dann wie folgt aus:
void setupi7 (void);
void i7_disable (void);
extern int i7_occur;
int main (void)
{
setupi7 (); /* Interrupt-Routine installieren*/
... /* Hier steht Ihr Hauptprogramm */
i7_disable(); /* interrupt-Routine verwerfen */
return 0;
}
Ihre Routine wartet, bis die Variable »i7_occur« ungleich Null ist und reagiert auf den Interrupt. Natürlich dürfen Sie nicht vergessen, i7_occur wieder zurückzusetzen.
while (!i7_occur);
i7_occur = 0; /* Variable zurücksetzen */
(ah)
; Interruptroutine für »setinterrupt()«
; (C) 1993 ICP-Verlag, TOS-Magazin
export i7_disable, setupi7, i7_occur
AER equ $fffa03 ; Aktive-Edge-Register
DDR equ $fffa05 ; Data-Direction-Register
IERA equ $fffa07 ; Interrupt-Enable-Register
IPRA equ $fffaOb ; Interrupt-Pending-Register
ISRA equ $fffa0f ; Interrupt-in-Service-Register
IMRA equ $fffa13 ; Interrupt-Mask-Register
; Interrupt ausschalten und alte MFPO-Routine restaurieren
i7_disable:
movem.l d0-d2/aO-a2, -(sp) ;Register retten
clr.l -(sp) ; Supervisor einschalten
move.w #32, -(sp) ; SUPER()
trap #1 ; GEMDOS
addq.l #06, sp ; Stack aufräumen
move.l d0, oldssp ; Stackpointer retten
bclr #7, IERA ; Interrupt ausschalten
bclr #7, IMRA ; Interrupt ausmaskieren
bclr #7, IPRA ; Keine „schwebenden“ I.
bclr #7, ISRA ; Keine „In-Service“ I.
move.l old_mfpi7, $13c ; alte Routine restaurieren
move.b old_iera, IERA ; Register auf alte
move.b old_imra, IMRA ; Werte setzen
move.b old_ipra, IPRA
move.b old_isra, ISRA
move.b old_ddr, DDR
move.b old_aer, AER
move.l old_ssp, -(SP) ; in User-Modus zurück
move.w #32, -(sp ; SUPER()
trap #1 ; GEMDOS
addq.l #06,sp ; Stack aufräumen
movem.l (sp)+, d0-d2/a0-a2 ; Register restaurieren
rts ; zurück ins Hauptprogramm
; Interrupt-Routine installieren
setupi7:
movem.l d0-d2/a0-a2, -(sp) ; Register retten
clr.l -(sp) ; Supervisor einschalten
move.w #32, -(sp) ; SUPER()
trap #1 ; GEMDOS
addq.l #06, sp ; Stack aufräumen
move.l d0, old_ssp ; Stackpointer retten
move.b IERA, old_iera ; alte Werte
move.b IMRA, old_imra ; sichern
move.b IPRA, old_ipra
move.b ISRA, old_isra
move.b DDR, old_ddr
move.b AER, old_aer
bclr #7, IERA ; MFPi7 ausschalten
bclr #7, IMRA ; ausmasieren
bclr #7, IPRA ; keine „schwebenden“ I.
bclr #7,ISRA ; keine „In-Service“ I.
bclr #7, DDR ; Port 7 ist Ausgang
movea.l #$13c, a0 ; MFPi7-Vektor
move.l (a0), old_mfpi7 ; alte Routine retten
move.l #i7_int, (a0) ; Interrupt installieren
bset #7, AER ; Interrupt bei Low->High
bset #7, IMRA ; MFPi7 setzen
bset #7, IERA ; und einschalten
move.l old_ssp, -(sp) ; in User-Modus zurück
move.w #32, -(sp ; SUPER()
trap #1 ; GEMDOS
addq.l #06, sp ; Stack aufräumen
movem.l (sp)+, d0-d2/a0-a2 ; Register restaurieren
rts ; Zurück ins Hauptprogramm
i7_int:
move.w #1, i7_occur
bclr #7, IPRA ; keine „schwebenden“ I.
bclr #7, ISRA ; keine ‚In-Service“ I.
bset #7, IMRA ; MFPi7 setzen
rte ; „return from Interrupt“
.bss
old_ssp: ds.l 1 ; alter Stackpointer
old_mfpi7: ds.l 1 ; alte MFPi7-Routine
i7_occur: ds.l 1 ; Flag für Interrupt
old_iera: ds.b 1 ; alte MFP-Register
old_imra: ds.b 1
old_ipra: ds.b 1
old_isra: ds.b 1
old_ddr: ds.b 1
old_aer: ds.b 1
end
Wenn ich zu laute Musik mit dem Falcon digitalisiere, kommt es im CODEC zu einem Überlauf, den ich laut Dokumentation nur mit »sndstatus (1);« abfragen und zurücksetzen kann. Dabei wird allerdings die gesamte Soundhardware zurückgesetzt. Gibt es keinen anderen Weg?
Es genügt vollkommen, den Status des CODEC über »sndstatus(0);« zu erfragen. Beachten Sie aber, daß Bit 4 und 5 in der Dokumentation vertauscht wurden. Tatsächlich signalisiert Bit 4 einen Überlauf des linken, Bit 5 des rechten Kanals.
int status;
status = sndstatus(0);
if (status & 16)
{
printf ("\n linker Überlauf!");
}
if (status & 32)
{
printf ("\n rechter Überlauf!");
}
Offset | Variable | Bedeutung |
---|---|---|
0 | long magic; | Enthält das Magic “2BIT“ |
4 | char sample_name[8]; | Name des Samples |
12 | int modus; | 0 = Mono, 0xffff = Stereo |
14 | int resolution; | 0x0008 = 8 Bit, 0x00 10 = 16 Bit |
16 | int signed; | 0 = unsigned, 1 = signed |
18 | int loop; | 0 = Loopen, 1 = nicht loopen |
20 | int midi; | 0xffff = keine Belegung |
22 | long frequenz; | Samplefrequenz in Hz |
26 | long laenge; | Anzahl der Samples |
30 | long loop_anfang; | |
34 | long loop_ende; | |
38 | int reserviert; | reserviert |
40 | int reserviert; | reserviert |
42 | int reserviert, | reserviert |
44 | char ext[20]; | Erweiterter Dateiname |
64 | char reserviert(64); | reserviert |
128 | Sampledaten |
Tabelle 1. Der Aufbau eines AVR-Headers für Samples