Hauptsprungleiste🧠 KernelEintrag Nr. 165CPC 464/664/6128

KL INIT EVENT

&BCEF

Einen Ereignisblock initialisieren.

Original (SOFT 968): „Initialize an event block.“

🔀Wie der Aufruf die Routine erreicht

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

📖Beschreibung

⚙️ Wirkung

  • Alle Einträge in einem Ereignisblock initialisieren.

🧮 Register auf einen Blick

EingabeBCDEHL
AusgabeHL
verändertkeine

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

➡️ Einsprungbedingungen

  • HL enthält die Adresse des Ereignisblocks.
  • B enthält die Ereignisklasse.
  • C enthält die ROM-Auswahladresse der Ereignisroutine.
  • DE enthält die Adresse der Ereignisroutine.

⬅️ Rücksprungbedingungen

  • HL enthält die Adresse des Ereignisblocks + 7.
  • Alle anderen Register bleiben erhalten.

📝 Hinweise aus dem Handbuch

  • Der Ereignisblock ist 7 Bytes lang und muss im zentralen 32K des RAM liegen. Der Aufbau eines Ereignisblocks ist in Anhang X beschrieben. Eine allgemeine Erläuterung von Ereignissen finden Sie in Abschnitt 12.
  • Die ROM-Auswahl und die Adresse der Routine sind die 'Fernadresse' der Ereignisroutine (siehe Abschnitt 2).
  • Die Ereignisklasse ist bit-signifikant wie folgt:
  • Bit 0: Nahe Adresse.
  • Bits 1..4: Priorität synchroner Ereignisse.
  • Bit 5: Muss null sein.
  • Bit 6: Express-Ereignis.
  • Bit 7: Asynchrones Ereignis.
  • Wenn das Asynchrones-Ereignis-Bit gesetzt ist, dann ist das Ereignis ein asynchrones Ereignis, andernfalls ist es ein synchrones Ereignis. Asynchrone Ereignisse haben keine Prioritäten, daher wird das Prioritätsfeld ignoriert.
  • Wenn das Express-Ereignis-Bit gesetzt ist, dann ist das Ereignis ein Express-Ereignis. Die Bedeutung hiervon hängt davon ab, ob das Ereignis synchron oder asynchron ist.
  • Alle Express-synchronen Ereignisse haben höhere Prioritäten als jedes normale synchrone Ereignis. Die Priorität eines synchronen Ereignisses ist in den Bits 1..4 der Klasse kodiert; je höher die Zahl, desto größer die Priorität. Kein Ereignis darf die Priorität 0 haben. Die Verarbeitung normaler synchroner Ereignisse kann deaktiviert werden (durch Aufruf von KL EVENT DISABLE), die von Express-synchronen Ereignissen jedoch nicht.
  • Interrupt-Pfad. Ein normales asynchrones Ereignis wird unmittelbar vor der Rückkehr aus dem Interrupt verarbeitet (mit aktivierten Interrupts).
  • Wenn das Nahe-Adresse-Bit gesetzt ist, dann befindet sich die Ereignisroutine entweder im unteren ROM oder im zentralen 32K des RAM. Die ROM-Auswahladresse wird ignoriert und die Routine wird direkt aufgerufen, statt über den FAR CALL-Mechanismus, wodurch der Verarbeitungsaufwand für Ereignisse reduziert wird. Wo möglich, sollten asynchrone Ereignisse an 'nahen Adressen' liegen. Express-asynchrone Ereignisse müssen immer an 'nahen Adressen' liegen.
  • Ereignisblöcke erscheinen in verschiedenen anderen Blöcken, die vom Kernel verwaltet werden, einschließlich Frame Flyback, Fast Ticker und Tick-Blöcken. Diese Routine wird verwendet, um die Ereignisblock-Teile dieser zu initialisieren.
  • Die Bytes nach dem letzten Byte des Ereignisblocks, selbst wenn der Block Teil eines anderen Blocks ist, werden vom Kernel nicht verwendet. Wenn die Ereignisroutine aufgerufen wird, wird ihr die Adresse des Blocks übergeben, sodass der Benutzer weitere Informationen über das Ereignis an den Block anhängen kann. Dies ermöglicht es mehreren ähnlichen Ereignissen, dieselbe Ereignisroutine zu teilen, wobei jedes Ereignis seine 'eigenen' Variablen an seinen Ereignisblock angehängt hat.
  • Die Ereignisroutine hat die folgenden Eintritts- und Austrittsbedingungen:
  • Eintritt:
  • Wenn sich die Ereignisroutine an einer 'fernen Adresse' befindet:
  • HL enthält die Adresse von Byte 5 des Ereignisblocks
  • (sodass angehängte Daten bei Adresse HL + 2 beginnen können).
  • Wenn sich die Ereignisroutine an einer 'nahen Adresse' befindet:
  • DE enthält die Adresse von Byte 6 des Ereignisblocks
  • (sodass angehängte Daten bei Adresse DE + 1 beginnen können).
  • Austritt:
  • AF, BC, DE und HL verändert.
  • Alle anderen Register bleiben erhalten.
  • Die Ereignisroutine darf die Register IX und IY verwenden, muss sie aber erhalten. Sie darf nicht den zweiten Registersatz verwenden. Asynchrone Ereignisse von Express dürfen keine Interrupts aktivieren.
  • KL INIT EVENT aktiviert Interrupts.

🧪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.