## ADDED Requirements ### Requirement: Ereigniszustellung an Anweisungsgrenzen Die VM SHALL an Anweisungsgrenzen prüfen, ob ein Ereignis zuzustellen ist, und in diesem Fall das `GOSUB`-Ziel des zugehörigen Traps ausführen. Der unterbrochene Zustand — Aufrufkette, Schleifen, Locals, `GOSUB`-Stapel und Fehlerzustand — MUST dabei erhalten bleiben; mit `RETURN` SHALL die Ausführung an der unterbrochenen Stelle fortfahren. Die Prüfung MUST NOT pro Opcode erfolgen; solange kein Trap definiert ist, MUST sie auf einen einzelnen Test hinauslaufen und MUST NOT die Uhr lesen. #### Scenario: Trap aus einer Prozedur heraus - **WHEN** ein Ereignis zugestellt wird, während eine `SUB` läuft, und das Trap-Ziel im Modulrumpf liegt - **THEN** läuft der Handler und nach `RETURN` setzt die `SUB` an der unterbrochenen Anweisung fort #### Scenario: Ohne aktiven Trap wird die Uhr nicht gelesen - **WHEN** ein Programm ohne jede `ON …`-Trap-Definition ausgeführt wird - **THEN** fragt die Ausführung an keiner Anweisungsgrenze die Zeit ab, und der Durchsatz bleibt im Rahmen der Messgenauigkeit unverändert ### Requirement: Jede Schleife trägt eine Anweisungsgrenze im Kreis Der zurückspringende Zweig jeder Schleife (`FOR`/`NEXT`, `WHILE`/`WEND`, `DO`/`LOOP` in allen Bedingungsformen) MUST über mindestens eine Anweisungsgrenze führen, auch wenn der Schleifenrumpf leer ist. Andernfalls gäbe es in einer Warteschleife keinen Zustellpunkt: kein Ereignis, kein Breakpoint und kein Abbruch würden dort wirken. #### Scenario: Leere Warteschleife - **WHEN** `FOR i% = 1 TO 10000` unmittelbar von `NEXT` gefolgt wird - **THEN** führt der Rücksprung über eine Anweisungsgrenze und ein aktiver Zeit-Trap wird darin zugestellt #### Scenario: Leere Schleife in jeder Form - **WHEN** eine `WHILE`/`WEND`-, `DO WHILE`/`LOOP`- oder `DO`/`LOOP UNTIL`-Schleife ohne Rumpf übersetzt wird - **THEN** liegt zwischen Rücksprungziel und Rücksprung eine Anweisungsgrenze ### Requirement: DOEVENTS gibt die Kontrolle ab `DOEVENTS` SHALL anstehende Ereignisse zustellen und danach einen Wert liefern. Solange keine Formulare geladen werden können, SHALL der Wert 0 sein. #### Scenario: DOEVENTS in einer Warteschleife - **WHEN** ein Programm in einer Schleife `DOEVENTS` aufruft und ein Trap fällig wird - **THEN** läuft der Handler innerhalb dieser Schleife