es haben mich einige Anfragen erreicht, wie die Farbdarstellung im Hi-Res Text-Modus (GR0) in PenGoCRAZY realisiert ist. Ich habe deshalb einige Erläuterungen und auch ein Programm-Beispiel in ACTION vorbereitet. Ich hoffe, es wird damit für alle die selbst ein ähnliches Projekt realisieren wollen klarer, wie so eine Darstellung realisiert werden kann.
Einleitung:
PenGoCRAZY, mein Beitrag zum ABBUC SW-Contest 2025, nutzt hochauflösende Grafik mit 320×200 Pixeln in 8 Farben. Für eine optimale Darstellung empfiehlt sich PAL mit Composite- oder S-Video-Anschluss. Aber selbst mit TV-Modulator an einem alten CRT-TV ist die Darstellung immer noch gut. In Emulatoren wie ALTIRRA bewirkt das Aktivieren der Video-Option „PAL Blending/Artefacting“ eine vergleichbare Darstellung wie bei einem echten LCD/CRT Display. NTSC-Artefakte sollten vermieden werden. Daher ist bei NTSC-Geräten S-Video besser geeignet.
Funktionsweise:
Der in PenGoCRAZY verwendete Ansatz ist eigentlich ein zweilagiges Player-Missile (PM) Overlay, das durch Überlagerung zweier Player-Streifen die Auswahl von 4 Farbtönen/2 Helligkeiten pro 8 Pixel ermöglicht. Um den gesamten Bildschirm abzudecken, müssen die PM-Streifen gemultiplext werden, um die PM-Ressourcen effektiv zu verdoppeln. Die Idee dahinter war, das C64 Color RAM zu emulieren, das das Einfärben einzelner Textzeichen erlaubt. Tatsächlich ist die Farbauflösung des PM-Overlays sogar höher, da die Farbe pro 8×1 Pixel statt 8×8 Pixel gewechselt werden kann.
Ich habe in der Vergangenheit mit verschiedenen Ansätzen experimentiert und wollte das schon immer einmal in einem Programm einsetzen. Es gibt verschiedene Varianten dieses Ansatzes. Die in PenGoCRAZY verwendete ist ein 320×8 Pixel Screen-Kernel, der durch DLI synchronisiert wird, sodass er pro Textzeile durch Konfiguration des DLI in der Display List ein- oder ausgeschaltet werden kann. Der Screen-Kernel folgt dem „Beam“ (Strahl), während das Bild ausgegeben wird, und konfiguriert PM-Positionen und Farben „on the fly“. Das ist etwas knifflig, da das CPU-Timing nicht regelmäßig ist. Da ANTIC die CPU anhält, wenn eine neue Display-Adresse oder Display-Daten geholt werden, wird das Timing auf diesen Zeilen gestört. Etwas fummelig, aber machbar.
Das Ergebnis sieht auf PAL-Originalhardware, sowohl mit Composite als auch S-Video, sehr ordentlich aus. Man erhält vollflächige und satte Farben. Da die Grafikdetails „echte“ 320×200 Pixel sind, empfiehlt sich bei NTSC-Geräten S-Video, da die NTSC-Artefaktfarben bei Composite-Video die Details der Grafik verwischen. Mit S-Video sieht aber auch NTSC-Originalhardware gut aus. Ich habe es auch mit TheA400 Mini getestet, und sowohl PAL als auch NTSC werden korrekt angezeigt, ebenso wie auf original XL/XE-Hardware.
Das ACTION-Demo:
Um die Funktionsweise besser zu verstehen, habe ich eine kurze Demo in ACTION vorbereitet. Hier sieht man vor allem den Code des Display List Interrupts (DLI), der den Farbmultiplex erzeugt. Die Lösung ist etwas anders als bei PenGoCRAZY, läuft dafür aber auch auf dem alten Atari 800

Technische Umsetzung des Farbmultiplex:
Die Demonstration illustriert die Funktionsweise eines Display List Interrupts (DLI), der zur Erzeugung eines Farbmultiplexes eingesetzt wird. Das zugrundeliegende Verfahren basiert auf einem zweischichtigen Overlay von Player-Missile-Grafikobjekten (PM), wodurch pro 8 Pixel die Auswahl von vier Farbtönen und zwei Helligkeitsstufen durch Überlagerung zweier Player-Streifen ermöglicht wird. Um eine vollständige Abdeckung des Bildschirms zu gewährleisten, erfolgt ein Multiplexing der PM-Streifen, wodurch die verfügbaren PM-Ressourcen effektiv verdoppelt werden.
Vergleich mit C64 Color RAM und Farbauflösung:
Das Ziel dieses Ansatzes ist die Emulation der Funktionalität des C64 Color RAM, welches die individuelle Einfärbung von Textzeichen gestattet. Die hier vorgestellte Methode bietet jedoch eine höhere Farbauflösung, da ein Farbwechsel auf einer 8×1-Pixel-Basis (statt 8×8 Pixel) realisiert werden kann.
Kernel-Architektur und Synchronisation:
Die Implementierung erfolgt mittels eines 320×8-Pixel-Screen-Kernels, der durch Display List Interrupts synchronisiert wird. Dadurch ist es möglich, den Kernel für jede Textzeile individuell zu aktivieren oder zu deaktivieren. Während der Bildausgabe folgt der Kernel dem Elektronenstrahl („Beam“) und konfiguriert die Positionen sowie die Farben der Player-Missile-Objekte in Echtzeit. Die Realisierung erfordert eine präzise Steuerung der CPU-Zeit, da der ANTIC-Chip beim Laden neuer Display-Adressen oder -Daten die CPU anhält und somit das Timing beeinflusst.
Ergebnisse und Kompatibilität:
Die resultierende Grafikdarstellung zeichnet sich auf PAL-Originalhardware sowohl bei Composite- als auch S-Video-Ausgabe durch vollflächige und gesättigte Farben aus. Aufgrund der hohen Detailtreue (echte 320×200 Pixel) empfiehlt sich bei NTSC-Systemen die Nutzung von S-Video, da bei Composite-Video NTSC-typische Artefaktfarben die Bildschärfe beeinträchtigen können. Die Kompatibilität wurde sowohl auf TheA400 Mini (PAL/NTSC) als auch auf originalen XL/XE-Systemen erfolgreich getestet.
So, nun aber as Programmbsispiel für alle Atari 800/XL/XE, in ACTION. Übersetzen müsst ihr die Datei MAIN.ACT, z.B. mit C"MAIN.ACT". Die anderen Dateien werden automatisch mit INCLUDE eingebunden: Ebenso ein ausführbares XEX-File: