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>
This commit is contained in:
24
tests/compat/bildschirm.bas
Normal file
24
tests/compat/bildschirm.bas
Normal file
@@ -0,0 +1,24 @@
|
||||
' tb-screen: 80x25
|
||||
' Bildschirmsteuerung (Spec textbildschirm): LOCATE mit ausgelassenen
|
||||
' Argumenten, COLOR, CLS, VIEW PRINT-Scrollen, CSRLIN/POS und das
|
||||
' Zuruecklesen per SCREEN.
|
||||
LOCATE 3, 5
|
||||
PRINT "Position";
|
||||
PRINT " "; CSRLIN; POS(0)
|
||||
LOCATE , 1
|
||||
PRINT "Spalte 1 in Zeile 4"
|
||||
COLOR 14, 1
|
||||
PRINT "gelb auf blau"
|
||||
COLOR 7, 0
|
||||
LOCATE 12, 1
|
||||
PRINT "gelesen: "; CHR$(SCREEN(3, 5)); CHR$(SCREEN(3, 6));
|
||||
PRINT " Attribut "; SCREEN(5, 1, 1)
|
||||
LOCATE 8, 1
|
||||
VIEW PRINT 8 TO 10
|
||||
LOCATE 10, 1
|
||||
PRINT "a"
|
||||
PRINT "b"
|
||||
VIEW PRINT
|
||||
LOCATE 14, 1
|
||||
PRINT "fertig"
|
||||
END
|
||||
29
tests/compat/bildschirm.out
Normal file
29
tests/compat/bildschirm.out
Normal file
@@ -0,0 +1,29 @@
|
||||
|
||||
|
||||
Position 3 17
|
||||
Spalte 1 in Zeile 4
|
||||
gelb auf blau
|
||||
|
||||
|
||||
a
|
||||
b
|
||||
|
||||
|
||||
gelesen: Po Attribut 30
|
||||
|
||||
fertig
|
||||
--- Attribute (Vordergrund/Hintergrund je Zelle, hex) ---
|
||||
|
||||
|
||||
7070707070707070707070707070707070707070
|
||||
70707070707070707070707070707070707070
|
||||
e1e1e1e1e1e1e1e1e1e1e1e1e1
|
||||
|
||||
|
||||
70
|
||||
70
|
||||
|
||||
|
||||
70707070707070707070707070707070707070707070707070
|
||||
|
||||
707070707070
|
||||
10
tests/compat/breitezeichen.bas
Normal file
10
tests/compat/breitezeichen.bas
Normal file
@@ -0,0 +1,10 @@
|
||||
' tb-screen: 80x25
|
||||
' Breite Zeichen (CJK, Emoji) belegen zwei Zellen (Entscheidung 2026-09-02):
|
||||
' der Cursor rückt um zwei Spalten vor, POS zählt die Anfangsspalte, und ein
|
||||
' breites Zeichen am rechten Rand wandert als Ganzes in die nächste Zeile.
|
||||
PRINT "AB"; "中文"; "CD"
|
||||
PRINT LEN("中文")
|
||||
' 79 schmale Zeichen, dann ein breites: die letzte Spalte bleibt leer.
|
||||
PRINT STRING$(79, "x"); "字"; "E"
|
||||
PRINT "Ende"
|
||||
END
|
||||
5
tests/compat/breitezeichen.out
Normal file
5
tests/compat/breitezeichen.out
Normal file
@@ -0,0 +1,5 @@
|
||||
AB中文CD
|
||||
2
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
字E
|
||||
Ende
|
||||
@@ -1,3 +1,4 @@
|
||||
' tb-screen: 80x25
|
||||
' BYREF wirkt auf das Argument zurueck; Klammern erzwingen
|
||||
' Wertuebergabe (BYVAL); STATIC behaelt Werte; Rekursion ueber den
|
||||
' Funktionsnamen (Spec vm-ausfuehrung).
|
||||
@@ -27,4 +28,4 @@ SUB Zaehl
|
||||
STATIC z%
|
||||
z% = z% + 1
|
||||
PRINT "zaehler"; z%
|
||||
END SUB
|
||||
END SUB
|
||||
18
tests/compat/datarohtext.bas
Normal file
18
tests/compat/datarohtext.bas
Normal file
@@ -0,0 +1,18 @@
|
||||
' tb-screen: 80x25
|
||||
' DATA-Rohtext (Spec sprach-frontend): unquotierte Elemente behalten ihre
|
||||
' Gross-/Kleinschreibung und ihren inneren Leerraum; Leerraum an den
|
||||
' Raendern faellt weg. Quotierte Elemente bleiben unveraendert, auch mit
|
||||
' Komma. Ein Doppelpunkt beendet die Anweisung.
|
||||
DATA Hallo Welt, ab cd , x
|
||||
READ a$, b$, c$
|
||||
PRINT "["; a$; "]["; b$; "]["; c$; "]"
|
||||
DATA "a,b", 42, -3.5, MiXeD Text
|
||||
READ s$, n%, d!, t$
|
||||
PRINT "["; s$; "]"; n%; d!; "["; t$; "]"
|
||||
DATA eins : PRINT "nach Doppelpunkt"
|
||||
READ e$
|
||||
PRINT "["; e$; "]"
|
||||
RESTORE
|
||||
READ a$
|
||||
PRINT "nach RESTORE: ["; a$; "]"
|
||||
END
|
||||
5
tests/compat/datarohtext.out
Normal file
5
tests/compat/datarohtext.out
Normal file
@@ -0,0 +1,5 @@
|
||||
[Hallo Welt][ab cd][x]
|
||||
[a,b] 42 -3.5 [MiXeD Text]
|
||||
nach Doppelpunkt
|
||||
[eins]
|
||||
nach RESTORE: [Hallo Welt]
|
||||
119
tests/compat/dateien.bas
Normal file
119
tests/compat/dateien.bas
Normal file
@@ -0,0 +1,119 @@
|
||||
' 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
|
||||
18
tests/compat/dateien.out
Normal file
18
tests/compat/dateien.out
Normal file
@@ -0,0 +1,18 @@
|
||||
Groesse: 29
|
||||
[Zeile eins]
|
||||
[ 1 2 3 ]
|
||||
[a,b] 5 EOF:-1
|
||||
Zeilen: 4 letzte: [angehaengt]
|
||||
7 [Mueller ] 100 LOF: 126
|
||||
[Meier ][ Berlin]
|
||||
[Schulz ][Hamburg ]
|
||||
binaer: 4711 SEEK: 6
|
||||
-5 123456 1.5
|
||||
2 4 8
|
||||
Verzeichnis:-1
|
||||
dat-Dateien: 3
|
||||
umbenannt:-1
|
||||
Fehler 53
|
||||
Fehler 55
|
||||
Fehler 52
|
||||
fertig
|
||||
27
tests/compat/datumzeit.bas
Normal file
27
tests/compat/datumzeit.bas
Normal file
@@ -0,0 +1,27 @@
|
||||
' tb-screen: 80x25
|
||||
' Datum und Zeit (Spec konsolen-basisbibliothek): Serienwert-Zaehlweise,
|
||||
' Rueckumwandlung, WEEKDAY = 1 fuer Sonntag, Textformen und die
|
||||
' programmeigene Uhr ueber DATE$ =/TIME$ =.
|
||||
d# = DATESERIAL(1992, 3, 15)
|
||||
PRINT YEAR(d#); MONTH(d#); DAY(d#); WEEKDAY(d#)
|
||||
PRINT DATESERIAL(1900, 1, 1)
|
||||
t# = TIMESERIAL(13, 45, 30)
|
||||
PRINT HOUR(t#); MINUTE(t#); SECOND(t#)
|
||||
PRINT DATEVALUE("03-15-1992") = d#; TIMEVALUE("13:45:30") = t#
|
||||
DATE$ = "01-02-1993"
|
||||
TIME$ = "10:20:30"
|
||||
PRINT DATE$; " "; TIME$
|
||||
PRINT YEAR(NOW); MONTH(NOW); DAY(NOW)
|
||||
ON ERROR GOTO Fehler
|
||||
x# = DATESERIAL(1992, 13, 1)
|
||||
Weiter:
|
||||
x# = TIMEVALUE("25:00")
|
||||
Ende:
|
||||
ON ERROR GOTO 0
|
||||
PRINT "fertig"
|
||||
END
|
||||
Fehler:
|
||||
PRINT "Fehler"; ERR
|
||||
n% = n% + 1
|
||||
IF n% = 1 THEN RESUME Weiter
|
||||
RESUME Ende
|
||||
9
tests/compat/datumzeit.out
Normal file
9
tests/compat/datumzeit.out
Normal file
@@ -0,0 +1,9 @@
|
||||
1992 3 15 1
|
||||
2
|
||||
13 45 30
|
||||
-1 -1
|
||||
01-02-1993 10:20:30
|
||||
1993 1 2
|
||||
Fehler 5
|
||||
Fehler 5
|
||||
fertig
|
||||
@@ -1,3 +1,4 @@
|
||||
' tb-screen: 80x25
|
||||
' ON ERROR/RESUME NEXT/ERR/ERL (Spec vm-fehlerbehandlung):
|
||||
' Handler-Eintritt setzt ERR und ERL (letzte numerische Zeilennummer);
|
||||
' RESUME NEXT setzt nach der fehlerausloesenden Anweisung fort.
|
||||
@@ -11,4 +12,4 @@ PRINT "fertig"
|
||||
END
|
||||
Handler:
|
||||
PRINT "ERR="; ERR; "ERL="; ERL
|
||||
RESUME NEXT
|
||||
RESUME NEXT
|
||||
37
tests/compat/finanzen.bas
Normal file
37
tests/compat/finanzen.bas
Normal file
@@ -0,0 +1,37 @@
|
||||
' tb-screen: 80x25
|
||||
' Finanzmathematik (Spec konsolen-basisbibliothek): Endwert, Zahlung,
|
||||
' Zins-/Tilgungsanteil, Abschreibungen, Kapitalwert und interner Zinsfuss.
|
||||
' Vorzeichen wie beim Vorbild: ausgehende Zahlungen negativ.
|
||||
PRINT USING "########.##"; FV#(0.05, 10, -100, 0, 0)
|
||||
z# = PMT#(0.05, 10, 1000, 0, 0)
|
||||
PRINT USING "########.##"; z#
|
||||
' Zins- und Tilgungsanteil ergaenzen sich zur Zahlung.
|
||||
PRINT IPMT#(0.05, 1, 10, 1000, 0, 0) + PPMT#(0.05, 1, 10, 1000, 0, 0) = z#
|
||||
PRINT USING "#####.## "; SLN#(1000, 100, 10); SYD#(1000, 100, 10, 1); DDB#(1000, 100, 10, 1)
|
||||
DIM q#(1 TO 4)
|
||||
q#(1) = -1000: q#(2) = 400: q#(3) = 400: q#(4) = 400
|
||||
PRINT USING "#.######"; IRR#(q#(), 0.1)
|
||||
PRINT USING "#.######"; MIRR#(q#(), 0.05, 0.06)
|
||||
PRINT USING "#.######"; RATE#(10, z#, 1000, 0, 0, 0.1)
|
||||
PRINT USING "###.##"; NPER#(0.05, z#, 1000, 0, 0)
|
||||
' Fehlerfaelle: ungueltige Argumente und erfolglose Naeherung.
|
||||
ON ERROR GOTO Fehler
|
||||
x# = SLN#(1000, 100, 0)
|
||||
W1:
|
||||
x# = SYD#(1000, 100, 10, 11)
|
||||
W2:
|
||||
DIM p#(1 TO 2)
|
||||
p#(1) = 100: p#(2) = 200
|
||||
x# = IRR#(p#(), 0.1)
|
||||
W3:
|
||||
ON ERROR GOTO 0
|
||||
PRINT "fertig"
|
||||
END
|
||||
Fehler:
|
||||
PRINT "Fehler"; ERR
|
||||
n% = n% + 1
|
||||
SELECT CASE n%
|
||||
CASE 1: RESUME W1
|
||||
CASE 2: RESUME W2
|
||||
CASE ELSE: RESUME W3
|
||||
END SELECT
|
||||
12
tests/compat/finanzen.out
Normal file
12
tests/compat/finanzen.out
Normal file
@@ -0,0 +1,12 @@
|
||||
1257.79
|
||||
-129.50
|
||||
-1
|
||||
90.00 163.64 200.00
|
||||
0.097010
|
||||
0.083909
|
||||
0.050000
|
||||
10.00
|
||||
Fehler 5
|
||||
Fehler 5
|
||||
Fehler 5
|
||||
fertig
|
||||
31
tests/compat/groesse.120x40.out
Normal file
31
tests/compat/groesse.120x40.out
Normal file
@@ -0,0 +1,31 @@
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
z 1
|
||||
z 2
|
||||
z 3
|
||||
z 4
|
||||
z 5
|
||||
z 6
|
||||
z 7
|
||||
z 8
|
||||
z 9
|
||||
z 10
|
||||
z 11
|
||||
z 12
|
||||
z 13
|
||||
z 14
|
||||
z 15
|
||||
z 16
|
||||
z 17
|
||||
z 18
|
||||
z 19
|
||||
z 20
|
||||
z 21
|
||||
z 22
|
||||
z 23
|
||||
z 24
|
||||
z 25
|
||||
z 26
|
||||
z 27
|
||||
z 28
|
||||
z 29
|
||||
z 30
|
||||
24
tests/compat/groesse.80x25.out
Normal file
24
tests/compat/groesse.80x25.out
Normal file
@@ -0,0 +1,24 @@
|
||||
z 7
|
||||
z 8
|
||||
z 9
|
||||
z 10
|
||||
z 11
|
||||
z 12
|
||||
z 13
|
||||
z 14
|
||||
z 15
|
||||
z 16
|
||||
z 17
|
||||
z 18
|
||||
z 19
|
||||
z 20
|
||||
z 21
|
||||
z 22
|
||||
z 23
|
||||
z 24
|
||||
z 25
|
||||
z 26
|
||||
z 27
|
||||
z 28
|
||||
z 29
|
||||
z 30
|
||||
13
tests/compat/groesse.bas
Normal file
13
tests/compat/groesse.bas
Normal file
@@ -0,0 +1,13 @@
|
||||
' tb-screen: 80x25, 120x40
|
||||
' Nachweis der Größenunabhängigkeit (Spec kompat-testkorpus): dasselbe
|
||||
' Programm läuft bei zwei Bildschirmgrößen. Der Umbruch am rechten Rand und
|
||||
' das Scrollen am unteren Rand folgen der jeweiligen Größe — nirgends steckt
|
||||
' eine feste 80 oder 25.
|
||||
FOR i% = 1 TO 100
|
||||
PRINT "x";
|
||||
NEXT i%
|
||||
PRINT
|
||||
FOR z% = 1 TO 30
|
||||
PRINT "z"; z%
|
||||
NEXT z%
|
||||
END
|
||||
11
tests/compat/groessenaenderung.bas
Normal file
11
tests/compat/groessenaenderung.bas
Normal file
@@ -0,0 +1,11 @@
|
||||
' tb-screen: 80x25
|
||||
' tb-resize: nach 1 auf 120x40
|
||||
' Nachweis: eine Größenänderung mitten im Lauf wird zugestellt. Der zuvor
|
||||
' ausgegebene Inhalt bleibt oben links erhalten, die folgende Ausgabe nutzt
|
||||
' die neuen Grenzen (100 Zeichen passen jetzt in eine Zeile).
|
||||
PRINT "vorher"
|
||||
FOR i% = 1 TO 100
|
||||
PRINT "y";
|
||||
NEXT i%
|
||||
PRINT
|
||||
END
|
||||
2
tests/compat/groessenaenderung.out
Normal file
2
tests/compat/groessenaenderung.out
Normal file
@@ -0,0 +1,2 @@
|
||||
vorher
|
||||
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
|
||||
@@ -1,3 +1,4 @@
|
||||
' tb-screen: 80x25
|
||||
' Minimalfall: PRINT mit String und Zeilenumbruch
|
||||
PRINT "Hallo, Welt!"
|
||||
END
|
||||
END
|
||||
11
tests/compat/keymakros.bas
Normal file
11
tests/compat/keymakros.bas
Normal file
@@ -0,0 +1,11 @@
|
||||
' tb-screen: 80x25
|
||||
' Funktionstasten-Makros (Original-Hilfe): KEY n, text$ belegt F1-F10 sowie
|
||||
' 30/31 fuer F11/F12, hoechstens 15 Zeichen. KEY LIST listet alle zwoelf
|
||||
' untereinander, KEY ON blendet die Softkey-Zeile unten ein.
|
||||
KEY 1, "LIST"
|
||||
KEY 2, "RUN"
|
||||
KEY 30, "F11-Makro"
|
||||
KEY 3, "mehr als fuenfzehn Zeichen"
|
||||
KEY LIST
|
||||
PRINT "nach LIST"
|
||||
END
|
||||
13
tests/compat/keymakros.out
Normal file
13
tests/compat/keymakros.out
Normal file
@@ -0,0 +1,13 @@
|
||||
LIST
|
||||
RUN
|
||||
mehr als fuenfz
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
F11-Makro
|
||||
|
||||
nach LIST
|
||||
@@ -1,3 +1,4 @@
|
||||
' tb-screen: 80x25
|
||||
' FOR/NEXT, DO/LOOP, SELECT CASE, GOSUB
|
||||
FOR i% = 1 TO 3
|
||||
PRINT "for"; i%
|
||||
@@ -23,4 +24,4 @@ END
|
||||
|
||||
Unterprogramm:
|
||||
PRINT "gosub"
|
||||
RETURN
|
||||
RETURN
|
||||
@@ -1,3 +1,4 @@
|
||||
' tb-screen: 80x25
|
||||
' Zahlenkonvertierungs-Matrix (docs/tbvm-design.md, Abschnitt
|
||||
' "Zahlenkonvertierungs-Matrix"): Banker's Rounding (Original-Hilfe:
|
||||
' CINT), Ganzzahldivision rundet Operanden vor, Logik bitweise auf
|
||||
@@ -9,6 +10,17 @@ PRINT 1 / 4; 1 / 3
|
||||
PRINT 2 ^ 10; 2 ^ 0.5
|
||||
PRINT 6 AND 3; 6 OR 3; 6 XOR 3; NOT 0; 1.5 AND 1
|
||||
PRINT CLNG(2.5); CLNG(3.5)
|
||||
' --- Die vier Projektentscheidungen vom 2026-09-04 (docs/tbvm-design.md) ---
|
||||
' 1. CURRENCY gemischt mit Gleitkomma ergibt DOUBLE, nicht SINGLE.
|
||||
c@ = 2.5
|
||||
PRINT c@ + 1.5!; c@ + 1.5#; c@ * 2
|
||||
' 2. Ergebnistyp von ^: DOUBLE bei DOUBLE/CURRENCY, sonst SINGLE.
|
||||
PRINT 2 ^ 3; 2.5! ^ 2; 2.5# ^ 2; c@ ^ 2
|
||||
' 3. Exponentialform-Schwelle von SINGLE: Exponent < -7 oder >= 7.
|
||||
PRINT 1E-7!; 1E-8!; 9999999!; 10000000!
|
||||
PRINT .01!; .001!
|
||||
' 4. CURRENCY-Ausgabe: nachgestellte Nullen entfallen.
|
||||
PRINT 1.5@; 2@; 2.5000@; .1234@; 1.10@
|
||||
ON ERROR GOTO Uebergelaufen
|
||||
i% = 32767
|
||||
i% = i% + 1
|
||||
@@ -16,4 +28,4 @@ PRINT "nie"
|
||||
END
|
||||
Uebergelaufen:
|
||||
PRINT "Fehler"; ERR
|
||||
END
|
||||
END
|
||||
@@ -5,4 +5,9 @@
|
||||
1024 1.414214
|
||||
2 7 5 -1 0
|
||||
2 4
|
||||
4 4 5
|
||||
8 6.25 6.25 6.25
|
||||
.0000001 1E-08 9999999 1E+07
|
||||
.01 .001
|
||||
1.5 2 2.5 .1234 1.1
|
||||
Fehler 6
|
||||
|
||||
40
tests/compat/mathematik.bas
Normal file
40
tests/compat/mathematik.bas
Normal file
@@ -0,0 +1,40 @@
|
||||
' tb-screen: 80x25
|
||||
' Mathematik (Spec konsolen-basisbibliothek): Banker's Rounding, Vorzeichen
|
||||
' von INT/FIX, Konvertierungen und der reproduzierbare PRNG.
|
||||
PRINT CINT(0.5); CINT(1.5); CINT(2.5); CINT(-0.5); CINT(-1.5)
|
||||
PRINT INT(-1.7); FIX(-1.7); INT(1.7); FIX(1.7)
|
||||
PRINT ABS(-3); SGN(-3); SGN(0); SGN(3)
|
||||
PRINT CLNG(2.5); CLNG(3.5)
|
||||
' Fehlerfaelle ueber die Fehlerbehandlung sichtbar machen.
|
||||
ON ERROR GOTO Fehler
|
||||
x = SQR(-1)
|
||||
PRINT "unerreichbar"
|
||||
Weiter1:
|
||||
x = LOG(0)
|
||||
PRINT "unerreichbar"
|
||||
Weiter2:
|
||||
x% = CINT(40000)
|
||||
PRINT "unerreichbar"
|
||||
Weiter3:
|
||||
x = 1 / 0
|
||||
PRINT "unerreichbar"
|
||||
Weiter4:
|
||||
ON ERROR GOTO 0
|
||||
' Reproduzierbarkeit: gleicher Startwert, gleiche Folge.
|
||||
RANDOMIZE 42
|
||||
a1 = RND: a2 = RND
|
||||
RANDOMIZE 42
|
||||
b1 = RND: b2 = RND
|
||||
PRINT "gleich: "; (a1 = b1) AND (a2 = b2)
|
||||
c = RND
|
||||
PRINT "RND(0) wiederholt: "; (RND(0) = c)
|
||||
END
|
||||
Fehler:
|
||||
PRINT "Fehler"; ERR
|
||||
zaehler% = zaehler% + 1
|
||||
SELECT CASE zaehler%
|
||||
CASE 1: RESUME Weiter1
|
||||
CASE 2: RESUME Weiter2
|
||||
CASE 3: RESUME Weiter3
|
||||
CASE ELSE: RESUME Weiter4
|
||||
END SELECT
|
||||
10
tests/compat/mathematik.out
Normal file
10
tests/compat/mathematik.out
Normal file
@@ -0,0 +1,10 @@
|
||||
0 2 2 0 -2
|
||||
-2 -1 1 1
|
||||
3 -1 0 1
|
||||
2 4
|
||||
Fehler 5
|
||||
Fehler 5
|
||||
Fehler 6
|
||||
Fehler 11
|
||||
gleich: -1
|
||||
RND(0) wiederholt: -1
|
||||
22
tests/compat/printusing.bas
Normal file
22
tests/compat/printusing.bas
Normal file
@@ -0,0 +1,22 @@
|
||||
' tb-screen: 80x25
|
||||
' PRINT USING (Spec konsolen-basisbibliothek): numerische Platzhalter,
|
||||
' Tausendertrennung, Vorzeichenfuehrung, Waehrung und Fuellzeichen,
|
||||
' Exponentialform, String-Platzhalter, Wiederverwendung und Feldueberlauf.
|
||||
PRINT USING "###.##"; 3.14159
|
||||
PRINT USING "##.##"; -1.5
|
||||
PRINT USING "+###"; 12
|
||||
PRINT USING "###-"; -12
|
||||
PRINT USING "###-"; 12
|
||||
PRINT USING "##,#####"; 1234567
|
||||
PRINT USING "$$###"; 12
|
||||
PRINT USING "**###"; 12
|
||||
PRINT USING "#.##^^^^"; 1234
|
||||
PRINT USING "!"; "abc"
|
||||
PRINT USING "&"; "abc"
|
||||
PRINT USING "\ \"; "abcdef"
|
||||
PRINT USING "\ \"; "ab"
|
||||
PRINT USING "## "; 1; 2; 3
|
||||
PRINT USING "Wert: ## Stueck"; 7
|
||||
PRINT USING "##"; 12345
|
||||
PRINT FORMAT$(3.14159, "###.##")
|
||||
PRINT FORMAT$(42)
|
||||
18
tests/compat/printusing.out
Normal file
18
tests/compat/printusing.out
Normal file
@@ -0,0 +1,18 @@
|
||||
3.14
|
||||
-1.50
|
||||
+ 12
|
||||
12-
|
||||
12
|
||||
1,234,567
|
||||
$12
|
||||
***12
|
||||
1.23E+03
|
||||
a
|
||||
abc
|
||||
abcd
|
||||
ab
|
||||
1 2 3
|
||||
Wert: 7 Stueck
|
||||
%12345
|
||||
3.14
|
||||
42
|
||||
@@ -1,6 +1,7 @@
|
||||
' tb-screen: 80x25
|
||||
' PRINT-Formatierung von Zahlen: führendes Leerzeichen (bzw. -),
|
||||
' nachgestelltes Leerzeichen; Semikolon = direkt anschließen.
|
||||
PRINT 1; 2; 3
|
||||
PRINT -1; -2
|
||||
PRINT 1.5; -2.5
|
||||
END
|
||||
END
|
||||
@@ -1,5 +1,6 @@
|
||||
' tb-screen: 80x25
|
||||
' Komma = Sprung zur nächsten 14-Zeichen-Druckzone
|
||||
PRINT "a", "b", "c"
|
||||
PRINT "1234567890123", "x"
|
||||
PRINT "12345678901234", "x"
|
||||
END
|
||||
END
|
||||
14
tests/compat/stringrandfaelle.bas
Normal file
14
tests/compat/stringrandfaelle.bas
Normal file
@@ -0,0 +1,14 @@
|
||||
' tb-screen: 80x25
|
||||
' Randfaelle der Stringbibliothek (Spec konsolen-basisbibliothek):
|
||||
' Laenge ueber Stringende, VAL-Praefix, STR$-Vorzeichenspalte, STRING$ mit
|
||||
' Code und mit String, INSTR mit und ohne Startposition.
|
||||
PRINT "["; LEFT$("ab", 10); "]"; "["; RIGHT$("ab", 10); "]"
|
||||
PRINT "["; MID$("abc", 2); "]"; "["; MID$("abc", 2, 1); "]"
|
||||
PRINT "["; STR$(5); "]"; "["; STR$(-5); "]"; "["; STR$(1.5); "]"
|
||||
PRINT VAL(" 12.5abc"); VAL("x"); VAL("&HFF"); VAL("-3")
|
||||
PRINT "["; STRING$(3, 65); "]"; "["; STRING$(3, "xy"); "]"; "["; SPACE$(3); "]"
|
||||
PRINT INSTR("abcabc", "b"); INSTR(3, "abcabc", "b"); INSTR("abc", "z")
|
||||
PRINT "["; LTRIM$(" a "); "]"; "["; RTRIM$(" a "); "]"
|
||||
PRINT UCASE$("aÄb"); " "; LCASE$("AÄB"); " "; LEN("aÄb")
|
||||
PRINT HEX$(255); " "; OCT$(8); " "; CHR$(9731); " "; ASC("A")
|
||||
END
|
||||
9
tests/compat/stringrandfaelle.out
Normal file
9
tests/compat/stringrandfaelle.out
Normal file
@@ -0,0 +1,9 @@
|
||||
[ab][ab]
|
||||
[bc][b]
|
||||
[ 5][-5][ 1.5]
|
||||
12.5 0 255 -3
|
||||
[AAA][xxx][ ]
|
||||
2 5 0
|
||||
[a ][ a]
|
||||
AÄB aäb 3
|
||||
FF 10 ☃ 65
|
||||
@@ -1,3 +1,4 @@
|
||||
' tb-screen: 80x25
|
||||
' Stringfunktionen; LEN zählt Zeichen (UTF-8-Abweichung dokumentiert)
|
||||
s$ = "Terminal Basic"
|
||||
PRINT LEN(s$)
|
||||
@@ -9,4 +10,4 @@ PRINT UCASE$("äöü grüße")
|
||||
PRINT STRING$(5, "*"); SPACE$(3); "|"
|
||||
PRINT CHR$(65); ASC("A")
|
||||
PRINT STR$(42); "|"; VAL(" 12.5abc")
|
||||
END
|
||||
END
|
||||
15
tests/compat/system.bas
Normal file
15
tests/compat/system.bas
Normal file
@@ -0,0 +1,15 @@
|
||||
' tb-screen: 80x25
|
||||
' System- und Umgebungsanweisungen (Spec konsolen-basisbibliothek).
|
||||
' Nicht abbildbare Groessen liefern dokumentierte Ersatzwerte.
|
||||
ENVIRON "TB_KORPUS=hallo"
|
||||
PRINT "["; ENVIRON$("TB_KORPUS"); "]"
|
||||
ENVIRON "TB_KORPUS="
|
||||
PRINT "["; ENVIRON$("TB_KORPUS"); "]"
|
||||
PRINT "FRE>0:"; FRE(0) > 0; "STACK>0:"; STACK > 0
|
||||
PRINT "ERDEV:"; ERDEV; "["; ERDEV$; "]"
|
||||
TRON
|
||||
TROFF
|
||||
CLEAR
|
||||
PRINT "COMMAND$ leer:"; COMMAND$ = ""
|
||||
PRINT "fertig"
|
||||
END
|
||||
6
tests/compat/system.out
Normal file
6
tests/compat/system.out
Normal file
@@ -0,0 +1,6 @@
|
||||
[hallo]
|
||||
[]
|
||||
FRE>0:-1 STACK>0:-1
|
||||
ERDEV: 0 []
|
||||
COMMAND$ leer:-1
|
||||
fertig
|
||||
7
tests/compat/tabspc.bas
Normal file
7
tests/compat/tabspc.bas
Normal file
@@ -0,0 +1,7 @@
|
||||
' tb-screen: 80x25
|
||||
' TAB(n) springt zur Spalte n; steht der Cursor schon dahinter, folgt erst
|
||||
' ein Zeilenumbruch. SPC(n) gibt n Leerzeichen aus.
|
||||
PRINT "a"; TAB(10); "b"; TAB(20); "c"
|
||||
PRINT "x"; SPC(5); "y"
|
||||
PRINT "lang genug fuer einen Umbruch"; TAB(5); "danach"
|
||||
END
|
||||
4
tests/compat/tabspc.out
Normal file
4
tests/compat/tabspc.out
Normal file
@@ -0,0 +1,4 @@
|
||||
a b c
|
||||
x y
|
||||
lang genug fuer einen Umbruch
|
||||
danach
|
||||
Reference in New Issue
Block a user