9.8 KiB
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 STOPUEVENT 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
DOSFLAGPROCESSaus 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"):
- 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, undKEY(n) OFFwäre die einzige Art, eine Taste überhaupt normal zu lesen. - Reihenfolge gleichzeitig fälliger Ereignisse. Unbelegt. Wir legen
fest:
KEY(aufsteigend nachn), dannTIMER, dannUEVENT, dannSIGNAL— Tasten zuerst, weil sie an einer Benutzereingabe hängen. - 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 modulweitenON ERROR. - 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. 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:
- 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. SIGTERMist unter Windows von außen nicht zustellbar (es gibt keinkill);SIGNAL(2)bleibt dort wirkungslos.SIGNAL(1)wird dort über den Konsolen-Steuerhandler (CTRL_C_EVENT) bedient.