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
Aus: ST-Computer 06 / 1989, Seite 164

Links

Copyright-Bestimmungen: siehe Über diese Seite