Aus 'ST-Computer', Ausgabe 3/92: 'Druckeransteuerung via GDOS' Das GFA-BASIC ab der Version 3.x verfgt im Prinzip ber alle n”tigen Funktio- nen fr den Umgang mit GDOS. Solange man seine Schriften nur auf dem Bild- schirm ausgibt, stellen sich auch keine Probleme. Interessant wird es aber, wenn man versucht, auch seinem Drucker GDOS-Qualit„t zukommen zu lassen. Hier st”žt man gleich auf mehrere Schwierigkeiten... Problematisch: Welche GDOS-Version muž es sein? GFA-BASIC steuert nur die GDOS-Versionen 1.x korrekt an, neuere Versionen wie z.B. AMC-GDOS fhren zum Absturz. Das ist umso „rgerlicher, da viele Program- me (z.B. GEMINI, INTERFACE, TURBO-C) die Arbeit mit den alten GDOS-Versionen strikt ablehnen, was aufgrund der Fehleranf„lligkeit auch zu verstehen ist. Das Scheitern der BASIC-Ansteuerung liegt wahrscheinlich in der fehlenden Handle-šbergabe beim Aufruf der VDI-Routinen. Die neueren GDOS-Versionen erwarten das Ger„tehandle immer in CONTRL(6), was das BASIC wohl vernachl„s- sigt. Das fhrt dazu, das alle VDI-Aufrufe wie TEXT oder PLOT auf den Bildschirm bezogen werden. Ausgespielt: Der DEFTEXT-Befehl. Zeichensatz und Gr”že stellt man normalerweise ber den Befehl 'DEFTEXT farbe,stil,winkel,h”he,font' ein. Vielleicht haben Sie sich schon einmal gefragt, warum dieser Befehl so eigen- artige Werte als Gr”ženangabe erwartet. Warum z.B. 13 fr die normale System- schrift, die doch eigentlich 16 Pixel hoch ist? Der Grund liegt in der Unterscheidung zwischen ZELLEN- und ZEICHENGR™žE. Die Zeichenzelle gibt das Raster an, in dem der Zeichensatz erstellt werden kann, also 8*16 beim Systemfont. Die Zeichengr”že dagegen sagt aus, wieviele Rasterpunkte tats„chlich belegt sind, also nur 7*13 beim Systemfont. DEFTEXT erwartet nun also die tats„chliche ZEICHENH™HE in Pixeln, was sich bereits bei unbekannten BILDSCHIRM-Zeichens„tzen als problematisch erweist. Bei der Drucker-Ansteuerung zeigt sich DEFTEXT aber von einer Seite, die man hinter seinem biederen Erscheinungsbild nicht vermuten wrde: Zun„chst hat ein Zeichen auf dem Drucker natrlich ganz andere Ausmaže, so daž die Pixelangabe viel zu ungenau ist. Aber damit k”nnte man noch leben, wenn nicht je nach Art und Anzahl der geladenen Zeichens„tze immer andere Er- gebnisse auf dem Drucker erscheinen, als man erwarteten drfte. Teilweise muž man den Befehl zweimal hintereinander ausfhren, damit er wirksam wird. Die tats„chlich eingestellte Gr”že der Zeichen scheint hier von allem m”glichen beeinflužt zu werden, nur nicht von DEFTEXT. Dieser Befehl fhrt also auf Bildschirm und Drucker zu unterschiedlichen Er- gebnissen und ist daher fr unsere Zwecke nicht zu gebrauchen. Die L”sung: VDI-Routinen im Eigenbau. GFA-BASIC gew„hrt uns den einfachen und C-kompatiblen Zugriff auf s„mtliche VDI-Routinen. Also schreiben wir die von uns ben”tigten Funktionen mit kor- rekter Handle-šbergabe selbst (Quelle 2). Da wir klugerweise bei dieser Gelegenheit auch die Routinen VST_FONT() und VST_POINT() implementieren, k”nnen wir auf den DEFTEXT Befehl ganz verzichten. šber VST_FONT() legen wir den Zeichensatz fest (entspricht dem 5. DEFTEXT Parameter), VST_POINT() stellt die Zeichenh”he in POINT ein. Point ist ein Satzmaž (ca. 0,353 mm) und findet h„ufig bei der Gr”ženangabe von Zeichens„t- zen Verwendung. Auch im Dateinamen eines GDOS-Fonts ist diese Angabe immer enthalten (z.B. 'ATTP10.FNT'). VST_POINT() hat als Rckgabewert die tats„chlich eingestellte Textgr”že, da die gewnschte H”he ja nicht unbedingt im Zeichensatz vorgesehen ist. Aužerdem werden noch die Zeichen- und Zellenausmaže des eingestellten Zei- chensatzes geliefert. Da wir den DEFTEXT-Befehl durch die VST_POINT()-Funktion ersetzen, erhalten wir sowohl fr den Bildschirm als auch den Drucker die gleichen Textgr”žen und mssen uns nicht mit der leidigen Pixelangabe herumschlagen. Ersatz fr den TEXT-Befehl: V_JUSTIFIED() Den TEXT-Befehl des GFA-BASIC ersetzen wir durch V_JUSTIFIED(). Da diese Funktion ein paar mehr Parameter als das GFA-Pendant erwartet, gibt es zur Vereinfachung die Prozedur text, die den Funktionsaufruf enth„lt (Zeile 345). Die zus„tzlichen Parameter beziehen sich auf die Ausrichtung des Textes, die in „hnlicher Form auch dem GFA-Befehl 'TEXT x&,y&,l&,a$' bergeben werden k”nnen. Der 3. Parameter liegt hierbei die L„nge der Textausgabe fest. Auf diese Weise kann ein Text ohne grože Mhe, und ohne direkt ver„ndert zu werden, im Blocksatz ausgegeben werden. Dies geschieht bei l&>0 ber die Ver- „nderung des Zeichenabstandes oder durch die Ver„nderung des Wortabstandes bei l&<0 (Quelle 1). Bei unserer Implementation V_JUSTIFIED() ist diese Angabe auf 3 Parameter verteilt. Hier kann fr den Zeichen- und Wortabstand getrennt angegeben werden, ob eine Dehnung stattfinden soll (>0) oder nicht (=0). Unverzichtbar: Das Ger„tehandle Unsere selbstgeschriebenen VDI-Funktionen erwarten als ersten Parameter immer das Ger„tehandle. Fr den Bildschirm bergeben wir hier V~H, eine BASIC-Variable, die das bei Programmstart ermittelte Bildschirm-Handle enth„lt. Fr den Drucker erhalten wir das Handle ber V_OPNWK() (Zeile 101). V_OPNWK() ist brigens der einzige GFA-GDOS-Befehl, den wir fr die Drucker- ausgabe verwenden k”nnen, alle anderen mssen ersetzt werden. Nun k”nnen wir, wie es auch im Sinne des VDI ist, Bildschirm und Drucker mit denselben Befehlen ansprechen. So geht's: Das Listing. Das vorliegende Programm l„dt die verfgbaren Zeichens„tze und gibt sie mit den gleichen Funktionen zun„chst auf dem Bildschirm und dann auf dem Drucker aus. Die folgende Beschreibung gilt daher sowohl fr die Bildschirm- als auch die Druckerausgabe. Fr den Bildschirm muž allerdings keine Workstation ge”ffnet (und am Ende wieder geschložen) werden, da dies bereits beim Start des GFA-BASIC geschieht. Speicherreservierung ber RESERVE. Fr das ™ffnen der Drucker-Workstation und das Laden der Zeichens„tze wird eine ganze Menge Speicher ben”tigt. Wieviel genau, ist von der Aufl”sung Ihres Druckers und der Anzahl der Zeichens„tze abh„ngig (beim FX85 z.B. ca. 400 KB, beim ATARI LASER 1,5 MB). šber RESERVE wird zun„chst der BASIC-Speicher eingeschr„nkt und dem System berlassen. Ein beliebter Anf„ngerfehler besteht darin, hier einen Wert zu verwenden, der nicht durch 256 teilbar ist, was dann bei der Freigabe meist zum 'Fehler bei RESERVE...' fhrt. 'Workstation ”ffne dich...' Dann ”ffnen wir fr den Drucker eine Workstation ber V_OPNWK() und erhalten das Handle zurck, ber das wir dieses Ger„t von nun an ansprechen k”nnen. Aus dem INTOUT()-Feld k”nnen wir diverse Informationen ber die Workstation auslesen. INTOUT(0) und INTOUT(1) z.B. geben die Aufl”sung des Ger„tes in Pixeln an. Die Felder mssen unmittelbar nach dem V_OPNWK()-Aufruf ausgelesen werden, da sie sonst durch andere Werte berschrieben werden. In C werden diese Informationen normalerweise aus dem GEM WORK_OUT()-Feld gelesen. Auch im GFA-BASIC existiert dieses Feld. Allerdings enth„lt es IMMER die Parameter, die der V_OPNVWK()-Aufruf beim Start des GFA-BASIC fr den BILDSCHIRM ergeben hat. Diese Tatsache geht aus dem BASIC-Handbuch nicht klar hervor und ist sicherlich fr den Anf„nger zun„chst verwirrend. Das Laden der Zeichens„tze. Die Zeichens„tze werden ber ~VST_LOAD_FONTS() geladen bzw. verfgbar ge- macht. Nun ermitteln wir die vorhandenen Zeichens„tze und ihren Index mittels VQT_NAME(). Nur ber diesen Index k”nnen wir die Fonts sp„ter ansprechen. Jede Schriftenfamilie hat einen eigenen Index, SWISS z.B. hat die Nummer 2. ~VST_LOAD_FONTS() l„dt verst„ndlicherweise auch immer nur einen Vertreter dieser Familie. M”chten Sie also mehrere Zeichens„tze einer Familie (z.B: SWISS, EPSON SWISS und IBM SWISS) gleichzeitig installieren, um sie besser vergleichen zu k”nnen, so wrde nur der als erster im ASSIGN.SYS eingetrage- ne Zeichensatz geladen werden. Wenn Sie allerdings wissen, daž der Fontindex im ersten Wort des Zeichensatz- headers steht, so k”nnen Sie diesen Wert PROVISORISCH mit einem geeigneten Texteditor (Tempus, Mortimer) „ndern. Welche Pointgr”žen gibt es? Zur Ermittlung der vorhandenen Pointgr”žen w„re es am besten, sich ber die sogenannte FONT-RING-LISTE durch die Header der einzelnen Zeichens„tze zu hangeln. Hierzu mžten wir aber eine LINE_A-Variable benutzen, weshalb wir auf diese M”glichkeit verzichten und stattdessen folgende anwenden: Die Funktion VST_POINT() liefert die tats„chlich eingestellte Pointgr”že zu- rck. In der Prozedur point_groessen (Zeile 145) gehen wir nun alle Zeichen- s„tze durch, probieren alle m”glichen H”hen aus und tragen die tats„chlich eingestellten Gr”žen im String s_point$() bzw. p_point$() ein. Der Nachteil dieser Methode: Da der ROM-Bildschirmtreiber Zeichens„tze auf die doppelte Gr”že skalieren kann, werden auch H”hen zurckgegeben, die nicht als eigener Zeichensatz existieren. Die Qualit„t dieser vergr”žerten Schriften l„žt meist zu wnschen brig. Wir wissen nun, welche Zeichens„tze es gibt und in welchen Gr”žen wir sie ausgeben k”nnen. Die Ausgabe kann beginnen. Nun stellen wir mittels VST_FONT() den gewnschten Zeichensatz und ber VST_POINT() seine Gr”že ein und geben die Texte ber V_JUSTIFIED() aus. Bei der Bildschirmausgabe erscheinen die Schriften sofort, beim Drucker werden sie zun„chst in einem internen Puffer (Display-List) gespeichert und erst ber V_UPDWK() ausgedruckt. Danach entfernen wir die Fonts ber VST_UNLOAD_FONTS(), schliežen die Druk- ker-Workstation mit V_CLSWK() und geben den reservierten Speicher wieder frei. Nachsatz zur Kl„rung. Die im Text genannten Probleme mit den GFA-Befehlen beziehen sich lediglich auf die DRUCKER-Ansteuerung. Solange Sie Ihre Ausgaben nur auf dem Bildschirm t„tigen, k”nnen Sie sowohl neuere GDOS-Versionen als auch die GFA-eigenen Funktionen (TEXT, DEFTEXT, VST_LOAD_FONTS() usw.) verwenden. Allerdings ist auch hier der Ersatz von DEFTEXT durch VST_POINT() zur Ein- stellung der Fontgr”že sinnvoll, da so eine wesentlich pr„zisere Gr”ženangabe m”glich ist. Quellenangaben: 1. GFA-BASIC 3.0 Handbuch, GFA-Systemtechnik GmbH 2. ATARI ST/STE/TT-Profibuch, 10. Auflage, Sybex Verlag Gregor Duchalski