# Phase 4 (Eingang) — Ereignisschleife und klassische Ereignis-Traps ## Why Phase 4 beginnt laut PLAN mit der Ereignisschleifen-Architektur. Diese Architektur lässt sich an den **klassischen Ereignis-Traps** vollständig bauen und beweisen, ohne eine Zeile Forms-Objektmodell: Sie brauchen dieselbe Warteschlange, dieselben Zustellpunkte, dieselbe Maskierung und denselben Rückruf in die VM, aber keine Formulare, keine Steuerelemente und kein `.FRM`. Umgekehrt müsste der Entwurf der Schleife mitten im Objektmodell blind bezahlt werden. Phase 3 hat die halbe Maschinerie bereits nebenbei gebaut: die `Ereignis`-Warteschlange, das Einsortieren in `RtState::pump`, die Zustellpunkte an Anweisungsgrenzen und vor blockierender Eingabe sowie den `CaptureHost` für Tests ohne Terminal. Es fehlen drei Dinge: eine **Zeitquelle**, die **Maskierung** einzelner Ereignisquellen und vor allem der **Rückruf in die VM** — heute gibt es keinen Weg, aus der Laufzeit heraus eine Prozedur oder ein `GOSUB`-Ziel des laufenden Programms auszuführen. `DOEVENTS()` liefert deshalb konstant 0. Zugleich sind die zehn Ereignis-Elemente die letzte Lücke des Inventars außerhalb von Forms: von den 15 offenen Einträgen entfallen zehn auf diese Gruppe, drei auf die Forms-Dialoge und zwei auf Phase 5. ## What Changes - **Ereignisquellen und Warteschlange**: Das Ereignismodell der Laufzeit wird um eine **Zeitquelle** erweitert. Die Zeit kommt vom Host, nicht aus einem direkten Uhrzugriff der Laufzeit — nur so kann der `CaptureHost` virtuelle Zeit stellen und ein Korpusprogramm mit `ON TIMER` deterministisch prüfen. **BREAKING** für den `Host`-Trait. - **Mausereignisse als vierte Quelle**: Der `TerminalHost` verwirft die Mausereignisse von `crossterm` heute. Sie werden aufgenommen und in Zellenkoordinaten geführt — Tastendruck, Loslassen und Bewegung mit Taste und Umschaltzustand. Die Eingangsaufgabe der Phase lautet „Terminal-Events → Event-Queue → VM-Ticks"; die Maus ist ein Terminal-Event und damit Teil der Schleife, auch wenn sie erst die Steuerelemente auswerten. - **Rückruf in die VM**: Ereigniszustellung wird ein Vorgang der VM, kein Builtin. Ein zugestelltes Ereignis führt das `GOSUB`-Ziel seines Traps aus und kehrt danach an die unterbrochene Stelle zurück. Damit bekommt auch `DOEVENTS()` seine Wirkung. - **Zustellpunkte**: Die vorhandenen Punkte (Anweisungsgrenze, blockierende Eingabe) werden zu einer geschlossenen, dokumentierten Liste ausgebaut: Anweisungsgrenze, `DOEVENTS`, `SLEEP` (wird durch ein zugestelltes Ereignis beendet) und blockierende Eingabe. Zwischen Zustellpunkten unterbricht nichts das Programm. - **Klassische Ereignis-Traps** (Sprachreferenz §8, **10 Inventareinträge**): `ON TIMER(n&)`, `ON KEY(n%)`, `ON UEVENT` und `ON SIGNAL(n%)` je mit `GOSUB label`; die Steueranweisungen `TIMER`, `KEY(n)`, `UEVENT` und `SIGNAL(n)` je mit `ON`/`OFF`/`STOP` sowie die Klammer `EVENT` mit `ON`/`OFF`; dazu `SetUEvent`. Wertebereiche nach Beleg: `KEY` 0, 1–25, 30–31; `TIMER` 1–86 400 Sekunden; `SIGNAL` 1–2. Ihr Status im Inventar wechselt auf `implementiert`. - **Maskierung mit drei Zuständen**: `ON` stellt zu, `OFF` verwirft — auch ein unter `STOP` bereits gemerktes Ereignis —, `STOP` merkt eines und stellt es beim nächsten `ON` zu. Der Eintritt in einen Handler führt selbsttätig `STOP` seiner Quelle aus, das `RETURN` selbsttätig `ON`, außer im Handler stand ein ausdrückliches `OFF`. - **`SIGNAL` auf Betriebssystemsignale** (Entscheidung 2026-09-04): Die Quelle des Vorbilds war OS/2-gebunden (Prozessflags über `DOSFLAGPROCESS`) und existiert nicht. Abgebildet wird die minimale Menge, die auf allen Zielplattformen besteht: `SIGNAL(1)` auf `SIGINT`, `SIGNAL(2)` auf `SIGTERM`. Signale erreichen die Laufzeit über den Host, nicht im Signalkontext. - **Getrappte Tasten verlassen den Eingabestrom**: Eine Taste, für die ein aktiver `ON KEY`-Trap besteht, wird zugestellt und MUST NOT zusätzlich bei `INKEY$`, `INPUT` oder `INPUT$` erscheinen. - **Namentliche Abweisung im Frontend**: Die zehn Elemente erhalten Grammatik und Signaturen. Heute rutscht `ON TIMER(5) GOSUB marke` stillschweigend in das berechnete `ON ausdruck GOSUB` — genau der Fall, den der Guiding Principle als Bug definiert. **Non-Goals:** - Die **Auswertung** von Mausereignissen durch Steuerelemente (Trefferprüfung, Fokuswechsel, Ziehen) — sie setzt das Objektmodell voraus und gehört zum Change der Steuerelemente. Quelle, Warteschlange und Koordinatenmodell entstehen hier. - Das Forms-Objektmodell, Steuerelemente, `.FRM` und die Dialoge (`MSGBOX`, `INPUTBOX$`) — eigene Changes derselben Phase. - `COM`, `PEN`, `PLAY`, `STRIG` bleiben Non-Feature (Fehler 73). ## Capabilities ### New Capabilities - `ereignissteuerung`: Ereignisquellen (Tastatur, Zeit, benutzerdefiniert), Warteschlange und Reihenfolge, Zustellpunkte, Maskierung mit `ON`/`OFF`/`STOP` je Quelle und global, Zustellung als `GOSUB` in das laufende Programm, Zusammenspiel mit Fehlerbehandlung und blockierender Eingabe. ### Modified Capabilities - `sprach-frontend`: Grammatik und Signaturprüfung SHALL die Trap-Anweisungen und `SetUEvent` umfassen; `ON (n) GOSUB` MUST NOT als berechnetes `ON ausdruck GOSUB` behandelt werden. - `vm-ausfuehrung`: Die VM SHALL an Anweisungsgrenzen anstehende Ereignisse zustellen und dafür das `GOSUB`-Ziel des Traps ausführen, ohne den unterbrochenen Zustand zu verlieren. - `kompat-testkorpus`: Korpusabdeckung der Ereignis-Traps mit deterministischer Zeit. ## Impact - `crates/tb-runtime`: `Ereignis` und der `Host`-Trait um die Zeitquelle erweitert (**BREAKING**); Trap-Zustände und Warteschlange in `RtState`; `INKEY$`-Puffer filtert getrappte Tasten; `SLEEP` endet bei Zustellung. - `crates/tb-vm`: Zustellung als Vorgang der Ausführung (neue Instruktion und Frame-Behandlung); `DOEVENTS` erhält Wirkung. - `crates/tb-frontend`: Grammatik und Signaturen der zehn Elemente; `Unsupported`-Absenkung von `SETUEVENT` entfällt. - `crates/tb-ui`: `TerminalHost` liefert die Zeit, reicht die Mausereignisse von `crossterm` durch, statt sie zu verwerfen, und meldet Betriebssystemsignale als Ereignis. - `tests/compat`: neue Korpusprogramme für Zeit-, Tasten- und UEvent-Traps sowie für `ON`/`OFF`/`STOP`. - `docs/`: `sprachreferenz.md` §8 ausformuliert; `inventar.md` setzt die zehn Einträge auf `implementiert`; `bibliothek.md` um die Elemente erweitert. - PLAN.md: die Eingangsaufgabe von Phase 4 und der Punkt „Klassische Ereignis-Traps" sind damit erledigt.