Jeder SIGNUM!-Benutzer kennt dieses Problem: Es existieren viel mehr 24-Nadel- als 9-NadelzeichensĂ€tze auf dem Public Domain-Gebiet (Ich habe dieses Problem eigentlich nicht, denn ich bin kein stolzer Besitzer eines SIGNUM!-Exemplares). Dies Programm soll diesen Umstand beseitigen, es wandelt 24-Nadel- in 9-NadelzeichensĂ€tze um. Es ist entstanden, als ein Mitstudent sich mit dem Problem an mich wandte, daĂ er wissenschaftliche 24-Nadel-ZeichensĂ€tze erhalten hat, aber nur einen Star NL-10 besitzt. FĂŒr ihn habe ich dieses Programm geschrieben (hallo Werner!).
Geschrieben ist es in OMIKRON.BASIC V3.01 und lÀuft am besten auf einem SM 124. Gleich vorweg: Ich habe zwei undokumentierte Befehle benutzt: L (zerlegt eine Zahl in High- und LowByte) und FRE (< Adresse >) (gibt einen Speicherbereich wieder frei, siehe ST 12/88)
Das Programm selbst besteht aus dem Hauptprogramm und fĂŒnf Prozeduren: Get_Path holt ĂŒber GEMDOS den aktuellen Pfad incl. Laufwerk. Mouse_Alert vereinfacht den Aufruf von Alertboxen, indem die Mauskontrolle ĂŒbernommen wird. Load_Font lĂ€dt eine Zeichensatzdatei. Zuerst wird dabei die Datei geöffnet und festgestellt, ob es wirklich eine 24-Nadeldatei (Aufteilung eines Zeichensatz-Files ist im Listing erklĂ€rt) ist und welche LĂ€nge diese Datei besitzt. Entsprechend der LĂ€nge wird Speicherplatz angefordert, und die Datei wird geladen. Danach werden die Adressen der Zeichendaten berechnet, und anhand dieser Daten werden die Maximalwerte (Breite, Höhe usw.) berechnet. Die Prozedur Null_Wandel Ă€ndert die Bitmuster der Zeichen nicht, es werden nur die Startzeilen (die Zeilen, in der das Zeichen beginnt) so verkleinert, daĂ die maximal-Werte in den Bereich eines 9-Nadelzeichensatzes passen. Die Prozedur Voll_Wandeln Ă€ndert die Bitmuster jedes Zeichens: Ein 24-Nadelzeichen ist 6080 Punkte groĂ, ein 9-Nadel-Zeichen nur 4048 Punkte, daraus ergibt sich ein VerhĂ€ltnis von 2:3 und 3:5. Daraus folgt, daĂ im Bitmuster jede dritte und fĂŒnfte Zeile und jede dritte Spalte gelöscht werden. Es wird also fĂŒr jede neue Bit-Position die alte Position berechnet (Spalte5/3, Zeile3/2) und deren Wert ĂŒbernommen. ZusĂ€tzlich wird der Rest rechts und unten gelöscht. In der hohen Auflösung kann zusĂ€tzlich dieses Ergebnis gleich sichtbar gemacht werden, so sieht man sofort evtl, nötige Nachbesserungen. Sobald das Programm gestartet wird, meldet es sich mit einer Fileselectorbox (altbekannt) und erfragt den Namen des zu wandelnden Zeichensatzes. Das gewĂ€hlte File wird auf ZulĂ€ssigkeit geprĂŒft und dann geladen (Load_Font). Falls der geladene Zeichensatz nicht höher als 48 und breiter als 40 Punkte ist, erscheint eine Alertbox, in der man die Umwandlungsart wĂ€hlen kann. Danach kann man sich bei Vollumwandlung und S/W-Modus dafĂŒr entscheiden, ob die Zeichen angezeigt werden sollen.
Bild 1: Die umgewandelten ZeichensĂ€tze lassen sich auf dem Bildschirm anzeigen und zur Nachbearbeitung anschlieĂend ausdrucken (hier der Futura-Zeichensatz)
Dies ist gut geeignet, um festzustellen, welche Zeichen einer Nachbehandlung bedĂŒrfen. Nach der Umwandlung wird das P9-File gespeichert (Das P9-File wird grundsĂ€tzlich im gleichen Katalog wie das P24-File gespeichert!), der Speicherplatz wird freigegeben, und man kann noch weitere Umwandlungen durchfĂŒhren oder das Programm beenden.
Nach Nullumwandlung entspricht der Editorzeichensatz in der GröĂe nicht mehr dem Druckerzeichensatz, dadurch sind auch die Angaben ĂŒber die Breite der einzelnen Zeichen viel zu klein (sie liegen ja im Editor-Zeichensatz)! Diese Umwandlung ist eigentlich nur bei Umwandlungen von ZeichensĂ€tzen in verschiedenen GröĂen sinnvoll (z.B. Rockwell).
Man sollte dann einen gröĂeren Editorzeichensatz umkopieren und mit dem Namen des gewandelten Druckerzeichensatzes versehen. Danach hat man ein besseres Druckbild, als mit einem vollgewandelten Zeichensatz.
'*******************************************************************
'* Programm zum Wandeln von 24-Nadel-Signum- *
'* ZeichensÀtzen in 9-Nadel-ZeichensÀtze. *
'* *
'* Version vom 24.2.89, Autor: J. Krinke *
'* *
'* Bei Nullumwandlung paĂt das Bit-Muster des 24-Nadel-Font in das *
'* 9-Nadel Format, es wird also nur i.der Höhe verschoben und ist *
'* damit um 1/3 breiter und 2/3 höher. Diese Umwandlung ist gut *
'* geeignet bei Umwandlung von ZeichensĂ€tzen in verschiedenen GröĂen, *
'* allerdings muĂ dann ein passender Editorzeichensatz gefunden *
'* werden, damit die Proportionaldaten stimmen (diese *
'* stehen im Editorzeichensatz!!!). *
'* Bei Voll-Umwandlung wird jedes Bit des Bitmusters verÀndert, *
'* das VerhÀltnis ist 5:3 (Hoch) und 3:2 (Breit). *
'* Also entfĂ€llt jede dritte und fĂŒnfte Zeile und jede dritte *
'* Spalte. Daher kann eine Nachbehandlung im Editor nötig sein, *
'* wenn LĂŒcken entstehen. *
'* Bei Voll Umwandlung wird auf Wunsch der Zeichensatz ausgegeben, *
'* damit gleich ersichtlich wird, welche Zeichen nachgearbeitet *
'* werden mĂŒssen (nur i.Maximalauflösung, als s/w). *
'* *
'* Format einer Zeichensatzdatei: *
'* 1. "ps09" Signum-9-Nadel-Zeichensatz *
'* "ps24" Signum-24-Nadel-Zeichensatz *
'* "es24" Signum-Editor-Zeichensatz *
'* 2. "9999" Nummer, meistens "0001" *
'* 3. $80%L (es folgen 128 Byte Daten) *
'* 4. 128 Bytes Daten (keine Ahnung wofĂŒr...) *
'* 5. Daten%L nach Database folgen Daten%L Bytes *
'* 6. 127 * Adr%L Font-Adresse im Offset zu Database *
'* 7. 0%L Ende des Headers, => Database <= *
'* (normaler Offset zum Fileanfang: 652) *
'* 8. Fontdaten: *
'* StartZeile%B, AnzahlZeilen%B, Breite%B (in Bytes), 0%B *
'* falls Zeichen nicht existiert, ist dies 0%L *
'* Es folgen AnzahlZeile%B * Breite%B Bytes Bitmuster *
'* *
'* Beim Editorzeickensatx ist das anders!: *
'* Breite%B ist Proportional-Info, und es folgen AnzahlZeile%B *
'* Bytes Bitmuster. *
'* *
'* keep hacking! jk *
'*******************************************************************
DIM Font_Adresse%L(127)
PRINT CHR$(27);"f";' Cursor aus
Get_Path(Path$)
Path$=Path$+"\*.P24"
-Einsprung
CLS
MOUSEON
FILESELECT (Path$,Name$,Okay%L)' Fontfile holen
MOUSEOFF
CLS
IF (Okay%L=0) OR (Name$="") THEN END ' Abbruch
Dateiname$= LEFT$(Path$, LEN(Path$)-INSTR( MIRROR$(Path$),"\"))+"\"+Name$
IF FN Load_Font%L(Dateiname$) THEN
Al$="[3]["+Name$+"|ist kein 24-Nadel Font.][Ok|Abbruch]"
IF FN Mouse_Alert%L(1,Al$)=1 THEN GOTO Einsprung' NeuwÀhlen
END
ENDIF
IF (Max_Laenge%L<=48) AND (Max_Breite%L<=5) THEN
Al$="[2][Eine Null-Umwandlung ist|möglich. Was ist gewĂŒnscht?][Null|1:1]"
Wandeln%L=FN Mouse_Alert%L(1,Al$)' Umwandlung bestimmen
ELSE Wandeln%L=0
ENDIF
IF Wandeln%L=1
THEN Null_Wandeln
ELSE Voll_Wandeln
ENDIF
' Font speichern
WPOKE File_Adresse%L+2, CVI("09")' Signum-9-Nadel-Font setzen
BSAVE LEFT$(Dateiname$, LEN(Dateiname$)-2)+"9",File_Adresse%L,File_Laenge%L
IF FN Mouse_Alert%L(1,"[2][Noch ein Font umwandeln?][Ja|Ende]")=1 THEN
FRE (File_Adresse%L)' Speicher freigeben und Programm wiederholen
GOTO Einsprung
ENDIF
CLS
END
DEF PROC Get_Path(R Path_Name$)
'* ermittelt per GEMDOS den aktuellen Pfad
GEMDOS (Drive%L, $19) ' Aktuelles Laufwerk ermitteln
Path_Name$=" "*64
Adr%L= LPEEK( SEGPTR +28)+LPEEK( VARPTR(Path_Name$))
GEMDOS (,$47,L Adr%L,0)' Aktuellen Pfadnamen holen
Path_Name$= LEFT$(Path_Name$, INSTR(Path_Name$+ CHR$(0), CHR$(0))-1)
Path_Name$= CHR$ (65+Drive%L)+":"+Path_Name$
RETURN
DEF FN Mouse_Alert%L(Standard%L,Alert$)
' * Alert-Box mit automatischer Mauskontrolle
LOCAL Okay%L
MOUSEON
FORM_ALERT (Standard%L,Alert$,Okay%L)
MOUSEOFF
RETURN Okay%L
DEF FN Load_Font%L(D_Name$)
'* Font-File laden und Daten ermitteln (Höhe & Breite)
' gibt evtl. Fehler zurĂŒck
LOCAL Fehler%L
OPEN "i",1,D_Name$' Filedaten holen
Fehler%L= INPUT$(4,1)<>"ps24"' File okay?
IF Fehler%L THEN
CLOSE 1
ELSE
File_Laenge%L= LOF(1)
CLOSE 1
File_Adresse%L= MEMORY(File_Laenge%L)
BLOAD Dateiname$,File_Adresse%L' Fontfile laden
Min_Zeile%L=$FF
Max_Zeile%L=0
Max_Breite%L=0
FOR Font%L=1 TO 127' Adressen und Bereichsdaten holen
Font_Adresse%L= LPEEK(File_Adresse%L+ Font%L*4+140)+ File_Adresse%L+652
IF LPEEK(Font_Adresse%L)<>0 THEN
Font_Adresse%L(Font%L)=Font_Adresse%L
Start_Zeile%L= PEEK(Font_Adresse%L)
End_Zeile%L=Start_Zeile%L+PEEK(Font_Adresse%L+1)
Breite%L= PEEK(Font_Adresse%L+2)
IF Start_Zeile%L<Min_Zeile%L THEN Min_Zeile%L=Start_Zeile%L
IF End_Zeile%L>Max_Zeile%L THEN Max_Zei1e%L=End_Zei1e%L
IF Breite%L>Max_Breite%L THEN Max_Breite%L=Breite%L
ELSE Font_Adresse%L(Font%L)=0
ENDIF
NEXT Font%L
Max_Laenge%L=Max_Zeile%L-Min_Zeile%L
ENDIF
RETURN Fehler%L
DEF PROC Null_Wandeln
'* Nullumwandlung, es werden nur die Startzeilen verÀndert
Div_Zeile%L=Min_Zeile%L-(Min_Zeile%L*(48-Max_Laenge%L))\(80-Max_Laenge%L)
FOR Font%L=1 TO 127
IF Font_Adresse%L(Font%L)<>0 THEN
POKE Font_Adresse%L(Font%L),PEEK(Font_Adresse%L(Font%L))-Div_Zeile%L
ENDIF
NEXT Font%L
RETURN
DEF PROC Voll_Wandeln
' * Volle Umwandlung Höhe: 80:48, Breite 60:40, also 5:3, 3:2
XBIOS (Aufloesung%L, 4)
IF Aufloesung%L=2 THEN ' Maximale Auflösung?
Al$="[2][Sollen die Fonts angezeigt| werden?][Ja|Nein]"
Draw_Flag%L=FN Mouse_Alert%L(2,Al$)
MODE =1
ELSE Draw_Flag%L=0
ENDIF
FOR Font%L=1 TO 127
Font_Adresse%L=Font_Adresse%L(Font%L)
IF Font_Adresse%L<>0 THEN ' Nur bei ex. Fonts
Start_Zeile%L= PEEK(Font_Adresse%L)
Start_Zeile%L=(Start_Zeile%L*6+5)\10 ' Neuer Wert
POKE Font_Adresse%L,Start_Zeile%L
Zeilen%L= PEEK(Font_Adresse%L+1)
Zeilen%L=(Zeilen%L*6+5)\10' Neuer Wert
POKE Font_Adresse%L+1,Zeilen%L
Breite%L= PEEK(Font_Adresse%L+2)
Bit_Breite%L=(Breite%L*32+3)\6 ' Neuer Wert (in Bits)
FOR Zeile%L=0 TO Zeilen%L-1' Zeilen umkopieren
Zeil_Adr1%L=Font_Adresse%L+4+Zeile%L*Breite%L
Zeil_Adr2%L=Font_Adresse%L+4+((Zeile%L*10+4)\6)*Breite%L
FOR Punkt_Bit1%L=0 TO Bit_Breite%L-l ' Punkte umkopieren
Punkt_Bit2%L=(Punkt_Bit1%L*3+1)\2
Bit_Adr1%L=Zeil_Adr1%L+(Punkt_Bit1%L SHR 3)
Bit_Adr2%L=Zeil_Adr2%L+(Punkt_Bit2%L SHR 3)
Set_Bit%L= BIT (7-(Punkt_Bit2%L AND 7), PEEK(Bit_Adr2%L))
BIT (7-(Punkt_Bit1%L AND 7), (Bit_Adr1%L))=Set_Bit%L
IF Draw_Flag%L=1 THEN
LINE COLOR =-Set_Bit%L
X%L=(Font%L AND 15)*40+Punkt_Bit1%L
Y%L=(Font%L SHR 4)*48+Zeile%L+Start_Zeile%L
DRAW X%L,Y%L
ENDIF
NEXT Punkt_Bit1%L
FOR Punkt_Bit%L=Bit_Breite%L TO Breite%L*8-1 ' Rest löschen
BIT (7-(Punkt_Bit%L AND 7),(Zeil_Adr1%L+(Punkt_Bit%L SHR 3)))=0
NEXT Punkt_Bit%L
NEXT Zeile%L
ENDIF
NEXT Font%L
IF Draw_Flag%L=1 THEN ' evtl. Hardcopy
IF FN Mouse_Alert%L(2,"[2][Hardcopy gewĂŒnscht?][Ja|Nein]")=1 THEN HCOPY
ENDIF
RETURN