← ST-Computer 06 / 1989

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

Grundlagen

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