Aus 24 mach 9: Umwandlung von SIGNUM!-Druckerzeichensätzen

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

Jens Krinke
Links

Copyright-Bestimmungen: siehe Über diese Seite