Setzt den OpenSpec-Change phase-3-runtime-bildschirm um (77/77 Aufgaben). Abdeckung laut Inventar: 195 implementiert, 37 offen, 53 Non-Feature. Vollstaendigkeits-Inventar - docs/inventar.md mit 285 Eintraegen aus den Themenlisten von bas7advr.hlp und qb45advr.hlp, je mit Status und Fundstelle - crates/tb-frontend/tests/inventar.rs haelt die Tabelle in beide Richtungen gegen den Code; der Abdeckungsstand kann nicht veralten Bruchschritt (Puffer, Host, Korpus) - Cell/TextScreen ziehen ratatui-frei nach tb-runtime::screen; tb-ui behaelt Farbabbildung, Widget und den neuen Terminal-Host - Host wechselt vom Zeichenstrom auf Anzeige des Zellenpuffers plus Ereignisse (Taste, Groessenaenderung, Abbruch) - Korpusvergleich auf getrimmten Bildschirm-Snapshot; die acht bestehenden Sollausgaben blieben dabei unveraendert Groessenunabhaengigkeit - 80x25 ist nirgends mehr eine feste Grenze; Groessenaenderungen waehrend der Ausfuehrung werden zugestellt (Inhalt oben links erhalten, Cursor und VIEW PRINT geklemmt) - Korpusnachweis: dasselbe Programm bei 80x25 und 120x40 mit je eigener Sollausgabe, plus ein Programm mit Groessenwechsel mitten im Lauf Bibliothek - Breite Unicode-Zeichen belegen zwei Zellen (Cursor, POS, Randumbruch) - Bildschirm: CLS, COLOR, LOCATE, WIDTH, VIEW PRINT, SCREEN, CSRLIN, POS - Tastatur: INKEY$, INPUT$, Funktionstasten-Makros (KEY n / LIST / ON) - PRINT USING, LPRINT USING, FORMAT$, SetFormatCC - Mathematik mit kompatiblem PRNG (gleiche Saat, gleiche Folge) - Datum und Zeit mit Serienwerten ab 1899 - Finanzmathematik: FV#, PV#, Pmt#, IPmt#, PPmt#, NPer#, Rate#, NPV#, IRR#, MIRR#, SLN#, SYD#, DDB# - Datei-E/A: sequenziell, RANDOM (Recordpuffer und UDT-Variablen), BINARY, FIELD/LSET/RSET, Statusfunktionen, Dateisystem, MK$/CV - System: ENVIRON, FRE, CLEAR, TRON/TROFF, STACK, ERDEV, ERR-Anweisung Altlasten aus Phase 2 - ON ERROR GOTO auf Modulebene ist aus Prozeduren ansprechbar (prozeduruebergreifender Fixup im Codegenerator) - DATA behaelt seinen Rohtext (Gross-/Kleinschreibung, innerer Leerraum) - Die vier TODO-verify-Zellen der Konvertierungsmatrix sind aufgeloest Vom Inventar aufgedeckte Fehler - Zwoelf Non-Features wies der Compiler entgegen der Phase-1-Spec nicht ab (CALLS, SSEG, POINT, VIEW, COM, PEN, STRIG, STICK, die String*-Routinen, LINE und OPEN "COMn:") -- geschlossen - Drei Gruppen fehlten im urspruenglichen Umfang: Finanzmathematik, Record-Konvertierung, Rest der Dateisystemfunktionen - bas7advr.hlp allein ist keine vollstaendige Quelle; das Inventar bildet die Vereinigung mit qb45advr.hlp Neue Changes - phase-3-isam: schliesst Phase 3 ab (Speicherschicht redb) - phase-3-ortszeit: zieht die UTC-Abweichung zurueck Neue Abhaengigkeit: unicode-width. Dokumentiert: sprachreferenz.md und tbvm-design.md sind TODO-frei, docs/bibliothek.md neu, PLAN.md fortgeschrieben. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
59 lines
2.8 KiB
Markdown
59 lines
2.8 KiB
Markdown
## ADDED Requirements
|
|
|
|
### Requirement: Zeitfunktionen liefern Ortszeit
|
|
`DATE$`, `TIME$`, `TIMER` und `NOW` SHALL den Zeitpunkt in der Zeitzone
|
|
des Rechners liefern, nicht in koordinierter Weltzeit. `TIMER` SHALL die
|
|
Sekunden seit der **lokalen** Mitternacht zählen. Der maßgebliche Versatz
|
|
SHALL für den jeweils abgefragten Zeitpunkt bestimmt werden, nicht einmal
|
|
beim Programmstart — ein Programm, das über eine Zeitumstellung hinweg
|
|
läuft, folgt ihr. Die Zerlegungsfunktionen (`DAY`, `MONTH`, `YEAR`,
|
|
`WEEKDAY`, `HOUR`, `MINUTE`, `SECOND`) arbeiten unverändert auf seriellen
|
|
Werten und rechnen selbst nicht um.
|
|
|
|
#### Scenario: Datum und Uhrzeit stimmen mit der Systemuhr überein
|
|
- **WHEN** ein Programm `DATE$` und `TIME$` abfragt
|
|
- **THEN** entsprechen sie der Ortszeit des Rechners zum Abfragezeitpunkt
|
|
|
|
#### Scenario: TIMER zählt ab lokaler Mitternacht
|
|
- **WHEN** `TIMER` abgefragt wird
|
|
- **THEN** entspricht der Wert den Sekunden seit der letzten lokalen Mitternacht, nicht seit der UTC-Mitternacht
|
|
|
|
#### Scenario: NOW und die Zerlegungsfunktionen passen zusammen
|
|
- **WHEN** `n# = NOW` gebildet und `HOUR(n#)` ausgewertet wird
|
|
- **THEN** liefert `HOUR(n#)` dieselbe Stunde, die auch `TIME$` nennt
|
|
|
|
#### Scenario: Sommerzeit wirkt zum jeweiligen Zeitpunkt
|
|
- **WHEN** in einer Zone mit Sommerzeit ein Zeitpunkt vor und einer nach der Umstellung abgefragt wird
|
|
- **THEN** unterscheiden sich die beiden Versätze um die Umstellungsspanne
|
|
|
|
### Requirement: Zonenermittlung mit Rückfallebene
|
|
Die Laufzeit SHALL die Zeitzone des Rechners über die
|
|
Betriebssystemeinstellung bestimmen. Lässt sie sich nicht ermitteln,
|
|
SHALL UTC gelten und das Programm ohne Fehler weiterlaufen. Ob die
|
|
Rückfallebene greift, MUST für ein Programm erkennbar sein und in
|
|
docs/sprachreferenz.md beschrieben stehen; ein stiller Wechsel auf UTC
|
|
MUST NOT vorkommen.
|
|
|
|
#### Scenario: Zone nicht ermittelbar
|
|
- **WHEN** die Zeitzone des Rechners nicht bestimmt werden kann
|
|
- **THEN** rechnen die Zeitfunktionen in UTC und das Programm läuft ohne Fehler weiter
|
|
|
|
#### Scenario: Rückfallebene ist erkennbar
|
|
- **WHEN** ein Programm den Zonenzustand abfragt
|
|
- **THEN** unterscheidet die Antwort erkennbar zwischen ermittelter Zone und Rückfall auf UTC
|
|
|
|
### Requirement: Programmversatz wirkt auf die Ortszeit
|
|
`DATE$ = text$` und `TIME$ = text$` SHALL weiterhin nicht die Systemuhr
|
|
stellen, sondern einen programmeigenen Versatz setzen. Dieser Versatz
|
|
SHALL auf die **Ortszeit** wirken: nach `TIME$ = "10:20:30"` nennt
|
|
`TIME$` diese Uhrzeit, und `NOW`, `HOUR` und `TIMER` stimmen damit
|
|
überein.
|
|
|
|
#### Scenario: Gesetzte Uhrzeit wird zurückgelesen
|
|
- **WHEN** `TIME$ = "10:20:30"` ausgeführt und danach `TIME$` abgefragt wird
|
|
- **THEN** nennt `TIME$` `10:20:30`
|
|
|
|
#### Scenario: Versatz wirkt auf alle Zeitfunktionen
|
|
- **WHEN** `DATE$ = "01-02-1993"` gesetzt und danach `YEAR(NOW)` ausgewertet wird
|
|
- **THEN** liefert `YEAR(NOW)` 1993
|