## Purpose Die Konsolen-Basisbibliothek ist die in Phase 2 vorgezogene Scheibe der Laufzeitbibliothek: die Builtin-Aufrufschnittstelle der VM, ein `Host`-Abstraktion für Konsolen-E/A sowie PRINT-Formatierung und die vom Testkorpus benötigten Stringfunktionen. ## ADDED Requirements ### Requirement: Builtin-Aufrufschnittstelle Die VM SHALL Bibliotheksfunktionen und -anweisungen über eine indizierte Dispatch-Tabelle aufrufen (Argumente auf dem Operandenstack, Index im Opcode); die Tabelle lebt in der Laufzeitbibliothek und ist ohne Änderung am Opcode-Satz erweiterbar (Phase 3 füllt sie auf). #### Scenario: Builtin über Tabelle - **WHEN** `PRINT LEN("abc")` ausgeführt wird - **THEN** wird `LEN` über seinen Tabellenindex aufgerufen und liefert 3 ### Requirement: Host-Abstraktion für Konsolen-E/A Alle Konsolenwirkungen der VM SHALL über eine austauschbare Host-Schnittstelle laufen (Textausgabe, zeilenweises Lesen für `INPUT`, Abbruchprüfung). Host-Aufrufe dürfen blockieren; die Abbruchprüfung (Strg+Untbr) obliegt dem Host. `tbc run` verwendet einen Konsolen-Host (stdout/stdin); Tests MUST einen Capture-Host verwenden können, der die Ausgabe byte-genau aufzeichnet. #### Scenario: Capture-Host im Test - **WHEN** ein Korpusprogramm im Test-Harness läuft - **THEN** entsteht die komplette Ausgabe im Capture-Host und ist byte-genau vergleichbar ### Requirement: PRINT-Formatierung `PRINT` SHALL Zahlen im Format des Vorbilds ausgeben: führendes Leerzeichen für nicht-negative bzw. `-` für negative Werte, nachgestelltes Leerzeichen (auch am Zeilenende); Zahlendarstellung je Typ wie beim Vorbild (u. a. kein Dezimalpunkt bei ganzzahligen Werten, signifikante Stellen je nach SINGLE/DOUBLE). `;` schließt direkt an, `,` springt zur nächsten 14-Zeichen-Druckzone (belegt ein Element die Zone ganz, zur übernächsten); ohne abschließendes `;`/`,` folgt ein Zeilenumbruch. #### Scenario: Zahlen mit Vorzeichenspalte - **WHEN** `PRINT 1; -2; 3.5` ausgeführt wird - **THEN** lautet die Ausgabe ` 1 -2 3.5 ` mit Zeilenumbruch #### Scenario: Druckzonen - **WHEN** `PRINT "12345678901234", "x"` ausgeführt wird - **THEN** beginnt `x` in Spalte 29 (Zone nach der belegten übersprungen) ### Requirement: Korpus-Stringfunktionen Die Bibliothek SHALL mindestens folgende Funktionen mit der Semantik des Vorbilds bereitstellen (Zeichen = Unicode-Codepoints, dokumentierte UTF-8-Abweichung): `LEN`, `LEFT$`, `RIGHT$`, `MID$` (Funktion), `INSTR`, `UCASE$`, `LCASE$`, `STRING$`, `SPACE$`, `CHR$`, `ASC`, `STR$`, `VAL`. Randfälle folgen dem Vorbild, u. a.: `VAL` liest das führende Zahlenpräfix und ignoriert Leerraum; `STR$` stellt nicht-negativen Zahlen ein Leerzeichen voran; `ASC("")` löst Fehler 5 „Illegal function call" aus. #### Scenario: Korpusdatei strings.bas - **WHEN** `tests/compat/strings.bas` ausgeführt wird - **THEN** entspricht die Ausgabe byte-genau `strings.out` #### Scenario: VAL mit Restzeichen - **WHEN** `VAL(" 12.5abc")` ausgewertet wird - **THEN** ist das Ergebnis 12.5