# textbildschirm Specification ## Purpose Der emulierte Textbildschirm ist die Rendering-Grundlage für `PRINT`, `LOCATE`, `COLOR`, `CLS` und später die Forms-Engine: Unicode-Zellenpuffer mit dynamischer Terminalgröße und klassischer 16-Farben-Palette auf Ratatui. ## Requirements ### Requirement: Dynamische Terminalgröße mit Mindestmaß Der Bildschirm SHALL der Terminalgröße folgen (Puffer per `resize` anpassbar; Inhalt bleibt oben links erhalten, Cursor wird geklemmt). Die Mindestgröße ist 80×25: kleinere Werte werden auf 80×25 geklemmt, und ist die Render-Fläche kleiner als 80×25, SHALL nur ein Hinweis „Terminal zu klein" mit Ist- und Mindestgröße gerendert werden. #### Scenario: Vergrößertes Terminal - **WHEN** der Bildschirm auf 120×40 gesetzt wird - **THEN** sind alle 120 Spalten und 40 Zeilen adressierbar (`LOCATE 40, 120`) #### Scenario: Zu kleines Terminal - **WHEN** die Render-Fläche 60×20 misst - **THEN** erscheint statt des Puffers der Hinweis mit Minimum 80×25 ### Requirement: PRINT-Semantik mit Umbruch und Scrollen `print` SHALL Zeichen an der Cursorposition ausgeben, am rechten Rand umbrechen und am unteren Rand des Scrollbereichs den Bereich um eine Zeile nach oben scrollen; `\n` bricht um, `\r` setzt an den Zeilenanfang. `VIEW PRINT oben TO unten` SHALL das Scrollen auf den Bereich begrenzen; ohne eigene Einstellung folgt der Scrollbereich der Bildschirmgröße. #### Scenario: Scrollen in VIEW-PRINT-Bereich - **WHEN** der Scrollbereich Zeilen 3–5 umfasst und in Zeile 5 ein Umbruch erfolgt - **THEN** scrollen nur die Zeilen 3–5; Kopfzeilen außerhalb bleiben unverändert ### Requirement: 1-basierte Cursor-API mit Bereichsprüfung `LOCATE`, `CSRLIN` und `POS` SHALL 1-basiert arbeiten; `LOCATE` außerhalb der aktuellen Bildschirmgrenzen SHALL als Fehler abgewiesen werden (Basis für Laufzeitfehler 5). #### Scenario: Grenzprüfung - **WHEN** bei 80×25 `LOCATE 26, 1` aufgerufen wird - **THEN** wird der Aufruf abgewiesen ### Requirement: Klassische Farbpalette und Blink-Simulation Der Bildschirm SHALL die klassische Palette abbilden (Vordergrund 0–15, Hintergrund 0–7) und auf ANSI-Indexfarben mappen (klassisch 1 = Blau ↔ ANSI 4 usw.). Blinkende Vordergrundfarben (16–31) SHALL als „hell" simuliert werden (Farbe − 16, Intensitätsbit gesetzt) — kein echtes Terminal-Blinken. #### Scenario: Blink wird hell - **WHEN** `COLOR 17, 0` gesetzt wird (blinkend Blau) - **THEN** wird mit heller Vordergrundfarbe 9 gerendert ### Requirement: Unicode-Zellenmodell Der Puffer SHALL Unicode-Zeichen speichern (keine CP437-Emulation); aktuell gilt strikt 1 Zeichen = 1 Zelle. (Zeichen mit Darstellungsbreite 2 belegen künftig zwei Zellen — beschlossene Änderung, Umsetzung in Phase 3 als eigenes Change.) #### Scenario: Umlaute und Symbole - **WHEN** `Ä☃` ausgegeben wird - **THEN** belegen `Ä` und `☃` je genau eine Zelle