home *** CD-ROM | disk | FTP | other *** search
/ TopWare 18: Liquid / Image.iso / liquid / top1200 / paperbgi.lzh / PASCAL / ALLOC.PAS next >
Encoding:
Pascal/Delphi Source File  |  1993-11-28  |  43.1 KB  |  1,210 lines

  1. unit alloc;
  2. {
  3. (C)opyright
  4.        Raimund Nisius
  5.        Goethepark  13
  6.        10627  Berlin
  7.        April 1992
  8. Als rechtmäßiger Besitzer eines BGI-Treibers dürfen sie
  9. diesen Quellcode benutzen und nach Ihrem Bedarf verändern.
  10.  
  11. Diese Unit ist für HPGL.BGI, LASER.BGI und NADEL.BGI DESKJETC.BGI
  12. PAINTJET.BGI und DXF.BGI nutzbar.
  13. ------------------------------------------------------------------
  14. Wenn Sie einen dieser Treiber nicht benutzen, dann können sie
  15. die entsprechende Zeile
  16. $DEFINE ...
  17. in der Datei  "inventar.inc" streichen.
  18. }
  19.  
  20. {$I inventar.inc}
  21.  
  22. { $ DEFINE PLOTTER_EINBINDEN}  { Leerzeichen um $ entfernen, }
  23. { $ DEFINE LASER_EINBINDEN}    { falls Treiber eingebunden }
  24. { $ DEFINE NADEL_EINBINDEN}    { werden sollen }
  25. { $ DEFINE DESKJET_EINBINDEN}
  26. { $ DEFINE PAINTJET_EINBINDEN}
  27. { $ DEFINE DXF_EINBINDEN}
  28.  
  29. {
  30. unit alloc   stellt dem Hauptprogramm die Variablen
  31.                 monitortreiber  , monitormode
  32.                 plottertreiber  , plottermode
  33.                 lasertreiber    , lasermode
  34.                 nadeltreiber    , nadelmode
  35.                 deskjettreiber  , deskjetmode
  36.                 PAINTJETtreiber  , PAINTJETmode
  37.                 DXFtreiber       , DXFmode
  38.          zur Verfügung und initialisiert sie. Außer beim Monitor
  39.              bedeutet "...mode" die Schnittstelle, an der das Gerät
  40.              angeschlossen ist. Wenn Sie im Hauptprgramm mit z.B.
  41.              initgraph( plottertreiber, plottermode, '');
  42.              auskommen, dann brauchen Sie nicht mehr weiterzulesen.
  43.  
  44. unit alloc   stellt den Treibern "HPGL.BGI","LASER.BGI","NADEL.BGI",
  45.              "DESKJETC.BGI" einen Interruptvektor zur Verfügung. Dieser
  46.              Vektor zeigt auf eine Datenstruktur vom Typ BGI_Konfigura-
  47.              tion mit den Konfigurationen der einzelnen Treiber.
  48.              Der Initialisierungsteil der Unit installiert den Interrupt
  49.              und sorgt dafür daß er zum Programmschluß wieder entfernt
  50.              wird.
  51.  
  52.              Welcher Interruptvektor das ist, wird zur Laufzeit bestimmt.
  53.              Wenn das Recordelement "reconfig" gleich Null ist, setzt
  54.              der Treiber seine eigenen Defaultwerte ein.
  55.              Die Bedeutung der Recordelemente entnehmen Sie bitte der
  56.              Datei "PARAMS.PAS".
  57.  
  58. unit alloc   stellt den Druckertreibern eine Funktion zur Speicher-
  59.              allocation zur Verfuegung
  60.              Der Speicher wird während der Ausführung von CloseGraph
  61.              bzw. RestoreCrtMode von der Funtion "bgi_alloc" angefordert
  62.              und durch "myfree" wieder freigegeben.
  63.  
  64. unit alloc   stellt den Druckertreibern eine Funktion zur Kontrolle
  65.              der Datenausgabe zur Verfügung (BGIControl)
  66.              Diese Funktion wird während der Datenübertragung oft mit einem
  67.              Argument >= 0 aufgerufen. Bei Fehlern wird sie mit einem
  68.              Argument  < 0 aufgerufen.
  69.              Das Funktionsergebnis befiehlt dem Treiber, wie er arbeiten soll.
  70.              Argument :
  71.                    >= 0 : Nummer der Zeile die übertragen werden soll
  72.                    -1   : Fehler beim Eröffnen ( Gerät defekt, )
  73.                    -2   : Fehler beim Übertragen (Busy oder Störung)
  74.                    -3   : Soll Graphik erzeugt werden ? 0 : ja  1: nein
  75.              Rückgabe :
  76.                    0 : Fortsetzung der Übertragung (noch mal versuchen)
  77.                    1 : Abrruch der Übertragung
  78.                    2 : Neustart der Übertragung (nur wenn Status < 0)
  79.              Wenn die Adresse dieser Funktion dem Treiber nicht eingetragen
  80.              ist (NIL), bricht er bei Eröffnungsfehler ab, sonst arbeitet er
  81.              weiter. (Printer Busy)
  82.  
  83. Alle Funktionen müssen FAR sein!  Sie müssen das jeweilige Datensegment
  84. dieser Funktionen kennen. Darum lassen Sie sie am besten in dieser Unit.
  85. }
  86.  
  87.  
  88. interface
  89.  
  90. uses
  91.     params;
  92.  
  93.  
  94. var
  95.    monitortreiber ,            { Defaulttreiber wird nach installuserdriver }
  96.    monitormode    : integer;   { nicht mehr gefunden }
  97.  
  98. {$IFDEF HPGLPLOTTER}
  99.    plottermode    ,
  100.    plottertreiber : integer;     { Treibernummer für initgraph }
  101. {$ENDIF}
  102.  
  103. {$IFDEF LASERDRUCKER}
  104.    lasermode      ,
  105.    lasertreiber   : integer;     { Treibernummer für initgraph }
  106. {$ENDIF}
  107.  
  108. {$IFDEF NADELDRUCKER}
  109.    nadelmode      ,
  110.    nadeltreiber   : integer;     { Treibernummer für initgraph }
  111. {$ENDIF}
  112.  
  113. {$IFDEF DESKJETDRUCKER}
  114.    deskjetmode      ,
  115.    deskjettreiber   : integer;     { Treibernummer für initgraph }
  116. {$ENDIF}
  117.  
  118. {$IFDEF PAINTJETDRUCKER}
  119.    PAINTJETmode      ,
  120.    PAINTJETtreiber   : integer;     { Treibernummer für initgraph }
  121. {$ENDIF}
  122.  
  123. {$IFDEF DXFDRUCKER}
  124.    DXFmode      ,
  125.    DXFtreiber   : integer;     { Treibernummer für initgraph }
  126. {$ENDIF}
  127.  
  128. function TreiberName(driver : integer) : string;
  129.  
  130. const
  131.      myfill : array[1..16] of word = (          { Beispiel für 16*16 Bit }
  132.                                      $8000,     { Wenn Sie die Adresse die- }
  133.                                      $4000,     { ses records in }
  134.                                      $2000,     { Treiber_konfiguration. }
  135.                                      $1000,     { userfill eintragen }
  136.                                      $0800,
  137.                                      $0400,
  138.                                      $0200,
  139.                      $0100,
  140.                                      $0080,
  141.                                      $0040,
  142.                                      $0080,
  143.                                      $0100,
  144.                                      $0200,
  145.                      $0400,
  146.                                      $0800,
  147.                                      $F000
  148.                                      );
  149.  
  150.      Treiber_konfiguration : BGI_Konfiguration =
  151.         (
  152.         umgebung : (
  153.             errormessages : TRUE;                      { zum debuggen }
  154.             warnings      : TRUE;                      { zum debuggen }
  155.             dateiname     : 'BGI.DAT';  { für Mode 8  }
  156.                           { Rest wird von dieser Unit beim Start initialisiert }
  157.             control       : NIL;
  158.             control_ds    : 0;
  159.             myalloc       : NIL;
  160.             mfree         : NIL;
  161.         free_ds       : 0;
  162.         Selectordelta : 0;
  163.             tmp_path      : ''
  164.             );
  165.        plotter      : NIL;
  166.        laserjet     : NIL;
  167.        nadeldrucker : NIL;
  168.        deskjet_c    : NIL;
  169.        PAINTJET     : NIL;
  170.        DXF          : NIL;
  171.        reserve1     : NIL;
  172.        reserve2     : NIL;
  173.        reserve3     : NIL;
  174.        userfill     : NIL   { NIL : normales SetFillPattern  }
  175. {      userfill     : @myfill;  { sonst Zeiger auf 16 Worte, die das Bitmuster }
  176.                             { für USER_FILL Zeilenweise mit 16 Bit definieren }
  177.        );
  178.  
  179. {$IFDEF NADELDRUCKER}
  180. const            { Werte für Treiber_konfiguration.nadeldrucker^.printermode }
  181.   EPS_240     = 0;   { 8 Nadelmodi, vertikale Auflösung immer 72 DPI }
  182.   EPS_120Y    = 1;   { so gut wie alle Nadeldrucker }
  183.   EPS_120L    = 2;
  184.   EPS_60      = 3;
  185.   EPS_240_216 = 4;
  186.   EPS_80      = 5;
  187.   EPS_72      = 6;
  188.   EPS_90      = 7;
  189.   EPS_144     = 8;
  190.  
  191.   EPS_60_180  =  9;   { 24 Nadelmodi }
  192.   EPS_120_180 = 10;   { so gut wie alle Nadeldrucker }
  193.   EPS_90_180  = 11;
  194.   EPS_180_180 = 12;
  195.   EPS_360_180 = 13;
  196.   NEC_360_360 = 14;   { nur NEC P6/7 }
  197.   EPS_360_360 = 15;   { Epson   }
  198.  
  199. {$ENDIF}
  200.  
  201. implementation
  202.  
  203. uses
  204.     crt,
  205.     dos,
  206.   {$IFDEF DPMI}
  207.     WinApi,
  208.   {$ENDIF}
  209.     graph;
  210.  
  211. const
  212.   {$IFDEF VER70}
  213.       {$IFDEF DPMI} { Protected Mode Version 7.0}
  214.      plottername  = 'PHPGL';
  215.      lasername    = 'PLASER';
  216.      nadelname    = 'PNADEL';
  217.      deskjetname  = 'PDJ500C';
  218.      PAINTJETname = 'PPJXL';
  219.      DXFname      = 'PDXF';
  220.       {$ELSE} { REALMODE Version 7.0}
  221.      plottername  = 'RHPGL';
  222.      lasername    = 'RLASER';
  223.      nadelname    = 'RNADEL';
  224.      deskjetname  = 'RDJ500C';
  225.      PAINTJETname = 'RPJXL';
  226.      DXFname      = 'RDXF';
  227.      RESTHEAP     = 4096;          { RESTHEAP muß noch für Interrupts}
  228.                                     { von Turbovision bleiben }
  229.       {$ENDIF}
  230.   {$ELSE} { REALMODE vor Version 7.0}
  231.      plottername  = 'HPGL';
  232.      lasername    = 'LASER';
  233.      nadelname    = 'NADEL';
  234.      deskjetname  = 'DESKJETC';
  235.      PAINTJETname = 'PJXL';
  236.      DXFname      = 'DXF';
  237.      RESTHEAP     = 4096;           { RESTHEAP muß noch für Interrupts}
  238.                                     { von Turbovision bleiben }
  239.      SelectorInc  = $1000;          { wird aber nur in Version 7 benötigt }
  240.                                     { und ist dort eine globale System-Variable }
  241.   {$ENDIF}
  242.  
  243. type
  244.     wordpointer = ^word;
  245.  
  246. var
  247.  
  248. {$IFDEF ANY_DRUCKER}
  249.   {$IFDEF DPMI}     { Speicher wird am Stück mit GlobalAllocPtr angefordert}
  250.     MemHandle       : array[0..10] of THandle;
  251.     MemPtr          : array[0..10] of pointer;
  252.   {$ELSE}           { Real Mode Speicher wird mit GetMem angefordert}
  253.     Blockzahl       : word;                  { Anzahl der allozierten Blöcke }
  254.     memptr          : array[1..10] of ^byte;  { Zeiger auf diese Blöcke       }
  255.     memsize         : array[1..10] of word;   { Größen dieser Blöcke          }
  256.   {$ENDIF}
  257. {$ENDIF}
  258.  
  259.  
  260.   benutzte_Vektornummer : integer;
  261.   AltIntVektor          : pointer;    { Interruptvektor vor initialisierung der Unit}
  262.   oldexitproc           : pointer;    { alte Exitprocedur }
  263. {$IFnDEF DPMI}
  264.   Umleitung             : IntServiceRec;        { einfach statische Daten }
  265. {$ENDIF}
  266.   UmleitungPtr          : ^IntServiceRec;       { Zeiger auf ISR }
  267.  
  268. {$F+}
  269.  
  270. {$IFDEF HPGLPLOTTER}
  271.    {$IFDEF PLOTTER_EINBINDEN}
  272.    procedure _HPGL_driver; external;
  273.       {$IFDEF VER70}
  274.           {$IFDEF DPMI} { Protected Mode Version 7.0}
  275.           {$L p_phpgl.obj}
  276.           {$ELSE} { REALMODE Version 7.0}
  277.           {$L p_rhpgl.obj}
  278.           {$ENDIF}
  279.       {$ELSE} { REALMODE vor Version 7.0}
  280.       {$L p_hpgl.obj}
  281.       {$ENDIF}
  282.    {$ENDIF}
  283. {$ENDIF}
  284.  
  285. {$IFDEF LASERDRUCKER}
  286.    {$IFDEF LASER_EINBINDEN}
  287.    procedure _LASER_driver; external;
  288.       {$IFDEF VER70}
  289.           {$IFDEF DPMI} { Protected Mode Version 7.0}
  290.           {$L p_plaser.obj}
  291.           {$ELSE} { REALMODE Version 7.0}
  292.           {$L p_rlaser.obj}
  293.           {$ENDIF}
  294.       {$ELSE} { REALMODE vor Version 7.0}
  295.       {$L p_laser.obj}
  296.       {$ENDIF}
  297.    {$ENDIF}
  298. {$ENDIF}
  299.  
  300. {$IFDEF NADELDRUCKER}
  301.    {$IFDEF NADEL_EINBINDEN}
  302.    procedure _NADEL_driver; external;
  303.       {$IFDEF VER70}
  304.           {$IFDEF DPMI} { Protected Mode Version 7.0}
  305.           {$L p_pnadel.obj}
  306.           {$ELSE} { REALMODE Version 7.0}
  307.           {$L p_rnadel.obj}
  308.           {$ENDIF}
  309.       {$ELSE} { REALMODE vor Version 7.0}
  310.       {$L p_nadel.obj}
  311.       {$ENDIF}
  312.    {$ENDIF}
  313. {$ENDIF}
  314.  
  315. {$IFDEF DESKJETDRUCKER}
  316.    {$IFDEF DESKJET_EINBINDEN}
  317.    procedure _DESKJETC_driver; external;
  318.       {$IFDEF VER70}
  319.           {$IFDEF DPMI} { Protected Mode Version 7.0}
  320.           {$L p_pdj500.obj}
  321.           {$ELSE} { REALMODE Version 7.0}
  322.           {$L p_rdj500.obj}
  323.           {$ENDIF}
  324.       {$ELSE} { REALMODE vor Version 7.0}
  325.       {$L p_deskjt.obj}
  326.       {$ENDIF}
  327.    {$ENDIF}
  328. {$ENDIF}
  329.  
  330. {$IFDEF PAINTJETDRUCKER}
  331.    {$IFDEF PAINTJET_EINBINDEN}
  332.    procedure _PAINTJET_driver; external;
  333.       {$IFDEF VER70}
  334.           {$IFDEF DPMI} { Protected Mode Version 7.0}
  335.           {$L p_ppjxl.obj}
  336.           {$ELSE} { REALMODE Version 7.0}
  337.           {$L p_rpjxl.obj}
  338.           {$ENDIF}
  339.       {$ELSE} { REALMODE vor Version 7.0}
  340.       {$L p_pjxl.obj}
  341.       {$ENDIF}
  342.    {$ENDIF}
  343. {$ENDIF}
  344.  
  345. {$IFDEF DXFDRUCKER}
  346.    {$IFDEF DXF_EINBINDEN}
  347.    procedure _DXF_driver; external;
  348.       {$IFDEF VER70}
  349.           {$IFDEF DPMI} { Protected Mode Version 7.0}
  350.           {$L p_ppjxl.obj}
  351.           {$ELSE} { REALMODE Version 7.0}
  352.           {$L p_rpjxl.obj}
  353.           {$ENDIF}
  354.       {$ELSE} { REALMODE vor Version 7.0}
  355.       {$L p_pjxl.obj}
  356.       {$ENDIF}
  357.    {$ENDIF}
  358. {$ENDIF}
  359.  
  360.  
  361.  
  362.  
  363.  
  364.  
  365. {$IFDEF ANY_DRUCKER}
  366. {$IFnDEF DPMI}      { zuerst realmode Version}
  367.  
  368.    function errorhandler(s : word) : integer;  far;{Fehlerbehandlung von getmem  }
  369.    begin
  370.        errorhandler := 1;   { Fehler führt nicht zu Abbruch,    }
  371.                             { sondern GetMem liefert NIL zurück }
  372.    end;
  373.  
  374.    function lpointer(x : pointer) : longint;  { Adresse als longzahl }
  375.    begin
  376.    lpointer := longint(seg(x^)) * 16 + ofs(x^);
  377.    end;
  378.  
  379.  
  380.    function bgi_alloc(var start : word) : word; far;
  381.                      { Rückgabe : Größe in Paragraphen }
  382.                      { start ist der 1. Paragraph      }
  383.    var
  384.       theorie  : longint;
  385.       alterror : pointer;
  386.       i        : word;
  387.  
  388.    begin
  389.    alterror := HeapError;        { Fehlerbehandlung ohne Abbruch installieren }
  390.    HeapError := @errorhandler;
  391.    theorie := maxavail - RESTHEAP; { Wieviel Speicher gibt es ? }
  392.                                     { RESTHEAP muß noch für Interrupts}
  393.                                     { von Turbovision bleiben }
  394.    i := 0;                       { noch keine Speicher reserviert }
  395.    while (theorie > 16) do       { ganze Paragraphen }
  396.       begin
  397.       inc(i);                           { nächster Block }
  398.       if theorie >= $FFF0 then          { maximale Blockgröße in Turbo Pascal }
  399.          memsize[i] := $FFF0
  400.       else
  401.          memsize[i] := theorie;
  402.       getmem(memptr[i],memsize[i]);     { Speicher anfordern }
  403.       if memptr[i] = nil then           { Allokation nicht erfolgreich ? }
  404.          begin
  405.          dec(i);                        { Block wird nicht gezählt }
  406.          theorie := 0;                  { Schleifenabbruch         }
  407.          end
  408.       else                              { Allokation erfolgreich }
  409.          begin                          { auf Zusammenhang prüfen }
  410.          dec(theorie,memsize[i]);       { Restspeicher ermitteln }
  411.          if i > 1 then                  { den 1. Block natürlich nicht }
  412.             begin
  413.             if lpointer(memptr[i]) <> (lpointer(memptr[i-1]) + memsize[i-1]) then
  414.               begin                          { Lücke zum vorherigen Block : }
  415.               freemem(memptr[i],memsize[i]); { und wieder freigegeben   }
  416.               dec(i);                        { Block wird nicht gezählt }
  417.               theorie := 0;                  { Schleifenabbruch         }
  418.               end;
  419.             end;
  420.          end;                           { Allokation erfolgreich }
  421.       end;  { while theorie }
  422.  
  423.    Blockzahl := i;                      { merken für myfree }
  424.    if i = 0 then                        { Kein Speicher ?  }
  425.       bgi_alloc := 0                      { Funktionswert 0  }
  426.    else
  427.       begin                             { oder doch Erfolg :}
  428.       start := seg(memptr[1]^);         {Funktionswert = Startparagraph }
  429.       inc(start,(ofs(memptr[1]^) +15) div 16);  { start aufrunden mit offset }
  430.       bgi_alloc := (lpointer(memptr[i]) + memsize[i]) div 16 - start;
  431.       end;
  432.    HeapError := alterror;
  433.    end;
  434.  
  435.    procedure myfree; far;    { gibt den Speicher wieder frei }
  436.                           { muß auch aufgerufen werden koennen, wenn }
  437.                           { bgi_alloc nicht erfolgreich war ! }
  438.    var
  439.       i : word;
  440.    begin
  441.    for i := 1 to Blockzahl do
  442.        freemem(memptr[i],memsize[i]); { Speicher wieder freigegeben   }
  443.    end;
  444.  
  445. {$ELSE}  { DPMI Version }
  446.  
  447.    const
  448.         stack_count : word = 0; { Zaehler der Calls von bgi_alloc }
  449.                 { bgi_alloc wird je nach Treiber und Mode bis zu 6 mal auf-}
  450.                 { gerufen. Beim letzten Aufruf (für die Bit-Image Daten) }
  451.                 { darf auch weniger Speicher reserviert werden. Dann wird }
  452.                 { das Bild in Bändern erzeugt und übertragen (dauert länger)}
  453.  
  454.    function bgi_alloc( var Memory : pointer; idealsize : longint)
  455.             : longint;
  456.    far;
  457.          { Input Pointer auf Daten, Wunschgröße in Byte }
  458.          { Rückgabe : Größe in Byte }
  459.    var
  460.     maxmem : LongInt;
  461.    begin
  462.     maxmem   := GlobalCompact(idealsize);     { möglichst alles }
  463.                                                   { bereitstellen }
  464.     if (idealsize) < maxmem then              { aber nicht mehr als}
  465.         maxmem := idealsize;              { erforderlich }
  466.     MemHandle[stack_count]    := GlobalAlloc(GMEM_FIXED, maxmem);     { reservieren }
  467.     MemPtr[stack_count]    := GlobalLock(MemHandle[stack_count]);  { festnageln }
  468.     Memory                  := MemPtr[stack_count];                 { mitteilen }
  469.     bgi_alloc               := GlobalSize(MemHandle[stack_count]);    { Größe ermitteln }
  470.     inc(stack_count);
  471.    end;
  472.  
  473.    procedure myfree; far;    { gibt den Speicher wieder frei }
  474.    begin
  475.    if stack_count = 0 then
  476.       exit;
  477.    while stack_count >0 do
  478.       begin
  479.       dec(stack_count);
  480.       if MemPtr[stack_count] = NIL then
  481.          continue;
  482.       if GlobalUnlock(MemHandle[stack_count]) = false then
  483.          begin
  484.          MemHandle[stack_count] := GlobalFree(MemHandle[stack_count]);
  485.          MemPtr[stack_count] := NIL;
  486.          end
  487.       else
  488.          begin
  489.          Writeln('Speicher konnte von "myfree" nicht freigegeben werden!');
  490.          Halt(4);
  491.          end;
  492.       end;
  493.    end;
  494.  
  495. {$ENDIF}
  496.  
  497. function BGIControl(Status : integer) : word; far;
  498. { wird von den Drucker-Treibern während der Ausgabe oft aufgerufen }
  499. { Argument : Status }
  500.       { >= 0 : Nummer der Zeile die übertragen werden soll }
  501.       { -1   : Fehler beim Eröffnen }
  502.       { -2   : Fehler beim übertragen (Busy oder Störung) }
  503.       { -3   : Soll Graphik erzeugt werden ? 0 : ja  1: nein
  504. { Rückgabe : }
  505.       { 0 : Fortsetzung der Übertragung }
  506.       { 1 : Abbruch der Übertragung }
  507.       { 2 : Neustart der Übertragung (nur wenn Status < 0) }
  508.  
  509. var
  510.    c : char;
  511. begin
  512. if Status >= 0 then           { kein Fehler : Status = Zeilennummer }
  513.    begin
  514.    write(#13,Status:4);       { den Anwender unterhalten }
  515.                               { Bemerkung : Der Treiber schreibt auch }
  516.                               { die Grenzzeilen des aktuellen Bandes auf }
  517.                               { den Monitor. Dies können Sie mit  }
  518.                               { Treiber_konfiguration.warnings unterbinden }
  519.  
  520.    if keypressed then         { den Anwender beachten }
  521.       begin
  522.       writeln('Ausgabe in vollem Gange');
  523.       writeln('Was ist zu tun ?');
  524.       writeln(' 0 : Weitermachen');
  525.       writeln(' 1 : Aufhören');
  526.       while keypressed do
  527.             c := readkey;                   { Puffer leeren }
  528.       repeat
  529.          c := readkey;                      { Entscheidung abholen }
  530.       until (c = '0') or (c = '1') ;
  531.       BGIControl := ord(c) - ord('0');      { Entscheidung auswerten }
  532.       end
  533.    else                                     { keine Intervention : }
  534.       BGIControl := 0;                      { weitermachen }
  535.    exit;                                    { zurück zum BGI-Treiber }
  536.    end;
  537. if Status = -1 then                         { Fehler beim Öffnen }
  538.    begin
  539.    writeln('Ausgabe nicht bereit (Disk voll, Printer Offline, ...) !');
  540.    writeln('Was ist zu tun ?');
  541.    writeln(' 0 : Drucker ist eingeschaltet, nochmal versuchen ');
  542.    writeln(' 1 : Aufhören');
  543.    while keypressed do
  544.          c := readkey;                      { Puffer leeren }
  545.    repeat
  546.       c := readkey;                         { Entscheidung abholen }
  547.    until (c = '0') or (c = '1') ;
  548.    BGIControl := ord(c) - ord('0');         { Entscheidung auswerten }
  549.    exit;
  550.    end;
  551. if Status = -3 then                         { Soll graphik erzeugt werden ?}
  552.    begin
  553.    BGIControl := 0;                         { ja ! }
  554. {   BGIControl := 1;                         { nein! }
  555.    exit;
  556.    end;
  557.                                          { Rest : Status < -1 }
  558. gotoxy(6,wherey);
  559. write('Printer BUSY');                   { melden }
  560. if keypressed then                       { Eingriff gefordert ? }
  561.    begin
  562.    writeln('Ausgabe gestört oder Drucker beschäftigt !');
  563.    writeln('Was ist zu tun ?');
  564.    writeln(' 0 : Drucker ist beschäftigt, weiter versuchen');
  565.    writeln(' 1 : Aufhören');
  566.    writeln(' 2 : Daten noch mal von vorn übertragen');
  567.    while keypressed do
  568.          c := readkey;                   { Puffer leeren }
  569.    repeat
  570.       c := readkey;                      { Entscheidung abholen }
  571.    until (c >= '0') and (c <= '2') ;
  572.    BGIControl := ord(c) - ord('0');      { Entscheidung auswerten }
  573.    end
  574. else
  575.    BGIControl := 0;        { Weitermachen }
  576. end;
  577.  
  578. {$ENDIF}
  579.  
  580. const
  581. {$IFDEF HPGLPLOTTER}
  582.        HP7475_A3 : hpgl_rec = (
  583.            reconfig    : 1;         { 1: Treiber benutzt diese Werte   }
  584.            stiftzahl   : 7;         { Stifte im Karussel +  "kein stift" }
  585.            speedmax    : 381;       { Defaultspeed [mm/s] }
  586.            speed       : (100,100,100,100,100,100,100,100, { der Farbstifte }
  587.                           100,100,100,100,100,100,100,100, { in % }
  588.                           100,100,100,100,100,100,100,100, {  100 = default }
  589.                           100,100,100,100,100,100,100,100
  590.                          );
  591.            dicke       :    { der Stifte [Plottereinheiten],  12 = 0.3mm  }
  592.                          (12,12,12,12,12,12,12,12,
  593.                           12,12,12,12,12,12,12,12,
  594.                           12,12,12,12,12,12,12,12,
  595.                           12,12,12,12,12,12,12,12
  596.                          );
  597.            strichweite : 3;  { gestrichelten Linien pro Pattern-Bit }
  598.                              {in Stiftdicken }
  599.            size        : (x:16158;y:11040); { Ausdehnung in Pixeln          }
  600.            filehandle  : 0;     { wird vom Treiber gesetzt. }
  601.                                 { Für Plotterbefehle mittels INT $40) }
  602.            rotate      : FALSE; { Landscape                 }
  603.            formfeed    : FALSE; { Plotter kann und soll Papier auswerfen ?  }
  604.            lastschnitt : 0;     { für Schnittstellle = 9    }
  605.            initstr     : #27'(;IN;SC;PU0,0;'; { Plotter Reset, kein Stift }
  606.            exitstr     : ''    { leer }
  607.            );
  608.  
  609.        HP7475_A4 : hpgl_rec = (
  610.            reconfig    : 1;         { 1: Treiber benutzt diese Werte   }
  611.            stiftzahl   : 7;         { Stifte im Karussel +  "kein stift" }
  612.            speedmax    : 381;       { Defaultspeed [mm/s] }
  613.            speed       : (100,100,100,100,100,100,100,100, { der Farbstifte }
  614.                           100,100,100,100,100,100,100,100, { in % }
  615.                           100,100,100,100,100,100,100,100, {  100 = default }
  616.                           100,100,100,100,100,100,100,100
  617.                          );
  618.            dicke       :    { der Stifte [Plottereinheiten],  12 = 0.3mm  }
  619.                          (12,12,12,12,12,12,12,12,
  620.                           12,12,12,12,12,12,12,12,
  621.                           12,12,12,12,12,12,12,12,
  622.                           12,12,12,12,12,12,12,12
  623.                          );
  624.            strichweite : 3;  { gestrichelten Linien pro Pattern-Bit }
  625.                              {in Stiftdicken }
  626.            size        : (x:11040;y: 7721); { Ausdehnung in Pixeln         }
  627.            filehandle  : 0;     { wird vom Treiber gesetzt. }
  628.                                 { Für Plotterbefehle mittels INT $40) }
  629.            rotate      : FALSE; { Landscape                 }
  630.            formfeed    : FALSE; { Plotter kann und soll Papier auswerfen ? }
  631.            lastschnitt : 0;     { für Schnittstellle = 9    }
  632.            initstr     : #27'(;IN;SC;PU0,0;'; { Plotter Reset, kein Stift }
  633.            exitstr     : ''     { leer }
  634.            );
  635.  
  636.        HPLaserjet_A4 : hpgl_rec = (
  637.            reconfig    : 1;         { 1: Treiber benutzt diese Werte   }
  638.            stiftzahl   : 7;         { Stifte im Karussel +  "kein stift" }
  639.            speedmax    : 381;       { Defaultspeed [mm/s] }
  640.            speed       : (100,100,100,100,100,100,100,100, { der Farbstifte }
  641.                           100,100,100,100,100,100,100,100, { in % }
  642.                           100,100,100,100,100,100,100,100, {  100 = default }
  643.                           100,100,100,100,100,100,100,100
  644.                          );
  645.            dicke       :    { der Stifte [Plottereinheiten],  12 = 0.3mm  }
  646.                          (12,12,12,12,12,12,12,12,
  647.                           12,12,12,12,12,12,12,12,
  648.                           12,12,12,12,12,12,12,12,
  649.                           12,12,12,12,12,12,12,12
  650.                          );
  651.            strichweite : 3;  { gestrichelten Linien pro Pattern-Bit }
  652.                              {in Stiftdicken }
  653.            size        : (x:7721;y: 11040); { Ausdehnung in Pixeln                 }
  654.            filehandle  : 0;     { wird vom Treiber gesetzt. }
  655.                                 { Für Plotterbefehle mittels INT $40) }
  656.            rotate      : FALSE; { Landscape                 }
  657.            formfeed    : FALSE; { Plotter kann und soll Papier auswerfen ?         }
  658.            lastschnitt : 0;     { für Schnittstellle = 9    }
  659.            initstr     : #27'%0B'#27'(;IN;SC;PU0,0;'; { HPGL-Modus an, Plotter Reset, kein Stift }
  660.            exitstr     : #27'%0A'#12 { PCL-Modus wieder an, Formfeed }
  661.            );
  662.  
  663.        HP7550_A3 : hpgl_rec = (
  664.            reconfig    : 1;         { 1: Treiber benutzt diese Werte   }
  665.            stiftzahl   : 9;         { Stifte im Karussel +  "kein stift" }
  666.            speedmax    : 381;       { Defaultspeed [mm/s] }
  667.            speed       : (100,100,100,100,100,100,100,100, { der Farbstifte }
  668.                           100,100,100,100,100,100,100,100, { in % }
  669.                           100,100,100,100,100,100,100,100, {  100 = default }
  670.                           100,100,100,100,100,100,100,100
  671.                          );
  672.            dicke       :    { der Stifte [Plottereinheiten],  12 = 0.3mm  }
  673.                          (12,12,12,12,12,12,12,12,
  674.                           12,12,12,12,12,12,12,12,
  675.                           12,12,12,12,12,12,12,12,
  676.                           12,12,12,12,12,12,12,12
  677.                          );
  678.            strichweite : 3;  { gestrichelten Linien pro Pattern-Bit }
  679.                              {in Stiftdicken }
  680.            size        : (x:15970;y:10870); { Ausdehnung in Pixeln           }
  681.            filehandle  : 0;     { wird vom Treiber gesetzt. }
  682.                                 { Für Plotterbefehle mittels INT $40) }
  683.            rotate      : FALSE; { Landscape                 }
  684.            formfeed    : TRUE;  { Plotter kann und soll Papier auswerfen ?   }
  685.            lastschnitt : 0;     { für Schnittstellle = 9    }
  686.            initstr     : #27'(;IN;SC;PU0,0;'; { Plotter Reset, kein Stift }
  687.            exitstr     : ''     { leer }
  688.            );
  689.  
  690.        HP7550_A4 : hpgl_rec = (
  691.            reconfig    : 1;         { 1: Treiber benutzt diese Werte   }
  692.            stiftzahl   : 9;         { Stifte im Karussel +  "kein stift" }
  693.            speedmax    : 381;       { Defaultspeed [mm/s] }
  694.            speed       : (100,100,100,100,100,100,100,100, { der Farbstifte }
  695.                           100,100,100,100,100,100,100,100, { in % }
  696.                           100,100,100,100,100,100,100,100, {  100 = default }
  697.                           100,100,100,100,100,100,100,100
  698.                          );
  699.            dicke       :    { der Stifte [Plottereinheiten],  12 = 0.3mm  }
  700.                          (12,12,12,12,12,12,12,12,
  701.                           12,12,12,12,12,12,12,12,
  702.                           12,12,12,12,12,12,12,12,
  703.                           12,12,12,12,12,12,12,12
  704.                          );
  705.            strichweite : 3;  { gestrichelten Linien pro Pattern-Bit }
  706.                              {in Stiftdicken }
  707.            size        : (x:10870;y: 7600); { Ausdehnung in Pixeln         }
  708.            filehandle  : 0;     { wird vom Treiber gesetzt. }
  709.                                 { Für Plotterbefehle mittels INT $40) }
  710.            rotate      : FALSE; { Landscape                 }
  711.            formfeed    : TRUE;  { Plotter kann und soll Papier auswerfen ? }
  712.            lastschnitt : 0;     { für Schnittstellle = 9    }
  713.            initstr     : #27'(;IN;SC;PU0,0;'; { Plotter Reset, kein Stift }
  714.            exitstr     : ''     { leer }
  715.            );
  716. {$ENDIF}
  717.  
  718. {$IFDEF LASERDRUCKER}
  719.        AUFLOESUNG = 1;   {Druckerpixel/logischem Punkt    Bereich: 1..4  }
  720.        laserkonfig : laser_rec = (
  721.            reconfig    : 1;        { 1: Treiber liest Werte aus Struct   }
  722.            stiftzahl   : 2;        { Stiftzahl des Druckers (0..n-1).     }
  723.            dicke       : (  { in Dots Druckereinheiten, 12 = 1mm bei 300 dpi }
  724.                          1,1,1,1,3,3,3,3,
  725.                          3,3,3,3,3,3,3,3,
  726.                          3,3,3,3,3,3,3,3,
  727.              3,3,3,3,3,3,3,3
  728.                          );
  729.            strichweite : 6;     { der gestrichelten Linien pro Pattern-Bit }
  730.            size        : (x:2335 div AUFLOESUNG;
  731.                           y:3300 div AUFLOESUNG
  732.                           );    { Ausdehnung in Pixeln bei Portrait }
  733.            rotate      : FALSE; { Portrait }
  734.            formfeed    : TRUE;  { (J/N) Seite ausdrucken ?  }
  735.            resolution  : AUFLOESUNG;        { 1,2,3 oder 4 Pixel / Punkt }
  736.            compress    : FALSE; { Komprimiermethode 2 ab Laserjet III }
  737.            lastschnitt : 0;      { für Schnittstellle = 9   }
  738.            file_append : FALSE; { True : File wird nicht überschrieben }
  739.      initstr     : #27'*p0X'#27'*p0Y'  { Cursor nach Links oben }
  740.            );
  741. {$ENDIF}
  742.  
  743.  
  744. {$IFDEF NADELDRUCKER}
  745.        nadelkonfig : nadel_rec = (
  746.      reconfig    : 1;         { 1: Treiber liest Werte aus Struct      }
  747.            stiftzahl   : 2;       { Stiftzahl im Karussel  (0..n-1).     }
  748.            dicke       : (  { in Dots Druckereinheiten, 12 = 1mm bei 300 dpi }
  749.                       1,1,1,1,1,1,1,1,
  750.                       1,1,1,1,1,1,1,1,
  751.                       1,1,1,1,1,1,1,1,
  752.                       1,1,1,1,1,1,1,1
  753.                       );    { in Dots Druckereinheiten 12 = 1mm bei 300 dpi }
  754.            strichweite : 6;     { der gestrichelten Linien pro Pattern-Bit  }
  755.            size        : (x:0;y:0);{ Nadel nimmt eigene Werte }
  756.            rotate      : FALSE;     { Portrait }
  757.            formfeed    : TRUE;  { (J/N) Seite ausdrucken ?  }
  758.            printermode : EPS_240;       { EPS_240 .. NEC_360_360    }
  759.            defaultbackground : 15;       { weiß nur für colormode }
  760.            endezeichen : 6;     { 0: CR 1: LF 2: CR/LF  +4 für Zeilenende immer }
  761.            lastschnitt : 0;      { für Schnittstellle = 9   }
  762.            file_append : FALSE; { True : File wird nicht überschrieben }
  763.        initstr     : #27'U1'       { Spezielle Einstellungen     }
  764.             { z.B. Unidirektionaler Druck für High Quality }
  765.         );
  766. {$ENDIF}
  767.  
  768. {$IFDEF DESKJETDRUCKER}
  769.     DESKJET_AUFLOESUNG = 1;   {Druckerpixel/logischem Punkt    Bereich: 1..4  }
  770.     deskjetkonfig : deskjet_rec = (
  771.      reconfig    : 1;        { 1: Treiber liest Werte aus Struct       }
  772.      stiftzahl   : 16;        { Stiftzahl des Druckers (0..n-1).     }
  773.      dicke       : (  { in Dots Druckereinheiten, 12 = 1mm bei 300 dpi }
  774.              1,1,1,1,3,3,3,3,
  775.              3,3,3,3,3,3,3,3,
  776.              3,3,3,3,3,3,3,3,
  777.              3,3,3,3,3,3,3,3
  778.              );
  779.      strichweite : 6;       { der gestrichelten Linien pro Pattern-Bit}
  780.      size        : (x:2400 div DESKJET_AUFLOESUNG;
  781.               y:3100 div DESKJET_AUFLOESUNG   {3150 im Monomodus möglich}
  782.               );    { Ausdehnung in Pixeln bei Portrait }
  783.      rotate      : FALSE;   { Portrait }
  784.      formfeed    : TRUE;    { (J/N) Seite ausdrucken ?  }
  785.      resolution  : DESKJET_AUFLOESUNG;      { 1,2,3 oder 4 Pixel / Punkt }
  786.      printermode : 128; { 0 für Mono, 128 für Color }
  787.      defaultbackground : 15;       { weiß nur für colormode }
  788.      lastschnitt : 0;     { für Schnittstellle = 9  }
  789.      file_append : FALSE;   { True : File wird nicht überschrieben }
  790.      quality     : 2;       { 0: Keypad Einstellung 1: Draft 2: High }
  791.      depletion   : 1;       { Ausdünnung 0: keine 1: normal, 2 stark }
  792.      shingling   : 2;        { Mehrphasendruck 0: nein 1: 2 Phasen 2: 4 Phasen }
  793.      Initstring  : ''        {  zur freien Benutzung 50 chars }
  794.      );
  795. {$ENDIF}
  796.  
  797. {$IFDEF PAINTJETDRUCKER}
  798.     PAINTJET_AUFLOESUNG = 1;   {Druckerpixel/logischem Punkt    Bereich: 1..2  }
  799.     PAINTJETkonfig : paintjet_rec = (
  800.      reconfig    : 1;        { 1: Treiber liest Werte aus Struct       }
  801.      stiftzahl   : 16;        { Stiftzahl des Druckers (0..n-1).     }
  802.      dicke       : (  { in Dots Druckereinheiten, 12 = 1mm bei 300 dpi }
  803.              1,1,1,1,3,3,3,3,
  804.              3,3,3,3,3,3,3,3,
  805.              3,3,3,3,3,3,3,3,
  806.              3,3,3,3,3,3,3,3
  807.              );
  808.      strichweite : 3;       { der gestrichelten Linien pro Pattern-Bit}
  809.      size        : (x:1440 div PAINTJET_AUFLOESUNG;    {A4}
  810.               y:2055 div PAINTJET_AUFLOESUNG           {A4}
  811.               );    { Ausdehnung in Pixeln bei Portrait }
  812.      rotate      : FALSE;   { Portrait }
  813.      formfeed    : TRUE;    { (J/N) Seite ausdrucken ?  }
  814.      resolution  : PAINTJET_AUFLOESUNG;      { 1 oder 2 Pixel / Punkt }
  815.      printermode : 128; { 0 für Mono, 128 für Color }
  816.      defaultbackground : 15;       { weiß nur für colormode }
  817.      lastschnitt : 0;     { für Schnittstellle = 9  }
  818.      file_append : FALSE;   { True : File wird nicht überschrieben }
  819.      shingling   : 2        { Mehrphasendruck 0: nein 1: 2 Phasen 2: 4 Phasen }
  820.      );
  821. {$ENDIF}
  822.  
  823. {$IFDEF DXFDRUCKER}
  824.     DXFkonfig : DXF_rec = (
  825.      reconfig    : 1;        { 1: Treiber liest Werte aus Struct       }
  826.      stiftzahl   : 8;        { Stiftzahl des Druckers (0..n-1).     }
  827.      dicke       : (  { in units der resolution  }
  828.              1,2,3,4,5,3,3,3,
  829.              3,3,3,3,3,3,3,3,
  830.              3,3,3,3,3,3,3,3,
  831.              3,3,3,3,3,3,3,3
  832.              );
  833.      strichweite : 3;       { der gestrichelten Linien pro Pattern-Bit}
  834.      size        : (x:2100;
  835.                     y:2900);    { DIN A4 Ausdehnung 1/10 mm }
  836.      resolution  : -1;      { 10 erpotenz der Pixel mm }
  837.      textwinkel  : 90;   { Winkel SetTextStyle( x,VertDir, y)  normal }
  838.      textstyle   : 'txt'
  839.      );
  840. {$ENDIF}
  841.  
  842. function get_schnittstelle(var mode: integer; geraet,defaultdatei : string) : boolean;
  843. var
  844.    c : char;
  845. begin
  846. writeln('Wählen Sie die Schnittstelle für den ',geraet,' : ');
  847. writeln('  0  Standarddatei "',defaultdatei,'" im Aktuellen Verzeichnis');
  848. writeln('  1  COM1:');
  849. writeln('  2  COM2:');
  850. writeln('  3  COM3:');
  851. writeln('  4  COM4:');
  852. writeln('  5  LPT1:');
  853. writeln('  6  LPT2:');
  854. writeln('  7  LPT3:');
  855. writeln('  8  Datei mit frei wählbarem Namen');
  856. writeln('  9  ',geraet,' wird nicht benötigt.');
  857. writeln;
  858. write('Drücken Sie eine Taste aus 0..9 ');
  859. mode := -1;
  860. repeat
  861. c := readkey;
  862. if c <= '9' then
  863.    mode := ord(c) - ord('0');
  864. until mode >= 0;
  865. writeln;
  866. if mode = 9 then
  867.    get_schnittstelle := false
  868. else
  869.    get_schnittstelle := true;
  870. end;
  871.  
  872.  
  873. const
  874. {$IFDEF VER50}
  875. graph_fehler = 5;
  876. {$DEFINE NUR12}
  877. {$ENDIF}
  878.  
  879. {$IFDEF VER55}
  880. graph_fehler = 5;
  881. {$DEFINE NUR12}
  882. {$ENDIF}
  883.  
  884. {$IFDEF VER60}
  885. graph_fehler = 0;  { Version 6.0 arbeitet korrekt}
  886.                    { aber nicht registerbgidriver}
  887. {$ENDIF}
  888. {$IFDEF VER70}
  889. graph_fehler = 0;  { Version 7.0 arbeitet korrekt}
  890.                    { registerbgidriver hab ich nicht untersucht }
  891. {$ENDIF}
  892.  
  893. function VectorIstBrauchbar(IntVektor : pointer ) : boolean;
  894. begin
  895. {$IFNDEF DPMI}
  896. if (word(IntVektor^) = $CF58) or (IntVektor = NIL) then
  897.    VectorIstBrauchbar := true { keine Interrupt Routine installiert }
  898. else
  899.    VectorIstBrauchbar := false; { Interrupt Routine vorhanden }
  900. {$ELSE}
  901. VectorIstBrauchbar := true; { es gibt sowieso keinen verwaisten Interrupt- }
  902.                             { vektor. Aber die Umlenkung funktioniert  }
  903.                             { sogar mit INT21 (kostet nur Zeit). }
  904. {$ENDIF}
  905. end;
  906.  
  907.  
  908. procedure SucheIntvektor;
  909. var
  910.   weitersuchen  : boolean;    { nach freiem Interruptvektor }
  911.  
  912. begin
  913. weitersuchen := true;
  914. benutzte_Vektornummer      := $60;
  915. while weitersuchen do
  916.    begin
  917.    getintvec(benutzte_Vektornummer,AltIntVektor);
  918.    weitersuchen := not VectorIstBrauchbar(AltIntVektor);
  919.    if weitersuchen then
  920.       begin
  921.       inc(benutzte_Vektornummer);
  922.       if benutzte_Vektornummer > $FF then   { alle Ints durchprobiert  }
  923.          begin                              { kann eigentlich nicht ... }
  924.          writeln('Kein Interrupt mehr für BGI-Treiber frei !');
  925.          halt(4);
  926.          end;
  927.       end;
  928.    end;
  929. end;
  930.  
  931. procedure allocexit; far;
  932.     begin
  933.     exitproc := oldexitproc;   { alte exitprozedur restaurieren }
  934.     setintvec(benutzte_Vektornummer,AltIntVektor);  { alten Vektor restaurieren }
  935.     {$IFDEF DPMI}
  936.     if GlobalFreePtr(UmleitungPtr) <> 0 then
  937.        begin
  938.        writeln('Intvektor Speicher nicht mehr frei zu geben !?');
  939.        { writeln('Warum haben Sie denn die SIMM's angelötet?');}
  940.        end;
  941.     {$ENDIF}
  942.     end;
  943.  
  944.  
  945.  
  946. procedure ErzeugeIntServiceRoutine;
  947. var
  948.    test : word;                 { dummy }
  949. begin
  950. {$IFDEF DPMI}
  951.     { Speicher für ISR reservieren }
  952. UmleitungPtr := GlobalAllocPtr(gmem_NoDiscard+gmem_NoCompact, sizeof(UmleitungPtr^));
  953. {$ELSE}
  954. UmleitungPtr := @Umleitung;    { erzeugt einen far Pointer für SetIntVec}
  955. {$ENDIF}
  956.  
  957. {ISR "assemblieren" }
  958. with UmleitungPtr^ do
  959.     begin
  960.     jumpbefehl   := $EA;            { jump far segment offset }
  961.     sprungziel   := AltIntVektor;   { zur original ISR }
  962.     kennung      := kenncode;       { für BGI-Treiber  }
  963.     data         := @Treiber_konfiguration; { Pointer auf Konfiguration }
  964.     end;
  965. {$IFDEF DPMI}
  966.     { im Protected Mode muß der Code über einen Codeselector adressiert werden}
  967.     test := PrestoChangoSelector(seg(UmleitungPtr^),seg(UmleitungPtr^));
  968. {$ENDIF}
  969.     SetIntVec(benutzte_Vektornummer,UmleitungPtr); { und installieren }
  970.     oldexitproc := exitproc;          { bisherige exitprozedur merken      }
  971.     exitproc    := @allocexit;        { sorgt fuer Restaurierung der ISR   }
  972.                                       { und der bisherigen Exitprozedur    }
  973. end;
  974.  
  975. procedure InitDriver (
  976.            var treiber ,                { Aufrufparameter für initgraph }
  977.                mode    : integer;       { Aufrufparameter für initgraph }
  978.            BGI_Name    ,                { Name der BGI-Datei }
  979.            geraet      ,                { Klartext Name des Ausgabegerätes}
  980.            Ofile       : string;        { Standard Ausgabefile des Treibers }
  981.            einbinden   : boolean;       { ja/nein}
  982.            Objtreiber  : pointer        { falls ja : Zeiger auf angelinkten
  983.                                         Treiber }
  984.            );
  985. begin
  986.  
  987.    if get_schnittstelle(mode,geraet,Ofile) then   { Treiber wird gebraucht }
  988.       begin
  989.       treiber := graph_fehler + installuserdriver (BGI_Name,NIL);
  990.       if einbinden then
  991.           begin
  992.           if registerbgidriver(Objtreiber) < 0 then
  993.              begin
  994.              writeln('RegisterBGIDriver von ',BGI_Name,' ist fehlgeschlagen');
  995.              halt(0);
  996.              end;
  997.           end;
  998.       end
  999.    else
  1000.       begin                            { Treiber wird nicht gebraucht }
  1001.       treiber := monitortreiber;       { Zur Sicherheit Ausgabe auf Monitor }
  1002.       mode    := monitormode;          { falls er doch gewählt wird.}
  1003.       end;
  1004.    {$IFDEF NUR12}
  1005.    if treiber > 12 then
  1006.       begin writeln('Maximal 2 fremde Treiber bei Pascal 5.0'); halt; end;
  1007.    {$ENDIF}
  1008.    if treiber < 0 then
  1009.        begin
  1010.        writeln( BGI_Name,' kann nicht mehr installiert werden.');
  1011.        writeln('Vermutlich ist die Tabelle voll.');
  1012.        writeln('Entfernen Sie einen der Treiber aus der Datei "Inventar.inc".');
  1013.        writeln('Oder wählen Sie einen der Treiber nicht aus.');
  1014.        halt(0);
  1015.        end;
  1016. end;
  1017.  
  1018. procedure KonfiguriereDieTreiber;
  1019. begin
  1020.     with Treiber_konfiguration.umgebung do
  1021.          begin
  1022. {$IFDEF ANY_DRUCKER}
  1023.          control       := @BGIControl;
  1024.          control_ds    := DSeg;
  1025.          myalloc       := @bgi_alloc;
  1026.          mfree         := @myfree;
  1027.      free_ds       := DSeg;
  1028.      Selectordelta := SelectorInc;
  1029. {$ENDIF}
  1030.          end;
  1031.  
  1032. {$IFDEF HPGLPLOTTER}
  1033. {      plotter := @HPLaserjet_A4; fuer Laserjet mit HPGL-Emulation }
  1034. Treiber_konfiguration.plotter := @HP7475_A4;
  1035. InitDriver (
  1036.            plottertreiber,
  1037.            plottermode,
  1038.            plottername        ,
  1039.            'Plotter',
  1040.            'HPGL.PLT',
  1041.     {$IFDEF PLOTTER_EINBINDEN}
  1042.            true,
  1043.            @_HPGL_driver
  1044.     {$ELSE}
  1045.            false,
  1046.            NIL
  1047.     {$ENDIF}
  1048.            );
  1049. {$ENDIF}
  1050.  
  1051. {$IFDEF LASERDRUCKER}
  1052. Treiber_konfiguration.laserjet     := @laserkonfig;
  1053. InitDriver (
  1054.            lasertreiber,
  1055.            lasermode,
  1056.            lasername        ,
  1057.            'Laserdrucker',
  1058.            'LASER.PRN',
  1059.     {$IFDEF LASER_EINBINDEN}
  1060.            true,
  1061.            @_LASER_driver
  1062.     {$ELSE}
  1063.            false,
  1064.            NIL
  1065.     {$ENDIF}
  1066.            );
  1067. {$ENDIF}
  1068.  
  1069. {$IFDEF NADELDRUCKER}
  1070. Treiber_konfiguration.nadeldrucker := @nadelkonfig;
  1071. InitDriver (
  1072.            NADELtreiber,
  1073.            NADELmode,
  1074.            NADELname        ,
  1075.            'NADELdrucker',
  1076.            'NADEL.PRN',
  1077.     {$IFDEF NADEL_EINBINDEN}
  1078.            true,
  1079.            @_NADEL_driver
  1080.     {$ELSE}
  1081.            false,
  1082.            NIL
  1083.     {$ENDIF}
  1084.            );
  1085. {$ENDIF}
  1086.  
  1087. {$IFDEF DESKJETDRUCKER}
  1088. Treiber_konfiguration.deskjet_c := @deskjetkonfig;
  1089. InitDriver (
  1090.            DESKJETtreiber,
  1091.            DESKJETmode,
  1092.            DESKJETname,
  1093.            'DESKJET 500 C',
  1094.            'DESKJETC.PRN',
  1095.     {$IFDEF DESKJET_EINBINDEN}
  1096.            true,
  1097.            @_DESKJETC_driver
  1098.     {$ELSE}
  1099.            false,
  1100.            NIL
  1101.     {$ENDIF}
  1102.            );
  1103. {$ENDIF}
  1104.  
  1105. {$IFDEF PAINTJETDRUCKER}
  1106. Treiber_konfiguration.paintjet := @PAINTJETkonfig;
  1107. InitDriver (
  1108.            paintjettreiber,
  1109.            paintjetmode,
  1110.            paintjetname        ,
  1111.            'Paintjet XL',
  1112.            'PAINTJET.PRN',
  1113.     {$IFDEF PAINTJET_EINBINDEN}
  1114.            true,
  1115.            @_paintjet_driver
  1116.     {$ELSE}
  1117.            false,
  1118.            NIL
  1119.     {$ENDIF}
  1120.            );
  1121. {$ENDIF}
  1122.  
  1123. {$IFDEF DXFDRUCKER}
  1124. Treiber_konfiguration.DXF := @DXFkonfig;
  1125. InitDriver (
  1126.            DXFtreiber,
  1127.            DXFmode,
  1128.            DXFname        ,
  1129.            'DXF',
  1130.            'BGI.DXF',
  1131.     {$IFDEF DXF_EINBINDEN}
  1132.            true,
  1133.            @_DXF_driver
  1134.     {$ELSE}
  1135.            false,
  1136.            NIL
  1137.     {$ENDIF}
  1138.            );
  1139. {$ENDIF}
  1140. end;
  1141.  
  1142. function TreiberName(driver : integer) : string;
  1143. begin
  1144. if driver = monitortreiber then
  1145.    begin
  1146.    TreiberName := GetDriverName;
  1147.    exit;
  1148.    end;
  1149. {$IFDEF HPGLPLOTTER}
  1150. if driver = plottertreiber then
  1151.    begin
  1152.    TreiberName := plottername;
  1153.    exit;
  1154.    end;
  1155. {$ENDIF}
  1156. {$IFDEF LASERDRUCKER}
  1157. if driver = lasertreiber then
  1158.    begin
  1159.    TreiberName := lasername;
  1160.    exit;
  1161.    end;
  1162. {$ENDIF}
  1163. {$IFDEF NADELDRUCKER}
  1164. if driver = nadeltreiber then
  1165.    begin
  1166.    TreiberName := nadelname;
  1167.    exit;
  1168.    end;
  1169. {$ENDIF}
  1170. {$IFDEF DESKJETDRUCKER}
  1171. if driver = deskjettreiber then
  1172.    begin
  1173.    TreiberName := deskjetname;
  1174.    exit;
  1175.    end;
  1176. {$ENDIF}
  1177. {$IFDEF PAINTJETDRUCKER}
  1178. if driver = PAINTJETtreiber then
  1179.    begin
  1180.    TreiberName := PAINTJETname;
  1181.    exit;
  1182.    end;
  1183. {$ENDIF}
  1184. {$IFDEF DXFDRUCKER}
  1185. if driver = DXFtreiber then
  1186.    begin
  1187.    TreiberName := DXFname;
  1188.    exit;
  1189.    end;
  1190. {$ENDIF}
  1191.    TreiberName := 'unknown driver';
  1192. end;
  1193.  
  1194.  
  1195.  
  1196. begin {initialisierung der unit }
  1197.  
  1198. { Monitor ermitteln solange DetectGraph noch funktioniert }
  1199. DetectGraph(monitortreiber,monitormode);
  1200.  
  1201. SucheIntvektor;      { Freien Interruptvektor suchen  }
  1202.  
  1203. { Code für die Interruptreoutine erzeugen und installieren }
  1204. ErzeugeIntServiceRoutine;
  1205.  
  1206. {XYtreiber  , XYmode ... zuweisen, und die Treiber Installieren}
  1207. KonfiguriereDieTreiber;
  1208.  
  1209. end.
  1210.