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>
305 lines
8.4 KiB
Markdown
305 lines
8.4 KiB
Markdown
# Bibliotheksreferenz
|
||
|
||
Die Laufzeitbibliothek **so wie implementiert**. Der Umfang wird von
|
||
[docs/inventar.md](inventar.md) bestimmt; dort steht auch, was noch offen
|
||
ist. Abweichungen vom Vorbild sind in
|
||
[docs/sprachreferenz.md](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.
|