PCX-Bilderzeugung auf dem KC85/4
von Mario Leubner
Um die Popularität des KC85 plattformübergreifend zu dokumentieren, ist es erforderlich, Bildschirmanzeigen von verschiedenen Programmen als Bilddatei zur Verfügung zu haben. Das Bildformat sollte dabei möglichst universell nutzbar sein, die KC-spezifischen Formate PIP/PIF und HIP/HIF scheiden also aus. Am besten scheint noch das relativ alte, aber dennoch weitgehend unterstützte PCX-Format von Z-Soft geeignet zu sein.
Varianten
Vom PCX-Format gibt es zahlreiche Versionen, jedoch keine allgemeingültigen Definitionen des Dateiaufbaus. Nicht alle Programme erzeugen aus den gleichen Bildern identische Dateien und hier gilt es einen Kompromiß zu finden. Am KC85/4 haben wir zwei Farbmodi zu unterscheiden: LORES, den Bytemodus und HIRES, den Bitmodus. Diese sind entsprechend unterschiedlich zu handhaben, da die IRM-Inhalte je nach Modus auch von der KC-Hardware unterschiedlich interpretiert werden. Für die PCX-Bilder gibt es demnach ebenfalls zwei Formen:
LORES: Vordergrund- und Hintergrundfarbinformationen gelten jeweils für 1 mal 8 Bildpunkte horizontal in einer Linie (1 Byte). Mit dem Farbbyte können 16 Vorder- und 8 Hintergrundfarben eingestellt werden. Im Pixelbyte liegt dagegen nur die Information, ob der Bildpunkt in der Vorder- oder Hintergrundfarbe darzustellen ist.
HIRES: Ein Bit aus jeder Ebene (Farb- und Pixel-RAM) wird direkt als Farbinformation eines Bildpunktes gewertet. Mit den zwei zur Verfügung stehenden Bits können 4 Farben dargestellt werden. Jeder Punkt kann eine der Farben schwarz, rot, türkis oder weiß annehmen.
PCX-Formate: Das PCX-Format muß also entweder 24 Farben für LORES oder 4 Farben für HIRES darstellen können. Definiert ist das PCX-Format aber nur für 2, 4, 8, 16, 256 oder 16,7 Millionen Farben. Der HIRES-Modus stellt kein Problem dar, hier eignet sich direkt das Format mit 4 Farben. Für den LORES-Modus ist entweder eine Reduzierung auf 8 Farben erforderlich, dabei könnte zum Beispiel nicht mehr zwischen den Vorder- und Hintergrundfarben unterschieden werden oder die Vordergrundfarben 8 bis 15 würden im gleichen Farbton wie die Farben 0 bis 7 dargestellt. In beiden Fällen gehen wichtige Details verloren. Es bleibt also nur die Möglichkeit, 24 der möglichen 256 Farben der nächsten Stufe zu verwenden. Dabei entsteht zwar eine gewisse Redundanz, man erhält aber alle Farbinformationen. Ich habe mich für diese Variante entschieden. Für die zu erzeugenden PCX-Formate ergeben sich demnach die in der nachfolgenden Tabelle gegenübergestellten Daten:
LORES | HIRES | |
PCX-Version: | 3.0 | 3.0 |
Anzahl Farben: | 256 | 4 |
Palette: | extern | intern |
Bits/Pixel/Ebene: | 8 | 1 |
Anzahl Ebenen: | 1 | 2 |
Bildbreite: | 320 Pixel | 320 Pixel |
Bildhöhe: | 256 Pixel | 256 Pixel |
Bytes je Zeile: | 320 | 40 |
Farbpalette: Die Farbpalette besteht aus 3 Byte je darzustellender Farbe. Diese drei Bytes enthalten die Anteile der Grundfarben rot, grün und blau - jeweils im Bereich zwischen 0 und 255. Für bis zu 16 Farben hat die Palette im PCX-Header am Dateianfang Platz. Bei 256 Farben befindet sich die Palette am Dateiende. Und hier gibt es ein nur schwer lösbares Problem: Die Programme auf dem PC suchen die Palette direkt vom Dateiende aus und ignorieren diese, falls sie nicht genau an der geforderten Stelle steht.
Eine unter CAOS oder CP/M erzeugte Datei läßt sich jedoch nur sektorweise erzeugen, ist also immer genau ein Vielfaches von 128 lang. Das logische Dateiende liegt also irgendwo im letzten Sektor und kann normalerweise nicht näher bestimmt werden.
Der Trick
Binärdateien können alle Zeichen (Byte-Werte von 0 bis 255) enthalten, Textdateien enthalten dagegen nur darstellbare Zeichen, deren Zeichenvorrat vom verwendeten Programm abhängt. Unter CP/M werden Textdateien mit dem Zeichencode EOF (1Ah) am Dateiende gekennzeichnet, falls das Dateiende nicht mit dem Sektorende zusammenfällt. Textdateien lassen sich somit in der Größe genau auf das Zeichen bestimmen.
Bei der Betrachtung des PCX-Formates für LORES-Bilder enthält der PCX-Header keinen Wert 1Ah und auch im Datenbereich wird niemals der Wert 1Ah auftreten, da die möglichen 24 Farben mit den Werten 0 bis 23 codiert sind (0..17h) und als Komprimierungszähler nur Werte größer als C0h vorkommen. Es ist also möglich, durch einfaches Anhängen eines Bytes EOF das genaue Dateiende zu kennzeichnen. An dieser Stelle nutzt man die Redundanz gezielt aus. Jetzt muß die Datei nur als Textdatei behandelt und z.B. mit der MTOOLs ohne die Option -b zu einem PC übertragen werden. Damit hat die Datei auf dem PC genau die richtige Größe und wird korrekt weiterverarbeitet.
Für PCX-Dateien, die HIRES-Bilder des KC darstellen, muß dagegen die Option -b benutzt werden, damit die Übertragung nicht beim Auftreten eines Bytes mit dem Wert 1Ah abgebrochen wird. Die Daten einer solchen Datei können jeden beliebigen Wert annehmen, es besteht keine Redundanz. Die Weiterverarbeitung einer solchen Datei stellt jedoch kein Problem dar, auch wenn sie ein paar Bytes länger ist. Die Farbpalette steht ja am Dateianfang und wird auch von dort aus ermittelt.
Programmbeschreibung
Das vorliegende Programm PCX.KCC läuft unter CAOS. Es erfordert einen KC85/4 mit D004. Die Dateiausgabe erfolgt über die Byteschnittstelle von DEP. Das Programm leitet die Tastatur-Interrupts (vom System-PIO und der SIO Kanal 2) auf sich selbst um und kontrolliert das Auftreten einer Hardcopy-Forderung. Falls diese vorliegt, wird statt dessen die Dateiausgabe aufgerufen. (Das einfache Eintragen auf der Hardcopy-Adresse reicht nicht aus, da dann nur ein Aufruf möglich wäre, wenn eine Tastatureingabe über die KBD-Funktion angefordert wird.) Vom Programm bekommt man nun die Aufforderung zur Eingabe eines Dateinamen, bestehend aus maximal 8 Zeichen. Der Dateityp PCX wird automatisch ergänzt. Nach Bestätigung mit der Enter-Taste verschwindet das Fenster mit dem Dateinamen wieder und die Ausgabe der Datei beginnt. Je nach Komplexität des Bildinhaltes dauert es nun einige Zeit, als Fertigmeldung ertönt ein BEEP und danach kann man mit dem gerade laufenden Prozeß fortfahren. Die Fehlerbehandlung wurde auf ein Minimum reduziert. Unter der Annahme, daß keine Fehler erwartet werden, läuft das Programm ohne Probleme durch. Das Auftreten eines Fehlers (Diskette voll, Schreibfehler usw.) führt nur zu einem Sprung auf E000h, wirkt also wie die Betätigung der RESET-Taste. Über die Art des Fehlers muß man sich selbst Gedanken machen, z.B. durch den Versuch, eine andere Datei auszugeben.
Das Programm PCX besteht aus zwei Teilen und ist voll verschieblich:
- Hauptprogramm: belegt ca. 600h Bytes an einer beliebigen Stelle im RAM bzw. IRM des KC85/4.
- Interrupt-Umleitung: belegt 80h Bytes im RAM0 (oder im RAM4).
Die MC-Datei PCX.KCC wurde auf der Adresse 0 erzeugt, muß also stets mit Offset geladen werden. Der Ladeoffset ist gleich der Zieladresse, wo das Hauptprogramm laufen soll. Die Dateigröße gestattet das Laden innerhalb der IRM-Bereiches ab BA00H, wodurch der gesamte RAM für andere Programme weiterhin nutzbar bleibt. Beim Programmaufruf mit dem Menüwort %PCX wird der zweite Teil, die ISR-Umleitung, aktiviert. Diese ist standardmäßig auf die Adresse 0 voreingestellt, kann aber per Menüwort verändert werden. Als Parameter ist dann nur die Anfangsadresse des 128 Byte großen Bereiches anzugeben. Es sollte möglichst eine Adresse innerhalb des RAM0 gewählt werden, da dieser immer zugeschalten ist. Falls der RAM4 nicht geschalten wird, kann der Interrupt auch in diesen Bereich umgeleitet werden.
Aktivierung: Beim Aufruf des Menüwortes %PCX erscheint eine der folgenden Meldungen. Daran kann der Status des Programmes abgelesen werden:
- DEP nicht aktiv!
- Es ist kein D004 vorhanden oder das D004 ist nicht in der CAOS-Betriebsart.
- ISR bereits modifiziert!
- Entweder wurde der Treiber bereits aktiviert (Menüwort 2mal aufgerufen) oder die Interrupts wurden von einem anderen Programm umgestellt.
- Screen-Saver aktiviert auf ADR1 ADR2
- Das Programm ist aktiv und kann ab sofort mit Hardcopy (Shift-CLR) aufgerufen werden. Zur Kontrolle werden die Anfangsadressen der beiden Programmteile angezeigt
-
Deaktivierung: Deaktiviert wird das Programm durch die Zurückstellung der Interrupts. Das kann entweder durch RESET, einen Sprung auf die Adresse E000h oder F000h oder durch einen Aufruf der CAOS-Funktion SIXD erreicht werden. Solange das Hauptprogramm im Speicher unverändert vorliegt, kann durch erneute Eingabe des Menüwortes %PCX eine erneute Aktivierung erfolgen. Dabei wird die zuletzt benutzte ISR-Adresse verwendet, solange keine andere Adresse angegeben wird.
Da das Programm verschieblich ist, kann es auf unterschiedliche Adressen geladen werden. Hierbei muß beachtet werden, daß CAOS alle im Speicher stehenden Menüworte sucht, der Speicher wird dabei linear von C000H bis 0000H durchsucht. Befindet sich ein Menüwort mehrmals im Speicher, erscheint es zwar mehrmals im Menü, der Aufruf erfolgt aber stets zu dem ersten gefundenen Menüwort! Also bevor das Programm auf einen anderen Speicherbereich geladen wird, die alte Version entfernen: Entweder manuell durch MODIFY die Prologbytes 7Fh überschreiben oder durch einen Sprung auf die Adresse F000h (Speicher löschen).
Bilder von BASIC-Programmen
Für BASIC-Programme empfiehlt sich der Speicherbereich ab BA00h für das Hauptprogramm. Prinzipiell ist die Zusammenarbeit mit BASIC gewährleistet, da von PCX.KCC keinerlei Zustände verändert werden. Laufende BASIC-Programme werden nach der Ausgabe der Bilddatei automatisch fortgesetzt. Viele BASIC-Programme (besonders Spiele) erzeugen jedoch ab BA00h Zeichensätze und überschreiben PCX.KCC. Hier sollte die Möglichkeit der Begrenzung des von BASIC benutzten RAM geprüft werden (BASIC-Befehl CLEAR). Dann könnte man PCX.KCC z.B. ab 7A00h laden und ausführen.
Bekannte Probleme
CAOS stellt ein System dar, bei dem jedes Programm den Speicher nutzen kann wie es will. Sollen mehrere Programme gleichzeitig im Speicher liegen, darf ein Programm das andere nicht beeinflussen. Dieses Problem tritt bei dem PCX-Generator verstärkt auf, da das Programm zum Erzeugen von Bildern aus laufenden Programmen heraus dient.
PCX ist voll verschieblich und kann sich so jedem anderen Programm anpassen. Vielfach ist jedoch nicht bekannt, welche Bereiche frei sind. Sollte die Standard-Speicherbelegung von PCX (BA00h bis C000h für Hauptprogramm und 0000h bis 0080h für ISR-Umleitung) nicht funktionieren, kann man auf andere Adressen ausweichen. Aber welcher Bereich ist nicht genutzt?
Ich empfehle folgende Vorgehensweise:
- CAOS-Betriebsart starten
- Sprung auf Adresse F000h, um den Speicher zu löschen. (%go F000 bei CAOS 4.3 oder in BASIC: CALL*F000)
- Falls nicht mit CAOS 4.3 gearbeitet wird: JUMP FC 0 (lädt das Hilfsprogramm FLOAD ab Adresse 0)
- gewünschte Anwendung laden und ausführen
- Anschließend den Speicher mit DISPLAY untersuchen. Ungenutzte Bereiche enthalten immer noch 00h. Man sucht 80h Byte im RAM0 und weitere 600h Byte im gesamten Speicher.
- PCX-Programm auf einen der freien Bereiche laden und aktivieren.
Sollte auch das nicht funktionieren oder nicht genug ungenutzter Speicher vorhanden sein, kann man mit ESC-2 in das alternative Bild des KC umschalten. Dort wird das Anwendungsprogramm ausgeführt und an der gewünschten Stelle RESET gedrückt. Damit wird der Inhalt dieses Bildes ,,eingefroren``. Jetzt kann man das PCX-Programm laden und aktivieren. Im CAOS-Menü schaltet man mit ESC-2 wieder in das andere Bild (für HIRES-Bilder noch mit ESC-A den Modus wechseln) und drückt Shift-CLR. Aufpassen, daß der blinkende Cursor nicht gerade stört! Unter CAOS 4.3 kann man die Namenseingabe auch mit BRK abbrechen.
Wenn nicht genug RAM-Speicher zur Verfügung steht, kann man auch versuchen, das Hauptprogramm in ein RAM-Modul zu laden. Ein 16K- oder 64K-Modul ist dazu z.B. auf der Adresse C000h zu aktivieren. Die ISR-Umleitung sollte trotzdem bevorzugt im RAM0 stehen, notfalls im RAM4. Probleme treten jedoch auf, wenn das ausgeführte Anwendungsprogramm anderen Speicher auf den Bereich ab C000h schaltet. Das läßt sich leicht an den Modul-LEDs kontrollieren, aber auch die Aktivierung des BASIC-ROM überdeckt ein RAM-Modul ab C000h.
Ein weiteres Problem stellt das CAOS-Unterprogramm SIXD dar, das die Interrupts zurückstellt. Wird dieses Unterprogramm innerhalb einer Anwendung aufgerufen, dann geht die Umleitung zum PCX-Treiber verloren und eine Bilderzeugung kann nicht mehr erfolgen. In einigen Fällen gelingt es, die Aufrufe SIXD zu entfernen (Programmpatch). Ansonsten bleibt nur die Nutzung des zweiten Bildes. Wenn das auch nicht funktioniert (nicht alle Programme laufen im zweiten Bild!), dann gibt es momentan noch keine allgemeingültige Lösung.
Screen-Saver für Bilder im KC-Format
Als eine weitere Variante habe ich im oben beschriebenen Programm PCX.KCC die PCX-Routine ersetzt zur Erzeugung von Bilddateien im KC-Format *.PIP/PIF für LORES- bzw. *.HIP/HIF für HIRES-Bilder. Die Eigenschaften des so entstandenen Programmes SCREEN.KCC sind identisch bis auf folgende Details:
- Menüwort %SCREEN anstatt %PCX
- Programmcode ist kürzer (480h Bytes), dadurch kann der Hauptteil auch im Bereich A880h bis AD00h liegen;
- schnellere Programmausführung, da keine Formatumwandlung; erforderlich ist und die Datei blockweise ausgegeben wird;
- Ausgabe erfolgt stets in zwei Dateien (unkomprimiert)
Ausblick
Eine Weiterverarbeitung der Bilder im KC-Format kann mit den KC-eigenen Programmen wie UNIPIC, DIASHOW, WordPro6, ML.COM usw. erfolgen. Eventuell wäre auch ein Programm zur Konvertierung PIP/PIF nach PCX sowie HIP/HIF nach PCX denkbar. Aber wenn der KC zwar etwas langsamer das PCX-Format selbst erzeugt, dann dürfte der Aufwand einer nachträglichen Konvertierung diesen Geschwindigkeitsverlust wieder ausgleichen. Aber vielleicht schreibt ja trotzdem jemand ein Konvertierungsprogramm?