Files
TerminalBasic/openspec/changes/archive/2026-09-04-phase-4-ereignisschleife/umfang-und-form.md

262 lines
9.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 186 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 |
| 110 | F1F10 |
| 11 | Pfeil hoch |
| 12 | Pfeil links |
| 13 | Pfeil rechts |
| 14 | Pfeil runter |
| 1525 | benutzerdefinierte Tasten |
| 3031 | F11F12 (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 1525
Die Einzelseite zu `KEY n, zeichenkette$` (`x_dot_setfkr.html`) behandelt
**nur** die Makrozuweisung für 110 und 3031; die Erklärungsform für
1525 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, 125, 3031 mit fester Tastenzuordnung | Spec unverändert, Bereich jetzt belegt |
| E | `ON TIMER(n)` | `n&` ist LONG, 186 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.