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>
8.4 KiB
Bibliotheksreferenz
Die Laufzeitbibliothek so wie implementiert. Der Umfang wird von docs/inventar.md bestimmt; dort steht auch, was noch offen ist. Abweichungen vom Vorbild sind in docs/sprachreferenz.md unter „Abweichungen" gesammelt.
Ein automatischer Test hält das Inventar gegen den Code; diese Referenz beschreibt das Verhalten dahinter.
Bildschirm
| Element | Art |
|---|---|
CLS |
Anweisung |
COLOR |
Anweisung |
CSRLIN |
Funktion |
INPUT |
Anweisung |
LINE INPUT |
Anweisung |
LOCATE |
Anweisung |
POS |
Funktion |
PRINT |
Anweisung |
SCREEN |
Anweisung |
SCREEN |
Funktion |
SPC |
Funktion |
TAB |
Funktion |
VIEW PRINT |
Anweisung |
WIDTH |
Anweisung |
Alle Anweisungen wirken auf den Zellenpuffer der aktuellen
Bildschirmgröße — 80×25 ist nirgends eine feste Grenze. Ausgelassene
Argumente von LOCATE und COLOR lassen den bisherigen Wert stehen.
LOCATE außerhalb der Grenzen und SCREEN(zeile, spalte) außerhalb
lösen Fehler 5 aus. Die Funktionsform SCREEN liefert ohne drittes
Argument den Zeichencode, mit drittem das Farbattribut
(Hintergrund·16 + Vordergrund). WIDTH hebt den Puffer höchstens an.
VIEW PRINT ohne Argumente setzt den Scrollbereich auf den vollen
Bildschirm zurück.
Datum/Zeit
| Element | Art |
|---|---|
DATE$ |
Anweisung |
DATE$ |
Funktion |
DATESERIAL |
Funktion |
DATEVALUE |
Funktion |
DAY |
Funktion |
HOUR |
Funktion |
MINUTE |
Funktion |
MONTH |
Funktion |
NOW |
Funktion |
SECOND |
Funktion |
TIME$ |
Anweisung |
TIME$ |
Funktion |
TIMER |
Funktion |
TIMESERIAL |
Funktion |
TIMEVALUE |
Funktion |
WEEKDAY |
Funktion |
YEAR |
Funktion |
Serielle Werte zählen Tage ab dem 30.12.1899 (Serie 2 = 1.1.1900);
der Nachkommaanteil ist die Tageszeit. WEEKDAY liefert 1 für Sonntag.
Ungültige Datums- oder Zeitangaben lösen Fehler 5 aus.
Die Uhr läuft in UTC (dokumentierte Abweichung). DATE$ = … und
TIME$ = … stellen nicht die Systemuhr, sondern einen
programmeigenen Versatz, den alle Zeitfunktionen mitrechnen.
Deklaration
| Element | Art |
|---|---|
COMMON |
Anweisung |
CONST |
Anweisung |
DATA |
Anweisung |
DEFtype |
Anweisung |
DIM |
Anweisung |
ERASE |
Anweisung |
LBOUND |
Funktion |
LET |
Anweisung |
OPTION BASE |
Anweisung |
READ |
Anweisung |
REDIM |
Anweisung |
REM |
Anweisung |
RESTORE |
Anweisung |
SHARED |
Anweisung |
STATIC |
Anweisung |
SWAP |
Anweisung |
TYPE |
Anweisung |
UBOUND |
Funktion |
Ereignisse
| Element | Art |
|---|---|
DOEVENTS |
Funktion |
Fehlerbehandlung
| Element | Art |
|---|---|
ERL |
Funktion |
ERR |
Funktion |
ERROR |
Anweisung |
ON ERROR |
Anweisung |
RESUME |
Anweisung |
Finanzen
| Element | Art |
|---|---|
DDB# |
Funktion |
FV# |
Funktion |
IPMT# |
Funktion |
IRR# |
Funktion |
MIRR# |
Funktion |
NPER# |
Funktion |
NPV# |
Funktion |
PMT# |
Funktion |
PPMT# |
Funktion |
PV# |
Funktion |
RATE# |
Funktion |
SLN# |
Funktion |
SYD# |
Funktion |
Alle Funktionen rechnen in DOUBLE. Vorzeichenkonvention wie beim Vorbild: ausgehende Zahlungen sind negativ, eingehende positiv. Das letzte Argument der Renten-Funktionen ist die Fälligkeit — 0 nachschüssig, 1 vorschüssig.
Rate# und IRR# nähern sich mit dem Sekantenverfahren.
Abbruchbedingung: höchstens 100 Schritte; erreicht wird die Lösung,
wenn der Betrag der Restabweichung unter 1e-9 fällt. Bleibt sie über
1e-6, gilt die Näherung als erfolglos und es tritt Fehler 5 auf —
ein stiller Ersatzwert wird nie geliefert. Eine Zahlungsreihe ohne
Vorzeichenwechsel weist IRR# sofort mit Fehler 5 ab.
Weitere Fehler 5: Periode außerhalb der Laufzeit bei
IPmt#/PPmt#/SYD#/DDB#, Nutzungsdauer null bei SLN#,
Perioden null bei Pmt#, Zinssatz ≤ −1.
Formatierung
| Element | Art |
|---|---|
FORMAT$ |
Funktion |
PRINT USING |
Anweisung |
SetFormatCC |
Routine |
PRINT USING, LPRINT USING und FORMAT$ teilen dieselbe
Formatzeichenkette. Numerische Platzhalter: # Ziffernstelle,
. Dezimalpunkt, , Tausendertrennung, +/- Vorzeichenführung
(vorn oder hinten, mit eigener Stelle), $$ mitlaufendes
Währungszeichen und ** Sternfüllung (beide bringen zwei Stellen
mit), ^^^^ Exponentialform. String-Platzhalter: ! erstes Zeichen,
& ganzer String, \ \ feste Länge. _ macht das Folgezeichen
literal.
Passt ein Wert nicht in sein Feld, wird er vollständig ausgegeben und
mit % gekennzeichnet. Die Formatzeichenkette wird wiederholt,
solange Werte übrig sind. Eine Zeichenkette ohne Feld bei vorhandenen
Werten löst Fehler 5 aus. SetFormatCC setzt das Währungszeichen
über einen Ländercode; nicht aufgeführte Codes behalten $.
Klang
| Element | Art |
|---|---|
BEEP |
Anweisung |
Mathematik
| Element | Art |
|---|---|
ABS |
Funktion |
ATN |
Funktion |
CCUR |
Funktion |
CDBL |
Funktion |
CINT |
Funktion |
CLNG |
Funktion |
COS |
Funktion |
CSNG |
Funktion |
EXP |
Funktion |
FIX |
Funktion |
INT |
Funktion |
LOG |
Funktion |
RANDOMIZE |
Anweisung |
RND |
Funktion |
SGN |
Funktion |
SIN |
Funktion |
SQR |
Funktion |
TAN |
Funktion |
Rundung ist kaufmännisch-symmetrisch zur geraden Zahl
(CINT(0.5) = 0, CINT(1.5) = 2, CINT(2.5) = 2). INT rundet ab,
FIX in Richtung null. Überschreitet ein Ergebnis den Zieltyp, tritt
Fehler 6 auf; SQR/LOG mit unzulässigem Argument lösen Fehler 5
aus, Division durch null Fehler 11.
Der Zufallsgenerator ist der 24-Bit-LCG des Vorbilds
(zustand = (zustand · &HFD43FD + &HC39EC3) MOD 2^24). RND(0)
wiederholt den letzten Wert, RND(n) mit n < 0 sät neu aus dem
Argument. RANDOMIZE saat liefert bei gleicher Saat stets dieselbe
Folge, unabhängig von vorherigen RND-Aufrufen; ohne Argument wird
der Startwert abgefragt.
Metabefehl
| Element | Art |
|---|---|
$DYNAMIC |
Metabefehl |
$STATIC |
Metabefehl |
Prozeduren
| Element | Art |
|---|---|
CALL |
Anweisung |
DECLARE |
Anweisung |
DEF FN |
Anweisung |
FUNCTION |
Anweisung |
SUB |
Anweisung |
Steuerfluss
| Element | Art |
|---|---|
DO...LOOP |
Anweisung |
END |
Anweisung |
EXIT |
Anweisung |
FOR...NEXT |
Anweisung |
GOSUB |
Anweisung |
GOTO |
Anweisung |
IF...THEN...ELSE |
Anweisung |
ON...GOSUB |
Anweisung |
ON...GOTO |
Anweisung |
RETURN |
Anweisung |
SELECT CASE |
Anweisung |
STOP |
Anweisung |
WHILE...WEND |
Anweisung |
Strings
| Element | Art |
|---|---|
ASC |
Funktion |
CHR$ |
Funktion |
HEX$ |
Funktion |
INSTR |
Funktion |
LCASE$ |
Funktion |
LEFT$ |
Funktion |
LEN |
Funktion |
LTRIM$ |
Funktion |
MID$ |
Anweisung |
MID$ |
Funktion |
OCT$ |
Funktion |
RIGHT$ |
Funktion |
RTRIM$ |
Funktion |
SPACE$ |
Funktion |
STR$ |
Funktion |
STRING$ |
Funktion |
UCASE$ |
Funktion |
VAL |
Funktion |
Zeichen sind Unicode-Codepoints; LEN zählt Zeichen, nicht Bytes
(dokumentierte Abweichung). Randfälle: VAL liest das führende
Zahlenpräfix und überspringt Leerraum, versteht &H/&O;
STR$ stellt nicht-negativen Zahlen ein Leerzeichen voran;
LEFT$/RIGHT$ mit Länge über der Stringlänge liefern den ganzen
String; ASC("") sowie eine Startposition kleiner 1 bei
MID$/INSTR lösen Fehler 5 aus. STRING$ nimmt einen Zeichencode
oder einen String (dessen erstes Zeichen zählt).
System
| Element | Art |
|---|---|
COMMAND$ |
Funktion |
SLEEP |
Anweisung |
SYSTEM |
Anweisung |
ENVIRON$ liest Umgebungsvariablen nach Namen, COMMAND$ liefert die
Aufrufargumente ohne Programmnamen. Nicht abbildbare Größen liefern
einen dokumentierten Ersatzwert statt still zu variieren.
Tastatur
| Element | Art |
|---|---|
INKEY$ |
Funktion |
INPUT$ |
Funktion |
KEY |
Anweisung |
INKEY$ blockiert nicht: leerer String bei leerem Puffer, ein Zeichen
bei einer Zeichentaste, zwei Zeichen mit führendem Nullzeichen bei
einer Sondertaste. INPUT$(n) liest genau n Zeichen und blockiert
dabei, ohne sie am Bildschirm zu wiederholen.
KEY n, text$ belegt ein Funktionstasten-Makro (n = 1–10 sowie 30/31,
höchstens 15 Zeichen), KEY LIST gibt alle zwölf untereinander aus,
KEY ON/KEY OFF blendet die Softkey-Zeile ein und aus.