Files
TerminalBasic/openspec/changes/phase-3-ortszeit/specs/konsolen-basisbibliothek/spec.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

2.8 KiB

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