# Umfang und Form der Ereignis-Elemente (Aufgaben 1.1, 1.2) **Quelle.** `bas7advr.hlp` (BASIC 7 Advisor), Einzelseiten unter https://dos-help.soulsphere.org/bas7advr.hlp/ (abgerufen 2026-09-04); Gegenprobe `qb45advr.hlp` unter derselben Domain. Zitate wörtlich aus den Einzelseiten, Übersetzung nur in den Kommentarzeilen. ## 1.1 Einzelseiten | Element | Seite | |---|---| | `ON TIMER` | `x_dot_ontimerrr.html` | | `ON KEY` | `x_dot_onkeyr.html` | | `ON UEVENT` | `x_dot_onur.html` | | `ON SIGNAL` | `x_dot_onsigbar.html` | | `TIMER` (Anweisung) | `x_dot_timersr.html` | | `KEY(n)` (Ereignis) | `x_dot_ketvr.html` | | `UEVENT` | `x_dot_uevvvr.html` | | `SIGNAL` | `x_dot_signalr.html` | | `EVENT` | `x_dot_evntonr.html` | | `SetUEvent` | `x_dot_SETUEVr.html` | ### ON TIMER > `ON TIMER(n&) GOSUB {linenumber | linelabel}` > > „The maximum number of seconds that can be specified for the time > interval, n&, is the number of seconds in a 24-hour day (86,400)." > > „A linenumber value of 0 disables event trapping and does not specify > line 0 as the start of the routine." Der Zeitwert ist **LONG** (`n&`), Bereich 1–86 400 Sekunden. `GOSUB 0` schaltet den Trap ab. ### TIMER ON/OFF/STOP > „TIMER ON enables timer-event trapping." > > „TIMER OFF disables timer-event trapping. … Events occurring while > trapping is off are ignored." > > „TIMER STOP suspends timer-event trapping. … Events occurring while > trapping is off are remembered and processed when the next TIMER ON > statement is executed." **Wiedereintritt — wörtlich belegt:** > „an automatic TIMER STOP is executed so that recursive traps cannot > take place." > > „The RETURN from the trapping routine automatically performs a TIMER ON > statement unless an explicit TIMER OFF was performed inside the > routine." Das ist genauer als „die Quelle gilt während des Handlers als gestoppt": `RETURN` schaltet die Quelle **auf ON**, außer im Handler stand ein ausdrückliches `OFF`. ### KEY(n) — Wertebereich > ``` > KEY(n%) ON > KEY(n%) OFF > KEY(n%) STOP > ``` | n% | Taste | |---|---| | 0 | alle Tasten dieser Tabelle | | 1–10 | F1–F10 | | 11 | Pfeil hoch | | 12 | Pfeil links | | 13 | Pfeil rechts | | 14 | Pfeil runter | | 15–25 | benutzerdefinierte Tasten | | 30–31 | F11–F12 (101-Tasten-Tastatur) | `ON KEY` selbst: `ON KEY(n%) GOSUB {linenumber | linelabel}`. Zur Frage, ob eine getrappte Taste im Eingabestrom bleibt, sagt die Einzelseite nur: > „After a key is trapped, the information on which key was trapped is no > longer available." Die Gegenprobe in `qb45advr.hlp` (`x_dot_onkeyba.html`, `x_dot_ketv.html`) enthält dazu **nichts**. → Festlegung nötig, siehe 1.2. ### Benutzerdefinierte Tasten 15–25 Die Einzelseite zu `KEY n, zeichenkette$` (`x_dot_setfkr.html`) behandelt **nur** die Makrozuweisung für 1–10 und 30–31; die Erklärungsform für 15–25 steht in keiner der beiden Hilfen, ebenso wenig die Bedeutung der Bits des Tastaturflagbytes. Belegt ist dagegen die **Scancode-Tabelle** (`qb45advr.hlp`, `x_dot_kbsct.html`), aus der die Zuordnung Zeichen → Scancode stammt: > ESC 01 · „! or 1" 02 … „) or 0" 0B · „_ or -" 0C · „+ or =" 0D · > TAB 0F · Q 10 … P 19 · ENTER 1C · A 1E … L 26 · Z 2C … M 32 · > SPACEBAR 39 · F1 3B … F10 44 · HOME 47 · UP 48 · LEFT 4B · RIGHT 4D · > END 4F · DOWN 50 · INS 52 · DEL 53 → Festlegung nötig für das Flagbyte, siehe 1.2. ### UEVENT und SetUEvent > `ON UEVENT GOSUB {linenumber | linelabel}` > > „This event typically originates from a hardware interrupt but can also > be triggered by software." > > „SetUEvent … sets a flag that BASIC checks before executing the next > statement." Bestätigt die Zustellung **an der Anweisungsgrenze**. > ``` > UEVENT ON > UEVENT OFF > UEVENT STOP > ``` > > UEVENT STOP „preserves events in memory for processing once UEVENT ON > resumes, though executing UEVENT OFF afterward will discard these queued > events." `OFF` verwirft also auch ein unter `STOP` gemerktes Ereignis. `SetUEvent` ist eine **Routine** ohne dokumentierte Argumentliste und ohne dokumentierten Rückgabewert: > „It sets the BASIC entry point that causes a user-defined event." ### SIGNAL > ``` > SIGNAL(n%) ON > SIGNAL(n%) OFF > SIGNAL(n%) STOP > ``` > > `ON SIGNAL(n%) GOSUB {linenumber | linelabel}` > > „A linenumber value of 0 disables event trapping." Quelle der Signale — wörtlich: > „OS/2 protected-mode signal" > > „Process flags A, B, and C are used for communicating between > processes." > > aktiviert durch die OS/2-Funktion `DOSFLAGPROCESS` aus einem anderen > Prozess. Ein **Wertebereich für `n%` ist nicht dokumentiert**; die Einzelseite verweist auf „Chapter 9, ‚Event Handling'" des Programmer's Guide, der nicht vorliegt. ### EVENT > ``` > EVENT ON > EVENT OFF > ``` > > „EVENT OFF … equivalent to compiling a program from the BC command line > without using /V or /W." > > „EVENT OFF and EVENT ON can be used to bracket sections of code where > events do not need to be detected and trapped, and fast performance is > required." **`EVENT STOP` ist nicht dokumentiert.** `EVENT` ist im Vorbild kein Laufzeit-Hauptschalter mit drei Zuständen, sondern eine Klammer, die die Erzeugung der Ereignisprüfungen im Kompilat ein- und ausschaltet. ### Reihenfolge und Trapping in Prozeduren Zu beidem geben die Einzelseiten **nichts** her; sie verweisen auf Kapitel 9 des Programmer's Guide. → Festlegung nötig, siehe 1.2. ## 1.2 Abweichungen der Delta-Spec vom Beleg Nach der Leitplanke „Referenzverhalten schlägt Eleganz … das gilt auch gegenüber den eigenen Spezifikationen" ist bei jeder Abweichung die **Spec** anzugleichen. | Nr. | Delta-Spec sagt | Beleg sagt | Folge | |---|---|---|---| | A | `EVENT` hat `ON`/`OFF`/`STOP` und überlagert die Einzelzustände | nur `ON`/`OFF`; Klammer um die Erzeugung der Prüfungen | Spec angleichen; `EVENT STOP` wird namentlich abgewiesen | | B | „während des Handlers gilt die Quelle als gestoppt; mit `RETURN` gilt wieder ihr Zustand" | Eintritt = automatisches `STOP`; `RETURN` = automatisches `ON`, außer im Handler stand ein ausdrückliches `OFF` | Spec präzisieren | | C | `OFF` verwirft künftige Ereignisse | `OFF` verwirft **auch** ein unter `STOP` gemerktes | Spec ergänzen | | D | `ON KEY(n)` mit Wertebereich | 0, 1–25, 30–31 mit fester Tastenzuordnung | Spec unverändert, Bereich jetzt belegt | | E | `ON TIMER(n)` | `n&` ist LONG, 1–86 400; `GOSUB 0` schaltet ab | Spec unverändert, Form jetzt belegt | **Ohne Beleg — unsere Festlegungen (gehören nach `sprachreferenz.md` unter „Abweichungen"):** 1. **Getrappte Tasten verlassen den Eingabestrom.** Von keiner der beiden Hilfen belegt. Wir legen fest: eine Taste mit aktivem Trap erscheint nicht zusätzlich bei `INKEY$`/`INPUT`. Begründung: andernfalls sähe ein Programm dieselbe Taste zweimal, und `KEY(n) OFF` wäre die einzige Art, eine Taste überhaupt normal zu lesen. 2. **Reihenfolge gleichzeitig fälliger Ereignisse.** Unbelegt. Wir legen fest: `KEY` (aufsteigend nach `n`), dann `TIMER`, dann `UEVENT`, dann `SIGNAL` — Tasten zuerst, weil sie an einer Benutzereingabe hängen. 3. **Trapping in Prozeduren.** Unbelegt. Wir legen fest: die Zustellung erfolgt an jeder Anweisungsgrenze, auch innerhalb von `SUB`/`FUNCTION`; das Ziel liegt im Modulrumpf. Das entspricht dem bereits umgesetzten Verhalten des modulweiten `ON ERROR`. 4. **Bits des Tastaturflagbytes** in `KEY n, CHR$(flag)+CHR$(scan)`. Unbelegt. Wir legen die Belegung des BIOS-Flagbytes zugrunde: 1 rechte Umschalttaste, 2 linke Umschalttaste, 4 Strg, 8 Alt. Im Terminal sind linke und rechte Umschalttaste nicht unterscheidbar, beide Bits gelten deshalb gleich; NumLock und CapsLock spielen für einen Trap keine Rolle und werden ignoriert. 5. **`SIGNAL`-Quelle.** Die belegte Quelle ist OS/2-gebunden (`DOSFLAGPROCESS`, Prozessflags A/B/C) und existiert auf keiner Zielplattform; ein Wertebereich ist nicht dokumentiert. → **Entscheidung des Projektinhabers ausstehend**, siehe unten. ## Entscheidung zu `SIGNAL` (Projektinhaber, 2026-09-04) `SIGNAL` wird auf **Betriebssystemsignale** abgebildet, und zwar nur auf die minimale Menge, die auf allen Zielplattformen existiert. Der C-Standard garantiert überall — Linux, macOS **und** Windows — `SIGABRT`, `SIGFPE`, `SIGILL`, `SIGINT`, `SIGSEGV`, `SIGTERM`. Von diesen sind nur zwei asynchron, von außen ausgelöst und fortsetzbar; die vier Fault-Signale entstehen aus dem eigenen Programmzustand, und ein `RETURN` aus ihrem Handler führte in denselben Fehler zurück. Abgebildet werden deshalb: | `n%` | Signal | Bedeutung | |---|---|---| | 1 | `SIGINT` | Unterbrechungswunsch von außen | | 2 | `SIGTERM` | Beendigungswunsch von außen | Ein anderer Wert als 1 oder 2 wird namentlich abgewiesen — zur Übersetzungszeit, wenn er konstant ist, sonst mit Laufzeitfehler 5. **Zustellung.** Signale erreichen die Laufzeit wie die Zeit über den Host; nur er berührt das Betriebssystem. Ein Signal wird nicht im Signalkontext verarbeitet, sondern setzt eine Marke, die der Host beim nächsten Abholen in ein Ereignis übersetzt. **Verhältnis zum Abbruch.** Im Rohmodus liefert das Terminal Strg+C als Taste, nicht als Signal; daran ändert sich nichts. Trifft `SIGINT` dagegen von außen ein (`kill -INT`), gilt: mit aktivem Trap läuft der Handler, ohne aktiven Trap bleibt es beim bisherigen Abbruch. Dieselbe Regel wie bei getrappten Tasten. **Abweichungen, die zu dokumentieren sind:** 1. Die belegte Quelle des Vorbilds (OS/2-Prozessflags A/B/C über `DOSFLAGPROCESS`) existiert nicht; `n%` bedeutet bei uns etwas anderes als im Vorbild. Ein Wertebereich war im Vorbild ohnehin nicht dokumentiert. 2. `SIGTERM` ist unter Windows von außen nicht zustellbar (es gibt kein `kill`); `SIGNAL(2)` bleibt dort wirkungslos. `SIGNAL(1)` wird dort über den Konsolen-Steuerhandler (`CTRL_C_EVENT`) bedient.