════════════════════════════════════════════════════════════════════════════════
                    DOS GAMES LAUNCHER - DOKUMENTATIONSDATEI
════════════════════════════════════════════════════════════════════════════════

 INHALTSVERZEICHNIS
 ──────────────────────────────────────────────────────────────────────────────
    1. Programmbeschreibung
    2. Lizenz
    3. Systemvoraussetzungen
    4. Installation
    5. AUTOEXEC.BAT-Integration
    6. Dateien im Lieferumfang und zur Laufzeit
    7. Konfiguration der LAUNCHER.INI
    8. Tastaturbelegung
    9. Marker-System
   10. Genre-Filter (TAB)
   11. Diagnose-System: [INI]-Indikator und LAUNCHER.LOG
   12. Warnmeldungen
   13. Errorlevel (Rückgabewerte)
   14. Limits und Begrenzungen
   15. Zeichensatz: UTF-8 vs. CP437
   16. Atomares Speichern (Marker-Persistenz)
   17. Hinweise und bekannte Einschränkungen


════════════════════════════════════════════════════════════════════════════════
1. PROGRAMMBESCHREIBUNG
════════════════════════════════════════════════════════════════════════════════

 Der DOS GAMES LAUNCHER ist ein kompaktes 16-Bit-Real-Mode-Programm für MS-DOS,
 das eine übersichtliche, durchsuchbare und kategorisierbare Liste von DOS-
 Spielen (oder beliebigen anderen Programmen) auf den Bildschirm zeichnet, sie
 mit der Tastatur bedienbar macht und das ausgewählte Spiel per Batchdatei
 startet.

 KERNIDEE
   - Eine einzige Konfigurationsdatei (LAUNCHER.INI) beschreibt die gesamte
     Sammlung samt Ordnerstruktur, Kategorien und Startbefehlen.
   - Pro Eintrag wird ein Block aus Batch-Befehlen mitgeführt. Beim Start
     schreibt der Launcher diese Befehle in _RUN.BAT und beendet sich.
     AUTOEXEC.BAT (oder ein benutzereigener WRAPPER) führt _RUN.BAT aus,
     löscht sie und ruft den Launcher erneut auf.
   - Das Programm ist als einzelne MZ-EXE (~11 KB) kompiliert, lädt im UMB
     (LOADHIGH) und benötigt keinerlei Laufzeitbibliotheken oder Treiber außer
     dem normalen DOS- und VGA-Textmodus.

 EINSATZBEREICHE
   - Spielesammlung auf einem Retro-PC (echte Hardware) bequem anwählen.
   - Universeller Programmstarter unter DOSBox / DOSBox Staging / DOSBox-X und
     PCem / 86Box für eine gepflegte Benutzeroberfläche.
   - Bootbares USB- oder Floppy-System mit kuratierter Programmliste.


════════════════════════════════════════════════════════════════════════════════
2. LIZENZ
════════════════════════════════════════════════════════════════════════════════

 DOS GAMES LAUNCHER  v1.00 (DE)
 Copyright (c) 2026 ThoMiEn. Alle Rechte vorbehalten.
 https://www.thomien.de

 Freeware - kostenlose private, nicht-kommerzielle Nutzung.
 Weitergabe nur in unveränderter Originalform zugelassen!
 Modifikation, Rev-Eng. und kommerzielle Nutzung untersagt!
 Die Nutzung erfolgt auf eigene Gefahr!

 Der Quellcode dieses Programms ist nicht Bestandteil der Distribution und
 wird vom Autor nicht öffentlich gemacht. Jegliche Form der Disassemblierung,
 Dekompilierung oder anderweitiger Rekonstruktion des Quellcodes (Reverse
 Engineering) ist ausdrücklich untersagt, ebenso jede Modifikation der
 mitgelieferten LAUNCHER.EXE oder die Erstellung abgeleiteter Werke. Erlaubt
 ist ausschließlich die unveränderte Nutzung und Weitergabe der
 Originaldateien.

 Mit der Verwendung dieser Software erklärt sich der Anwender mit diesen
 Bedingungen einverstanden. Bei Verbreitung muss diese README.TXT, die
 LAUNCHER.EXE und die Original-LAUNCHER.INI sowie die im Header enthaltenen
 Copyright-Vermerke vollständig und unverändert mitgeliefert werden. Eine
 Aufnahme in kommerzielle Pakete, Bundles, Magazin-Cover-CDs/-DVDs oder
 kostenpflichtige Downloads ist ohne ausdrückliche schriftliche Genehmigung
 des Autors untersagt.


════════════════════════════════════════════════════════════════════════════════
3. SYSTEMVORAUSSETZUNGEN
════════════════════════════════════════════════════════════════════════════════

 - MS-DOS 3.0 oder kompatibel.
 - 8086/8088 oder besser (NASM 386+ Anweisungen wie MOVZX werden genutzt; in
   der Praxis ist somit ein 386 oder neuer erforderlich).
 - VGA-/EGA-/CGA-Textmodus 80x25 (Standard-DOS-Textmodus).
 - Ca. 16 KB freier konventioneller Speicher (LOADHIGH-tauglich).
 - Editor zur Bearbeitung von LAUNCHER.INI in UTF-8.


════════════════════════════════════════════════════════════════════════════════
4. INSTALLATION
════════════════════════════════════════════════════════════════════════════════

 1. Kopieren Sie LAUNCHER.EXE und LAUNCHER.INI in ein Verzeichnis Ihrer Wahl.
 2. Passen Sie LAUNCHER.INI an Ihre Programmsammlung an (siehe Abschnitt 7).
 3. Optional: Tragen Sie das Schleifen-Konstrukt in Ihre AUTOEXEC.BAT ein,
    damit der Launcher beim Booten automatisch erscheint (siehe Abschnitt 5).

 HINWEIS
   Die LAUNCHER.EXE muss aus ihrem eigenen Verzeichnis gestartet werden,
   damit LAUNCHER.INI, _RUN.BAT, LAUNCHER.LOG und LAUNCHER.TMP im selben Pfad
   gefunden bzw. angelegt werden.


════════════════════════════════════════════════════════════════════════════════
5. AUTOEXEC.BAT-INTEGRATION
════════════════════════════════════════════════════════════════════════════════

 EMPFOHLENES SCHLEIFEN-KONSTRUKT
   :loop
   launcher.exe
   if errorlevel 2 goto end
   if errorlevel 1 goto dos
   if exist _run.bat call _run.bat
   if exist _run.bat del _run.bat
   goto loop
   :dos
   command
   goto loop
   :end
   exit

 VERHALTEN
   - ENTER auf einem Eintrag startet das gewählte Programm: der Launcher
     schreibt den Batchblock des Eintrags in _RUN.BAT und beendet sich mit
     Errorlevel 0. Das Schleifen-Konstrukt führt _RUN.BAT aus, löscht sie und
     startet den Launcher neu.
   - F10 verlässt den Launcher mit Errorlevel 1 in einen interaktiven
     DOS-Shell-Aufruf (COMMAND). Verlässt der User die Shell per EXIT, wird
     der Launcher wieder geladen.
   - ESC verlässt den Launcher mit Errorlevel 2 endgültig (Schleife bricht ab).


════════════════════════════════════════════════════════════════════════════════
6. DATEIEN IM LIEFERUMFANG UND ZUR LAUFZEIT
════════════════════════════════════════════════════════════════════════════════

 LAUNCHER.EXE  Das Programm selbst.
 LAUNCHER.INI  Konfiguration der Programm-Sammlung.
   README.TXT  Diese Dokumentation.

     _RUN.BAT  Wird beim Programstart geschrieben. Enthält den Batchblock
               des gewählten Eintrags. Wird von der AUTOEXEC.BAT-Schleife
               nach Ausführung gelöscht.
 LAUNCHER.LOG  Wird bei der ersten Diagnose-Warnung angelegt. Bleibt bei
               sauberer INI nicht existent bzw. wird gelöscht.
 LAUNCHER.TMP  Tritt nur kurzzeitig beim Speichern auf. Bei Umbenennungs-
               fehler nach erfolgreichem Löschen der Original-INI bleibt sie
               bewusst stehen — der Benutzer kann sie dann manuell zu
               LAUNCHER.INI umbenennen.


════════════════════════════════════════════════════════════════════════════════
7. KONFIGURATION DER LAUNCHER.INI
════════════════════════════════════════════════════════════════════════════════

Grundregeln:

  - UTF-8 ist verpflichtend. Der Launcher prüft die Datei mit einem
    RFC-3629-konformen Validator (Overlong-Sequenzen und UTF-16-Surrogate
    werden erkannt). Bei Verstoss: rotes [INI] und WC_NOTUTF8 im LOG.
  - Eine BOM am Datei-Anfang wird toleriert, aber gemeldet.
  - Zeilen, die mit ';' beginnen, sind Kommentare und werden überall still
    ignoriert.
  - Die Datei darf maximal 32 KB groß sein.

Syntax:

  ; Kommentar
        Wird ignoriert. Auch innerhalb von Batch-Blöcken und vor dem ersten
        Sektionskopf erlaubt.

  [Titel]
        Einzelner Titel ohne Genre.

  [Titel;GENRE]
        Titel mit Genre. Beim Drücken von TAB lassen sich nur Einträge eines
        Genres anzeigen.

  [Titel]!      Marker Stufe 1 (laufend, gelb)
  [Titel]!!     Marker Stufe 2 (durchgespielt, grün)
  [Titel]!!!    Marker Stufe 3 (Problem, rot)
        Marker werden mit der Leertaste durchgeschaltet (0 -> 1 -> 2 -> 3 -> 0)
        und beim ersten Marker-Wechsel persistent in die INI zurückgeschrieben
        (atomar, siehe Abschnitt 16).

  [+Gruppentitel]
        Öffnet einen Ordner / eine Gruppe. Folgende Einträge gehören zur
        Gruppe, bis [-] folgt. Gruppen erlauben kein Genre und keine
        Marker-Sufffixe.

  [-]
        Schließt die aktuelle Gruppe.

  Beliebige Textzeilen unterhalb eines Sektionskopfs gehören zum Batch-Block
  dieses Eintrags. Sie werden beim Start in _RUN.BAT geschrieben — mit zwei
  Ausnahmen:

      - Zeilen, die mit ';' beginnen, werden NICHT übernommen.
      - Zeilen, die mit "REM" (case-insensitive) beginnen, werden NICHT
        übernommen.

  Hat ein Eintrag nach diesen Filtern keine ausführbaren Zeilen mehr, wird er
  ausgegraut und ist mit ENTER nicht startbar (das ist der reguläre Weg, um
  reine Platzhalter-Sektionen anzulegen, ohne Diagnosewarnungen zu erzeugen).

Beispiel:

   ; Mein Sampler
   [+Adventures]
   [The Secret of Monkey Island;ADVENTURE]!!
   c:
   cd \games\monkey
   monkey.exe
   [Day of the Tentacle;ADVENTURE]
   c:
   cd \games\dott
   dott.exe
   [-]

   [+Action]
   [Doom;SHOOTER]!
   c:
   cd \games\doom
   doom.exe
   [Doom II;SHOOTER]
   c:
   cd \games\doom2
   doom2.exe
   [-]

   ; Direkter Eintrag ohne Ordner
   [Norton Commander;TOOL]
   c:
   cd \nc
   nc.exe

7.4  WAS WIRD DURCH SUM-EINTRÄGE / GRUPPEN UNTERSTÜTZT?

  - Eine Verschachtelungsebene (Gruppe -> Spiel). Verschachtelte Gruppen sind
    nicht zulässig und werden mit WC_NESTED gemeldet.
  - Ein Genre wird in Großbuchstaben normalisiert (auch deutsche Umlaute
    ä/ö/ü/é werden zu Ä/Ö/Ü/É; ß wird zu "SS" expandiert), Doppelnennungen in
    unterschiedlicher Schreibweise werden automatisch dedupliziert.
  - Maximal 16 verschiedene Genres werden gespeichert; weitere werden mit
    WC_GENFULL ignoriert.


════════════════════════════════════════════════════════════════════════════════
8. TASTATURBELEGUNG
════════════════════════════════════════════════════════════════════════════════

    TASTE  FUNKTION
 ────────  ────────────────────────────────────────────────────────────────────
    ENTER  Aktuellen (aktiven) Eintrag starten.
    SPACE  Marker-Stufe durchschalten (0 -> 1 -> 2 -> 3 -> 0).
      TAB  Genre-Filter durchschalten (ALLE GENRES -> ... -> ALLE GENRES).
           Inaktiv, wenn höchstens ein Genre erkannt wurde.
 0–9, A–Z  Springt zum nächsten Eintrag, dessen Name mit diesem Zeichen
           beginnt (ignoriert Groß-/Kleinschreibung, mit Schleifenumbruch).
        +  Alle Ordner aufklappen.
        -  Alle Ordner zuklappen.
        ←  Auf Titel in einer Gruppe: zur Gruppe springen.
           Auf offener Gruppe: Ordner zuklappen.
        →  Auf geschlossener Gruppe: Ordner aufklappen.
        ↑  Auswahlbalken eine Zeile hoch.
        ↓  Auswahlbalken eine Zeile runter.
    Bild↑  Eine Seite hoch.
    Bild↓  Eine Seite runter.
     Pos1  Sprung zum Listenanfang.
     Ende  Sprung zum Listenende.
       F1  Information zum Lizenztext mit URL.
      F10  Launcher beenden mit Errorlevel 1 (Sprung zur DOS-Shell).
      ESC  Launcher beenden mit Errorlevel 2 (Schleife verlassen).

 DYNAMISCHE RÜCKMELDUNG
   Inaktive Tasten werden in der zweizeiligen Statusleiste am unteren
   Bildschirmrand grau gedimmt — und vom Tastatur-Handler ebenfalls ignoriert.
   Visuelles Feedback und Funktion sind synchron. So sieht der Benutzer auf
   einen Blick, was im aktuellen Kontext möglich ist.


════════════════════════════════════════════════════════════════════════════════
9. MARKER-SYSTEM
════════════════════════════════════════════════════════════════════════════════

 Der Launcher erlaubt, jedem aktiven Eintrag eine von vier Stufen zuzuweisen:

   0 = Keine Markierung
   1 = Laufend (gelb)
   2 = Durchgespielt (grün)
   3 = Problem (rot)

 Die Stufen 1–3 werden in der Liste als farbiges "*" hinter dem Eintrag
 angezeigt (gelb / grün / rot), die Stufe 0 ist ohne Symbol.

 BEDIENUNG
   Auf dem Eintrag stehen, Leertaste drücken — die Stufe rotiert 0 -> 1 -> 2 ->
   3 -> 0. Die Änderung wird unmittelbar in der INI persistent gemacht (atomar
   via LAUNCHER.TMP, siehe Abschnitt 16).


════════════════════════════════════════════════════════════════════════════════
10. GENRE-FILTER (TAB)
════════════════════════════════════════════════════════════════════════════════

 Jedes Spiel kann optional einer Kategorie zugeordnet werden:

   [Titel-1;GENRE-1]
   [Titel-2;GENRE-2]

 TAB schaltet zwischen den Filtern durch:

   ALLE GENRES -> GENRE-1 -> GENRE-2 -> ALLE GENRES

 BEI AKTIVEM FILTER WERDEN
   - Spiele direkt nach passendem Genre gefiltert.
   - Gruppen nur angezeigt, wenn mindestens ein Titel im Filter passt.
   - Titel nur angezeigt, wenn ihr Genre passt und ihre Gruppe offen ist.

 SPEZIALFÄLLE
   - 0 oder 1 Genres in der INI: TAB ist deaktiviert. Bei genau einem Genre
     zeigt der untere Rand dauerhaft dessen Namen statt "ALLE GENRES".
   - Anzeige im unteren Rand: max. 43 Zeichen sichtbar; längere Namen werden
     auf 40 Zeichen + "..." gekürzt.
   - Maximal 16 Genres werden registriert; weitere lösen eine Warnung aus.
   - Genre-Normalisierung: Großschreibung inkl. ä/ö/ü/é -> Ä/Ö/Ü/É, ß -> "SS".
     So werden Schreibvarianten automatisch dedupliziert.


════════════════════════════════════════════════════════════════════════════════
11. DIAGNOSE-SYSTEM: [INI]-INDIKATOR UND LAUNCHER.LOG
════════════════════════════════════════════════════════════════════════════════

11.1  INDIKATOR

Oben rechts im Rahmen erscheint dauerhaft ein dreifarbiger Indikator "─[INI]─":

   GRÜN   Keine Warnungen. INI vollständig sauber.
   GELB   Nur doppelte Titel oder doppelte Gruppen festgestellt.
          Das ist erlaubt, aber meist unbeabsichtigt — daher der Hinweis.
          Kein Eintrag in LAUNCHER.LOG (nur visuelles Signal).
   ROT    Mindestens eine "echte" Warnung. Details in LAUNCHER.LOG.

11.2  LAUNCHER.LOG

  - Wird LAZY beim ersten "echten" Warning angelegt.
  - Zeichensatz: UTF-8 (lesbar in modernen Editoren).
  - Eine Zeile pro Warnung, Format:

        Zeile 42: <Meldung>

    bzw. bei datei-globalen Warnungen ohne Zeilennummer:

        Datei : <Meldung>

  - Bei null Warnungen am Ende des Parse-Vorgangs wird eine eventuell übrig
    gebliebene alte LAUNCHER.LOG gelöscht.
  - Der Schreibhandle wird bei I/O-Fehler geschlossen und disabled — weitere
    LOG-Aufrufe sind danach No-Ops, der Launcher läuft normal weiter.


════════════════════════════════════════════════════════════════════════════════
12. WARNMELDUNGEN
════════════════════════════════════════════════════════════════════════════════

  Code  Symbol          Bedeutung
  ────  ─────────────  ──────────────────────────────────────────────────
   1    WC_FILEBIG     INI > 32 KB. Rest wird ignoriert.
   2    WC_MAXGAMES    Mehr als 128 Einträge erkannt (one-shot).
   3    WC_NAMELEN     Sektionsname länger als 70 Zeichen.
   4    WC_POOLFULL    name_pool (8 KB) erschöpft. Weitere Namen werden
                       gekürzt / ausgelassen.
   5    WC_GENFULL     Mehr als 16 verschiedene Genres erkannt.
   6    WC_NOBRK       "[" ohne abschließendes "]".
   7    WC_BANGS       Mehr als 3 Marker-"!" hinter "]".
   8    WC_CLOSEX      "[-" mit Zusatztext im Sektionsnamen.
   9    WC_GRPGEN      Genre an einem Gruppen-Header.
  10    WC_GRPMARK     Marker an einem Gruppen-Header.
  11    WC_NESTED      Verschachtelte Gruppe (innerhalb einer offenen).
  12    WC_UNCLOSED    Gruppe am Datei-Ende noch offen.
  13    WC_EMPTY       Leerer Sektionsname "[]".
  14    WC_DUPSEMI     Mehrere ";" im Titel.
  15    WC_ORPH1       Inhalt vor erster Sektion (one-shot).
  16    WC_ORPH2       Inhalt nach "[-]" (one-shot pro "[-]").
  17    WC_IOERR       I/O-Fehler beim Lesen der INI.
  18    WC_BADCHAR     Unbekanntes Multi-Byte-Zeichen / High-Byte.
  19    WC_BOM         UTF-8 BOM am Datei-Anfang.
  20    WC_TXTAFTER    Text nach "]" am Zeilenende.
  21    WC_NOTUTF8     INI ist nicht UTF-8.
  22    WC_NUL         NUL-Byte in der Datei.
  23    WC_SEMIBAT     ";"-Kommentar im Batch (zusammen mit
                       ausführbaren Zeilen).
  24    WC_CLOSEMRK    Marker an "[-]".
  25    WC_WHITENM     Sektionsname besteht nur aus Whitespace.
  28    WC_BRACKETS    Extra "[" oder "]" im Sektionsnamen.
  29    WC_CTRLCHAR    Steuerzeichen < 0x20 im Namen.
  30    WC_INNERWS     Whitespace direkt nach "[" oder vor "]".
  31    WC_LINEEND     Gemischte Zeilenenden (CR/LF/CRLF) — file-global.
  32    WC_NOEOL       Datei endet ohne Zeilenumbruch — file-global.
  33    WC_BATLINE     Batch-Zeile > 128 Zeichen — per-Batch one-shot.
  35    WC_STRAYCL     "[-]" ohne offene Gruppe.

Codes 26 (WC_EMPTYGRP), 27 (WC_GENREDUP), 34 (WC_DUPGROUP), 36 (WC_DEADGRP) und
37 (WC_MARKDEAD) sind absichtlich deaktiviert, weil die zugrunde liegenden
Fälle entweder syntaktisch erlaubt sind (leere Gruppen als Platzhalter) oder
bereits durch Normalisierung abgefangen werden (Genre-Großschreibung).

Doppelte Titel (intern WC_DUP) werden bewusst nicht ins LOG geschrieben,
sondern nur durch den gelben Indikator signalisiert.


════════════════════════════════════════════════════════════════════════════════
13. ERRORLEVEL (RÜCKGABEWERTE)
════════════════════════════════════════════════════════════════════════════════

   0   ENTER auf einem aktiven Eintrag. _RUN.BAT wurde geschrieben und
       wartet darauf, im AUTOEXEC.BAT-Loop ausgeführt zu werden.
   1   F10. Sprung zur DOS-Shell (siehe AUTOEXEC.BAT-Beispiel).
   2   ESC. Launcher endgültig beenden, Loop verlassen.


════════════════════════════════════════════════════════════════════════════════
14. LIMITS UND BEGRENZUNGEN
════════════════════════════════════════════════════════════════════════════════

 128  Einträge insgesamt (inkl. Gruppenkopfzeilen).
  17  Sichtbare Zeilen pro Seite.
  16  Eindeutige Genres.
  70  Maximale Sektionsnamen-Länge in Zeichen (nach UTF-8 -> CP437).
  32  Maximale INI-Dateigröße in KB.
   8  Name-Pool insgesamt in KB (CP437-Namen + Genre-Namen).
 128  Maximale Batch-Zeilenlänge in Zeichen (nach DOS COMMAND.COM).


════════════════════════════════════════════════════════════════════════════════
15. ZEICHENSATZ: UTF-8 vs. CP437
════════════════════════════════════════════════════════════════════════════════

Der Launcher verwendet zwei verschiedene Encodings, je nach Ziel:

  Bildschirm (DOS-Print, VRAM)   CP437     z. B. 81h für "ü"
  LAUNCHER.LOG                   UTF-8     z. B. C3 BC für "ü"
  LAUNCHER.INI                   UTF-8     Pflicht.

Der Konverter "conv_uml" wandelt UTF-8 -> CP437 für die Bildschirmdarstellung
in einen separaten name_pool um, damit das Original im Hauptpuffer (file_buf)
für das Speichern (save_ini) unverändert bleibt.

Abdeckung der CP437-Lookup-Tabellen:

  - 2-Byte-UTF-8 (C2..DF): 60 Codepoints im Lookup.
  - 3-Byte-UTF-8 (E0..EF): 61 Codepoints im Lookup.
  - Komplette Roundtrip-Abdeckung aller 128 CP437-High-Bytes (0x80–0xFF):
    deutsche Umlaute, französische / spanische / skandinavische Akzente,
    griechische Buchstaben, Math- und Box-Drawing-Zeichen, Block-Elemente.

Sonderfälle:

  - 4-Byte-UTF-8 (Codepoint > U+FFFF) wird als "?" eingefügt und mit WC_BADCHAR
    gemeldet.
  - Steuerzeichen < 0x20 (außer Tab) lösen WC_CTRLCHAR aus.
  - Unbekannte Sequenzen werden zu "?" konvertiert.


════════════════════════════════════════════════════════════════════════════════
16. ATOMARES SPEICHERN (MARKER-PERSISTENZ)
════════════════════════════════════════════════════════════════════════════════

Wann wird gespeichert?

   Beim Drücken der Leertaste auf einem aktiven Eintrag — sobald sich damit die
   Markerstufe ändert. Die INI wird in geänderter Form zurück auf die Platte
   gebracht, ohne dass der Benutzer sie manuell editieren muss.

Wie funktioniert das atomar?

   1. Schreiben in LAUNCHER.TMP.
   2. Jeder DOS-Schreibruf (Int 21h, Funktion 40h) wird auf CF (Carry)
      UND AX==CX (vollständige Bytes geschrieben?) geprüft. Partial
      Writes werden als Fehler erkannt.
   3. LAUNCHER.TMP schließen.
   4. Originaldatei LAUNCHER.INI löschen.
   5. LAUNCHER.TMP per Int 21h, Funktion 56h (Rename) zu LAUNCHER.INI
      umbenennen.

Fehlerpfade:

   - Schreib- oder Close-Fehler vor dem Löschen des Originals:
     LAUNCHER.TMP wird gelöscht, LAUNCHER.INI bleibt unverändert.
     Bildschirm wird zurückgesetzt, Meldung "err_save" + Wartetaste.
   - Rename-Fehler nach erfolgreichem Löschen des Originals (sehr
     selten): LAUNCHER.TMP wird ABSICHTLICH NICHT gelöscht. Die Daten
     liegen vollständig in LAUNCHER.TMP — der Benutzer kann sie manuell
     zu LAUNCHER.INI umbenennen.

Folge: In keinem Fehlerszenario gehen Daten verloren. Schlimmstenfalls muss
eine Datei umbenannt werden.


════════════════════════════════════════════════════════════════════════════════
17. HINWEISE UND BEKANNTE EINSCHRÄNKUNGEN
════════════════════════════════════════════════════════════════════════════════

 - Das Programm setzt einen 80x25-Textmodus voraus. Grafische Modi werden
   nicht angesteuert.
 - LAUNCHER.INI muss als UTF-8 ohne BOM gespeichert werden. BOM löst eine
   Warnung aus, wird aber toleriert.
 - Eine Verschachtelungstiefe für Gruppen ist unterstützt (Gruppe -> Titel).
   Tiefer verschachtelte Strukturen sind nicht vorgesehen.
 - Mehrere ";" im Titel sind nicht erlaubt; das erste ";" trennt Titel und
   Genre, weitere ";" lösen eine Warnmeldung aus.
 - Beim Marker-Wechsel wird die INI jedes Mal komplett zurückgeschrieben. Auf
   Disketten oder sehr langsamen Medien ist das spürbar.
 - Beim Beenden (F10 / ESC) wird keine INI geschrieben — nur Marker-Änderungen
   werden persistent. Die INI wird beim Marker-Wechsel sofort gespeichert,
   nicht erst beim Beenden.
 - Gruppen können geöffnet/geschlossen werden, aber dieser Zustand ist nicht
   persistent — beim Neustart sind alle Gruppen wieder im Standard-Zustand.
