home *** CD-ROM | disk | FTP | other *** search
/ TopWare 18: Liquid / Image.iso / liquid / top1200 / paperbgi.lzh / C / BGIALLOC.C next >
Encoding:
C/C++ Source or Header  |  1993-11-28  |  30.8 KB  |  815 lines

  1. /*
  2.     File BGIALLOC.C     TAB 4
  3.  
  4.     (C)opyright
  5.            Raimund Nisius
  6.            Goethepark  13
  7.            W-1000 Berlin 12
  8.        April 1992
  9.     Als rechtmäßiger Besitzer eines BGI-Treibers dürfen sie
  10.     diesen Quellcode benutzen und nach Ihrem Bedarf verändern.
  11.  
  12.     Dieses Modul ist für HPGL.BGI, LASER.BGI und NADEL.BGI DESKJETC.BGI
  13.     PJXL.BGI DXF.BGI nutzbar.
  14.     ------------------------------------------------------------------
  15.     Wenn Sie einen dieser Treiber nicht benutzen, dann können sie
  16.     die entsprechende Zeile
  17.     ##define ...
  18.     in der Datei  "inventar.h" streichen.
  19.     */
  20.  
  21. #include "inventar.h"
  22.  
  23. /*      Entfernen Sie diesen Kommentar , wenn
  24.         Sie die Treiber einbinden wollen
  25. #define PLOTTER_EINBINDEN
  26. #define LASER_EINBINDEN
  27. #define NADEL_EINBINDEN
  28. #define DESKJET_EINBINDEN
  29. #define PAINTJET_EINBINDEN
  30.  
  31. */
  32.  
  33. /*
  34. Diese Datei stellt dem Hauptprogramm die Variablen
  35.                 monitortreiber  , monitormode
  36.                 plottertreiber  , plottermode
  37.                 lasertreiber    , lasermode
  38.                 nadeltreiber    , nadelmode
  39.                 deskjettreiber  , deskjetmode
  40.                 paintjettreiber  , paintjetmode
  41.              zur Verfügung und intialisiert sie. Außer beim Monitor
  42.              bedeutet "...mode" die Schnittstelle, an der das Gerät
  43.              angeschlossen ist. Wenn Sie im Hauptprgramm mit z.B.
  44.              initgraph( plottertreiber, plottermode, '');
  45.              auskommen, dann brauchen Sie nicht mehr weiterzulesen.
  46.  
  47.  
  48. Diese Datei
  49.             stellt den Treibern "HPGL.BGI","LASER.BGI","NADEL.BGI",
  50.             "DESKJETC.BGI" einen Interruptvektor zur Verfügung.
  51.             Dieser Vektor zeigt auf eine Datenstruktur vom Typ
  52.             BGI_struct mit den Konfigurationen der einzelnen Treiber.
  53.             Der Initialisierungsteil des Moduls installiert den Interrupt
  54.             und sorgt dafür daß er zum Programmschluß wieder entfernt
  55.             wird.
  56.  
  57.             Welcher Interruptvektor das ist, wird zur Laufzeit bestimmt.
  58.             Wenn das Strukturelement "reconfig" gleich Null ist, setzt
  59.             der Treiber seine eigenen Defaultwerte ein.
  60.             Die Bedeutung der Strukturelemente entnehmen Sie bitte der
  61.             Datei "BGIALLOC.H".
  62.  
  63.  
  64.  
  65. Diese Datei
  66.             stellt den Druckertreibern eine Funktion zur Speicher-
  67.             allocation zur Verfügung.
  68.             Der Speicher wird während der Ausführung von CloseGraph
  69.             bzw. RestoreCrtMode von myalloc angefordert und mit
  70.             myfree wieder freigegeben.
  71.  
  72.  
  73. Diese Datei
  74.     stellt den Druckertreibern eine Funktion zur Kontrolle
  75.     der Datenausgabe zur Verfügung (BGIControl)
  76.     Diese Funktion wird während der Datenübertragung oft mit einem
  77.     Argument >= 0 aufgerufen. Bei Fehlern wird sie mit einem
  78.     Argument  < 0 aufgerufen.
  79.     Das Funktionsergebnis befiehlt dem Treiber, wie er arbeiten soll.
  80.     Argument :
  81.           >= 0 : Nummer der Zeile die übertragen werden soll
  82.           -1   : Fehler beim Eröffnen
  83.           -2   : Fehler beim übertragen (Busy oder Störung)
  84.           -3   : Anfrage ob die Bilderzeugung stattfinden soll
  85.                    (Antwort 1 = Abbruch. Sonst gehts los)
  86.     Rückgabe :
  87.           0 : Fortsetzung der Übertragung (noch mal versuchen)
  88.           1 : Abrruch der Übertragung
  89.           2 : Neustart der Übertragung (nur wenn Status < 0)
  90.     Wenn die Adresse dieser Funktion dem Treiber nicht übergeben
  91.     wurde, bricht er bei Eröffnungsfehler ab, sonst arbeitet er
  92.     weiter.
  93.  
  94.  
  95.     Hinweis
  96.     falls Sie eine komplizierte dynamische Datenstruktur haben :
  97.     AllocInit() muß den Druckertreibern zwei Funktionen und deren
  98.     Datensegment bekanntmachen.
  99.     Die erste Funktion muß wie myalloc deklariert sein. Sie muß ver-
  100.     fügbaren, zusammenhängenden Speicherplatz (möglichst viel) schaf-
  101.     fen und dem Treiber mitteilen. Die Anzahl der vollständigen Para-
  102.     graphen (16Byte) ist der Rückgabewert dieser Funktion. Die als
  103.     Referenz übergebene Variable wird mit der Nummer des 1. voll-
  104.     ständigen Paragraphen belegt.
  105.     Die zweite Funktion muß wie myfree deklariert sein. Sie gibt den
  106.     Speicher wieder frei.
  107.     Sie können z.B. mit myalloc Ihren gesamten Heap auf Festplatte
  108.     retten. Mit myfree restaurieren sie den Heap wieder. myalloc
  109.     braucht dann nur die Länge und Position des geretteten Heap anzu-
  110.     geben. Vorteil : Sie müssen den genauen Aufbau ihrer dynamischen
  111.     Daten zum Zeitpunkt von closegraph nicht kennen.
  112. */
  113.  
  114. #ifdef  __TINY__
  115. #error Übersetzen Mit Speichermodell {Compact,Large, Huge}!
  116. #endif
  117. #ifdef  __SMALL__
  118. #error Übersetzen Mit Speichermodell {Compact,Large, Huge}!
  119. #endif
  120. #ifdef  __MEDIUM__
  121. #error Übersetzen Mit Speichermodell {Compact,Large, Huge}!
  122. #endif
  123.  
  124. #include <graphics.h>
  125. #include <alloc.h>
  126. #include <conio.h>
  127. #include <stdio.h>
  128. #include <stdlib.h>
  129. #include <dos.h>
  130. #include <string.h>
  131. #define  BGIALLOC_FILE      /* fuer BGIALLOC.H */
  132. #include "BGIALLOC.H"
  133.  
  134. void AllocInit(void);   /* wird automatisch bei Programmstart aufgerufen */
  135. void get_schnittstelle(int *mode, char *geraet, char *defaultdatei);
  136.                         /* wird von AllocInit benutzt (erfragt interaktiv) */
  137.                         /* die Schnittstelle des Gerätes ab. */
  138. void allocexit(void);   /* wird zum Programmschluß automatisch aufgerufen */
  139.  
  140. typedef unsigned int  word;
  141.  
  142. #ifdef ANY_DRUCKER
  143.     void far *memptr;           /* Zeiger auf den allozierten Bereich */
  144. #endif
  145. int benutzte_Vektornummer;      /* Interruptvektor vor initialisierung */
  146. void interrupt(*AltIntVektor)();            /* des Moduls */
  147.  
  148.  
  149. /* deklarieren der Treiber zum Linken */
  150. /* muß nicht sein */
  151. #ifdef HPGLPLOTTER
  152.    #ifdef PLOTTER_EINBINDEN
  153.     void           _Cdecl HPGL_driver(void);
  154.     extern int far _Cdecl HPGL_driver_far[];
  155.    #endif
  156. #endif
  157.  
  158. #ifdef LASERDRUCKER
  159.    #ifdef LASER_EINBINDEN
  160.     void           _Cdecl LASER_driver(void);
  161.     extern int far _Cdecl LASER_driver_far[];
  162.    #endif
  163. #endif
  164.  
  165. #ifdef NADELDRUCKER
  166.     #ifdef NADEL_EINBINDEN
  167.     void           _Cdecl NADEL_driver(void);
  168.     extern int far _Cdecl NADEL_driver_far[];
  169.     #endif
  170. #endif
  171.  
  172. #ifdef DESKJETDRUCKER
  173.     #ifdef DESKJET_EINBINDEN
  174.     void           _Cdecl DESKJETC_driver(void);
  175.     extern int far _Cdecl DESKJETC_driver_far[];
  176.     #endif
  177. #endif
  178.  
  179. #ifdef PAINTJETDRUCKER
  180.     #ifdef PAINTJET_EINBINDEN
  181.     void           _Cdecl PAINTJET_driver(void);
  182.     extern int far _Cdecl PAINTJET_driver_far[];
  183.     #endif
  184. #endif
  185.  
  186. #ifdef DXFPLOTTER
  187.    #ifdef PLOTTER_EINBINDEN
  188.     void           _Cdecl HPGL_driver(void);
  189.     extern int far _Cdecl HPGL_driver_far[];
  190.    #endif
  191. #endif
  192. #ifdef ANY_DRUCKER
  193.  
  194. unsigned int far pascal myalloc(word far *start)
  195.                                     /* Rückgabe : Größe in Paragraphen */
  196.                                     /* (soviel, wie möglich)           */
  197.                                     /* start ist der 1. Paragraph      */
  198. {
  199. unsigned long   laenge,         /* gewünschte Blocklänge beim ausprobieren*/
  200.                 mindestens = 0L,/* Untergrenze der Blocklänge im Heap */
  201.                 hoechstens = farcoreleft(); /* Obergrenze der Blocklänge*/
  202. /* Groesse des größten freien Blocks Heap wird mit Mittelpunktverfahren */
  203. /* ermittelt */
  204. laenge = hoechstens;                /* vieleicht klappts ja sofort. */
  205. while ( (hoechstens - mindestens) > 63)
  206.     {
  207.     memptr = farmalloc(laenge);
  208.     if (memptr == NULL)         /* Block dieser Laenge nicht vorhanden */
  209.         hoechstens = laenge;    /* Obergrenze setzen */
  210.     else
  211.         {                       /* Block dieser Laenge vorhanden */
  212.         mindestens = laenge;    /* Untergrenze setzen */
  213.         farfree(memptr);        /* und wieder freigeben zum Weitersuchen. */
  214.         }
  215.     laenge = (mindestens + hoechstens) / 2L;    /* Neue Mitte zwischen den*/
  216.     }                                           /* Grenzen berechnen. */
  217. memptr = farmalloc(mindestens);     /* Speicher endgueltig reservieren */
  218. *start  = FP_SEG(memptr);           /* Startparagraph fuer den Treiber */
  219. *start += (FP_OFF(memptr)+15)/16;   /* Normieren und evtentuell runden */
  220. return (word) (mindestens / 16)-2;  /* Groesse in Paragraphen (der 1.  */
  221.                                     /* und der letzte Paragraph könnten*/
  222.                                     /* unvollständig sein)             */
  223. }
  224.  
  225. void far pascal myfree()    /* gibt den Speicher wieder frei */
  226.                             /* muß auch aufgerufen werden koennen, wenn */
  227.                             /* myalloc nicht erfolgreich war ! */
  228. {
  229. if (memptr != NULL)
  230.     farfree(memptr);        /* Speicher wieder freigegeben   */
  231. }
  232.  
  233.  
  234. unsigned int far pascal BGIControl(int Status)
  235. /* wird vom LASER.BGI-Treiber während der Ausgabe oft aufgerufen */
  236. /* Argument   : Status */
  237.       /* >= 0 : Nummer der Zeile die übertragen werden soll */
  238.       /* -1   : Fehler beim Eröffnen */
  239.       /* -2   : Fehler beim übertragen (Busy oder Störung) */
  240.       /* -3   : Anfrage ob die Bilderzeugung stattfinden soll */
  241.       /*            (Antwort 1 = Abbruch. Sonst gehts los)
  242. /* Rückgabe : */
  243.       /* 0 : Fortsetzung der Übertragung */
  244.       /* 1 : Abrruch der Übertragung */
  245.       /* 2 : Neustart der Übertragung (nur wenn Status < 0) */
  246. {
  247. char c;
  248.  
  249. if (Status >= 0)                /* kein Fehler : Status = Zeilennummer */
  250.    {
  251.    printf("\r%4d",Status);      /* den Anwender unterhalten */
  252.    if (kbhit())                 /* und beachten */
  253.       {
  254.       printf("Ausgabe in vollem Gange\n\r");
  255.       printf("Was ist zu tun ?\n\r");
  256.       printf(" 0 : Weitermachen\n\r");
  257.       printf(" 1 : Aufhören\n\r");
  258.       while (kbhit())
  259.         c = getch();                        /* Puffer leeren */
  260.       do
  261.         c = getch();                        /* Entscheidung abholen */
  262.       while ((c != '0') && (c != '1')) ;
  263.       return (unsigned) c - '0';            /* Entscheidung auswerten */
  264.       }
  265.    else                                     /* keine Intervention : */
  266.       return 0;                             /* weitermachen */
  267.    }
  268. if (Status == -1)                           /* Fehler beim Öffnen */
  269.    {
  270.    printf("Ausgabe nicht bereit (Disk voll, Printer Offline, ...) !\n\r");
  271.    printf("Was ist zu tun ?\n\r");
  272.    printf(" 0 : Drucker ist eingeschaltet, nochmal versuchen \n\r");
  273.    printf(" 1 : Aufhören\n\r");
  274.    while (kbhit())
  275.      c = getch();                       /* Puffer leeren */
  276.    do
  277.      c = getch();                       /* Entscheidung abholen */
  278.    while ((c != '0') && (c != '1')) ;
  279.     return (unsigned) c - '0';          /* Entscheidung auswerten */
  280.    }
  281. if (Status == -3)                       /* Soll Graphik erzeugt werden */
  282.    {
  283.     return 0;                              /* ja !   */
  284. /*     return 1;                              /* nein   */
  285.    }
  286.                                         /* Rest : Status < -1 */
  287. gotoxy(6,wherey());
  288. printf("Printer BUSY");                 /* melden */
  289. printf("Ausgabe gestört oder Drucker beschäftigt !\n\r");
  290. printf("Was ist zu tun ?\n\r");
  291. printf(" 0 : Drucker ist beschäftigt, weiter versuchen\n\r");
  292. printf(" 1 : Aufhören\n\r");
  293. printf(" 2 : Daten noch mal von vorn übertragen\n\r");
  294. while (kbhit())
  295.   c = getch();                      /* Puffer leeren */
  296. do
  297.   c = getch();                      /* Entscheidung abholen */
  298. while ((c < '0') && (c > '2')) ;
  299. return c - '0';                     /* Entscheidung auswerten */
  300. }
  301.  
  302. #endif /* ANY_DRUCKER */
  303.  
  304. const
  305. #ifdef HPGLPLOTTER
  306.     hpgl_struct HP7475_A3 = {
  307.         1,          /* reconfig1: Treiber benutzt diese Werte   */
  308.         7,          /* Stifte im Karussel +  "kein stift" */
  309.         381,        /* Defaultspeed [mm/s] */
  310.         {   {
  311.             100,100,100,100,100,100,100,100, /* speed der Farbstifte */
  312.             100,100,100,100,100,100,100,100, /* in % */
  313.             100,100,100,100,100,100,100,100, /*  100 = default */
  314.             100,100,100,100,100,100,100,100
  315.             }
  316.         },
  317.                 /* dicke der Stifte [Plottereinheiten],  12 = 0.3mm  */
  318.         {   {
  319.             12,12,12,12,12,12,12,12,
  320.             12,12,12,12,12,12,12,12,
  321.             12,12,12,12,12,12,12,12,
  322.             12,12,12,12,12,12,12,12
  323.             }
  324.         },
  325.         3,          /* strichweite der gestrichelten Linien */
  326.                     /* pro Pattern-Bit in Stiftdicken */
  327.         {16158, /* Ausdehnung in Pixeln                 */
  328.         11040},
  329.         0,      /* filehandle wird vom Treiber gesetzt. */
  330.                 /* Für Plotterbefehle mittels INT $40} */
  331.         0,      /* kein rotate : Landscape          */
  332.         0,      /* Plotter kann und soll Papier auswerfen  : nein */
  333.         0,      /* lastschnitt für Schnittstellle = 9   */
  334.         '\x0f', /* Stringlänge im Pascalstil */
  335.         "\x1b(;IN;SC;PU0,0;", /* initstr : Plotter Reset, kein Stift */
  336.         0,      /* exitlength  */
  337.         ""      /*Exitstring : leer */
  338.        };
  339.  
  340.     hpgl_struct HP7475_A4 = {
  341.         1,          /* reconfig1: Treiber benutzt diese Werte   */
  342.         7,          /* Stifte im Karussel +  "kein stift" */
  343.         381,        /* Defaultspeed [mm/s] */
  344.         {   {
  345.             100,100,100,100,100,100,100,100, /* speed der Farbstifte */
  346.             100,100,100,100,100,100,100,100, /* in % */
  347.             100,100,100,100,100,100,100,100, /*  100 = default */
  348.             100,100,100,100,100,100,100,100
  349.             }
  350.         },
  351.                 /* dicke der Stifte [Plottereinheiten],  12 = 0.3mm  */
  352.         {   {
  353.             12,12,12,12,12,12,12,12,
  354.             12,12,12,12,12,12,12,12,
  355.             12,12,12,12,12,12,12,12,
  356.             12,12,12,12,12,12,12,12
  357.             }
  358.         },
  359.         3,          /* strichweite der gestrichelten Linien */
  360.                     /* pro Pattern-Bit in Stiftdicken */
  361.         {11040, /* Ausdehnung in Pixeln                 */
  362.         7721},
  363.         0,      /* filehandle wird vom Treiber gesetzt. */
  364.                 /* Für Plotterbefehle mittels INT $40} */
  365.         0,      /* kein rotate : Landscape          */
  366.         0,      /* Plotter kann und soll Papier auswerfen  : nein */
  367.         0,      /* lastschnitt für Schnittstellle = 9   */
  368.         '\x0f', /* Stringlänge im Pascalstil */
  369.         "\x1b(;IN;SC;PU0,0;", /* initstr : Plotter Reset, kein Stift */
  370.         0,      /* exitlength  */
  371.         ""      /*Exitstring : leer */
  372.        };
  373.  
  374.     hpgl_struct HPLaserjet_A4 = {
  375.         1,          /* reconfig1: Treiber benutzt diese Werte   */
  376.         7,          /* Stifte im Karussel +  "kein stift" */
  377.         381,        /* Defaultspeed [mm/s] */
  378.         {   {
  379.             100,100,100,100,100,100,100,100, /* speed der Farbstifte */
  380.             100,100,100,100,100,100,100,100, /* in % */
  381.             100,100,100,100,100,100,100,100, /*  100 = default */
  382.             100,100,100,100,100,100,100,100
  383.             }
  384.         },
  385.                 /* dicke der Stifte [Plottereinheiten],  12 = 0.3mm  */
  386.         {   {
  387.             12,12,12,12,12,12,12,12,
  388.             12,12,12,12,12,12,12,12,
  389.             12,12,12,12,12,12,12,12,
  390.             12,12,12,12,12,12,12,12
  391.             }
  392.         },
  393.         3,          /* strichweite der gestrichelten Linien */
  394.                     /* pro Pattern-Bit in Stiftdicken */
  395.         {7721,  /* Ausdehnung in Pixeln                 */
  396.         11040},
  397.         0,      /* filehandle wird vom Treiber gesetzt. */
  398.                 /* Für Plotterbefehle mittels INT $40} */
  399.         0,      /* kein rotate : Landscape          */
  400.         0,      /* Plotter kann und soll Papier auswerfen  : nein */
  401.         0,      /* lastschnitt für Schnittstellle = 9   */
  402.         19, /* Stringlänge im Pascalstil */
  403.         "\x1b%0B\x1b(;IN;SC;PU0,0;", /* initstr : Plotter Reset, kein Stift */
  404.         5,      /* exitlength  */
  405.         "\x1b%0A\f" /*Exitstring : PCL Modus wieder an, Formfeed */
  406.        };
  407.  
  408.     hpgl_struct HP7550_A3 = {
  409.         1,          /* reconfig1: Treiber benutzt diese Werte   */
  410.         9,          /* Stifte im Karussel +  "kein stift" */
  411.         381,        /* Defaultspeed [mm/s] */
  412.         {   {
  413.             100,100,100,100,100,100,100,100, /* speed der Farbstifte */
  414.             100,100,100,100,100,100,100,100, /* in % */
  415.             100,100,100,100,100,100,100,100, /*  100 = default */
  416.             100,100,100,100,100,100,100,100
  417.             }
  418.         },
  419.                 /* dicke der Stifte [Plottereinheiten],  12 = 0.3mm  */
  420.         {   {
  421.             12,12,12,12,12,12,12,12,
  422.             12,12,12,12,12,12,12,12,
  423.             12,12,12,12,12,12,12,12,
  424.             12,12,12,12,12,12,12,12
  425.             }
  426.         },
  427.         3,          /* strichweite der gestrichelten Linien */
  428.                     /* pro Pattern-Bit in Stiftdicken */
  429.         {15970, /* Ausdehnung in Pixeln                 */
  430.         10870},
  431.         0,      /* filehandle wird vom Treiber gesetzt. */
  432.                 /* Für Plotterbefehle mittels INT $40} */
  433.         0,      /* kein rotate : Landscape          */
  434.         1,      /* Plotter kann und soll Papier auswerfen  : ja */
  435.         0,      /* lastschnitt für Schnittstellle = 9   */
  436.         '\x0f', /* Stringlänge im Pascalstil */
  437.         "\x1b(;IN;SC;PU0,0;", /* initstr : Plotter Reset, kein Stift */
  438.         0,      /* exitlength  */
  439.         "" /*Exitstring : leer */
  440.        };
  441.  
  442.     hpgl_struct HP7550_A4 = {
  443.         1,          /* reconfig1: Treiber benutzt diese Werte   */
  444.         9,          /* Stifte im Karussel +  "kein stift" */
  445.         381,        /* Defaultspeed [mm/s] */
  446.         {   {
  447.             100,100,100,100,100,100,100,100, /* speed der Farbstifte */
  448.             100,100,100,100,100,100,100,100, /* in % */
  449.             100,100,100,100,100,100,100,100, /*  100 = default */
  450.             100,100,100,100,100,100,100,100
  451.             }
  452.         },
  453.                 /* dicke der Stifte [Plottereinheiten],  12 = 0.3mm  */
  454.         {   {
  455.             12,12,12,12,12,12,12,12,
  456.             12,12,12,12,12,12,12,12,
  457.             12,12,12,12,12,12,12,12,
  458.             12,12,12,12,12,12,12,12
  459.             }
  460.         },
  461.         3,          /* strichweite der gestrichelten Linien */
  462.                     /* pro Pattern-Bit in Stiftdicken */
  463.         {10870, /* Ausdehnung in Pixeln                 */
  464.         7600},
  465.         0,      /* filehandle wird vom Treiber gesetzt. */
  466.                 /* Für Plotterbefehle mittels INT $40} */
  467.         0,      /* kein rotate : Landscape          */
  468.         1,      /* Plotter kann und soll Papier auswerfen  : ja */
  469.         0,      /* lastschnitt für Schnittstellle = 9   */
  470.         '\x0f', /* Stringlänge im Pascalstil */
  471.         "\x1b(;IN;SC;PU0,0;", /* initstr : Plotter Reset, kein Stift */
  472.         0,      /* exitlength  */
  473.         ""      /*Exitstring : leer */
  474.        };
  475. #endif
  476.  
  477. #ifdef DXFPLOTTER
  478.     DXF_struct DXFdefault = {
  479.         1,          /* reconfig1: Treiber benutzt diese Werte   */
  480.         7,          /* Stifte "kein stift" */
  481.             {  /* Stiftdicke in units der resolution*/
  482.                 {
  483.                 3,3,3,3,3,3,3,3,
  484.                 3,3,3,3,3,3,3,3,
  485.                 3,3,3,3,3,3,3,3,
  486.                 3,3,3,3,3,3,3,3
  487.                 }
  488.             },
  489.         3,          /* strichweite der gestrichelten Linien */
  490.                     /* pro Pattern-Bit in Stiftdicken */
  491.         {2100, /* Ausdehnung in Pixeln                 */
  492.         2900},
  493.         -1,            /* resolution der Koordinaten = 1/10 mm */
  494.         90,            /* Winkel für SetTextStyle( x,VertDir, y)  normal */
  495.         3,            /* Pascal Stringlänge */
  496.         "txt"        /* Standard text stil */
  497.        };
  498.  
  499. #endif
  500.  
  501. #ifdef LASERDRUCKER
  502. #define AUFLOESUNG 1    /*Druckerpixel/logischem Punkt    Bereich: 1..4  */
  503. laser_struct laserkonfig = {
  504.             1,        /* reconfig1: Treiber liest Werte aus Struct     */
  505.             2,        /* Stiftzahl des Druckers (0..n-1).     */
  506.             {  /* Stiftdicke in Dots Druckereinheiten, 12 = 1mm bei 300 dpi */
  507.                 {
  508.                 3,3,3,3,3,3,3,3,
  509.                 3,3,3,3,3,3,3,3,
  510.                 3,3,3,3,3,3,3,3,
  511.                 3,3,3,3,3,3,3,3
  512.                 }
  513.             },
  514.             6,      /* strichweite der gestrichelten Linien pro Pattern-Bit                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             */
  515.         {2335 / AUFLOESUNG,     /* Ausdehnung in Pixeln bei Portrait */
  516.         3300  / AUFLOESUNG
  517.         },
  518.         0,      /* rotate : Portrait */
  519.         1,      /* (J/N) Seite ausdrucken : ja */
  520.         AUFLOESUNG, /* resolution 1,2,3 oder 4 Pixel / Punkt */
  521.         0,          /* Komprimiermethode 2 ab Laserjet III */
  522.         0,          /* lastschnitt für Schnittstellle = 9   */
  523.         0,          /* 1 : File wird nicht überschrieben */
  524.         '\x0A',     /* Stringlänge im Pascalstil */
  525.         "\x1b*p0X\x1b*p0Y"  /* initstr Cursor nach Links oben */
  526.        };
  527. #endif
  528.  
  529. #ifdef NADELDRUCKER
  530. nadel_struct nadelkonfig = {
  531.         1,        /* reconfig1: Treiber liest Werte aus Struct     */
  532.         2,        /* Stiftzahl des Druckers (0..n-1).     */
  533.         {  /* Stiftdicke in Dots Druckereinheiten, 12 = 1mm bei 300 dpi */
  534.             {
  535.             1,1,1,1,1,1,1,1,
  536.             1,1,1,1,1,1,1,1,
  537.             1,1,1,1,1,1,1,1,
  538.             1,1,1,1,1,1,1,1
  539.             }
  540.         },
  541.         6,      /* strichweite der gestrichelten Linien pro Pattern-Bit                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 */
  542.         {0,0},      /* Ausdehnung in Pixeln bei Portrait */
  543.                     /* Nadel nimmt eigene Werte */
  544.         0,          /* rotate : Portrait */
  545.         1,          /* (J/N) Seite ausdrucken : ja */
  546.         EPS_60,     /* printermode EPS_240 .. EPS_360_360   */
  547.         7,          /* defaultbackground weiß (nur im Colormodus  0..8) */
  548.         6,          /* 0: CR 1: LF 2: CR/LF  +4 für Zeilenende immer */
  549.         0,          /* lastschnitt für Schnittstellle = 9   */
  550.         0,          /* 1 : File wird nicht überschrieben */
  551.         '\x0',      /* Stringlänge im Pascalstil */
  552.         ""          /* keine initialisierung */
  553.     };
  554. #endif
  555.  
  556. #ifdef DESKJETDRUCKER
  557. #define DJ_AUFLOESUNG 1 /*Druckerpixel/logischem Punkt    Bereich: 1..4  */
  558. deskjet_struct deskjetkonfig = {
  559.         1,        /* reconfig1: Treiber liest Werte aus Struct     */
  560.         16,        /* Stiftzahl des Druckers (0..n-1).     */
  561.         {  /* Stiftdicke in Dots Druckereinheiten, 12 = 1mm bei 300 dpi */
  562.             {
  563.             3,3,3,3,3,3,3,3,
  564.             3,3,3,3,3,3,3,3,
  565.             3,3,3,3,3,3,3,3,
  566.             3,3,3,3,3,3,3,3
  567.             }
  568.         },
  569.         6,      /* strichweite der gestrichelten Linien pro Pattern-Bit                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 */
  570.         {2400 / DJ_AUFLOESUNG,      /* Ausdehnung in Pixeln bei Portrait */
  571.         3100  / DJ_AUFLOESUNG       /* 3150 im Monomodus möglich */
  572.         },
  573.         0,      /* rotate : Portrait */
  574.         1,      /* (J/N) Blatt auswerfen : ja */
  575.         DJ_AUFLOESUNG,  /* resolution 1,2,3 oder 4 Pixel / Punkt */
  576.         128,        /* printermode 0 : Monochrom, 128 : color */
  577.         7,          /* defaultbackground weiß (klappt nicht) */
  578.         0,          /* lastschnitt für Schnittstellle = 9   */
  579.         0,          /* 1 : File wird nicht überschrieben */
  580.         2,          /* quality 0: Keypad Einstellung 1: Draft 2: High */
  581.         0,          /* Ausdünnung 0: keine 1: normal, 2 stark */
  582.         4           /* Mehrphasendruck 0: nein 1: 2 Phasen 2: 4 Phasen */
  583.                 '\x0',      /* Stringlänge im Pascalstil */
  584.                 ""          /* keine initialisierung */
  585.        };
  586. #endif
  587.  
  588.  
  589. #ifdef PAINTJETDRUCKER
  590. #define PJ_AUFLOESUNG 1 /*Druckerpixel/logischem Punkt    Bereich: 1..2  */
  591. paintjet_struct paintjetkonfig = {
  592.         1,        /* reconfig1: Treiber liest Werte aus Struct     */
  593.         16,        /* Stiftzahl des Druckers (0..n-1).     */
  594.         {  /* Stiftdicke in Dots Druckereinheiten, 12 = 1mm bei 300 dpi */
  595.             {
  596.             3,3,3,3,3,3,3,3,
  597.             3,3,3,3,3,3,3,3,
  598.             3,3,3,3,3,3,3,3,
  599.             3,3,3,3,3,3,3,3
  600.             }
  601.         },
  602.         6,      /* strichweite der gestrichelten Linien pro Pattern-Bit                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 */
  603.         {1440 / PJ_AUFLOESUNG,      /* Ausdehnung in Pixeln bei Portrait */
  604.         2055  / PJ_AUFLOESUNG       /* */
  605.                                     /* Format        x     y    */
  606.                                     /* US Letter/A   1472  1931 */
  607.                                     /* US Ledger/B   1920  2990 */
  608.                                     /* A4            1440  2055 */
  609.                                     /* A3            1984  2906 */
  610.         },
  611.         0,      /* rotate : Portrait */
  612.         1,      /* (J/N) Blatt auswerfen : ja */
  613.         PJ_AUFLOESUNG,  /* resolution 1 oder 2 Pixel / Punkt */
  614.         128,        /* printermode 0 : Monochrom, 128 : color */
  615.         7,          /* defaultbackground weiß (klappt nicht) */
  616.         0,          /* lastschnitt für Schnittstellle = 9   */
  617.         0,          /* 1 : File wird nicht überschrieben */
  618.         0           /* Mehrphasendruck 0: nein 1: ja */
  619.        };
  620. #endif
  621.  
  622.  
  623.  
  624. void get_schnittstelle(int *mode, char *geraet, char *defaultdatei)
  625. {
  626. char c;
  627.  
  628. printf("Wählen Sie die Schnittstelle für den %s : \n",geraet);
  629. printf("  0  Standarddatei %s im Aktuellen Verzeichnis\n",defaultdatei);
  630. printf("  1  COM1:\n");
  631. printf("  2  COM2:\n");
  632. printf("  3  COM3:\n");
  633. printf("  4  COM4:\n");
  634. printf("  5  LPT1:\n");
  635. printf("  6  LPT2:\n");
  636. printf("  7  LPT3:\n");
  637. printf("  8  Datei mit frei wählbarem Namen\n\n");
  638. printf("Drücken Sie eine Taste aus 0..8\n");
  639. *mode = -1;
  640. do
  641.  {
  642.  c = getch();
  643.  if (c <= '8')
  644.     *mode = (int) (c -'0');
  645.  }while (*mode < 0);
  646. printf("\n");
  647. }
  648.  
  649.  
  650.  
  651.  
  652.  
  653. #ifndef __BORLANDC__
  654. #error wenn Sie Turbo C 2.0 Benutzen, gilt :  #define graph_fehler 5
  655. #error für die C++ Compiler           gilt :  #define graph_fehler 0
  656. #endif
  657.  
  658. #define graph_fehler 0
  659.  
  660.  
  661. int myfill[16] = {
  662.                                  0x8000,
  663.                                  0x4000,
  664.                                  0x2000,
  665.                                  0x1000,
  666.                                  0x0800,
  667.                                  0x0400,
  668.                                  0x0200,
  669.                                  0x0100,
  670.                                  0x0080,
  671.                                  0x0040,
  672.                                  0x0080,
  673.                                  0x0100,
  674.                                  0x0200,
  675.                                  0x0400,
  676.                                  0x0800,
  677.                                  0xF000
  678.               };
  679.  
  680.  
  681.  
  682. void allocexit(void)
  683. {
  684. setvect(benutzte_Vektornummer,AltIntVektor);  /* alten Vektor restaurieren */
  685. }
  686.  
  687.  
  688.  
  689.  
  690.  
  691. void AllocInit()
  692. {
  693. allgemein_struct *allgemein;
  694.  
  695.  
  696. detectgraph((int far *)&monitortreiber,(int far *)&monitormode);
  697.  
  698. /* Freien Interruptvektor suchen  */
  699. benutzte_Vektornummer  = 0x60;    /* Der erste möglicherweise freie Vektor*/
  700.                                 /* das Prinzip arbeitet sogar mit INT21 */
  701. AltIntVektor = getvect(benutzte_Vektornummer);
  702.  
  703. Umleitung.jumpbefehl[0] = 0xEA;        /* jump absolute */
  704. memcpy(&Umleitung.jumpbefehl[1],&AltIntVektor, sizeof (void far *));
  705. Umleitung.data = &Treiber_konfiguration;
  706.  
  707. setvect(benutzte_Vektornummer,
  708.     (void interrupt (*)( ))&Umleitung);
  709.                                 /* den eigenen Interrupt installieren */
  710.                                 /* ist aber nur Datenstruktur */
  711.                                 /* die aber aufgerufen werden darf */
  712.  
  713. atexit(allocexit);          /* sorgt fuer Restaurierung des */
  714.                         /* Interrupts zum Programmschluß */
  715.  
  716. #ifdef ANY_DRUCKER
  717. allgemein = &(Treiber_konfiguration.umgebung);
  718. /*
  719. Wenn die Funktionen BGIControl, myalloc, und myfree
  720. in einem anderen Modul definiert sind, dann
  721. müssen Sie auch das jeweilige Datensegment von dort holen !
  722. */
  723.      allgemein->control       = BGIControl;
  724.      allgemein->control_ds    = _DS;
  725.      allgemein->alloc         = myalloc;
  726.      allgemein->mfree         = myfree;
  727.      allgemein->free_ds       = _DS;
  728. /*
  729.  ohne diese Zeile arbeitet setfillpattern normal
  730.   Treiber_konfiguration.userfill      = (int far *)&myfill;
  731. */
  732. #endif
  733.  
  734. #ifdef HPGLPLOTTER
  735.  Treiber_konfiguration.plotter = &HP7475_A4;
  736.  plottertreiber = graph_fehler + installuserdriver ("HPGL",NULL);
  737.  #ifdef PLOTTER_EINBINDEN
  738.     if (registerbgidriver(HPGL_driver) < 0)
  739.         {
  740.         printf("RegisterBGIDriver von HPGL ist fehlgeschlagen");
  741.         exit(1);
  742.         }
  743.  #endif
  744.  get_schnittstelle(&plottermode,"Plotter","HPGL.PLT");
  745. #endif
  746.  
  747. #ifdef DXFPLOTTER
  748.  Treiber_konfiguration.dxf = &DXFdefault;
  749.  dxftreiber = graph_fehler + installuserdriver ("dxf",NULL);
  750.  #ifdef dxf_EINBINDEN
  751.     if (registerbgidriver(dxf_driver) < 0)
  752.         {
  753.         printf("RegisterBGIDriver von dxf ist fehlgeschlagen");
  754.         exit(1);
  755.         }
  756.  #endif
  757.  get_schnittstelle(&dxfmode,"dxf","BGI.DXF");
  758. #endif
  759.  
  760. #ifdef LASERDRUCKER
  761.  Treiber_konfiguration.laserjet     = &laserkonfig;
  762.  lasertreiber = graph_fehler + installuserdriver ("LASER",NULL);
  763.  #ifdef LASER_EINBINDEN
  764.     if (registerbgidriver(LASER_driver) < 0 )
  765.         {
  766.         printf("RegisterBGIDriver von LASER ist fehlgeschlagen");
  767.         exit(1);
  768.         }
  769.  #endif
  770.  get_schnittstelle(&lasermode,"Laserdrucker","LASER.PRN");
  771. #endif
  772.  
  773. #ifdef NADELDRUCKER
  774.  Treiber_konfiguration.nadeldrucker = &nadelkonfig;
  775.  nadeltreiber = graph_fehler + installuserdriver ("NADEL",NULL);
  776.  #ifdef NADEL_EINBINDEN
  777.     if (registerbgidriver(NADEL_driver) < 0)
  778.         {
  779.         printf("RegisterBGIDriver von NADEL ist fehlgeschlagen");
  780.         exit(1);
  781.         }
  782.  #endif
  783.  get_schnittstelle(&nadelmode,"Nadeldrucker","NADEL.PRN");
  784. #endif
  785.  
  786. #ifdef DESKJETDRUCKER
  787.  Treiber_konfiguration.deskjet_c     = &deskjetkonfig;
  788.  deskjettreiber = graph_fehler + installuserdriver ("DESKJETC",NULL);
  789.  #ifdef DESKJET_EINBINDEN
  790.     if (registerbgidriver(DESKJETC_driver) < 0 )
  791.         {
  792.         printf("RegisterBGIDriver von DESKJET C ist fehlgeschlagen");
  793.         exit(1);
  794.         }
  795.  #endif
  796.  get_schnittstelle(&deskjetmode,"DeskJet 500 C","DESKJETC.PRN");
  797. #endif
  798.  
  799. #ifdef PAINTJETDRUCKER
  800.  Treiber_konfiguration.paintjet     = &paintjetkonfig;
  801.  paintjettreiber = graph_fehler + installuserdriver ("PJXL",NULL);
  802.  #ifdef PAINTJET_EINBINDEN
  803.     if (registerbgidriver(PAINTJET_driver) < 0 )
  804.         {
  805.         printf("RegisterBGIDriver von PAINTJET XL ist fehlgeschlagen");
  806.         exit(1);
  807.         }
  808.  #endif
  809.  get_schnittstelle(&paintjetmode,"PaintJet XL","PAINTJET.PRN");
  810. #endif
  811.  
  812. }
  813.  
  814. #pragma startup AllocInit
  815.