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>
120 lines
2.4 KiB
QBasic
120 lines
2.4 KiB
QBasic
' tb-screen: 80x25
|
|
' tb-tempdir
|
|
' Datei-E/A (Spec datei-eio): sequenziell schreiben und lesen, wahlfreier
|
|
' Zugriff mit UDT-Records und mit FIELD/LSET/RSET, Binaerzugriff sowie die
|
|
' Status- und Dateisystemfunktionen. Laeuft in einem temporaeren Verzeichnis.
|
|
TYPE Kunde
|
|
Nr AS INTEGER
|
|
Name AS STRING * 8
|
|
Saldo AS DOUBLE
|
|
END TYPE
|
|
DIM k AS Kunde, g AS Kunde
|
|
|
|
' --- sequenziell ---
|
|
OPEN "seq.txt" FOR OUTPUT AS #1
|
|
PRINT #1, "Zeile eins"
|
|
PRINT #1, 1; 2; 3
|
|
WRITE #1, "a,b", 5
|
|
CLOSE #1
|
|
OPEN "seq.txt" FOR INPUT AS #1
|
|
PRINT "Groesse:"; LOF(1)
|
|
LINE INPUT #1, z$
|
|
PRINT "["; z$; "]"
|
|
LINE INPUT #1, z$
|
|
PRINT "["; z$; "]"
|
|
INPUT #1, s$, n%
|
|
PRINT "["; s$; "]"; n%; "EOF:"; EOF(1)
|
|
CLOSE #1
|
|
|
|
' --- Anhaengen ---
|
|
OPEN "seq.txt" FOR APPEND AS #1
|
|
PRINT #1, "angehaengt"
|
|
CLOSE #1
|
|
OPEN "seq.txt" FOR INPUT AS #1
|
|
anzahl% = 0
|
|
DO WHILE NOT EOF(1)
|
|
LINE INPUT #1, z$
|
|
anzahl% = anzahl% + 1
|
|
LOOP
|
|
PRINT "Zeilen:"; anzahl%; "letzte: ["; z$; "]"
|
|
CLOSE #1
|
|
|
|
' --- wahlfrei mit UDT ---
|
|
OPEN "rec.dat" FOR RANDOM AS #2 LEN = 42
|
|
k.Nr = 7
|
|
k.Name = "Mueller"
|
|
k.Saldo = 100
|
|
PUT #2, 3, k
|
|
GET #2, 3, g
|
|
PRINT g.Nr; "["; g.Name; "]"; g.Saldo; "LOF:"; LOF(2)
|
|
CLOSE #2
|
|
|
|
' --- wahlfrei mit FIELD ---
|
|
OPEN "fld.dat" FOR RANDOM AS #3 LEN = 80
|
|
FIELD #3, 10 AS nm$, 10 AS ort$
|
|
LSET nm$ = "Meier"
|
|
RSET ort$ = "Berlin"
|
|
PUT #3, 1
|
|
LSET nm$ = "Schulz"
|
|
LSET ort$ = "Hamburg"
|
|
PUT #3, 2
|
|
GET #3, 1
|
|
PRINT "["; nm$; "]["; ort$; "]"
|
|
GET #3, 2
|
|
PRINT "["; nm$; "]["; ort$; "]"
|
|
CLOSE #3
|
|
|
|
' --- binaer ---
|
|
OPEN "bin.dat" FOR BINARY AS #4
|
|
w% = 4711
|
|
PUT #4, 4, w%
|
|
w% = 0
|
|
GET #4, 4, w%
|
|
PRINT "binaer:"; w%; "SEEK:"; SEEK(4)
|
|
CLOSE #4
|
|
|
|
' --- Konvertierungsfunktionen ---
|
|
PRINT CVI(MKI$(-5)); CVL(MKL$(123456)); CVD(MKD$(1.5))
|
|
PRINT LEN(MKI$(1)); LEN(MKL$(1)); LEN(MKD$(1))
|
|
|
|
' --- Dateisystem ---
|
|
MKDIR "unter"
|
|
PRINT "Verzeichnis:"; LEN(CURDIR$) > 0
|
|
n$ = DIR$("*.dat")
|
|
anzahl% = 0
|
|
DO WHILE n$ <> ""
|
|
anzahl% = anzahl% + 1
|
|
n$ = DIR$("")
|
|
LOOP
|
|
PRINT "dat-Dateien:"; anzahl%
|
|
NAME "seq.txt" AS "neu.txt"
|
|
PRINT "umbenannt:"; DIR$("neu.txt") <> ""
|
|
KILL "neu.txt"
|
|
KILL "rec.dat"
|
|
KILL "fld.dat"
|
|
KILL "bin.dat"
|
|
RMDIR "unter"
|
|
|
|
' --- Fehlerfaelle ---
|
|
ON ERROR GOTO Fehler
|
|
OPEN "fehlt.txt" FOR INPUT AS #5
|
|
W1:
|
|
OPEN "a.txt" FOR OUTPUT AS #6
|
|
OPEN "b.txt" FOR OUTPUT AS #6
|
|
W2:
|
|
x& = LOF(9)
|
|
W3:
|
|
CLOSE #6
|
|
KILL "a.txt"
|
|
ON ERROR GOTO 0
|
|
PRINT "fertig"
|
|
END
|
|
Fehler:
|
|
PRINT "Fehler"; ERR
|
|
f% = f% + 1
|
|
SELECT CASE f%
|
|
CASE 1: RESUME W1
|
|
CASE 2: RESUME W2
|
|
CASE ELSE: RESUME W3
|
|
END SELECT
|