Hauptsprungleiste🔊 Sound ManagerEintrag Nr. 149CPC 464/664/6128

SOUND TONE ENVELOPE

&BCBF

Eine Tonhüllkurve einrichten.

Original (SOFT 968): „Set up a tone envelope.“

🔀Wie der Aufruf die Routine erreicht

Dein Programm            RAM-Sprungleiste            Low Kernel (RAM/ROM)        unteres ROM
─────────────            ────────────────            ────────────────────        ───────────
CALL &BCBF  ───────▶  &BCBF: RST 1 ─────────▶  &0008 LOW JUMP:           SOUND TONE ENVELOPE
                         DW Low Address            ROM-Zustand merken,  ───▶  (Routine)
                         (Bit 15 = oberes ROM aus)  unteres ROM an                  │
     ◀──────────────────────────────────────────  ROM-Zustand zurück  ◀──── RET ──┘

📖Beschreibung

⚙️ Wirkung

  • Eine der 15 benutzerprogrammierbaren Tonhüllkurven einrichten.

🧮 Register auf einen Blick

EingabeAHL
AusgabeCarryHL
verändertABCDEF

Automatisch aus den Bedingungen abgeleitet – bei Fallunterscheidungen („wenn … dann“) gilt der Volltext unten.

➡️ Einsprungbedingungen

  • A enthält eine Hüllkurvennummer.
  • HL enthält die Adresse eines Tondatenblocks.

⬅️ Rücksprungbedingungen

  • Wenn die Hüllkurve erfolgreich eingerichtet wurde:
  • Carry gesetzt.
  • HL enthält die Adresse des Datenblocks + 16.
  • A und BC verändert.
  • Wenn die Envelope-Nummer ungültig ist:
  • Carry gelöscht.
  • A, BC und HL bleiben erhalten.
  • Immer:
  • DE und andere Flags verändert.
  • Alle anderen Register bleiben erhalten.

📝 Hinweise aus dem Handbuch

  • Die einzurichtende Envelope wird durch eine Zahl im Bereich 1..15 angegeben. Es wird keine Envelope eingerichtet, wenn eine Zahl außerhalb dieses Bereichs übergeben wird.
  • Der Ton-Datenblock wird in die Ton-Envelope kopiert. Der Datenblock kann im ROM oder im RAM liegen. Er darf nicht im RAM unter einem ROM liegen.
  • Der Ton-Datenblock hat das folgende Layout:
  • Byte 0: Anzahl der Abschnitte in der Envelope.
  • Bytes 1..3: Erster Abschnitt der Envelope.
  • Bytes 4..6: Zweiter Abschnitt der Envelope.
  • Bytes 7..9: Dritter Abschnitt der Envelope.
  • Bytes 10..12: Vierter Abschnitt der Envelope.
  • Bytes 13..15: Fünfter Abschnitt der Envelope.
  • in der Envelope verwendete Abschnitte. Nicht verwendete Abschnitte müssen nicht eingerichtet werden. Eine Envelope, die keine Abschnitte verwendet, verändert den Ton nicht (d. h. keine Envelope-Bildung). Die Anzahl der zu verwendenden Abschnitte wird nicht überprüft; wenn eine Zahl außerhalb des Bereichs 0..5 übergeben wird, hat dies unvorhersehbare Auswirkungen. Dies sollte vermieden werden.
  • Das oberste Bit, Bit 7, der Anzahl wird verwendet, um eine sich wiederholende Envelope anzugeben. Wenn dieses Bit gesetzt ist, wird nach dem Ende des letzten Abschnitts der Envelope wieder der erste verwendet.
  • Jeder Abschnitt des Ton-Datenblocks ist wie folgt aufgebaut:
  • Byte 0: Schrittzahl.
  • Byte 1: Schrittgröße.
  • Byte 2: Pausenzeit.
  • Wenn die Schrittzahl im Bereich #00..#EF liegt, dann ist der Abschnitt ein relativer Abschnitt. Die Schrittgröße wird vorzeichenerweitert (Bit 7 wird auf die Bits 8..15 kopiert) und wird zur aktuellen Tonperiode addiert, und zwar so oft, wie durch die Schrittzahl angegeben. Nach jeder Addition wird eine Wartezeit von der Pausenzeit in 1/100 Sekunden eingehalten. Der Soundchip verwendet nur die unteren 12 Bits der Tonperiode, daher wird die gesamte Arithmetik modulo #1000 durchgeführt.
  • Eine Schrittzahl von 0 bedeutet 1 Schritt, während eine Pausenzeit von 0 256 bedeutet
  • 1/100 Sekunden.
  • Wenn die Schrittzahl im Bereich #F0..#FF liegt, dann ist der Abschnitt ein absoluter Abschnitt. Die niederwertigsten vier Bits der Schrittzahl werden als das höchstwertige Byte der Tonperiode betrachtet und die Schrittgröße wird als das niederwertigste Byte betrachtet. Diese Tonperiode wird sofort gesetzt, gefolgt von einer Pause, deren Länge durch die Pausenzeit in 1/100 Sekunden festgelegt wird.
  • Es gibt keinen Schutz gegen das Ändern einer Envelope, während sie verwendet wird. Dies könnte unvorhersehbare Auswirkungen haben und sollte vermieden werden.
  • Wenn die Ton-Envelope vor dem Ende des Klangs endet (wie beim Einreihen des Klangs festgelegt), dann wird der letzte Ton gehalten. D. h. die Ton-Envelope beeinflusst nicht die Länge des Klangs.

🧪Beispielprogramm – ausführen, ändern, Schritt für Schritt

Das Programm liegt bei &4000 und würde auf dem echten CPC mit CALL &4000 aus BASIC gestartet. Hier läuft es im Z80-Emulator; die Firmware ist nachgebildet.
bereit
🐞 Im großen Debugger öffnen
0
1
2
3
Rand
Modus 1 · Basis &C000 · Versatz &0000
Tastenpuffer: leer
Gedrückt gehaltene Tasten (für KM TEST KEY / KM GET JOYSTICK) per Klick umschalten; die Zahl ist die Tastennummer.
Register & Flags
AF
&FFFF
BC
&0000
DE
&0000
HL
&0000
IX
&FFFF
IY
&FFFF
SP
&C000
PC
&0000
S
1
Z
1
Y
1
H
1
X
1
P/V
1
N
1
C
1
Z80-Takte: 0 TCPC-Zeit: 0 µsROMs: unten aus, oben ausRAM-Konfig: &C0
Nächste Befehle (Disassembler)
0000HLE ▸ RESET ENTRY
0002RET
0003NOP
0004NOP
0005NOP
0006NOP
0007NOP
0008HLE ▸ LOW JUMP
Firmware
Firmware jetzt
▶ RESET ENTRY · Details
Letzte Falle: –
Letzte Firmware-Aufrufe
noch keine
Weitere Anzeigen: Speicher, Stapel, Ton, Dateien, Drucker, Kernel
Speicher
400000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ················
401000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ················
402000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ················
403000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ················
404000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ················
405000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ················
406000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ················
407000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ················
PCSP(HL)(DE)Leseansicht mit aktueller ROM-/Bank-Einblendung
Stapel
C0000000← SP
C0020000
C0040000
C0060000
C0080000
C00A0000
C00C0000
C00E0000
Ton (Sound Manager)
Kanal A
still
4 von 4 Plätzen frei
Kanal B
still
4 von 4 Plätzen frei
Kanal C
still
4 von 4 Plätzen frei
Dateien (simuliertes Laufwerk)
DateiTypLängeLaden
HALLO.TXTASCII33–
ZAHLEN.BINbinär6&5000
MUSTER.DATbinär16&6000
Eingabe: keine · Ausgabe: keine
Drucker
(noch nichts gedruckt)
Kernel: Zeit & Ereignisse
Zeit (KL TIME PLEASE): 0 × 1/300 s = 0.00 s · Interrupts: 0
keine Ereignisblöcke angemeldet

🔗Verwandte Einträge

💡 Quellen
Amstrad SOFT 968 „CPC 464/664/6128 Firmware“, Abschnitt 15 (Beschreibung, übersetzt); Adresse und Name abgeglichen mit Taylor/Defoe „The Amstrad CPC Firmware Guide“. Simulation: eigene Nachbildung (HLE) – Laufzeiten der Firmware selbst werden nicht nachgebildet.