     Aus 'ST-Computer', Ausgabe 3/92: 'Druckeransteuerung via GDOS'

     Das GFA-BASIC ab der Version 3.x verfgt im Prinzip ber alle ntigen 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-Qualitt zukommen zu lassen.
     Hier stt 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 Fehleranflligkeit 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 Gertehandle immer in CONTRL(6), was das BASIC wohl vernachls-
      sigt. Das fhrt dazu, das alle VDI-Aufrufe wie TEXT oder PLOT auf den
      Bildschirm bezogen werden.

     Ausgespielt: Der DEFTEXT-Befehl.
      Zeichensatz und Gre stellt man normalerweise ber den Befehl 'DEFTEXT
      farbe,stil,winkel,hhe,font' ein.
      Vielleicht haben Sie sich schon einmal gefragt, warum dieser Befehl so eigen-
      artige Werte als Grenangabe 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 ZEICHENGRE.
      Die Zeichenzelle gibt das Raster an, in dem der Zeichensatz erstellt werden
      kann, also 8*16 beim Systemfont. Die Zeichengre dagegen sagt aus, wieviele
      Rasterpunkte tatschlich belegt sind, also nur 7*13 beim Systemfont.

      DEFTEXT erwartet nun also die tatschliche ZEICHENHHE in Pixeln, was sich
      bereits bei unbekannten BILDSCHIRM-Zeichenstzen als problematisch erweist.
      Bei der Drucker-Ansteuerung zeigt sich DEFTEXT aber von einer Seite, die man
      hinter seinem biederen Erscheinungsbild nicht vermuten wrde:
      Zunchst hat ein Zeichen auf dem Drucker natrlich ganz andere Ausmae, so
      da die Pixelangabe viel zu ungenau ist. Aber damit knnte man noch leben,
      wenn nicht je nach Art und Anzahl der geladenen Zeichenstze 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
      tatschlich eingestellte Gre der Zeichen scheint hier von allem mglichen
      beeinflut 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 Lsung: VDI-Routinen im Eigenbau.
      GFA-BASIC gewhrt uns den einfachen und C-kompatiblen Zugriff auf smtliche
      VDI-Routinen. Also schreiben wir die von uns bentigten Funktionen mit kor-
      rekter Handle-bergabe selbst (Quelle 2).
      Da wir klugerweise bei dieser Gelegenheit auch die Routinen VST_FONT() und
      VST_POINT() implementieren, knnen wir auf den DEFTEXT Befehl ganz
      verzichten.
      ber VST_FONT() legen wir den Zeichensatz fest (entspricht dem 5. DEFTEXT
      Parameter), VST_POINT() stellt die Zeichenhhe in POINT ein. Point ist ein
      Satzma (ca. 0,353 mm) und findet hufig bei der Grenangabe von Zeichenst-
      zen Verwendung. Auch im Dateinamen eines GDOS-Fonts ist diese Angabe immer
      enthalten (z.B. 'ATTP10.FNT').
      VST_POINT() hat als Rckgabewert die tatschlich eingestellte Textgre,
      da die gewnschte Hhe ja nicht unbedingt im Zeichensatz vorgesehen ist.
      Auerdem werden noch die Zeichen- und Zellenausmae 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 Textgren
      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 enthlt (Zeile 345).
      Die zustzlichen Parameter beziehen sich auf die Ausrichtung des Textes, die
      in hnlicher Form auch dem GFA-Befehl 'TEXT x&,y&,l&,a$' bergeben werden
      knnen. Der 3. Parameter liegt hierbei die Lnge der Textausgabe fest.
      Auf diese Weise kann ein Text ohne groe Mhe, und ohne direkt verndert zu
      werden, im Blocksatz ausgegeben werden. Dies geschieht bei l&>0 ber die Ver-
      nderung des Zeichenabstandes oder durch die Vernderung 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 Gertehandle
      Unsere selbstgeschriebenen VDI-Funktionen erwarten als ersten Parameter
      immer das Gertehandle. Fr den Bildschirm bergeben wir hier V~H, eine
      BASIC-Variable, die das bei Programmstart ermittelte Bildschirm-Handle
      enthlt. 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 knnen, alle anderen mssen ersetzt werden.

      Nun knnen wir, wie es auch im Sinne des VDI ist, Bildschirm und Drucker
      mit denselben Befehlen ansprechen.

     So geht's: Das Listing.
      Das vorliegende Programm ldt die verfgbaren Zeichenstze und gibt sie mit
      den gleichen Funktionen zunchst 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 geffnet
      (und am Ende wieder geschloen) werden, da dies bereits beim Start des
      GFA-BASIC geschieht.

     Speicherreservierung ber RESERVE.
      Fr das ffnen der Drucker-Workstation und das Laden der Zeichenstze wird
      eine ganze Menge Speicher bentigt. Wieviel genau, ist von der Auflsung
      Ihres Druckers und der Anzahl der Zeichenstze abhngig (beim FX85 z.B. ca.
      400 KB, beim ATARI LASER 1,5 MB).
      ber RESERVE wird zunchst der BASIC-Speicher eingeschrnkt und dem System
      berlassen. Ein beliebter Anfngerfehler 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 Gert von nun an ansprechen knnen.
      Aus dem INTOUT()-Feld knnen wir diverse Informationen ber die Workstation
      auslesen. INTOUT(0) und INTOUT(1) z.B. geben die Auflsung des Gertes 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 enthlt 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 Anfnger zunchst verwirrend.

     Das Laden der Zeichenstze.
      Die Zeichenstze werden ber ~VST_LOAD_FONTS() geladen bzw. verfgbar ge-
      macht. Nun ermitteln wir die vorhandenen Zeichenstze und ihren Index mittels
      VQT_NAME(). Nur ber diesen Index knnen wir die Fonts spter ansprechen.
      Jede Schriftenfamilie hat einen eigenen Index, SWISS z.B. hat die Nummer 2.
      ~VST_LOAD_FONTS() ldt verstndlicherweise auch immer nur einen Vertreter
      dieser Familie. Mchten Sie also mehrere Zeichenstze einer Familie (z.B:
      SWISS, EPSON SWISS und IBM SWISS) gleichzeitig installieren, um sie besser
      vergleichen zu knnen, 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 knnen Sie diesen Wert PROVISORISCH mit einem geeigneten
      Texteditor (Tempus, Mortimer) ndern.

     Welche Pointgren gibt es?
      Zur Ermittlung der vorhandenen Pointgren wre es am besten, sich ber die
      sogenannte FONT-RING-LISTE durch die Header der einzelnen Zeichenstze zu
      hangeln. Hierzu mten wir aber eine LINE_A-Variable benutzen, weshalb wir
      auf diese Mglichkeit verzichten und stattdessen folgende anwenden:
      Die Funktion VST_POINT() liefert die tatschlich eingestellte Pointgre zu-
      rck. In der Prozedur point_groessen (Zeile 145) gehen wir nun alle Zeichen-
      stze durch, probieren alle mglichen Hhen aus und tragen die tatschlich
      eingestellten Gren im String s_point$() bzw. p_point$() ein.
      Der Nachteil dieser Methode: Da der ROM-Bildschirmtreiber Zeichenstze auf
      die doppelte Gre skalieren kann, werden auch Hhen zurckgegeben, die
      nicht als eigener Zeichensatz existieren. Die Qualitt dieser vergrerten
      Schriften lt meist zu wnschen brig.

      Wir wissen nun, welche Zeichenstze es gibt und in welchen Gren wir sie
      ausgeben knnen.

     Die Ausgabe kann beginnen.
      Nun stellen wir mittels VST_FONT() den gewnschten Zeichensatz und ber
      VST_POINT() seine Gre ein und geben die Texte ber V_JUSTIFIED() aus. Bei
      der Bildschirmausgabe erscheinen die Schriften sofort, beim Drucker werden
      sie zunchst in einem internen Puffer (Display-List) gespeichert und erst
      ber V_UPDWK() ausgedruckt.

      Danach entfernen wir die Fonts ber VST_UNLOAD_FONTS(), schlieen die Druk-
      ker-Workstation mit V_CLSWK() und geben den reservierten Speicher wieder
      frei.

     Nachsatz zur Klrung.
      Die im Text genannten Probleme mit den GFA-Befehlen beziehen sich lediglich
      auf die DRUCKER-Ansteuerung. Solange Sie Ihre Ausgaben nur auf dem Bildschirm
      ttigen, knnen 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 Fontgre sinnvoll, da so eine wesentlich przisere Grenangabe
      mglich ist.

     Quellenangaben:
      1. GFA-BASIC 3.0 Handbuch,
         GFA-Systemtechnik GmbH
      2. ATARI ST/STE/TT-Profibuch,
         10. Auflage, Sybex Verlag

     Gregor Duchalski
