★ APPLICATIONS ★ DIVERS ★ HI-DUMP — die neue Hardcopy-Dimension für alle CPCs|CPC Magazin) ★ |
HI-Dump (CPC Magazin) | Applications Divers |
Dieses Programm hat Fähigkeiten, die bisherige Hardcopy-Lösungen vor Neid erblassen lassen. Was denn? Noch eine Hardcopy-Routine, diesmal im CPC-Magazin? Gähn. Aber Halt! Das hier vorgestellte Programm hat Fähigkeiten, die bisherige Hardcopy-Lösungen vor Neid erblassen lassen. 1. Druckt HI-DUMP (mit Papierfarbe) in 4 Graustufen. 2. Es kann ein beliebiger Bildausschnitt gewählt werden. 3. Die Hardcopy ist relativ groß (17 cm x 10,5 cm) und das Seitenverhältnis stimmt, so daß Kreise nicht mehr zu Ellipsen verformt werden. 4. Kann HIDUMP an jeder freien RAM-Adresse betrieben werden. HI-DUMP läuft auch auf dem 664 und 6128. Mit den Druckern sieht die Verträglichkeit allerdings schlecht aus. HI-DUMP funktioniert zunächst nur mit dem NLQ 401. Für kompatible Drucker besteht eine Möglichkeit zur Anpassung der Steuerzeichen; das verwendete Konzept ist jedoch nur eingeschränkt übertragbar. Ob Aussicht auf Erfolg besteht, hängt hauptsächlich von der Größe und dem Abstand der Druckpixel ab. Und noch ein Eingeständnis: HI-DUMP ist nichts für eilige Menschen. Der Ausdruck des gesamten Bildschirms braucht 8 Minuten. Davon benötigt das Programm 40 Sekunden, den Rest hat der Drucker zu verantworten. Auch die Länge des Maschinencodes von 768 Byte erfordert einige Geduld und Sorgfalt beim Abtippen. Doch bevor das HI-DUMP-Programm weiter beschriebenwird, brauchen wir zunächst etwas Pixel-Latein. Das Handbuch des NLQ 401 nennt für die einzelnen Druckpixel einen Horizontalabstand von 1/60”, der je nach Bitbildmodus bis zu 4-fach verdichtet werden kann, sowie einen Vertikalabstand von 1/72”. Daraus ergibt sich, daß Pixel-Latein ein Quadrat (also auch das angestrebte richtige Seitenverhältnis) bei 5 Pixel waagrecht und 6 Pixel senkrecht entsteht. Im einfachsten Falle müßte man also bloß jede fünfte Zeile doppelt drucken. Aber da gibt es eine weitere Schwierigkeit. Im einfachen Bitbildmodus passen nur 480 Punkte in eine Zeile. Der CPC hat aber 640 Bildpunkte, also brauchen wir den doppelten oder vierfachen Bitbildmodus. Zusätzlich soll ein Bildschirmpixel ja in mehreren Graustufen gedruckt werden können, das heißt, er muß aus mehreren (in diesem Fall 0 bis 3) Druckpixeln zusammengesetzt werden. Eine Lösung dieses Problems ergibt sich nun dadurch, daß zwei übereinanderliegende Bildschirmpixelreihen sich eine dritte Druckpixelzeile miteinander teilen. Ein MODE 1 -Bildschirmpixel (zwei in MODE 2) wird waagerecht auf 5 Druckpixel im vierfachen Bitbildmodus verteilt, davon werden je nach Graustufe 0,1,2 oder alle 5 "gesetzt”. Eine Anschauung davon vermittelt die Abbildung. Mit dieser Methode entstehen übrigens auch keine Probleme durch das fehlende achte Bit des CPC-Druckerausgangs-aus naheliegenden Gründen werden jeweils 6 (2 mal 3) Bit übertragen. Für HI-DUMP wurde nicht die beliebte RSX-Form gewählt. Für eine RSX-Befehlserweiterung sind feste RAM-Adressen erforderlich, so daß es zu Konflikten mit anderen Programmen kommen kann. Da HI-DUMP sonst mit relativen Sprüngen und Adressen auskommt, wurde daher die CALL-Form genommen. Die Routine ist dadurch an jeder freien Stelle des RAM arbeitsfähig. Auch die sonst für eine RSX notwendige Initialisierung entfällt. Wenn eine Variable mit der Arbeitsadresse definiert wird, ist es möglich, mit CALL hidump,... die Routine indirekt mit einem Befehlsnamen aufzurufen. In diesem Fall wird aber jeder Eingabefehler als CALL 0 (RESET) quittiert, was man am einfachsten mit POKE 0,&C9 verhindert. So ganz ohne feste RAM-Adressen kommt aber auch HIDUMP nicht aus. Es werden sogar insgesamt 64 Byte für Tabellen, Variablenpuffer und eine Hilfsroutine zur Druckerausgabe verwendet. Dafür wurde jedoch ein "sicherer” Platz gefunden. Der Bereich &BE00 bis &BE3F liegt zwischen der Firmwaresprungtabelle und einem festen Bereich, der von der Floppy benutzt wird. Es handelt sich um einen Teil des Systemstack, der in diesem Umfang jedoch nicht ausgenutzt wird, und deshalb auch für andere Zwecke verwendet werden kann. Probleme könnte es höchstens dann geben, wenn andere Programme (z.B. weitere Peripheriegeräte) versuchen, denselben Bereich zu benutzen. HI-DUMP sorgt in diesem Falle bereits für sich selbst und gestaltet diesen RAM-Bereich in jedem Fall neu. Die Frage ist nur, ob das andere Programm (falls es je existieren sollte) dort Daten abgelegt hat, die noch benötigt werden. In diesem Fall müßte man die Daten vorher retten und nach der HI-DUMP Ausführung an die alte Stelle zurückbringen. Falls jedoch eine Situation eintritt, wo es trotzdem Schwierigkeiten gibt, besteht noch die Möglichkeit, den festen Bereich von HI-DUMP zu verlagern. Dazu muß lediglich im Basiclader die Zeile IF a$=”BE” THEN a$=”neu” hinzugefügt werden. Dabei kann ”neu” im einfachsten Fall ”BF” sein, womit ein anderer Teil des Stack benutzt wird, oder auch ein geeignetes anderes höherwertiges Adress-byte. Das Hauptprogramm Ein Drittel von HI-DUMP dient der Übernahme der Eingabeparameter (DATA-Zeilen 100 bis 150). Da sind zunächst mal 4 Werte mit den Bezeichnungen links, rechts, oben und unten. Damit wird natürlich der gewünschte Bildausschnitt festgelegt. Diese Werte werden den Firmwareroutinen für das Setzen des Grafikwindows unterworfen, so daß gültige Werte entstehen, die an Bildschirm- und Bytegrenzen ausgerichtet sind. Die Eingabe entspricht genau dem Basic-ORIGIN-Befehl für das Grafikfenster. Wenn keine Werte eingegeben werden, wird automatisch das bestehende Grafikfenster genommen. Auch die Werte da, db, de können weggelassen werden, dann erfolgt der Ausdruck so, daß INK 0 und 1 in weiß und schwarz sowie INK 2 und 3 in Graustufen wiedergegeben werden. Aus da, db und de werden 16 Byte abgeleitet (eins für jede INK) und im Bereich &BE00 bis &BE0F abgelegt. Von &BE10 bis &BE1F stehen dann die benötigten Werte für linken, rechten, oberen und unteren Rand und die Laufvariablen. Ab &BE20 bis &BE27 steht eine Tabelle mit Bitmasken für alle Pixel eines Byte (nur an dieser Stelle spielt der bestehende MODE eine Rolle). An die Adresse &BE2D wird die zum Firmware-Jump vervollständigte Indirection SCR READ kopiert und von &BE30 bis &BE3F noch eine Druckroutine geschrieben, die neben der Übertragung zum Drucker auch die Abfrage auf ESCAPE übernimmt. Nach soviel Vorarbeit kann nun endlich die Druckausgabe beginnen. HI-DUMP hat zwei Hauptschleifen, in denen die Bildschirmkoordinaten von links nach rechts und von oben nach unten durchlaufen werden. Der Firmwareeinsprung GRA TEST, der direkt diese Koordinaten verwenden kann, ist verhältnismäßig langsam, deshalb wurde schließlich SCR READ gewählt. SCR READ braucht allerdings die fertige Bildschirmadresse und eine Bitmaske (die haben wir schon durch den Startteil von HI-DUMP). Die Berechnung der Bildschirmadresse ist kompliziert, deshalb wird für jede Druckzeile ein Anfangswert der Bildschirm adresse mit GRATEST ermittelt. Die Variation dieses Wertes in der Zeile geschieht dann zum Teil mit eigenen Routinen, zum anderen Teil mit dem Firmwareeinsprung SCR NEJG" BYTE. Dèr Rest ist Fleißarbeit: Jeden Bildschirmpixel testen, die Ausgabemaske für die Vorgefundene INK untersuchen und gegebenenfalls die Bits für die a-, b-, und c-Felder der Druckerausgabe setzen. Dabei werden zwei Nebenschleifen durchlaufen. Zum einen wird ein Bildschirmbyte in 4 2-Bit-Teile zerlegt, zum anderen werden diese 2 Bit in der innersten Schleife nacheinander (jeweils mit 3 darunterliegenden "Kollegen") abgearbeitet. Der Programmaufbau ist im übrigen etwas verschachtelt. Da der Z-80 nur relative Sprünge über maximal 128 Byte zuläßt, absolute Sprünge aber vermieden werden sollten, mußten Programmteile nicht nach Logik, sondern nach Länge angeordnet werden. Die Funktion ist zum Glück unabhängig davon. Was passiert, wenn keine Druckmasken angegeben werden, wurde schon gesagt. Was kann man nun damit anfangen? RSX- und CALLparameter (also auch da,'db, de) sind Integerwerte, haben also in binärer Darstellung 16 Bit. Nun steht einfach jedes Bit der Reihe nach für eine INK. Das niedrigste Bit für INK 0 usw. da steht für das a-Feid, db für das b-Feld und de für das c-Feid. Es ist damit also möglich, für jede INK einzeln anzugeben, welche Felder bei der Druckausgabe gesetzt werden sollen. Es müssen nur die entsprechenden Bits in da, db, de gesetzt werden. Am besten ist es, diese Werte binär (mit &X) einzugeben, dann können die Bits gënau abgezählt werden. Eine Besonderheit besteht in MODE 2. a- und b-Feld entsprechen dabei bereits zwei Bildschirmpixeln. Damit nicht die Hälfte der Auflösung verlorengeht, müssen a- und b-Feld beide gesetzt sein. So wird's gemacht: Memory hidump-1 LOAD "HIDUMP.BIN”, hidump Dabei kann hidump eine beliebige freie RAM-Adresse sein. Eine Initialisierung von HIDUMP ist nicht erforderlich. Für die Druckerausgabe muß dann einfach einer der 4 möglichen CALLs eingegeben werden. CALL hidump CALL hidump, links, rechts, oben, unten CALL hidump, da, db, de CALL hidump, links, rechts, oben, unten, da, db, de Für die nicht angegebenen Parameter werden Standardwerte genommen (siehe Text).
Zusatzfunktion: POKE hidump + &145,0 Druck ab erstem Tabulatorstop POKE hidump + &145,6 Druck ab linkem Papierrand. Weitere Hinweise: Gegebenenfalls LIST#8 abschalten. Bei der vortex-RAM-Erweiterung nicht SPOOL.ON verwenden. Vor und nach jedem Drucken (insbesondere nach ESCAPE) den Drucker aus- und wieder einschalten, um definierte Anfangsbedingungen zu schaffen. Steuerzeichen Die verwendeten Druckersteuerzeichen werden in den DATA-Zeilen 165,185 und 195 übertragen. Die Hex-Folge dazu ist 6, wert, CD, 30, BE, DO. Das DO bewirkt den Abbruch nach ESC; es muß nur gelegentlich angefügt werden. wert ist das jeweilige Steuerzeichen. Mit diesen Informationen kann man aus Zeile 165 ablesen: 9 (Vorschub zum Tabulatorstop); Zeile 185:1B, 4A, 12, D (n/216” Zeilenvorschub und Wagenrücklauf); Zeile 195:1B, 5A,... (Bitbildmodus vierfacher Dichte mit Bitanzahl n1, n2, die vom Programm berechnet und gesetzt wird). Für Anpassungen ist Zeile 185 von besonderem Interesse. Es kann nötig sein, einen anderen Zeilenvorschubbefehl zu verwenden. Dabei ist zu bedenken, daß die 12 dem Dezimalwert 18 entspricht. Für n/72” müßte man also 6 einsetzen.
Bei einem doppelten Zeilenvorschub mag es helfen, die 5 Byte für den Wagenrücklaufbefehl durch 0 zu ersetzen, sonst muß ein anderer Zeilenvorschubbefehl gewählt werden. Wenn ein solcher Befehl verwendet wird, der den Zeilenabstand voreinstellt, kann er in den freigehaltenen Platz (die vielen Nullen) in Zeile 165 eingefügt werden. Es ist übrigens nicht möglich, diese Nullen oder nicht benötigte Steuerzeichen (beim NLQ 401 ist der Wagenrücklaufbefehl überflüssig) einfach wegzulassen, da zusätzlich noch Sprungbefehle angepaßt werden müßten. Gerhard Knapienski , CPC Magazin
|