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.
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