Files
TerminalBasic/openspec/changes/phase-3-ortszeit/proposal.md
Chili Palmer 52ccbb5848 Phase 3 (Kern): Laufzeitbibliothek, Bildschirm und Datei-E/A
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>
2026-09-04 06:54:19 +02:00

3.7 KiB

Ortszeit statt UTC

Why

DATE$, TIME$, TIMER und NOW liefern heute koordinierte Weltzeit. Das ist keine Rekonstruktion des Vorbilds, sondern eine Notlösung: die Standardbibliothek von Rust kennt keine Zeitzonen, und in phase-3-runtime-bildschirm sollte die erste schwere Abhängigkeit der Laufzeit nicht nebenbei entstehen. Die Abweichung steht in docs/sprachreferenz.md.

Für ein BASIC zum Bauen von Terminal-Werkzeugen ist das ein echter Mangel: Ein Programm, das eine Uhr anzeigt, ein Protokoll schreibt oder einen Termin prüft, zeigt schlicht die falsche Zeit — je nach Zone um Stunden daneben. Das Vorbild lief auf der Ortszeit des Rechners; jedes übernommene Programm rechnet damit.

Der Projektinhaber hat am 2026-09-04 entschieden, dafür eine Bibliothek in die Laufzeit aufzunehmen. Dieser Change zieht die Abweichung zurück.

What Changes

  • Zeitfunktionen liefern Ortszeit: DATE$, TIME$, TIMER und NOW rechnen in der Zeitzone des Rechners statt in UTC. TIMER zählt Sekunden seit der lokalen Mitternacht.
  • Sommerzeit wird berücksichtigt: Der Versatz wird für den jeweiligen Zeitpunkt bestimmt, nicht einmalig beim Programmstart — ein Programm, das über einen Zeitumstellungspunkt hinweg läuft, folgt ihm.
  • Neue Abhängigkeit in tb-runtime: eine Zeitzonenbibliothek, deren Berührungsfläche bewusst auf eine einzige Frage beschränkt bleibt — „welcher UTC-Versatz gilt zu diesem Zeitpunkt?". Die Kalenderrechnung (serielle Datumswerte, WEEKDAY, Zerlegung) bleibt die vorhandene, getestete Eigenimplementierung in tb-runtime::datetime.
  • Rückfallebene: Lässt sich die Zeitzone des Rechners nicht ermitteln, gilt UTC. Das Programm läuft weiter; die Rückfallebene ist über eine Funktion der Laufzeit erkennbar und dokumentiert.
  • DATE$ = / TIME$ = bleiben ein Programmversatz (sie stellen nicht die Systemuhr) — sie wirken künftig auf die Ortszeit.
  • Abweichung zurückziehen: Der Eintrag „Uhr läuft in UTC" entfällt aus docs/sprachreferenz.md; an seine Stelle tritt die Beschreibung der Zonenermittlung samt Rückfallebene.
  • Stufe 2 im PLAN: Die Zeitzonenbibliothek wird in den Ideenspeicher „Runtime-Bibliotheken als BASIC-Bibliotheken" aufgenommen — neben crossterm —, damit BASIC-Programme später direkt auf Zonen zugreifen können (Zonennamen, Versatz zu einem Zeitpunkt, Umrechnung zwischen Zonen).

Non-Goals: Zeitzonenbehaftete Datentypen im Dialekt (das Vorbild kennt nur lokale Wanduhrzeit); eine Sprachanbindung an die Bibliothek (das ist der Stufe-2-Eintrag, nicht dieser Change); Änderungen an der Zählweise serieller Datumswerte oder an DATEVALUE/TIMEVALUE, die Wanduhrzeit lesen und daher keine Umrechnung brauchen.

Capabilities

Modified Capabilities

  • konsolen-basisbibliothek: Die Datums- und Zeitfunktionen SHALL die Ortszeit des Rechners liefern statt UTC, einschließlich Sommerzeit und einer dokumentierten Rückfallebene.

Impact

  • crates/tb-runtime/src/datetime.rs: Versatzermittlung über die neue Bibliothek; jetzt_serial/jetzt_sekunden liefern Ortszeit. Die Kalenderrechnung bleibt unverändert.
  • crates/tb-runtime/src/builtins.rs: DATE$, TIME$, TIMER, NOW rechnen über die neue Funktion.
  • Cargo.toml (Workspace) und crates/tb-runtime/Cargo.toml: neue Abhängigkeit.
  • tests/compat: Korpusprogramm für die Zeitfunktionen, das ohne Abhängigkeit von der Zone des Testrechners prüfbar bleibt.
  • docs/sprachreferenz.md: Abweichung „Uhr läuft in UTC" entfällt; Zonenermittlung und Rückfallebene beschrieben.
  • docs/bibliothek.md: Abschnitt Datum/Zeit fortgeschrieben.
  • PLAN.md: Stufe-2-Eintrag um die Bibliothek erweitert.