Die Ästheten unter den ST-Anwendern blicken schon immer neidisch auf gewisse andere Fabrikate, die von vornherein mit hübsch proportionalen Zeichensätzen arbeiten. Zwar ist auch der ST von Natur aus dazu geeignet, doch die meisten Hobby-Programmierer verzichten darauf, sich dafür durch den GEM/VDI-Dschungel zu kämpfen. Für einfache Anwendungen genügt aber auch die hier vorgestellte kurze Omikron.BASIC-Routine. Sie verwendet Signum! Bildschirm-Fonts (die als Public Domain reichlich zur Verfügung stehen) und kommt ohne GEMLIB aus.
Die Routine PLOAD() lädt eine/mehrere E24-Dateien in den Speicher und patcht sie für die Ausgabe mit BITBLT. Jeder Zeichensatz muß dabei mit einem Namen gekennzeichnet werden, so daß später mit der Anweisung FONT=Name ein beliebiger Zeichensatz ausgewählt werden kann. Am Ende des Programms sollte der Speicher mit FRE(Name) wieder freigegeben werden.
Die Routine PTEXT(X,Y,Text$) wird genau wie die BASIC-Anweisung TEXT eingesetzt - mit dem Unterschied, daß die Variable X danach auf das Ende des ausgegebenen Textes zeigt, so daß man die nächste freie Position auf dem Bildschirm kennt.
Arno Maurer, W-7400 Tübingen 1
Pload ("SWISS.K24",Swiss)
INPUT " Probetext? ";T$
Font=Swiss
CLS
Ptext(90,90,T$)
FRE(Swiss)
END
'
DEF PROC Pload(File$, R Font)
LOCAL A,I
OPEN "I",1,File$
Font=MEMORY(LOF(1))
CLOSE 1
BLOAD File$,Font
FOR I=1 TO 127
A=Font+652+LPEEK(Font+I*4+140)
POKE Font+I, PEEK(A)
POKE A+3,PEEK(A+1)
WPOKE A,PEEK(A+2)
POKE A+2,0
NEXT I
RETURN
'
DEF PROC Ptext(X,Y,Text$)
LOCAL A,B,I,S,Z
FOR I=1 TO LEN(Text$)
Z=ASC(MID$(TextS,I,1))
S=INSTR("äöüÄÖܧß",CHR$(Z))
IF Z=32 THEN Z=0
IF S THEN
Z=ASC(MID$("][@}{\ "+CHRS(127),S,1))
ENDIF
IF Z>127 OR Z=0 THEN
X=X+8
ELSE
S=WPEEK(A)
WPOKE A,2
B=WPEEK(A+2)
BITBLT A TO X,Y-17+PEEK(Font+Z),B, WPEEK(A+4),7
WPOKE A,S
X=X+B
ENDIF
NEXT I
RETURN
Listing 1: Signum!-Zeichensätze in Omikron.BASiC
Der GFA-BASIC-Befehl DEFLINE [stil], [dicke], [anfang_s, end_s] erlaubt bekanntlich neben der Wahl von Liniendicke, Anfang- und Endsymbol auch das Festlegen des Linienstils für die Befehle LINE, BOX usw. Hier gibt es die Möglichkeit, zusätzlich zu den 6 bzw. 7 vordefinierten Linienarten auch selbstdefinierte Muster zu benutzen - wenn man weiß, wie. Alle mir bekannten Angaben dazu (einschl. orig. GFA-Handbuch, allerdings 1. Aufl. vom Mai ’88) sind entweder unvollständig oder schlicht falsch.
Der Knackpunkt ist, daß das gewünschte Linienmuster als 16-Bit-Wert im Zweierkomplement angegeben werden muß (das scheint komplizierter zu sein, als es tatsächlich ist)!
Beispielsweise erhält man eine Linie aus je zwei gesetzten und zwei nicht gesetzten Punkten durch den Befehl
DEFLINE 1+NOT &X1100110011001100,1,0,0
bzw., wenn das Muster in einer Variablen vorliegt, mit
stil%=&X110011001100H00
DEFLINE 1+NOT stil%,1,0,0
Die Übergabe des Wertes für das Muster als negative Zahl (wie es in den meisten Veröffentlichungen dazu immerhin heißt) ergibt sich so von selbst - diesmal jedoch mit dem erwarteten Ergebnis. Dabei ist die Reihenfolge der Operatoren wichtig:... NOT wert+1... liefert ein falsches Ergebnis. Es geht aber... (NOT wert)+1.
Volker Goreth, W-4150 Krefeld I
Wer fand es noch nicht ärgerlich, daß man mit dem PRINT-Befehl immer nur den normalen Zeichensatz benutzen kann? Dabei gäbe es so viele Anwendungen, bei denen man den kleinen Zeichensatz (88) wesentlich besser einsetzen könnte. Es wäre sicherlich sehr interessant, wenn man statt 25 nunmehr 50 Zeilen auf dem Monitor unterbringen könnte! Tabellen, die normalerweise auf zwei Seiten aufgeteilt werden müßten, passen nun auf einmal auf eine Seite; Listings und Texte werden wesentlich übersichtlicher. Die einzige Abhilfe für dieses Problem war bislang der TEXT-Befehl, der jedoch nicht gerade vor Schnelligkeit strotzte, sondern eher wesentlich langsamer als das PRINT-Äquivalent war. So gaben sich die meisten Programmierer damit zufrieden, daß es nicht anders geht, und teilten ihre Tabellen in mehrere Teile auf. Diesem Problem kann jedoch abgeholfen werden mit einem recht kurzen Listing, das alle folgenden PRINT-Anweisungen im kleinen 88-Zeichensatz ausgeben läßt. Dabei sollte man lediglich beachten, daß man nach dem Umschalten auf eine andere Font-Größe immer den Bildschirm löscht, da das Betriebssystem sonst mit der Darstellung der Fonts durcheinanderkommt. Ansonsten steht dem großflächigen Aufbau von Tabellen oder Datenaufkommen jedweder Art nichts mehr im Wege. Viel Spaß mit der neuen, "großen" Bildschirmauflösung!
S. Just. W-6936 Haag / MP
font_init !Adressen suchen
text(small_font%) !kleiner Font
CLS !Bildschirm löschen
FOR i&=1 TO 1000 !...mal ansehen
PRINT "Test! "; !
NEXT i& !...und raus
text(big_font%) !großer Font
CLS ! Bildschirm löschen
FOR i&=1 TO 1000 !...mal ansehen
PRINT "Test! "; !
NEXT i& !...und raus
END !...Ente
'
PROCEDURE font_init !Adressen finden
LOCAL find_match$,find_a%,find_m.adr%
' 0=6*8, 1=8*8, 2=8*16
find_match$=MKI$(&HA000)+MKI$(&H2009)+MKI$(&H4E75)
find_a%=VARPTR(find_match$)
findm.adr%=C:find_a%()
big_font%=LPEEK(find_m.adr%+8) !groß
small_font%=LPEEK(find_m.adr%+4) !klein
RETURN
PROCEDURE text(fnt_adr%) 'Umschalten
IF fnt_adr%>0
{INTIN}=fnt_adr%
INT{CONTRL+2}=0
INT{CONTRL+6}=2
INT{CONTRL+10}=102
VDISYS 5
ELSE
ALERT 3,"Font-Adresse|unbekannt!",1,"RETURN",d%
ENDIF
RETURN
Listing 2: So schaltet man den System-Font in GFA-BASIC um.