Das GFA-BASIC ab der Version 3.x verfügt im Prinzip über alle nötigen Funktionen für den Umgang mit GDOS. Solange man seine Schriften nur auf dem Bildschirm 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 führen zum Absturz. Das ist umso ärgerlicher, da viele Programme (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ässigt. Das führt dazu, das alle VDI-Aufrufe wie TEXT oder PLOT auf den Bildschirm bezogen werden.
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 eigenartige Werte als Größenangabe erwartet. Warum z.B. 13 für die normale Systemschrift, 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 816 beim Systemfont. Die Zeichengröße dagegen sagt aus, wieviele Rasterpunkte tatsächlich belegt sind, also nur 713 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 würde: Zunächst hat ein Zeichen auf dem Drucker natürlich 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 Ergebnisse auf dem Drucker erscheinen, als man erwarteten dürfte. Teilweise muß man den Befehl zweimal hintereinander ausführen, 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 führt also auf Bildschirm und Drucker zu unterschiedlichen Ergebnissen und ist daher für unsere Zwecke nicht zu gebrauchen.
Die Lösung lautet: 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 korrekter 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ätzen Verwendung. Auch im Dateinamen eines GDOS-Fonts ist diese Angabe immer enthalten (z.B. 'ATTP10.FNT'). VST_POINT() hat als Rückgabewert die tatsächlich eingestellte Textgröße, da die gewünschte Höhe ja nicht unbedingt im Zeichensatz vorgesehen ist. Außerdem werden noch die Zeichen- und Zellenausmaße des eingestellten Zeichensatzes geliefert.
Da wir den DEFTEXT-Befehl durch die VST_POINT()-Funktion ersetzen, erhalten wir sowohl für den Bildschirm als auch den Drucker die gleichen Textgrößen und müssen uns nicht mit der leidigen Pixelangabe herumschlagen.
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 Mühe, 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 für den Zeichen- und Wortabstand getrennt angegeben werden, ob eine Dehnung stattfinden soll (>0) oder nicht (=0).
Unsere selbstgeschriebenen VDI-Funktionen erwarten als ersten Parameter immer das Gerätehandle. Für den Bildschirm übergeben wir hier V~H, eine BASIC-Variable, die das bei Programmstart ermittelte Bildschirm-Handle enthält. Für den Drucker erhalten wir das Handle über V_OPNWK() (Zeile 101). V_OPNWK() ist übrigens der einzige GFA-GDOS-Befehl, den wir für die Druckerausgabe verwenden können, alle anderen müssen ersetzt werden.
Nun können wir, wie es auch im Sinne des VDI ist, Bildschirm und Drucker mit denselben Befehlen ansprechen.
Das vorliegende Programm lädt die verfügbaren 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 für die Bildschirm- als auch die Druckerausgabe. Für den Bildschirm muß allerdings keine Workstation geöffnet (und am Ende wieder geschloßen) werden, da dies bereits beim Start des GFA-BASIC geschieht.
Für 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...' führt.
Dann öffnen wir für den Drucker eine Workstation über V_OPNWK() und erhalten das Handle zurück, ü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 müssen 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 für den BILDSCHIRM ergeben hat. Diese Tatsache geht aus dem BASIC-Handbuch nicht klar hervor und ist sicherlich für den Anfänger zunächst verwirrend.
Die Zeichensätze werden über ~VST_LOAD_FONTS() geladen bzw. verfügbar gemacht. 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 würde nur der als erster im ASSIGN.SYS eingetragene Zeichensatz geladen werden.
Wenn Sie allerdings wissen, daß der Fontindex im ersten Wort des Zeichensatzheaders steht, so können Sie diesen Wert PROVISORISCH mit einem geeigneten Texteditor (Tempus, Mortimer) ändern.
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 zurück. In der Prozedur point_groessen (Zeile 145) gehen wir nun alle Zeichensä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 zurückgegeben, die nicht als eigener Zeichensatz existieren. Die Qualität dieser vergrößerten Schriften läßt meist zu wünschen übrig.
Wir wissen nun, welche Zeichensätze es gibt und in welchen Größen wir sie ausgeben können.
Nun stellen wir mittels VST_FONT() den gewünschten 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 Drucker-Workstation mit V_CLSWK() und geben den reservierten Speicher wieder frei.
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 Einstellung der Fontgröße sinnvoll, da so eine wesentlich präzisere Größenangabe möglich ist.
Quellenangaben:
"GDOS" macht's möglich: Schriften in hoher Qualität für Bildschirm und Drucker... Bild 2: Wichtiger Unterschied: Zeichen und Zellengröße
'
' GDOS/VDI-Routinen für GFA-BASIC 3.x
'
' von Gregor Duchalski, Baueracker 15a, 4690 Herne 1
' eMail: GREGOR DUCHALSKI @ DO im MausNet
'
' last change 10.09.92
' ------------------------------------------------------------------------------
' Das GFA-BASIC unterstützt leider neuere GDOS-Versionen wie AMC-GDOS oder FSM-
' GDOS nicht korrekt, gerade bei der Druckerausgabe kommt es zu Abstürzen. Daher
' ersetzen wir diese Routinen durch Eigenimplementation der VDI-Funktionen.
' Das bringt weitere Vorteile, wie die Umgehung des ungenauen DEFTEXT-Befehles.
'
' Diese Routinen wurden zum ersten Mal in der Zeitschrift ST COMPUTER, Ausgabe
' 3/92, Seite 80, 'Druckeransteuerung via GDOS', vorgestellt. Dieser Text befin-
' det sich unter dem Namen 'GDOS.TXT' ebenfalls im Lieferumfang.
' Näheres entnehmen Sie bitte entsprechender Fachliteratur (Profibuch).
'
' Das vorliegende Listing dient als Beispiel für die GDOS-Ansteuerung. Außerdem
' enthält es weitere VDI-Funktionen, die aber vom Programm selbst nicht benötigt
' werden.
'
' Bitte vor dem Start den INLINE in 'vq_vgdos' einlesen!
' ------------------------------------------------------------------------------
'
gdos_init
screen_fonts
drucker_fonts
'
gdos_exit
'
> PROCEDURE gdos_init
'
' Der RESERVE-Wert MUß durch 256 sein!
fre%=1560*256
'
' Kein Gdos vorhanden
IF GDOS?=FALSE
PRINT "Kein GDOS..."
END
ENDIF
'
' Kein Drucker vorhanden
IF OUT?(0)=FALSE
PRINT "Kein Drucker..."
END
ENDIF
'
' Speicher reservieren
RESERVE FRE(0)-fre%
'
RETURN
> PROCEDURE gdos_exit
'
' Falls überhaupt geöffnet...
IF handle&>0
'
' Druckerfonts entfernen
~@vst_unload_fonts(handle&,0)
'
' Drucker-Workstation schließen
~@v_clswk(handle&)
'
ENDIF
'
' Bildschirmfonts entfernen
~@vst_unload_fonts(V~H,0)
'
' Speicher restaurieren
RESERVE FRE(0)+fre%
'
END
'
RETURN
'
> PROCEDURE screen_fonts
'
' Felder für Index, Name und Größen
DIM s_fnt&(10),s_fnt$(10),s_point$(10)
'
' Fonts laden
s_anz&=SUCC(VST_LOAD_FONTS(0))
'
FOR i&=1 TO s_anz&
'
' Fontindex
s_fnt&(i&)=VQT_NAME(i&,a$)
'
' Fontname
s_fnt$(i&)=a$
'
NEXT i&
'
' Pointgrößen in s_point$() eintragen
point_groessen(V~H,s_anz&,s_fnt&(),s_point$())
'
CLS
PRINT "Verfügbare Bildschirmfonts:"
'
fonts_anzeigen(s_anz&,s_fnt$(),s_point$())
'
IF a|=27 !ESC=>Abbruch
gdos_exit
ENDIF
'
fonts_ausgeben(V~H) !Bildschirmausgabe
'
KEYGET a| !Tastendruck
'
RETURN
> PROCEDURE drucker_fonts
'
' Felder für Index, Name und Größen
DIM p_fnt&(10),p_fnt$(10),p_point$(10)
'
' Drucker-Workstation öffnen. Der ein-
' zige GFA-GDOS-Befehl, den wir zur
' Druckeransteurung noch verwenden.
handle&=V_OPNWK(21)
'
' Fehler bei V_OPNWK()
IF handle&<=0
PRINT "Fehler bei V_OPNWK(21)..."
gdos_exit
ENDIF
'
' Fonts laden
p_anz&=SUCC(@vst_load_fonts(handle&,0))
'
FOR i&=1 TO p_anz&
'
' Fontindex
p_fnt&(i&)=@vqt_name(handle&,i&,a$,fsm_flag&)
'
' Ist fsm_flag&<>0, dann ist der Font freiskalierbar
'
' Fontname
p_fnt$(i&)=a$
'
NEXT i&
'
' Pointgrößen in p_point$() eintragen
point_groessen(handle&,p_anz&,p_fnt&(),p_point$())
'
CLS
PRINT "Verfügbare Druckerfonts:"
'
fonts_anzeigen(p_anz&,p_fnt$(),p_point$())
'
IF a|<>27 ! ESC=>Abbruch
'
' Druckerausgabe, zunächst auf
' einen internen Puffer
fonts_ausgeben(handle&)
'
' Seite drucken
~@v_updwk(handle&)
'
ENDIF
'
RETURN
' -------------------------------------------------------- SCREEN & PRINTER
> PROCEDURE point_groessen(handle&,anz&,VAR a&(),a$())
LOCAL i&,a&,b&,c&
'
' Hier werde für jeden Font die ver-
' baren Pointgrößen ermittelt und in
' s_point$() für den Bildschirm und
' p_point$() für den Drucker
' eingetragen...
'
' Alle Fonts durchgehen
FOR i&=1 TO anz&
'
' Font einstellen
a&=@vst_font(handle&,a&(i&))
'
a&=999
b&=a&
'
WHILE a&>1
'
c&=b&
'
' Neue Größe setzen
b&=@vst_point(handle&,a&,a&,a&,a&,a&)
'
' Keine neue Höhe, also Schluß
EXIT IF c&=b&
'
' Nächste Pointhöhe eintragen
a$(i&)=a$(i&)+CHR$(b&)
'
a&=PRED(b&)
'
WEND
'
NEXT i&
'
RETURN
> PROCEDURE fonts_anzeigen(anz&,VAR a$(),b$())
LOCAL i&,t&
'
' Diese Prozedur zeigt an, welche
' Fonts geladen wurden und welche
' Pointhöhen verfügbar sind...
'
PRINT AT(40,1);"Pointgrößen:"
'
FOR i&=1 TO anz&
'
PRINT AT(1,i&+2);a$(i&);AT(40,i&+2);
'
FOR t&=1 TO LEN(b$(i&))
PRINT ",";ASC(MID$(b$(i&),t&,1));
NEXT t&
PRINT
'
NEXT i&
'
PRINT
PRINT "Taste drücken, ESC zum Abbruch..."
'
KEYGET a| ! Tastendruck
'
RETURN
> PROCEDURE fonts_ausgeben(handle&)
'
' Zuerst Font 2, 10 points hoch...
~@vst_font(handle&,s_fnt&(2))
~@vst_point(handle&,10,a&,a&,a&,a&)
text(10,160,s_fnt$(2)+" in 10 Points...")
'
' Font 2, 12 points hoch...
~@vst_point(handle&,12,a&,a&,a&,a&)
text(10,220,s_fnt$(2)+" in 12 Points...")
'
' Font 3, wieder 10 points
~@vst_font(handle&,s_fnt&(3))
~@vst_point(handle&,10,a&,a&,a&,a&)
text(10,280,s_fnt$(3)+" in 10 Points...")
'
RETURN
' -------------------------------------------------------- VDI-Bindings
> FUNCTION vq_vgdos
$F%
LOCAL a%
'
' Ermittelt, ob und welches GDOS vorhanden ist und gibt eine
' entsprechende Kennung zurück...
'
' Hier die Datei 'VQ_VGDOS.INL' einladen:
INLINE vq_vgdos_asm%,10
'
a%=C:vq_vgdos_asm%() ! TRAP #2 Aufruf
'
IF WORD(a%)=-2 ! D0 unverändert...
RETURN 0 ! ...kein GDOS
'
ELSE IF MKL$(a%)="_FSM" ! D0="_FSM"...
RETURN a% ! ...FSMGDOS installed
'
ELSE IF MKL$(a%)="_FNT" ! D0="_FNT"...
RETURN a% ! ...FONT-GDOS installed
'
ENDIF
'
RETURN CVL("GDOS") ! ...sonst normales GDOS
ENDFUNC
'
> FUNCTION v_updwk(handle&)
'
CONTRL(6)=handle& ! Gerätehandle
'
VDISYS 4,0,0
'
RETURN 0 ! Void
ENDFUNC
> FUNCTION v_clswk(handle&)
'
CONTRL(6)=handle& ! Gerätehandle
'
VDISYS 2,0,0
'
RETURN 0 ! Void
ENDFUNC
> FUNCTION v_clrwk(handle&)
$F%
'
CONTRL(6)=handle&
'
VDISYS 3,0,0
'
RETURN 0
ENDFUNC
'
> FUNCTION vst_load_fonts(handle&,a&)
'
INTIN(0)=a& ! Reserviert, 0
'
CONTRL(6)=handle& ! Gerätehandle
'
VDISYS 119,1,0
'
RETURN INTOUT(0) ! Anzahl Fonts
ENDFUNC
> FUNCTION vst_unload_fonts(handle&,a&)
'
INTIN(0)=a& ! Reserviert, 0
'
CONTRL(6)=handle& ! Gerätehandle
'
VDISYS 120,1,0
'
RETURN 0 ! Void
ENDFUNC
> FUNCTION vqt_name(handle&,nr&,VAR a$,i&)
$F%
LOCAL a%,a|
'
' Diese Routinen gibt in i& einen Wert <>0 zurück, wenn der Fonts
' freiskalierbar ist (FSM-GDOS).
'
a$=SPACE$(32)
a%=V:a$
'
INTIN(0)=nr&
'
CONTRL(6)=handle&
'
VDISYS 130,1,0
'
FOR i&=1 TO 32
'
a|=INTOUT(i&)
EXIT IF a|=0
'
BYTE{a%}=a|
INC a%
'
NEXT i&
'
i&=INTOUT(33)
a$=TRIM$(a$)
'
RETURN INTOUT(0)
ENDFUNC
'
> FUNCTION vst_font(handle&,nr&)
'
' Entspricht DEFTEXT ,,,,x
'
INTIN(0)=nr& ! Font-Index
'
CONTRL(6)=handle& ! Gerätehandle
'
VDISYS 21,1,0
'
RETURN INTOUT(0) ! Gesetzter Font
ENDFUNC
> FUNCTION vst_point(handle&,h&,VAR a&,b&,c&,d&)
'
INTIN(0)=h& ! Pointhöhe
'
CONTRL(6)=handle& ! Gerätehandle
'
VDISYS 107,1,0
'
a&=PTSOUT(0) ! Zeichenbreite
b&=PTSOUT(1) ! Zeichenhöhe
c&=PTSOUT(2) ! Zellenbreite
d&=PTSOUT(3) ! Zellenhöhe
'
RETURN INTOUT(0) ! Gesetzte Höhe
ENDFUNC
> FUNCTION v_justified(handle&,x&,y&,l&,w&,z&,a$)
'
' TEXT
'
PTSIN(0)=x& ! x-Position
PTSIN(1)=y& ! y-Position
'
PTSIN(2)=l& ! Textlänge
PTSIN(3)=0 ! reserviert
'
' Die beiden nächsten Parameter legen
' für Wort- und Zeichenzwischenräume
' getrennt fest,ob eine Dehnung statt-
' finden soll (>0) oder nicht (=0).
' Beim GFA-Befehl TEXT sind diese An-
' gaben und die Textlänge (PTSIN(2))
' im 3.Parameter zusammengefasst.
'
INTIN(0)=w& ! Wortzwischenraum
INTIN(1)=z& ! Zeichenzwischenraum
'
l&=LEN(a$) ! Stringlänge
'
FOR i&=1 TO l& ! String
INTIN(SUCC(i&))=ASC(MID$(a$,i&))
NEXT i&
'
CONTRL(6)=handle& ! Gerätehandle
'
VDISYS 11,ADD(l&,2),2,10
'
RETURN 0 ! Void
ENDFUNC
'
> PROCEDURE text(x&,y&,a$)
'
' ------------------------------------
' Diese Prozedur dient nur der
' Vereinfachung des TEXT-Aufrufes.
' Die Ausrichtung des Textes über die
' Dehnung der Wort-oder Zeichenabstän-
' de wird hier nicht berücksichtigt.
'
~@v_justified(handle&,x&,y&,0,0,0,a$)
'
RETURN
' -------------------------------------------------------- Weitere VDI-Bindings
> PROCEDURE vswr_mode(handle&,a&)
'
' Entpricht GRAPHMODE
'
INTIN(0)=a&
CONTRL(6)=handle&
'
VDISYS 32,1,0
'
RETURN
> PROCEDURE vqt_extent(handle&,a$,VAR a&,b&,c&,d&,e&,f&,g&,h&)
LOCAL i&,l&
'
' a$=a$+CHR$(0)
'
l&=LEN(a$)
'
FOR i&=1 TO l&
INTIN(PRED(i&))=ASC(MID$(a$,i&,1))
NEXT i&
'
CONTRL(6)=handle&
'
VDISYS 116,l&,0
'
a&=PTSOUT(0)
b&=PTSOUT(1)
c&=PTSOUT(2)
d&=PTSOUT(3)
e&=PTSOUT(4)
f&=PTSOUT(5)
g&=PTSOUT(6)
h&=PTSOUT(7)
'
RETURN
> FUNCTION vst_alignment(handle&,a&,b&)
$F%
'
INTIN(0)=a& !x-Beginn setzen 0-2
INTIN(1)=b& !y_Beginn setzen 0-7
'
CONTRL(6)=handle&
'
VDISYS 39,2,0
'
RETURN 0
ENDFUNC
> FUNCTION vs_clip(handle&,a&,x&,y&,w&,h&)
'
' Entspricht CLIP
'
INTIN(0)=a&
'
PTSIN(0)=x&
PTSIN(1)=y&
PTSIN(2)=ADD(x&,PRED(w&))
PTSIN(3)=ADD(y&,PRED(h&))
'
CONTRL(6)=handle&
'
VDISYS 129,1,2
'
RETURN 0
ENDFUNC
> PROCEDURE v_bit_image(handle&,a$,a&,b&,c&,d&,e&,x&,y&,w&,h&)
LOCAL i&,j&
'
' Gibt eine IMG-Datei auf der Workstation aus.
'
CONTRL(6)=handle&
'
INTIN(0)=a&
INTIN(1)=b&
INTIN(2)=c&
INTIN(3)=d&
INTIN(4)=e&
'
j&=4
FOR i&=0 TO PRED(LEN(a$))
'
INC j&
INTIN(j&)=BYTE{ADD(V:a$,i&)}
'
NEXT i&
'
INC j&
'
PTSIN(0)=x&
PTSIN(1)=y&
PTSIN(2)=ADD(x&,PRED(w&))
PTSIN(3)=ADD(y&,PRED(h&))
'
VDISYS 5,j&,2,23
'
RETURN