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:
2026-09-04 06:54:19 +02:00
parent a6f005d023
commit 52ccbb5848
94 changed files with 10421 additions and 792 deletions

View 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

View 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

View 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

View File

@@ -0,0 +1,5 @@
AB中文CD
2
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
字E
Ende

View File

@@ -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

View 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

View 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
View 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
View 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

View 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

View 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

View File

@@ -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
View 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
View 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

View 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

View 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
View 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

View 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

View File

@@ -0,0 +1,2 @@
vorher
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy

View File

@@ -1,3 +1,4 @@
' tb-screen: 80x25
' Minimalfall: PRINT mit String und Zeilenumbruch
PRINT "Hallo, Welt!"
END
END

View 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

View File

@@ -0,0 +1,13 @@
LIST
RUN
mehr als fuenfz
F11-Makro
nach LIST

View File

@@ -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

View File

@@ -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

View File

@@ -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

View 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

View 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

View 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)

View 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

View File

@@ -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

View File

@@ -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

View 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

View 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

View File

@@ -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
View 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
View 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
View 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
View File

@@ -0,0 +1,4 @@
a b c
x y
lang genug fuer einen Umbruch
danach