home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / turbo4 / binobj.doc < prev    next >
Text File  |  1987-12-08  |  5KB  |  127 lines

  1. Dokumentation zum Zusatzprogramm BINOBJ
  2. ───────────────────────────────────────
  3.  
  4.   Mit BINOBJ lassen sich binäre Dateien in .OBJ-Dateien konvertieren,
  5.   die ihrerseits über den Compiler-Befehl {$L} in ein Turbo
  6.   Pascal-Programm als "Prozedur" (d.h. ins Code-Segment) aufgenommen
  7.   werden können. Abgesehen davon, daß sich so Daten (wie z.B.
  8.   gespeicherte Bildschirme) aufnehmen lassen, deren Codierung als
  9.   typisierte Konstante unnötig aufwendig wäre, liegt der Hauptzweck
  10.   von BINOBJ in der Konvertierung von Grafik-Treibern und
  11.   Zeichensätzen. (Tatsächlich haben .BGI- und .CHR-Dateien ein
  12.   binäres Format). Ein Programm, das seine Treiber und Zeichensätze
  13.   direkt enthält, kommt zur Laufzeit ohne weitere Dateien aus - wir
  14.   haben das am Beispiel GRLINK.PAS (auf der Diskette III)
  15.   demonstriert.
  16.  
  17.   BINOBJ wird mit drei Parametern aufgerufen:
  18.  
  19.     BINOBJ   <Quelldatei[.BIN]>  <Zieldatei[.OBJ]>  <Prozedurname>
  20.  
  21.   <Quelldatei> steht für den Namen der zu konvertierenden Datei,
  22.   <Zieldatei> für die Datei, die BINOBJ erzeugen soll. <Prozedurname>
  23.   steht für den Namen der "Prozedur", unter dem die Zieldatei mit {$L}
  24.   in das Programm aufgenommen wird, muß also ein gültiger
  25.   Pascal-Bezeichner sein. Wenn die Angabe für <Quelldatei> kein Suffix
  26.   enthält, fügt BINOBJ automatisch die Endung .BIN an; analoges gilt
  27.   für die erzeugte Datei, die in diesem Fall automatisch das Suffix
  28.   .OBJ erhält.
  29.  
  30.   Das folgende Beispielprogramm liest eine Datei namens MENU.DTA und
  31.   kopiert ihren Inhalt in den Bildspeicher (insgesamt 80 * 25 * 2 =
  32.   4000 Bytes). Damit das Programm so übersichtlich wie möglich bleibt,
  33.   haben wir auf Fehlerprüfungen verzichtet:
  34.  
  35.     program Traditionell;
  36.     uses Crt;
  37.     var
  38.       MenuP : Pointer;
  39.       MenuF : File;
  40.  
  41.     procedure ShowScreen(var ScreenData : Pointer);
  42.     { Kopiert 4000 Bytes von ScreenData^ in den Bildspeicher }
  43.     var
  44.       ScreenSegment : Word;
  45.     begin
  46.       if (Lo(LastMode) = 7) then ScreenSegment := $B000  { Mono }
  47.        else ScreenSegment := $B800;
  48.       Move(ScreenData^,Ptr(ScreenSegment, 0)^, 4000);  { Kopieren }
  49.     end;
  50.  
  51.     begin  { Hauptprogramm }
  52.       Assign(MenuF, 'MENU.DTA');  Reset(MenuF, 1); { Öffnen der Datei }
  53.       GetMem(MenuP, 4000);                  { Puffer auf dem Heap }
  54.       BlockRead(MenuF, MenuP^, 4000);       { Lesen der Datei }
  55.       Close(MenuF);
  56.       ShowScreen(MenuP);                    { und Kopieren }
  57.     end.
  58.  
  59.   Hier werden die Daten auf "traditionelle" Weise von der Diskette
  60.   gelesen - MENU.DTA muß also zur Laufzeit des Programms verfügbar
  61.   sein.
  62.  
  63.   Alternativ dazu lassen sich die in MENU.DTA enthaltenen Daten mit
  64.   den folgenden Schritten direkt in das Programm aufnehmen:
  65.  
  66.   1. Konvertierung von MENU.DTA in eine .OBJ-Datei:
  67.  
  68.     binobj MENU.DTA MENUDTA MenuData
  69.  
  70.   Dieser Aufruf von BINOBJ liest die Datei MENU.DTA, erzeugt die Datei
  71.   MENUDTA.OBJ (das Suffix .OBJ wird automatisch angehängt) und gibt
  72.   den Daten den "Prozedurnamen" MenuData.
  73.  
  74.   2. Das Programm wird um eine external-Deklaration und den
  75.      entsprechenden Compiler-Befehl {$L} erweitert:
  76.  
  77.     program Daten_direkt;
  78.     uses Crt;
  79.          { <- Die Datei-Deklaration wird nicht mehr gebraucht }
  80.  
  81.     procedure ShowScreen(var ScreenData : Pointer);  { unverändert }
  82.     { Kopiert 4000 Bytes von ScreenData^ in den Bildspeicher }
  83.     var
  84.       ScreenSegment : Word;
  85.     begin
  86.       if (Lo(LastMode) = 7) then ScreenSegment := $B000  { Mono }
  87.        else ScreenSegment := $B800;
  88.       Move(ScreenData^,Ptr(ScreenSegment, 0)^, 4000);  { Kopieren }
  89.     end;
  90.  
  91.     procedure MenuData; external;  { "Prozedur" MenuData, als external
  92.                                      deklariert }
  93.     {$L MENUDTA.OBJ}               { Compiler-Befehl zur Aufnahme von
  94.                                      MENUDTA.OBJ - in dieser Datei sind
  95.                                      die Daten als "Prozedur MenuData"
  96.                                      enthalten }
  97.  
  98.     begin
  99.       ShowScreen(@MenuData);                { Aufruf von ShowScreen mit
  100.                                               der Adresse von MenuData }
  101.     end.
  102.  
  103.   ACHTUNG: Hier wird die *Adresse* der "Prozedur" übergeben, d.h. die
  104.   Adresse der als MenuData gespeicherten Daten.
  105.  
  106.   Die Vorteile dieses Verfahrens liegen auf der Hand: Erstens kommt
  107.   das Programm ohne zusätzliche Dateien aus, zweitens entfallen die
  108.   entsprechenden Diskettenzugriffe - und drittens können wir die Daten
  109.   über einen normalen Pascal-Bezeichner ansprechen.
  110.   Die Nachteile: Da die gespeicherten Daten Teil des Programms sind,
  111.   wächst sein Umfang entsprechend - außerdem müssen Sie die Datei
  112.   MENU.DTA nach jeder Veränderung erneut mit BINOBJ in eine .OBJ-Datei
  113.   konvertieren.
  114.  
  115.   BINOBJ ist also hauptsächlich dann sinnvoll, wenn die einzubindenden
  116.   Daten "stabil" sind, d.h. aller Voraussicht nach nicht allzuoft
  117.   verändert werden müssen.
  118.   Das Programm GRLINK.PAS (auf der Diskette III) zeigt eine derartige
  119.   Anwendung: Es bindet alle verfügbaren Grafiktreiber und Zeichensätze
  120.   in ein Programm ein, das danach ohne zusätzliche .BGI- und
  121.   .CHR-Dateien auf jedem Computer lauffähig ist, den GRAPH
  122.   unterstützt.
  123.  
  124.   Eine Beschreibung der Schritte zur Erstellung von GRLINK.EXE finden
  125.   Sie in GRLINK.PAS, eine ausführliche Erläuterung der neuen Funk-
  126.   tionen RegisterBGIFont und RegisterBGIDriver in der Datei GRAPH.DOC.
  127.