home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / dtx9302 / svga / xgraph.pas < prev   
Encoding:
Pascal/Delphi Source File  |  1993-02-18  |  61.9 KB  |  1,681 lines

  1. (*========================================================*)
  2. (*                XGRAPH.PAS Version 1.01                 *)
  3. (*             (C) 1993 Jörg Braun & DMV-Verlag           *)
  4. (* Compiler: Turbo Pascal ab Vers. 5.0, Borland Pascal 7  *)
  5. (*           Nicht für Turbo Pascal 4.0                   *)
  6. (*    Nicht für Borland Pascal 7.0 DOS-Protected-Mode!    *)
  7. (*========================================================*)
  8. (* XGRAPH ist ein SVGA-16-Color-Interface zur Unit Graph  *)
  9. (* und kann beliebig erweitert werden. Da alle Standard-  *)
  10. (* Bezeichner und Prozeduren/Funktionen integriert sind,  *)
  11. (* ist der weitere Aufruf von »Graph« überflüssig.        *)
  12. (* Beim Ersetzen durch eigene Routinen müssen nur die     *)
  13. (* GRAPH.-Aufrufe entfernt werden.                        *)
  14. (* ACHTUNG: Es ist zwar nicht mehr notwendig, die Unit    *)
  15. (* Graph einzubinden, falls es aber doch gemacht wird,    *)
  16. (* muß XGraph UNBEDINGT nach Graph eingebunden werden!    *)
  17. (* Voreingestellter Grafikmodus ist 800*600, 16-Color. Es *)
  18. (* ist möglich, auch andere Grafikmodi mit 16 Farben und  *)
  19. (* einer maximalen Bildgröße von 64 kByte einzustellen.   *)
  20. (* hierzu müssen nur die entsprechenden Werte im Imple-   *)
  21. (* mentationsteil geändert werden.                        *)
  22. (* Bei Turbo Pascal 5.X gibt es Probleme mit den Zusatz-  *)
  23. (* fonts, falls sie nicht mit XFONTS.PAS eingelinkt sind! *)
  24. (*========================================================*)
  25. {$I xgraph.h} (* <- Compilerschalter, Conditional defines *)
  26.  
  27. UNIT XGraph;                            (* eXtended Graph *)
  28.  
  29. INTERFACE
  30.  
  31. CONST
  32.   TopOn          = TRUE;  (* für Bar3D                    *)
  33.   TopOff         = FALSE; (* für Bar3D                    *)
  34.  
  35.   NormalPut      =   0;   (* Überschreiben                *)
  36.   CopyPut        =   0;   (* Überschreiben                *)
  37.   XORPut         =   1;   (* XOR-Operation                *)
  38.   OrPut          =   2;   (* ODER-Verknüpfung             *)
  39.   AndPut         =   3;   (* UND-Verknüpfung              *)
  40.   NotPut         =   4;   (* invertiertes Überschreiben   *)
  41.  
  42.   ClipOn         = TRUE;  (* Clipping-Konstanten          *)
  43.   ClipOff        = FALSE; (* Clipping-Konstanten          *)
  44.  
  45.   Black          =   0;   (* Die Farbkonstanten           *)
  46.   Blue           =   1;
  47.   Green          =   2;
  48.   DarkGray       =   8;
  49.   Cyan           =   3;
  50.   Red            =   4;
  51.   Magenta        =   5;
  52.   Brown          =   6;
  53.   LightGray      =   7;
  54.   LightBlue      =   9;
  55.   LightGreen     =  10;
  56.   LightCyan      =  11;
  57.   LightRed       =  12;
  58.   LightMagenta   =  13;
  59.   Yellow         =  14;
  60.   White          =  15;
  61.   Blink          = 128;
  62.  
  63.   EGABlack       =   0; (* Farben für EGA, VGA, 8514      *)
  64.   EGABlue        =   1; 
  65.   EGAGreen       =   2;
  66.   EGACyan        =   3;
  67.   EGARed         =   4;
  68.   EGAMagenta     =   5;
  69.   EGABrown       =  20;
  70.   EGALightgray   =   7;
  71.   EGADarkgray    =  56;
  72.   EGALightBlue   =  57;
  73.   EGALightGreen  =  58;
  74.   EGALightcyan   =  59;
  75.   EGALightRed    =  60;
  76.   EGALightMagenta=  61;
  77.   EGAYellow      =  62;
  78.   EGAWhite       =  63;  (* EGA: 16 Farben aus 64 (0..63) *)
  79.  
  80.   EmptyFill      =   0;  (* Füllen mit Hintergrundfarbe   *)
  81.   SolidFill      =   1;  (* Füllen mit der Zeichenfarbe   *)
  82.   LineFill       =   2;  (* ───                           *)
  83.   LtSlashFill    =   3;  (* ///                           *)
  84.   SlashFill      =   4;  (* /// mit dicken Linien         *)
  85.   BkSlashFill    =   5;  (* \\\ mit dicken Linien         *)
  86.   LtBkSlashFill  =   6;  (* \\\                           *)
  87.   HatchFill      =   7;  (* leicht schraffiert            *)
  88.   XHatchFill     =   8;  (* XXX                           *)
  89.   InterleaveFill =   9;  (* abwechselnde Linien           *)
  90.   WideDotFill    =  10;  (* ∙∙∙ weit auseinanderliegend   *)
  91.   CloseDotFill   =  11;  (* ∙∙∙ eng beieinander           *)
  92.   UserFill       =  12;  (* benutzerdef.: SetFillStyle()  *)
  93.  
  94.   CurrentDriver  =-128;  (* für GetModeRange              *)
  95.  
  96.   Detect         =   0;  (* automatische Erkennung        *)
  97.   CGA            =   1;  (* Die                           *)
  98.   MCGA           =   2;  (* verschiedenen                 *)
  99.   EGA            =   3;  (* Grafikkarten                  *)
  100.   EGA64          =   4;  (* als                           *)
  101.   EGAMono        =   5;  (* Voreinstellungen              *)
  102.   IBM8514        =   6;  (* Mit AUTODETECT!               *)
  103.   HercMono       =   7;  (* keine Untersch. zu MDA        *)
  104.   ATT400         =   8;  (* nicht getestet!               *)
  105.   VGA            =   9;  (*                               *)
  106.   PC3270         =  10;  (* nicht getestet!               *)
  107.  
  108. (* neu: *)
  109. {$IFDEF VER60}                  (* Turbo Pascal 6.0, 7.0: *)
  110.   SVGA           =  16;
  111. {$ELSE}                         (* Turbo Pascal 5.0, 5.5: *)
  112.   SVGA           =  11;
  113. {$ENDIF}
  114.   CGAC0          =   0;  (* 320 x 200  4 Farben Palette 0 *)
  115.   CGAC1          =   1;  (* 320 x 200  4 Farben Palette 1 *)
  116.   CGAC2          =   2;  (* 320 x 200  4 Farben Palette 2 *)
  117.   CGAC3          =   3;  (* 320 x 200  4 Farben Palette 3 *)
  118.   CGAHi          =   4;  (* 640 x 200  2 Farben           *)
  119.   MCGAC0         =   0;  (* 320 x 200  4 Farben Palette 0 *)
  120.   MCGAC1         =   1;  (* 320 x 200  4 Farben Palette 1 *)
  121.   MCGAC2         =   2;  (* 320 x 200  4 Farben Palette 2 *)
  122.   MCGAC3         =   3;  (* 320 x 200  4 Farben Palette 3 *)
  123.   MCGAMed        =   4;  (* 640 x 200  2 Farben           *)
  124.   MCGAHi         =   5;  (* 640 x 480  2 Farben           *)
  125.  
  126.   HercMonoHi     =   0;  (* 720 x 348  2 Farben           *)
  127.  
  128.   ATT400C0       =   0;  (* 320 x 200  4 Farben Palette 0 *)
  129.   ATT400C1       =   1;  (* 320 x 200  4 Farben Palette 1 *)
  130.   ATT400C2       =   2;  (* 320 x 200  4 Farben Palette 2 *)
  131.   ATT400C3       =   3;  (* 320 x 200  4 Farben Palette 3 *)
  132.   ATT400Med      =   4;  (* 640 x 200  2 Farben           *)
  133.   ATT400Hi       =   5;  (* 640 x 400  2 Farben           *)
  134.  
  135.   IBM8514Lo      =   0;  (* 640 x 480 16 Farben           *)
  136.   IBM8514Hi      =   1;  (*1024 x 768 16 Farben           *)
  137.  
  138.   PC3270Hi       =   0;  (* 720 x 350  2 Farben           *)
  139.  
  140.   EGALo          =   0;  (* 640 x 200 16 Farben           *)
  141.   EGAHi          =   1;  (* 640 x 350 16 Farben           *)
  142.   EGA64Lo        =   0;  (* 640 x 200 16 Farben           *)
  143.   EGA64Hi        =   1;  (* 640 x 350  4 Farben           *)
  144.   EGAMonoHi      =   3;  (* 640 x 350  2 Farben           *)
  145.   VGALo          =   0;  (* 640 x 200 16 Farben           *)
  146.   VGAMed         =   1;  (* 640 x 350 16 Farben           *)
  147.   VGAHi          =   2;  (* 640 x 480 16 Farben           *)
  148. (* neu: *)
  149.   EGA320  : BYTE = $FF;
  150.   SVGAHi         =   0;  (* 800 x 600 16 Farben           *)
  151.                          (* kartenabhängige Initialisier. *)
  152.  
  153.   LeftText       =   0;  (* Textausrichtungen             *)
  154.   BottomText     =   0;  (* für SetTextJustify            *)
  155.   CenterText     =   1;
  156.   RightText      =   2;
  157.   TopText        =   2;
  158.  
  159.   SolidLn        =   0;  (* Linientypen                   *)
  160.   DottedLn       =   1;
  161.   CenterLn       =   2;
  162.   DashedLn       =   3;
  163.   UserBitLn      =   4; (* benutzerdef.: SetLineStyle     *)
  164.  
  165.   NormWidth      =   1; (* Liniendicken                   *)
  166.   ThickWidth     =   3;
  167.  
  168.   DefaultFont    =   0; (* 8x8 Bitmusterzeichensatz  (ROM)*)
  169.   TriplexFont    =   1; (* Vektorzeichensatz Standard TRIP*)
  170.   SmallFont      =   2; (* Vektorzeichensatz Standard LCOM*)
  171.   SansSerifFont  =   3; (* Vektorzeichensatz Standard SANS*)
  172.   GothicFont     =   4; (* Vektorzeichensatz Standard GOTH*)
  173.  
  174. (* neu: *)
  175.   ScriptFont     =   5; (* Vektorzeichensatz Script   SCRI*)
  176.   SimplexFont    =   6; (* Vektorzeichensatz Simplex  SIMP*)
  177.   TSCRFont       =   7; (* Vektorzs. Triplex-Script   TSCR*)
  178.   LightFont      =   8; (* Vektorzs. Triplex-Light    LITT*)
  179.   EuroFont       =   9; (* Vektorzeichensatz Eurofont EURO*)
  180.  
  181. (* bold.chr ist bis Turbo Pascal 7 nicht aufgenommen und  *)
  182. (* muß mit RegisterUserFont eingebunden werden. Die Datei *)
  183. (* kann deshalb auch nicht ins Programm eingelinkt werden *)
  184.  
  185.   HorizDir       =   0; (* von links nach rechts          *)
  186.   VertDir        =   1; (* von unten nach oben            *)
  187.   UserCharSize   =   0; (* benutzerdef.: SetUserCharSize()*)
  188.   MaxColors      =  15; (* vordefinierte Konstante!       *)
  189.  
  190.   grOk           =   0; (* fehlerfreie Ausführung         *)
  191.   grNoInitGraph  =  -1; (* BGI-Treiber nicht geladen      *)
  192.   grNotDetected  =  -2; (* Grafikkarte nicht erkannt      *)
  193.   grFileNotFound =  -3; (* Grafiktreiber nicht gefunden   *)
  194.   grInvalidDriver=  -4; (* Grafiktreiber defekt           *)
  195.   grNoLoadMem    =  -5; (* nicht genug Speicher, um       *)
  196.                         (* Treiber zu laden               *)
  197.   grNoScanMem    =  -6; (* nicht genug Speicher für       *)
  198.                         (* Zeichenoperation               *)
  199.   grNoFloodMem   =  -7; (* nicht genug Speicher für Füll- *)
  200.                         (* operation                      *)
  201.   grFontNotFound =  -8; (* Fontdatei nicht gefunden       *)
  202.   grNoFontMem    =  -9; (* nicht genug Speicher für Font  *)
  203.   grInvalidMode  = -10; (* Grafikmodus vom Treiber nicht  *)
  204.                         (* unterstützt                    *)
  205.   grError        = -11; (* nicht näher klassifizierbarer  *)
  206.                         (* Fehler                         *)
  207.   grIOerror      = -12; (* Fehler bei Daten-Ein-/Ausgabe  *)
  208.   grInvalidFont  = -13; (* Zeichensatz-Datei ungültig     *)
  209.   grInvalidFontNum=-14; (* Kennziffer für Zeichensatz     *)
  210.                         (* nicht definiert                *)
  211. (* neu: *)
  212.   grInvalidAttr  = -15; (* Ungült. Fontattribut tFontAttr *)
  213.  
  214. TYPE
  215.   ArcCoordsType = RECORD
  216.     x, y, XStart, YStart, XEnd, YEnd: INTEGER;
  217.   END;
  218.  
  219.   FillPatternType = ARRAY[1..8] OF BYTE;
  220.  
  221.   FillSettingsType = RECORD
  222.     Pattern: WORD;
  223.     Color  : WORD;
  224.   END;
  225.  
  226.   LineSettingsType = RECORD
  227.     LineStyle: WORD;
  228.     Pattern  : WORD;
  229.     Thickness: WORD;
  230.   END;
  231.  
  232.   PaletteType = RECORD
  233.     Size  : BYTE;
  234.     Colors: ARRAY[0..MaxColors] OF SHORTINT;
  235.   END;
  236.  
  237.   PointType = RECORD
  238.     x, y: INTEGER;
  239.   END;
  240.  
  241.   TextSettingsType = RECORD
  242.     Font     : WORD;
  243.     Direction: WORD;
  244.     CharSize : WORD;
  245.     Horiz    : WORD;
  246.     Vert     : WORD;
  247.   END;
  248.  
  249.   ViewPortType = RECORD
  250.     x1, y1, x2, y2: INTEGER;
  251.     Clip          : BOOLEAN;
  252.   END;
  253.  
  254. (* neu: Schriftattribute zusammen mit allen Fonts:        *)
  255.   tFontAttr    =   (Normal,            (* Standardschrift *)
  256.                     Bold,              (* Fettschrift     *)
  257.                     Shadow,            (* Schattenschrift *)
  258.                     OutLine);          (* Outline-Schrift *)
  259.  
  260. CONST
  261.   FontAttr   : tFontAttr = Normal;     (* Schriftattribut *)
  262.                                        (* Voreinstellung  *)
  263. VAR
  264.   GraphGetMemPtr : POINTER;
  265.   GraphFreeMemPtr: POINTER;
  266.  
  267. PROCEDURE Arc(x, y: INTEGER; SA, EA, Radius: WORD);
  268. PROCEDURE Bar(x1, y1, x2, y2  : INTEGER);
  269. PROCEDURE Bar3D(x1,y1,x2,y2: INTEGER; d: WORD; t: BOOLEAN);
  270. PROCEDURE Circle(x,y: INTEGER; Radius: WORD);
  271. PROCEDURE ClearDevice;
  272. PROCEDURE ClearViewPort;
  273. PROCEDURE CloseGraph;
  274. PROCEDURE DetectGraph(VAR GraphDriver, GraphMode: INTEGER);
  275. PROCEDURE DrawPoly(NumPoints: WORD; VAR PolyPoints);
  276. PROCEDURE Ellipse(x, y : INTEGER; SA, EA, XR, YR : WORD);
  277. PROCEDURE FillEllipse(x, y : INTEGER; XR, YR: WORD);
  278. PROCEDURE FillPoly(NumPoints: WORD; VAR PolyPoints);
  279. PROCEDURE FloodFill(x, y: INTEGER; Border: WORD);
  280. PROCEDURE GetArcCoords(VAR ArcCoords: ArcCoordsType);
  281. PROCEDURE GetAspectRatio(VAR XAsp, YAsp: WORD);
  282. FUNCTION  GetBkColor: WORD;
  283. FUNCTION  GetColor: WORD;
  284. PROCEDURE GetDefaultPalette(VAR Palette: PaletteType);
  285. FUNCTION  GetDriverName: STRING;
  286. PROCEDURE GetFillPattern(VAR FillPattern: FillPatternType);
  287. PROCEDURE GetFillSettings(VAR FillInfo: FillSettingsType);
  288. FUNCTION  GetGraphMode: INTEGER;
  289. PROCEDURE GetImage(x1, y1, x2, y2: INTEGER; VAR BitMap);
  290. PROCEDURE GetLineSettings(VAR LineInfo: LineSettingsType);
  291. FUNCTION  GetMaxColor: WORD;
  292. FUNCTION  GetMaxMode:  INTEGER;
  293. FUNCTION  GetMaxX:     INTEGER;
  294. FUNCTION  GetMaxY:     INTEGER;
  295. FUNCTION  GetModeName(ModeNumber: INTEGER): STRING;
  296. PROCEDURE GetModeRange(GD: INTEGER; VAR Lo, Hi: INTEGER);
  297. PROCEDURE GetPalette(VAR Palette: PaletteType);
  298. FUNCTION  GetPaletteSize: INTEGER;
  299. FUNCTION  GetPixel(x, y: INTEGER): WORD;
  300. PROCEDURE GetTextSettings(VAR TextInfo: TextSettingsType);
  301. PROCEDURE GetViewSettings(VAR ViewPort: ViewPortType);
  302. FUNCTION  GetX: INTEGER;
  303. FUNCTION  GetY: INTEGER;
  304. PROCEDURE GraphDefaults;
  305. FUNCTION  GraphErrorMsg(ErrorCode: INTEGER): STRING;
  306. FUNCTION  GraphResult: INTEGER;
  307. FUNCTION  ImageSize(x1, y1, x2, y2: INTEGER): WORD;
  308. PROCEDURE InitGraph(VAR GraphDriver, GraphMode: INTEGER;
  309.                         PathToDriver          : STRING);
  310. FUNCTION  InstallUserDriver(n: STRING; p: POINTER): INTEGER;
  311. FUNCTION  InstallUserFont(FFName: STRING): INTEGER;
  312. PROCEDURE Line(x1, y1, x2, y2: INTEGER);
  313. PROCEDURE LineRel(dx, dy: INTEGER);
  314. PROCEDURE LineTo(x, y: INTEGER);
  315. PROCEDURE MoveRel(dx, dy: INTEGER);
  316. PROCEDURE MoveTo(x, y: INTEGER);
  317. PROCEDURE OutText(TextString: STRING);
  318. PROCEDURE OutTextXY(x, y: INTEGER; TextString: STRING);
  319. PROCEDURE PieSlice (x, y: INTEGER; SA, EA, R: WORD);
  320. PROCEDURE PutImage (x, y: INTEGER; VAR BM; BitBlt: WORD);
  321. PROCEDURE PutPixel (x, y: INTEGER; Pixel: WORD);
  322. PROCEDURE Rectangle(x1, y1, x2, y2: INTEGER);
  323. FUNCTION  RegisterBGIDriver(Driver: POINTER): INTEGER;
  324. FUNCTION  RegisterBGIFont(Font: POINTER): INTEGER;
  325. PROCEDURE RestoreCrtMode;
  326. PROCEDURE Sector(x, y: INTEGER; SA, EA, XR, YR: WORD);
  327. PROCEDURE SetActivePage(Page: WORD);
  328. PROCEDURE SetAllPalette(VAR Palette);
  329. PROCEDURE SetAspectRatio(XAsp, YAsp: WORD);
  330. PROCEDURE SetBkColor(ColorNum: WORD);
  331. PROCEDURE SetColor(Color: WORD);
  332. PROCEDURE SetFillPattern(Pat: FillPatternType; Col: WORD);
  333. PROCEDURE SetFillStyle(Pattern: WORD; Color: WORD);
  334. PROCEDURE SetGraphBufSize(BufSize: WORD);
  335. PROCEDURE SetGraphMode(Mode: INTEGER);
  336. PROCEDURE SetLineStyle(L, P, T: WORD);
  337. PROCEDURE SetPalette(ColorNum: WORD; Color: SHORTINT);
  338. PROCEDURE SetRGBPalette(ColorNum, R, G, B: INTEGER);
  339. PROCEDURE SetTextJustify(Horiz, Vert: WORD);
  340. PROCEDURE SetTextStyle(Font, Direction, CharSize: WORD);
  341. PROCEDURE SetUserCharSize(MultX, DivX, MultY, DivY: WORD);
  342. PROCEDURE SetViewPort(x1,y1, x2,y2: INTEGER; Clip: BOOLEAN);
  343. PROCEDURE SetVisualPage(Page: WORD);
  344. PROCEDURE SetWriteMode(WriteMode: INTEGER);
  345. FUNCTION  TextHeight(TextString: STRING): WORD;
  346. FUNCTION  TextWidth(TextString: STRING): WORD;
  347.  
  348. IMPLEMENTATION
  349.  
  350. USES
  351.   Dos, Graph;
  352.  
  353. CONST
  354.   GrafTable: ARRAY[128..255] OF ARRAY[0..7] OF BYTE = (
  355.   (* Der komplette Grafikzeichensatz für die Grafikmodi   *)
  356.   (* von Grafikkarten, bei denen er nicht im BIOS liegt.  *)
  357.   (* Erspart den Aufruf des Programms Graftabl für die    *)
  358.   (* Systemschrift (»DefaultFont«).                       *)
  359.     ($3C, $66, $60, $66, $3C, $0C, $06, $3C),     (* #128 *)
  360.     ($00, $66, $00, $66, $66, $66, $3F, $00),     (* #129 *)
  361.     ($0E, $00, $3C, $66, $7E, $60, $3C, $00),     (* #130 *)
  362.     ($7E, $C3, $3C, $06, $3E, $66, $3F, $00),     (* #131 *)
  363.     ($66, $00, $3C, $06, $3E, $66, $3F, $00),     (* #132 *)
  364.     ($70, $00, $3C, $06, $3E, $66, $3F, $00),     (* #133 *)
  365.     ($18, $18, $3C, $06, $3E, $66, $3F, $00),     (* #134 *)
  366.     ($00, $00, $3C, $60, $60, $3C, $06, $1C),     (* #135 *)
  367.     ($7E, $C3, $3C, $66, $7E, $60, $3C, $00),     (* #136 *)
  368.     ($66, $00, $3C, $66, $7E, $60, $3C, $00),     (* #137 *)
  369.     ($70, $00, $3C, $66, $7E, $60, $3C, $00),     (* #138 *)
  370.     ($66, $00, $38, $18, $18, $18, $3C, $00),     (* #139 *)
  371.     ($7C, $C6, $38, $18, $18, $18, $3C, $00),     (* #140 *)
  372.     ($70, $00, $38, $18, $18, $18, $3C, $00),     (* #141 *)
  373.     ($63, $1C, $36, $63, $7F, $63, $63, $00),     (* #142 *)
  374.     ($18, $18, $00, $3C, $66, $7E, $66, $00),     (* #143 *)
  375.     ($0E, $00, $7E, $30, $3C, $30, $7E, $00),     (* #144 *)
  376.     ($00, $00, $7F, $0C, $7F, $CC, $7F, $00),     (* #145 *)
  377.     ($1F, $36, $66, $7F, $66, $66, $67, $00),     (* #146 *)
  378.     ($38, $66, $00, $3C, $66, $66, $3C, $00),     (* #147 *)
  379.     ($00, $66, $00, $3C, $66, $66, $3C, $00),     (* #148 *)
  380.     ($00, $70, $00, $3C, $66, $66, $3C, $00),     (* #149 *)
  381.     ($3C, $66, $00, $66, $66, $66, $3F, $00),     (* #150 *)
  382.     ($00, $70, $00, $66, $66, $66, $3F, $00),     (* #151 *)
  383.     ($60, $66, $00, $66, $66, $3E, $06, $7C),     (* #152 *)
  384.     ($C3, $18, $3C, $66, $66, $3C, $18, $00),     (* #153 *)
  385.     ($66, $00, $66, $66, $66, $66, $3C, $00),     (* #154 *)
  386.     ($18, $18, $7E, $C0, $C0, $7E, $18, $18),     (* #155 *)
  387.     ($1C, $36, $32, $78, $30, $73, $7E, $00),     (* #156 *)
  388.     ($66, $66, $3C, $7E, $18, $7E, $18, $18),     (* #157 *)
  389.     ($F8, $CC, $CC, $FA, $C6, $CF, $C6, $C7),     (* #158 *)
  390.     ($0E, $1B, $18, $3C, $18, $18, $D8, $70),     (* #159 *)
  391.     ($0E, $00, $3C, $06, $3E, $66, $3F, $00),     (* #160 *)
  392.     ($1C, $00, $38, $18, $18, $18, $3C, $00),     (* #161 *)
  393.     ($00, $0E, $00, $3C, $66, $66, $3C, $00),     (* #162 *)
  394.     ($00, $0E, $00, $66, $66, $66, $3F, $00),     (* #163 *)
  395.     ($00, $7C, $00, $7C, $66, $66, $66, $00),     (* #164 *)
  396.     ($7E, $00, $66, $76, $7E, $6E, $66, $00),     (* #165 *)
  397.     ($3C, $6C, $6C, $3E, $00, $7E, $00, $00),     (* #166 *)
  398.     ($38, $6C, $6C, $38, $00, $7C, $00, $00),     (* #167 *)
  399.     ($18, $00, $18, $30, $60, $66, $3C, $00),     (* #168 *)
  400.     ($00, $00, $00, $7E, $60, $60, $00, $00),     (* #169 *)
  401.     ($00, $00, $00, $7E, $06, $06, $00, $00),     (* #170 *)
  402.     ($C3, $C6, $CC, $DE, $33, $66, $CC, $0F),     (* #171 *)
  403.     ($C3, $C6, $CC, $DB, $37, $6F, $CF, $03),     (* #172 *)
  404.     ($18, $18, $00, $18, $18, $18, $18, $00),     (* #173 *)
  405.     ($00, $33, $66, $CC, $66, $33, $00, $00),     (* #174 *)
  406.     ($00, $CC, $66, $33, $66, $CC, $00, $00),     (* #175 *)
  407.     ($22, $88, $22, $88, $22, $88, $22, $88),     (* #176 *)
  408.     ($55, $AA, $55, $AA, $55, $AA, $55, $AA),     (* #177 *)
  409.     ($DB, $77, $DB, $EE, $DB, $77, $DB, $EE),     (* #178 *)
  410.     ($18, $18, $18, $18, $18, $18, $18, $18),     (* #179 *)
  411.     ($18, $18, $18, $18, $F8, $18, $18, $18),     (* #180 *)
  412.     ($18, $18, $F8, $18, $F8, $18, $18, $18),     (* #181 *)
  413.     ($36, $36, $36, $36, $F6, $36, $36, $36),     (* #182 *)
  414.     ($00, $00, $00, $00, $FE, $36, $36, $36),     (* #183 *)
  415.     ($00, $00, $F8, $18, $F8, $18, $18, $18),     (* #184 *)
  416.     ($36, $36, $F6, $06, $F6, $36, $36, $36),     (* #185 *)
  417.     ($36, $36, $36, $36, $36, $36, $36, $36),     (* #186 *)
  418.     ($00, $00, $FE, $06, $F6, $36, $36, $36),     (* #187 *)
  419.     ($36, $36, $F6, $06, $FE, $00, $00, $00),     (* #188 *)
  420.     ($36, $36, $36, $36, $FE, $00, $00, $00),     (* #189 *)
  421.     ($18, $18, $F8, $18, $F8, $00, $00, $00),     (* #190 *)
  422.     ($00, $00, $00, $00, $F8, $18, $18, $18),     (* #191 *)
  423.     ($18, $18, $18, $18, $1F, $00, $00, $00),     (* #192 *)
  424.     ($18, $18, $18, $18, $FF, $00, $00, $00),     (* #193 *)
  425.     ($00, $00, $00, $00, $FF, $18, $18, $18),     (* #194 *)
  426.     ($18, $18, $18, $18, $1F, $18, $18, $18),     (* #195 *)
  427.     ($00, $00, $00, $00, $FF, $00, $00, $00),     (* #196 *)
  428.     ($18, $18, $18, $18, $FF, $18, $18, $18),     (* #197 *)
  429.     ($18, $18, $1F, $18, $1F, $18, $18, $18),     (* #198 *)
  430.     ($36, $36, $36, $36, $37, $36, $36, $36),     (* #199 *)
  431.     ($36, $36, $37, $30, $3F, $00, $00, $00),     (* #200 *)
  432.     ($00, $00, $3F, $30, $37, $36, $36, $36),     (* #201 *)
  433.     ($36, $36, $F7, $00, $FF, $00, $00, $00),     (* #202 *)
  434.     ($00, $00, $FF, $00, $F7, $36, $36, $36),     (* #203 *)
  435.     ($36, $36, $37, $30, $37, $36, $36, $36),     (* #204 *)
  436.     ($00, $00, $FF, $00, $FF, $00, $00, $00),     (* #205 *)
  437.     ($36, $36, $F7, $00, $F7, $36, $36, $36),     (* #206 *)
  438.     ($18, $18, $FF, $00, $FF, $00, $00, $00),     (* #207 *)
  439.     ($36, $36, $36, $36, $FF, $00, $00, $00),     (* #208 *)
  440.     ($00, $00, $FF, $00, $FF, $18, $18, $18),     (* #209 *)
  441.     ($00, $00, $00, $00, $FF, $36, $36, $36),     (* #210 *)
  442.     ($36, $36, $36, $36, $3F, $00, $00, $00),     (* #211 *)
  443.     ($18, $18, $1F, $18, $1F, $00, $00, $00),     (* #212 *)
  444.     ($00, $00, $1F, $18, $1F, $18, $18, $18),     (* #213 *)
  445.     ($00, $00, $00, $00, $3F, $36, $36, $36),     (* #214 *)
  446.     ($36, $36, $36, $36, $FF, $36, $36, $36),     (* #215 *)
  447.     ($18, $18, $FF, $18, $FF, $18, $18, $18),     (* #216 *)
  448.     ($18, $18, $18, $18, $F8, $00, $00, $00),     (* #217 *)
  449.     ($00, $00, $00, $00, $1F, $18, $18, $18),     (* #218 *)
  450.     ($FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF),     (* #219 *)
  451.     ($00, $00, $00, $00, $FF, $FF, $FF, $FF),     (* #220 *)
  452.     ($F0, $F0, $F0, $F0, $F0, $F0, $F0, $F0),     (* #221 *)
  453.     ($0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F),     (* #222 *)
  454.     ($FF, $FF, $FF, $FF, $00, $00, $00, $00),     (* #223 *)
  455.     ($00, $00, $3B, $6E, $64, $6E, $3B, $00),     (* #224 *)
  456.     ($00, $3C, $66, $7C, $66, $7C, $60, $60),     (* #225 *)
  457.     ($00, $7E, $66, $60, $60, $60, $60, $00),     (* #226 *)
  458.     ($00, $7F, $36, $36, $36, $36, $36, $00),     (* #227 *)
  459.     ($7E, $66, $30, $18, $30, $66, $7E, $00),     (* #228 *)
  460.     ($00, $00, $3F, $6C, $6C, $6C, $38, $00),     (* #229 *)
  461.     ($00, $33, $33, $33, $33, $3E, $30, $60),     (* #230 *)
  462.     ($00, $3B, $6E, $0C, $0C, $0C, $0C, $00),     (* #231 *)
  463.     ($7E, $18, $3C, $66, $66, $3C, $18, $7E),     (* #232 *)
  464.     ($1C, $36, $63, $7F, $63, $36, $1C, $00),     (* #233 *)
  465.     ($1C, $36, $63, $63, $36, $36, $77, $00),     (* #234 *)
  466.     ($0E, $18, $0C, $3E, $66, $66, $3C, $00),     (* #235 *)
  467.     ($00, $00, $7E, $DB, $DB, $7E, $00, $00),     (* #236 *)
  468.     ($06, $0C, $7E, $DB, $DB, $7E, $60, $C0),     (* #237 *)
  469.     ($1C, $60, $C0, $FC, $C0, $60, $1C, $00),     (* #238 *)
  470.     ($3C, $66, $66, $66, $66, $66, $66, $00),     (* #239 *)
  471.     ($00, $7E, $00, $7E, $00, $7E, $00, $00),     (* #240 *)
  472.     ($18, $18, $7E, $18, $18, $00, $7E, $00),     (* #241 *)
  473.     ($30, $18, $0C, $18, $30, $00, $7E, $00),     (* #242 *)
  474.     ($0C, $18, $30, $18, $0C, $00, $7E, $00),     (* #243 *)
  475.     ($0E, $1B, $1B, $18, $18, $18, $18, $18),     (* #244 *)
  476.     ($18, $18, $18, $18, $18, $D8, $D8, $70),     (* #245 *)
  477.     ($18, $18, $00, $7E, $00, $18, $18, $00),     (* #246 *)
  478.     ($00, $76, $DC, $00, $76, $DC, $00, $00),     (* #247 *)
  479.     ($38, $6C, $6C, $38, $00, $00, $00, $00),     (* #248 *)
  480.     ($00, $00, $00, $18, $18, $00, $00, $00),     (* #249 *)
  481.     ($00, $00, $00, $00, $18, $00, $00, $00),     (* #250 *)
  482.     ($0F, $0C, $0C, $0C, $EC, $6C, $3C, $1C),     (* #251 *)
  483.     ($78, $6C, $6C, $6C, $6C, $00, $00, $00),     (* #252 *)
  484.     ($70, $18, $30, $60, $78, $00, $00, $00),     (* #253 *)
  485.     ($00, $00, $3C, $3C, $3C, $3C, $00, $00),     (* #254 *)
  486.     ($00, $00, $00, $00, $00, $00, $00, $00));    (* #255 *)
  487.  
  488.   ModeTableBufSize: WORD = $FFF0;(* 64 kByte großer Puffer*)
  489.  
  490.   VGAPalette : PaletteType = (   (* Standard-VGA-Palette; *)
  491.             Size  :  16;     (* hier nach Belieben ändern *)
  492.             Colors: (EGABlack, EGABlue, EGAGreen, EGACyan,
  493.                      EGARed,   EGAMagenta,        EGABrown,
  494.                      EGALightgray, EGADarkgray,
  495.                      EGALightBlue, EGALightGreen,
  496.                      EGALightcyan, EGALightRed,
  497.                      EGALightMagenta, EGAYellow, EGAWhite));
  498.  
  499.   PatchExtDrv   : BOOLEAN   = TRUE;   (* Ext.-/Int.-Patch *)
  500.   AlreadyPatched: BOOLEAN   = FALSE;
  501.   CharSetted    : BOOLEAN   = FALSE;
  502.   ScreenDriver  : INTEGER   = Detect; (* globale Variab-  *)
  503.   ScreenMode    : BYTE      = $00;    (* len in der Unit  *)
  504.   SVGACard      : BYTE      = $FF;
  505.   Result        : INTEGER   = $00;
  506.   SVGAMode      : BYTE      = SVGAHi;
  507.   InitMode      : BYTE      = $03;
  508.   Int1FSave     : POINTER   = NIL;
  509.   SVGADriverPtr : POINTER   = NIL;
  510.   SVGADriverName: STRING[8] = 'SVGA';      (* Treiber-ID  *)
  511.  
  512.   (* Liste der unterstützten Grafikkarten, u.a. bei der   *)
  513.   (* Autodetect-Routine verwendet. Die Reihenfolge darf   *)
  514.   (* nicht geändert werden. Zusätzliche Karten müssen an- *)
  515.   (* gehängt und die Konstante »SumOfCards« entsprechend  *)
  516.   (* angepaßt werden:                                     *)
  517.   ET3000     = $00;         (* Tseng ET 3000, Sigma ...   *)
  518.   ET4000     = $01;         (* Tseng ET 4000, Sigma ...   *)
  519.   Paradise   = $02;         (* Paradise Professional, WD  *)
  520.   Trident    = $03;         (* Trident-Chipsatz           *)
  521.   Oak        = $04;         (* OTI-Chipsatz (OAK-Karte)   *)
  522.   Video7     = $05;         (* Video Seven VRAM           *)
  523.   Genoa      = $06;         (* Genoa HiRES EGA, VGA+      *)
  524.   ATI        = $07;         (* ATI VGA Wonder             *)
  525.   VESA       = $08;         (* VESA-Standard              *)
  526.   Tecmar     = $09;         (* Tecmar-BIOS                *)
  527.   ATTVGA     = $0A;         (* AT&T-BIOS                  *)
  528.   (*  weitere Karten hier entsprechend ergänzen (!!!)     *)
  529.   SumOfCards = ATTVGA; (* nach Ergänzungen anpassen (!!!) *)
  530.  
  531.   (* Für GetModeName zur Identifizierung der Karte:       *)
  532.   SVGAModeID: ARRAY[0..SumOfCards] OF STRING[22] = (
  533.     '800 x 600 Tseng ET3000',                       (*  0 *)
  534.     '800 x 600 Tseng ET4000',                       (*  1 *)
  535.     '800x600 Paradise SVGA',                        (*  2 *)
  536.     '800 x 600 Trident SVGA',                       (*  3 *)
  537.     '800 x 600 OAK Chipset',                        (*  4 *)
  538.     '800 x 600 Video Seven',                        (*  5 *)
  539.     '800 x 600 Genoa VGA+',                         (*  6 *)
  540.     '800x600 ATI VGA-Wonder',                       (*  7 *)
  541.     '800x600 VESA Standard', (* mit Treiber !!! *)  (*  8 *)
  542.     '800 x 600 Tecmar SVGA',                        (*  9 *)
  543.     '800x600 AT&T/Olivetti');                       (* 10 *)
  544.   (* hier entsprechend für weitere Karten ergänzen (!!!)  *)
  545.  
  546.   (* X-Auflösung des mit SVGAInit eingestellten Modus:    *)
  547.   SVGAResX: ARRAY[0..SumOfCards] OF WORD = (
  548.     799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799);
  549.   (* Für andere Auflösungen entsprechend anpassen (!!!)   *)
  550.  
  551.   (* Y-Auflösung des mit SVGAInit eingestellten Modus:    *)
  552.   SVGAResY: ARRAY[0..SumOfCards] OF WORD = (
  553.     599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599);
  554.   (* Für andere Auflösungen entsprechend anpassen (!!!)   *)
  555.  
  556.   (* Aspectratio (Wert für X-Achse, Y = 1000) für 800*600 *)
  557.   SVGAAspect: ARRAY[0..SumOfCards] OF WORD = (7000, 7000,
  558.     7000, 7000, 7000, 7000, 7000, 7000, 7000, 7000, 7000);
  559.   (* Für andere Auflösungen entsprechend anpassen (!!!)   *)
  560.  
  561.   SVGAInit: ARRAY[0..SumOfCards] OF BYTE = (
  562.   (* Der Initalisierungswert (AL) für den Modus 800x600   *)
  563.     $29, $29, $58, $5B, $52, $62, $79, $54, $6A, $16, $47);
  564.  
  565.   SVGAID: ARRAY[0..SumOfCards + 2] OF STRING[11] = (
  566.     'TSENG LAB',  'TSENG LAB',   'PARADISE', 'TRIDENT',
  567.     'OAK',        'VIDEO SEVEN', 'GENOA',    '761295520'
  568.     (* <- ATI *), 'VESA',        'TECMAR',   'OLIVETTI',
  569.     (* hier ergänzen !!! *)      'WESTERN',  'SIGMA');
  570.  
  571.   BGIFileLen = 5363; (* Größe von »svga.bgi« = gepachter  *)
  572.                      (* »egavga.bgi« von Turbo Pascal 5.0 *)
  573.  
  574.   GraphInitDone: BOOLEAN = FALSE; (* wurde InitGraph()    *)
  575.                                   (* bereits aufgerufen?  *)
  576. VAR
  577.   OrgExitProc: POINTER;
  578.   Buffer     : ARRAY[0..Pred(BGIFileLen)] OF CHAR;
  579.                (* Filebuffer für Blockread(BGIFile)       *)
  580.   Regs       : Registers;
  581.  
  582. (*========================================================*)
  583. (* Alle Prozeduren und Funktionen rufen die Routinen der  *)
  584. (* Unit GRAPH auf. Eventuelle Änderungen und Ergänzungen  *)
  585. (* können direkt in diesen Dummies vorgenommen werden:    *)
  586.  
  587. (* Ein ordentlicher Ausstieg falls noch im Grafikmodus:   *)
  588. PROCEDURE GraphExitProc;
  589. BEGIN
  590.   IF BYTE(Ptr($0040, $0049)^) <> InitMode THEN CloseGraph;
  591.   IF CharSetted THEN SetIntVec($1F, Int1FSave);
  592.   ExitProc := OrgExitProc;
  593.   Halt(ExitCode);
  594. END;
  595.  
  596. PROCEDURE Arc(x, y : INTEGER; SA, EA, Radius: WORD);
  597. BEGIN Graph.Arc(x,y, SA, EA, Radius); END;
  598.  
  599. PROCEDURE Bar(x1, y1, x2, y2: INTEGER);
  600. BEGIN Graph.Bar(x1, y1, x2, y2); END;
  601.  
  602. PROCEDURE Bar3D(x1,y1,x2,y2: INTEGER; d: WORD; t: BOOLEAN);
  603. BEGIN Graph.Bar3D(x1, y1, x2, y2, d, t); END;
  604.  
  605. PROCEDURE Circle(x, y: INTEGER; Radius: WORD);
  606. BEGIN Graph.Circle(x, y, Radius); END;
  607.  
  608. PROCEDURE ClearDevice;
  609. BEGIN Graph.ClearDevice; END;
  610.  
  611. PROCEDURE ClearViewPort;
  612. BEGIN Graph.ClearViewPort; END;
  613.  
  614. PROCEDURE CloseGraph;
  615. BEGIN
  616.   IF ScreenDriver = SVGA THEN BEGIN
  617.    Regs.AL := InitMode;
  618.    Regs.AH := 0;
  619.    Intr($10, Regs);
  620.   END ELSE
  621.     Graph.CloseGraph;
  622.   (* Falls der Zeichensatz geändert wurde, Zeiger zurück: *)
  623.   IF CharSetted THEN SetIntVec($1F, Int1FSave);
  624. END;
  625.  
  626. (* Ermittlung der (Standard-)Grafikkarte. Im Gegensatz zu *)
  627. (* Graph.Detectgraph findet keine Überprüfung auf MDA/    *)
  628. (* Hercules statt, allerdings wird IBM8514 erkennt.       *)
  629. PROCEDURE Autodetect(VAR GD, GM: INTEGER);
  630. VAR
  631.   Dummy: BYTE;
  632.   Int7F: POINTER;
  633.   Int1F: POINTER;
  634. BEGIN
  635.   GetIntVec($7F, Int7F);
  636.   IF LONGINT(Int7F) <> 0 THEN GD := IBM8514 (*8514/A Interface*)
  637.   ELSE WITH Regs DO BEGIN
  638.     GD := grNotDetected;
  639.     AL := BYTE(Ptr($0040, $0049)^);
  640.     AH := $0F;
  641.     Intr($10, Regs);
  642.     IF AL = $07 THEN GD := HercMono ELSE BEGIN
  643.       GetIntVec($1F, Int1F);
  644.       IF Seg(Int1F) > $B000 THEN BEGIN
  645.         AL := $06;    (* Zeichensatz im ROM *)
  646.         CX := $00;
  647.         dx := $00;
  648.         AH := $30;  (* undokumentiert! *)
  649.         Intr($10, Regs);
  650.         AX := CX;
  651.         IF AX = dx THEN AX := 0;
  652.         DS := CX;
  653.         BX := dx;
  654.         AL := BYTE(Ptr(DS, BX + 2)^);
  655.         AL := AL OR AL;
  656.         IF fZero AND 1 = 1 THEN BEGIN
  657.           IF Port[$0188] = $04 THEN GD := PC3270
  658.                                ELSE GD := CGA
  659.         END ELSE GD := CGA;
  660.       END ELSE BEGIN
  661.         AX := $0010;
  662.         Intr($10, Regs);
  663.         IF BYTE(Ptr($0040, $0049)^) <> $10 THEN
  664.           GD := CGA               (* EGA in CGA-Emulation *)
  665.         ELSE BEGIN
  666.           AL := InitMode;
  667.           AH := 0;
  668.           Intr($10, Regs);
  669.           AX := $1200;
  670.           BL := $10;
  671.           BH := $FF;
  672.           CL := $0C;
  673.           Intr($10, Regs);
  674.           IF BH = $01 THEN GD := EGAMono
  675.           ELSE BEGIN
  676.             IF BL < $03 THEN GD := EGA64
  677.             ELSE BEGIN
  678.               AH := $1A;
  679.               AL := $00;
  680.               BL := $34;
  681.               Intr($10, Regs);
  682.               IF AL <> $1A THEN GD := EGA ELSE CASE BL OF
  683.                 $00: GD := grNotDetected; (* kein Monitor!  *)
  684.                 $01: GD := HercMono;(* Emulation / PS2      *)
  685.                 $02: GD := CGA;     (* Emulation / PS2      *)
  686.                 $04: GD := EGA;     (* Emulation / PS2      *)
  687.                 $05: GD := EGAMono; (* Emulation / PS2      *)
  688.                 $06: GD := EGA;     (* Emulation / PS2      *)
  689.                 $07: GD := EGAMono; (* Emulation / PS2      *)
  690.                 $08: GD := VGA;
  691.                 $0A: GD := EGA;     (* Emulation / PS2      *)
  692.                 $0B: GD := MCGA;    (* Mono-Display         *)
  693.                 $0C: GD := MCGA;    (* Color-Display        *)
  694.                 $FF: GD := grNotDetected; (* unbekannt!     *)
  695.               END
  696.             END
  697.           END
  698.         END
  699.       END;
  700.     END;
  701.     IF GD = CGA THEN BEGIN
  702.       Dummy := BYTE(Ptr($0040, $0049)^);
  703.       AX := $0048;
  704.       Intr($10, Regs);
  705.       IF BYTE(Ptr($0040, $0049)^) = $48 THEN BEGIN
  706.         AL := Dummy;
  707.         Intr($10, Regs);
  708.         GD := ATT400;
  709.       END ELSE GD := CGA;
  710.     END;
  711.   END;
  712.   CASE GD OF
  713.     CGA     : GM := CGAHi;
  714.     MCGA    : GM := MCGAHi;
  715.     EGA     : GM := EGAHi;
  716.     EGA64   : GM := EGA64Hi;
  717.     EGAMono : GM := EGAMonoHi;
  718.     IBM8514 : GM := IBM8514Hi;
  719.     HercMono: GM := HercMonoHi;
  720.     ATT400  : GM := ATT400Hi;
  721.     VGA     : GM := VGAHi;
  722.     PC3270  : GM := PC3270Hi;
  723.     SVGA    : GM := SVGAHi;
  724.   END;
  725.   ScreenDriver := GD;
  726. END;
  727.  
  728. PROCEDURE DetectGraph(VAR GraphDriver, GraphMode: INTEGER);
  729. (* ------------------------------------------------------ *)
  730. (* Erweitert: Ermittelt bei VGA-Karten ob es sich um eine *) 
  731. (* dem System bekannte SVGA-Karte handelt. Falls ja, wird *) 
  732. (* versucht, die Karte zu ermitteln und dann 800x600      *) 
  733. (* initialisiert.                                         *) 
  734. (* Bleibt die Suche nach der Karte erfolglos (StandardVGA *)
  735. (* oder unbekannte Karte), wird als Treiber in VGA zurück-*) 
  736. (* geschaltet und VGAHi als Bildschirmauflösung gewählt.  *) 
  737. (* ------------------------------------------------------ *)
  738. TYPE
  739.   NullStr = ARRAY[0..254] OF CHAR;
  740. VAR
  741.   CardBIOS: NullStr ABSOLUTE $C000:$0005;
  742.   B, t    : BYTE;
  743.   s       : STRING;
  744.  
  745.   FUNCTION CheckIntr(InitCode: BYTE): BYTE;
  746.   (* Interruptaufruf überprüfen. Es wird nur getestet, ob *)
  747.   (* die Karte den entsprechenden Aufruf durchführt und   *)
  748.   (* nicht, ob das auch der richtige Modus ist (Über-     *)
  749.   (* schneidungen bei den Sondermodi diverser Karten!)    *)
  750.   VAR
  751.     drv,
  752.     InitMode: BYTE;
  753.   BEGIN
  754.     InitMode := BYTE(Ptr($0040, $0049)^);
  755.     Regs.AH  := 0;
  756.     Regs.AL  := InitCode;
  757.     Intr($10, Regs);
  758.     IF BYTE(Ptr($0040, $0049)^) = InitCode THEN BEGIN
  759.       drv     := InitCode;
  760.       Regs.AL := InitMode;
  761.       Regs.AH := 0;
  762.       Intr($10, Regs);
  763.     END ELSE drv := $FF;
  764.     CheckIntr := drv;
  765.   END;
  766.  
  767.   FUNCTION CheckSVGADriver: INTEGER;
  768.   VAR
  769.     GraphDriver: INTEGER;
  770.  
  771.     FUNCTION ReadBIOS: BYTE;  (* im BIOS Copyright suchen *)
  772.     VAR
  773.       s   : STRING;
  774.       B   : BYTE;
  775.     BEGIN
  776.       s[0] := #255;
  777.       FOR B := 1 TO 255 DO s[B] := UpCase(CardBIOS[B - 1]);
  778.       FOR B := 0 TO SumOfCards + 2 DO
  779.         IF Pos(SVGAID[B], s) > 0 THEN BEGIN
  780.           ReadBIOS := B;
  781.           IF B = Succ(SumOfCards) THEN B := Paradise;
  782.           IF B = SumOfCards + 2   THEN B := ET3000;
  783.           IF (B = ET3000) AND (Port[$3CD] AND $C0 = 0) THEN
  784.              B := ET4000;  (* Test, ob es eine ET4000 ist *)
  785.           ReadBIOS := B;
  786.           Exit;
  787.         END;
  788.       IF B > SumOfCards + 2 THEN
  789.         ReadBIOS := VGA;       (* Karte nicht erkannt (!) *)
  790.     END;
  791.  
  792.   BEGIN
  793.     Regs.AX := $1A00;
  794.     Intr($10, Regs);
  795.     IF Regs.AL = $1A THEN BEGIN
  796.       Regs.AX := $6F00;
  797.       Regs.BX := $0000;
  798.       Intr($10, Regs);
  799.       IF Regs.BX = $5637 (* 'V7' *) THEN GraphDriver := Video7
  800.       ELSE BEGIN
  801.      (* VESA-Überprüfung: daß der Aufruf mit 6Ah klappt   *)
  802.      (* (beispielsweise BOCA mit ET4000) heißt noch lange *)
  803.      (* nicht, daß es eine VESA-kompatible Karte ist bzw. *)
  804.      (* bei älteren Karten der VESA-Gerätetreiber in der  *)
  805.      (* »config.sys« einbunden ist                        *)
  806.         Regs.AX := $4F00;
  807.         Intr($10, Regs);
  808.       END;
  809.       IF Lo(Regs.AX) = $4F THEN
  810.         IF (Chr(BYTE(Ptr(Regs.ES, Regs.DI)^  )) = 'V') AND
  811.            (Chr(BYTE(Ptr(Regs.ES, Regs.DI+1)^)) = 'E') AND
  812.            (Chr(BYTE(Ptr(Regs.ES, Regs.DI+2)^)) = 'S') AND
  813.            (Chr(BYTE(Ptr(Regs.ES, Regs.DI+3)^)) = 'A') THEN
  814.            GraphDriver := VESA
  815.         ELSE
  816.           GraphDriver := ReadBIOS (* keine VESA-ID:       *)
  817.       ELSE                       (* BIOS-Copyright suchen *)
  818.         GraphDriver := ReadBIOS;
  819.     END;               (* sonst das BIOS-Copyright suchen *)
  820.     IF GraphDriver = VGA THEN WITH Regs DO BEGIN
  821.           (* letzter Check auf AT&T VDC600 / Paradise VGA *)
  822.       AX := $007F;                    (* get current mode *)
  823.       BH := $02;                      (* query mode       *)
  824.       Intr($10, Regs);
  825.       IF AL = $7F THEN GraphDriver := ATTVGA ELSE
  826.       IF BH = $7F THEN GraphDriver := Paradise 
  827.                   ELSE GraphDriver := VGA;
  828.     END;
  829.     CheckSVGADriver := GraphDriver;
  830.   END;
  831.  
  832. BEGIN
  833.   IF GraphDriver IN [CGA..PC3270] THEN
  834.     ScreenDriver := GraphDriver
  835.   ELSE
  836.     Autodetect(GraphDriver, GraphMode);
  837.  
  838.   IF GraphDriver = EGA THEN BEGIN
  839.     FOR B := 1 TO 255 DO s[B] := UpCase(CardBIOS[Pred(B)]);
  840.     IF Pos(SVGAID[Genoa], s) > 0 THEN BEGIN
  841.       GraphDriver := SVGA;             (* Genoa HiRes mit *)
  842.       GraphMode   := SVGAHi;           (* 800x600 als VGA *)
  843.       SVGAMode    := SVGAInit[Genoa];
  844.     END;                               (* initialisieren  *)
  845.   END;
  846.  
  847.   IF GraphDriver = VGA THEN BEGIN
  848.     GraphDriver := CheckSVGADriver;
  849.     IF GraphDriver <> VGA THEN BEGIN
  850.       SVGACard := GraphDriver;         (* ok, SVGA-Karte  *)
  851.       IF GraphDriver IN [ET3000..SumOfCards] THEN BEGIN
  852.         SVGAMode     := SVGAInit[GraphDriver];
  853.         GraphDriver  := SVGA;            (* vorerst ist   *)
  854.         ScreenDriver := GraphDriver;
  855.       END ELSE BEGIN
  856.         GraphDriver  := VGA;     (* unbekannte Karten auf *)
  857.         GraphMode    := VGAHi;   (* VGA runterdrücken und *)
  858.         ScreenDriver := VGA;     (* dann raus!            *)
  859.         Exit;
  860.       END;
  861.     END;
  862.  
  863.     IF SVGAMode <> CheckIntr(SVGAMode) THEN BEGIN
  864.       GraphDriver := VGA;   (* letzter Test gescheitert!  *)
  865.       GraphMode   := VGAHi; (* die Karte kannte den Modus *)
  866.     END;                    (* nicht!                     *)
  867.   END;
  868.  
  869.   ScreenDriver := GraphDriver; (* wird noch gebraucht ... *)
  870. END;
  871.  
  872.  
  873. PROCEDURE DrawPoly(NumPoints: WORD; VAR PolyPoints);
  874. BEGIN Graph.DrawPoly(NumPoints, PolyPoints); END;
  875.  
  876. PROCEDURE Ellipse(x, y: INTEGER; SA, EA, XR, YR  : WORD);
  877. BEGIN Graph.Ellipse(x, y, SA, EA, XR, YR); END;
  878.  
  879. PROCEDURE FillEllipse(x, y: INTEGER; XR, YR : WORD);
  880. BEGIN Graph.FillEllipse(x,y, XR, YR); END;
  881.  
  882. PROCEDURE FillPoly(NumPoints: WORD; VAR PolyPoints);
  883. BEGIN Graph.FillPoly(NumPoints, PolyPoints); END;
  884.  
  885. PROCEDURE FloodFill(x, y: INTEGER; Border: WORD);
  886. BEGIN Graph.FloodFill(x, y, Border); END;
  887.  
  888. PROCEDURE GetArcCoords(VAR ArcCoords: ArcCoordsType);
  889. BEGIN
  890.   Graph.GetArcCoords(Graph.ArcCoordsType(ArcCoords));
  891. END;
  892.  
  893. PROCEDURE GetAspectRatio(VAR XAsp, YAsp: WORD);
  894. BEGIN Graph.GetAspectRatio(XAsp, YAsp); END;
  895.  
  896. FUNCTION GetBkColor: WORD;
  897. BEGIN GetBkColor := Graph.GetBkColor; END;
  898.  
  899. FUNCTION GetColor: WORD;
  900. BEGIN GetColor := Graph.GetColor; END;
  901.  
  902. PROCEDURE GetDefaultPalette(VAR Palette: PaletteType);
  903. BEGIN
  904.   Graph.GetDefaultPalette(Graph.PaletteType(Palette));
  905. END;
  906.  
  907. FUNCTION GetDriverName: STRING;
  908. BEGIN
  909.   IF ScreenDriver = SVGA THEN
  910.     GetDriverName := SVGADriverName
  911.   ELSE
  912.     GetDriverName := Graph.GetDriverName;
  913. END;
  914.  
  915. PROCEDURE GetFillPattern(VAR FillPattern: FillPatternType);
  916. BEGIN                           
  917.   Graph.GetFillPattern(Graph.FillPatternType(FillPattern));
  918. END;                          
  919.  
  920. PROCEDURE GetFillSettings(VAR FillInfo: FillSettingsType);
  921. BEGIN                           
  922.   Graph.GetFillSettings(Graph.FillSettingsType(FillInfo));
  923. END;
  924.  
  925. FUNCTION GetGraphMode: INTEGER;
  926. BEGIN
  927.   IF ScreenDriver = SVGA THEN 
  928.    GetGraphMode := SVGAHi
  929.   ELSE
  930.   GetGraphMode := Graph.GetGraphMode;
  931. END;
  932.  
  933. PROCEDURE GetImage(x1, y1, x2, y2: INTEGER; VAR BitMap);
  934. BEGIN Graph.GetImage(x1, y1, x2, y2, BitMap); END;
  935.  
  936. PROCEDURE GetLineSettings(VAR LineInfo: LineSettingsType);
  937. BEGIN
  938.   Graph.GetLineSettings(Graph.LineSettingsType(LineInfo));
  939. END;
  940.  
  941. FUNCTION GetMaxColor: WORD;
  942. BEGIN GetMaxColor := Graph.GetMaxColor; END;
  943.  
  944. FUNCTION GetMaxMode: INTEGER;
  945. BEGIN
  946.  IF ScreenDriver = SVGA THEN GetMaxMode := SVGAHi 
  947.                         ELSE GetMaxMode := Graph.GetMaxMode;
  948. END;
  949.  
  950. FUNCTION GetMaxX: INTEGER;
  951. BEGIN GetMaxX := Graph.GetMaxX; END;
  952.  
  953. FUNCTION GetMaxY: INTEGER;
  954. BEGIN GetMaxY := Graph.GetMaxY; END;
  955.  
  956. FUNCTION GetModeName(ModeNumber: INTEGER): STRING;
  957. (* Im Gegensatz zur Original-Funktion werden Leerzeichen  *)
  958. (* am Ende des Namens entfernt!                           *)
  959. VAR
  960.    ModeName: STRING;
  961. BEGIN
  962.   ModeName := Graph.GetModeName(ModeNumber);
  963.   WHILE ModeName[Length(ModeName)] = #32 DO
  964.     Delete(ModeName, Length(ModeName), 1);
  965.   GetModeName := ModeName;
  966. END;
  967.  
  968. PROCEDURE GetModeRange(GD: INTEGER; VAR Lo, Hi: INTEGER);
  969. BEGIN
  970.  IF GD = CurrentDriver THEN
  971.    IF ScreenDriver = SVGA THEN GD := SVGA;
  972.  IF GD = SVGA THEN BEGIN
  973.     Lo := SVGAHi;                  (* es steht nur ein    *)
  974.     Hi := SVGAHi;                  (* Modus zur Verfügung *)
  975.   END ELSE
  976.     Graph.GetModeRange(GD, Lo, Hi);
  977. END;
  978.  
  979. PROCEDURE GetPalette(VAR Palette: PaletteType);
  980. BEGIN Graph.GetPalette(Graph.PaletteType(Palette)); END;
  981.  
  982. FUNCTION GetPaletteSize:INTEGER;
  983. BEGIN GetPaletteSize := Graph.GetPaletteSize; END;
  984.  
  985. FUNCTION GetPixel(x, y: INTEGER): WORD;
  986. BEGIN GetPixel := Graph.GetPixel(x, y); END;
  987.  
  988. PROCEDURE GetTextSettings(VAR TextInfo: TextSettingsType);
  989. BEGIN
  990.   Graph.GetTextSettings(Graph.TextSettingsType(TextInfo));
  991. END;
  992.  
  993. PROCEDURE GetViewSettings(VAR ViewPort: ViewPortType);
  994. BEGIN
  995.   Graph.GetViewSettings(Graph.ViewPortType(ViewPort));
  996. END;
  997.  
  998. FUNCTION GetX: INTEGER;  BEGIN GetX := Graph.GetX;  END;
  999.  
  1000. FUNCTION GetY: INTEGER;  BEGIN GetY := Graph.GetY;  END;
  1001.  
  1002. PROCEDURE GraphDefaults; BEGIN Graph.GraphDefaults; END;
  1003.  
  1004. FUNCTION GraphErrorMsg(ErrorCode: INTEGER): STRING;
  1005. VAR
  1006.   m : STRING;
  1007. BEGIN
  1008.   CASE ErrorCode OF
  1009.     grOk            : m := 'Kein Fehler';
  1010.     grNoInitGraph   : m := 'BGI-Grafik nicht installiert';
  1011.     grNotDetected   : m := 'Grafikhardware nicht ermittelt';
  1012.     grFileNotFound  : m := 'Grafiktreiber nicht gefunden';
  1013.     grInvalidDriver : m := 'Falsches Grafiktreiberformat';
  1014.     grNoLoadMem     : m := 'Nicht genug Speicher um '
  1015.                          + 'Treiber zu laden';
  1016.     grNoScanMem     : m := 'Speichermangel bei Scan-Fill';
  1017.     grNoFloodMem    : m := 'Speichermangel bei Floodfill';
  1018.     grFontNotFound  : m := 'Fontdatei nicht gefunden';
  1019.     grNoFontMem     : m := 'Nicht genug Speicher um Font'
  1020.                          + ' zu laden';
  1021.     grInvalidMode   : m := 'Falscher Grafikmodus für den '
  1022.                          + 'ausgewählten Treiber';
  1023.     grError         : m := 'Allgemeiner Grafikfehler';
  1024.     grIOerror       : m := 'Graphik-Ein-/Ausgabefehler';
  1025.     grInvalidFont   : m := 'Falsche Fontdatei';
  1026.     grInvalidFontNum: m := 'Falsche Fontnummer';
  1027.     grInvalidAttr   : m := 'Unbekanntes Schriftattribut';
  1028.     ELSE              m := 'Unerwarteter Fehler im Modul '
  1029.                          + 'XGraph'; (* nicht bei Borland *)
  1030.   END;                   
  1031.   GraphErrorMsg := m + '.';
  1032. END;
  1033.  
  1034. FUNCTION GraphResult: INTEGER;
  1035. BEGIN
  1036.   IF Result = 0 THEN GraphResult := Graph.GraphResult
  1037.   ELSE BEGIN
  1038.     GraphResult := Result;
  1039.     Result := 0;
  1040.   END;
  1041. END;
  1042.  
  1043. FUNCTION ImageSize(x1, y1, x2, y2: INTEGER): WORD;
  1044. BEGIN ImageSize := Graph.ImageSize(x1, y1, x2, y2); END;
  1045.  
  1046. PROCEDURE PatchBGI(VAR GraphDriver : INTEGER;
  1047.                        ModeNo      : BYTE;
  1048.                        PathToDriver: STRING;
  1049.                    VAR GraphError  : INTEGER);
  1050. (* Anpassen des Treibers SVGA.BGI zur Laufzeit an die     *)
  1051. (* momentan im Rechner befindliche Karte. Die Routine     *)
  1052. (* macht SVGA.BGI grafikkartenunabhängig (soweit das      *)
  1053. (* System die Karte kennt). SVGA.BGI ist ein gepatchter   *)
  1054. (* EGAVGA.BGI von Turbo Pascal 5.0 und ist auch mit Turbo *)
  1055. (* Pascal 5.5 und 6.0 sowie 7.0 im Real-Mode verwendbar.  *)
  1056.  
  1057. CONST
  1058.   ModeTableW1      = $2328;     (* Adressen der Tabellen, *)
  1059.   ModeTableW2      = $1B58;     (* (fix, nicht ändern!!!  *)
  1060.   ModeTableW3      = $0808;     (* Diese Werte dürfen     *)
  1061.   ModeTableColor   = $9090;     (* nicht geändert werden  *)
  1062.   BgiExt           = '.BGI';
  1063.   FilesOnly        = Anyfile - Directory - VolumeID;
  1064.  
  1065. TYPE
  1066.   tModeTable  = RECORD
  1067.     Nuls      : WORD;
  1068.     x1, y1    : WORD;
  1069.     x2, y2    : WORD;
  1070.     w1, w2    : WORD;
  1071.     Aspect    : WORD;
  1072.     w3        : WORD;
  1073.     ColorMode : WORD;
  1074.   END;
  1075.  
  1076.   tBgi        = RECORD
  1077.     id, BackSpaces  : ARRAY[1..2] OF CHAR;
  1078.     Copyright       : ARRAY[1..95] OF CHAR;
  1079.     CtrlZ           : BYTE;
  1080.     HeaderLength,
  1081.     DriverNo,
  1082.     CodeLength      : WORD;
  1083.     Version1        : ARRAY[1..2] OF WORD;
  1084.     FillBytes0      : ARRAY[1..18] OF BYTE;
  1085.     StartOffset,
  1086.     GraphDriverNo,
  1087.     FileLength      : WORD;
  1088.     Version2        : ARRAY[1..2] OF WORD;
  1089.     DriverName      : STRING[4]; (*SVGA*)
  1090.     UnusedBytesName : ARRAY[1..2] OF BYTE;
  1091.     RelocateBytes   : ARRAY[1..15] OF BYTE;
  1092.     FuncDispatch    : ARRAY[1..12] OF BYTE;
  1093.     InitID          : ARRAY[1..2] OF CHAR;
  1094.     FillNuls        : WORD;
  1095.     Emulate_RET     : BYTE;
  1096.     GraphCallDummy  : LONGINT;
  1097.     None_Return     : BYTE;
  1098.     FuncVectorTable : ARRAY[1..46] OF WORD; (* Funktionen *)
  1099.     Code3           : ARRAY[1..358] OF BYTE;
  1100.     Palette         : ARRAY[0..3]  OF PaletteType;
  1101.     Code4           : ARRAY[1..31] OF WORD;
  1102.     Filler0         : ARRAY[1..7]  OF BYTE;
  1103.     Nulls           : ARRAY[1..17] OF BYTE;
  1104.     Modes           : WORD;
  1105.     SVGAIDString    : STRING[22];
  1106.     KilledIDStrings : ARRAY[1..42] OF CHAR;
  1107.     ModeTablAdr     : ARRAY[0..3]  OF WORD;
  1108.     ModeTab         : ARRAY[0..3]  OF tModeTable;
  1109.     What3           : WORD;
  1110.     SetModeAdrs     : ARRAY[1..4]  OF WORD;
  1111.     InitGraphCode   : ARRAY[1..445] OF BYTE;
  1112.     MaxX1, MaxY1    : WORD;
  1113.     SavTable1       : ARRAY[1..11] OF BYTE;
  1114.     SavSeg          : WORD;
  1115.     SavMode         : BYTE;
  1116.     Code5           : ARRAY[1..8] OF BYTE;
  1117.     Mul801A         : ARRAY[1..4] OF BYTE;
  1118.     Cols7           : BYTE;
  1119.     Mul801B         : ARRAY[1..9] OF BYTE;
  1120.     MoveCode        : ARRAY[1..23] OF BYTE;
  1121.     DummyCode       : BYTE;
  1122.     MaxY2           : WORD;
  1123.     Code6, ModeNo1  : BYTE;
  1124.     Code7           : ARRAY[1..4] OF BYTE;
  1125.     Cols1           : BYTE;
  1126.     Code8           : ARRAY[1..2] OF BYTE;
  1127.     BufSize1        : WORD;
  1128.     Code9           : ARRAY[1..3] OF BYTE;
  1129.     MaxY3           : WORD;
  1130.     Code10, ModeNo2,
  1131.     Code11          : BYTE;
  1132.     BufSize2        : WORD;
  1133.     Code12          : ARRAY[1..3] OF BYTE;
  1134.     MaxY4           : WORD;
  1135.     Code13, ModeNo3 : BYTE;
  1136.     Code14          : ARRAY[1..3] OF BYTE;
  1137.     MaxY5           : WORD;
  1138.     Code15, ModeNo4 : BYTE;
  1139.     Code16          : ARRAY[1..3] OF BYTE;
  1140.     MaxY6           : WORD;
  1141.     Code17, ModeNo5,
  1142.     Code18          : BYTE;
  1143.     BufSize3        : WORD;
  1144.     Code19          : ARRAY[1..3] OF BYTE;
  1145.     BufSize4        : WORD;
  1146.     Code20          : ARRAY[1..4] OF BYTE;
  1147.     Cols2           : BYTE;
  1148.     Code21          : ARRAY[1..5] OF BYTE;
  1149.     MaxX2           : WORD;
  1150.     Code22          : ARRAY[1..5] OF BYTE;
  1151.     MaxX3           : WORD;
  1152.     Code23          : ARRAY[1..70] OF BYTE;
  1153.     Segment1        : WORD;
  1154.     Code24          : ARRAY[1..196] OF BYTE;
  1155.     Mul802A         : ARRAY[1..4]  OF BYTE;
  1156.     Cols8           : BYTE;
  1157.     Mul802B         : ARRAY[1..11]  OF BYTE;
  1158.     Code25          : ARRAY[1..82]  OF BYTE;
  1159.     Cols3           : BYTE;
  1160.     Code26          : ARRAY[1..70]  OF BYTE;
  1161.     Cols4           : BYTE;
  1162.     Code27          : ARRAY[1..53]  OF BYTE;
  1163.     Cols5           : BYTE;
  1164.     Code28          : ARRAY[1..69]  OF BYTE;
  1165.     Cols6           : BYTE;
  1166.     Code29          : ARRAY[1..3060] OF BYTE;
  1167.     MaxY7           : WORD;
  1168.     Code30          : ARRAY[1..5]  OF BYTE;
  1169.     JNB2JMP         : BYTE;
  1170.     RestOfCode      : ARRAY[1..202] OF BYTE;
  1171.   END;
  1172.  
  1173. VAR
  1174.   fm, B      : BYTE;
  1175.   BGIFileName: STRING[79];
  1176.   BGIFile    : FILE;
  1177.   ReadRes    : WORD;
  1178.   BGI        : tBgi ABSOLUTE Buffer;
  1179.   ModeTable  : tModeTable;
  1180.   ModeStr    : STRING[22];
  1181.   sr         : SearchRec;
  1182.  
  1183.   PROCEDURE PatchDriver(Mode: BYTE); 
  1184.   VAR                            (* hier geht's zur Sache *)
  1185.     s       : STRING[4];
  1186.     x       : INTEGER;
  1187.     Init, i : BYTE;
  1188.     Ratio,
  1189.     ResX,
  1190.     ResY    : WORD;
  1191.  
  1192. {$IFDEF WriteBGI}
  1193.     PROCEDURE WriteBGI2Disk; (* Speichert die gepatchte   *)
  1194.     VAR                      (* Datei in das aktuelle     *)
  1195.       f: File;               (* Verzeichnis               *)
  1196.     BEGIN
  1197.       Assign(f, 'SVGA.BGI');
  1198.       ReWrite(f, 1);
  1199.       BlockWrite(f, Buffer, BGIFileLen);
  1200.       Close(f);
  1201.     END;
  1202. {$ENDIF}
  1203.  
  1204.   BEGIN
  1205.     Ratio    := SVGAAspect[SVGACard];
  1206.     Init     := SVGAInit  [SVGACard];
  1207.     ResX     := SVGAResX  [SVGACard];
  1208.     ResY     := SVGAResY  [SVGACard];
  1209.     ModeStr  := SVGAModeID[SVGACard];
  1210.     WITH BGI DO BEGIN
  1211.       WITH ModeTable DO BEGIN
  1212.         Nuls      := $00;
  1213.         x1        := ResX;
  1214.         x2        := ResX;
  1215.         y1        := ResY;
  1216.         y2        := ResY;
  1217.         Aspect    := Ratio;
  1218.         w1        := ModeTableW1;
  1219.         w2        := ModeTableW2;
  1220.         w3        := ModeTableW3;
  1221.         ColorMode := ModeTableColor;
  1222.       END;
  1223.  
  1224.       MaxX1       := ResX;
  1225.       MaxX2       := ResX;
  1226.       MaxX3       := ResX;
  1227.  
  1228.       MaxY1       := ResY;
  1229.       MaxY2       := ResY;
  1230.       MaxY3       := ResY;
  1231.       MaxY4       := ResY;
  1232.       MaxY5       := ResY;
  1233.       MaxY6       := ResY;
  1234.       MaxY7       := ResY;
  1235.  
  1236.       ModeTab[0]  := ModeTable;
  1237.  
  1238.       BufSize1    := ModeTableBufSize;
  1239.       BufSize2    := ModeTableBufSize;
  1240.       BufSize3    := ModeTableBufSize;
  1241.       BufSize4    := ModeTableBufSize;
  1242.  
  1243.       ModeNo1     := Mode;
  1244.       ModeNo2     := Mode;
  1245.       ModeNo3     := Mode;
  1246.       ModeNo5     := Mode;
  1247.  
  1248.       SVGAIDString := ModeStr;   
  1249.  
  1250.       ResX := Succ(ResX) DIV 8;
  1251.  
  1252.       Cols1 := Lo(ResX);
  1253.       Cols2 := Lo(ResX);
  1254.       Cols3 := Lo(ResX);
  1255.       Cols4 := Lo(ResX);
  1256.       Cols5 := Lo(ResX);
  1257.       Cols6 := Lo(ResX);
  1258.       Cols7 := Lo(ResX);
  1259.       Cols8 := Lo(ResX);
  1260.       Move(VGAPalette, Palette[0], Succ(VGAPalette.Size));
  1261.       JNB2JMP := $EB;
  1262.     END;
  1263.   END;
  1264.  
  1265. BEGIN
  1266.   IF PatchExtDrv THEN BEGIN           (* externer Treiber *)
  1267.     GraphError  := 0;
  1268.     IF PathToDriver = '' THEN         (*   Treiber suchen *)
  1269.       BGIFileName := SVGADriverName + BgiExt
  1270.     ELSE BEGIN
  1271.       BGIFileName := PathToDriver + '\' + SVGADriverName
  1272.                                         + BgiExt;
  1273.       IF Pos('\\', BGIFileName) > 0 THEN
  1274.         Delete(BGIFileName, Pos('\\', BGIFileName), 1);
  1275.     END;
  1276.     Assign(BGIFile, BGIFileName);
  1277.     fm       := FileMode;
  1278.     FileMode := 0;
  1279.     FindFirst(BGIFileName, FilesOnly, sr);
  1280.     IF Pos(SVGADriverName, sr.Name) = 0 THEN BEGIN
  1281.       GraphError := grFileNotFound;
  1282.       Exit;
  1283.     END;
  1284.  
  1285.     IF NOT (sr.Attr IN [0, Archive]) THEN BEGIN
  1286.       SetFAttr(BGIFile, Archive); (* Schreibschutz auf-   *)
  1287.     END;                          (* heben (falls vorh.   *)
  1288.     Reset(BGIFile, 1);            (* Reset durchführen    *)
  1289.  
  1290.     IF IOResult <> 0 THEN BEGIN
  1291.       GraphError := grInvalidDriver;
  1292.       Exit;
  1293.     END;
  1294.  
  1295.     IF FileSize(BGIFile) <> BGIFileLen THEN BEGIN
  1296.       GraphError := grInvalidDriver;    
  1297.       Close(BGIFile);      (* das war die falsche Datei!  *)
  1298.       FileMode   := fm;
  1299.       Exit;
  1300.     END;
  1301.  
  1302.     BlockRead(BGIFile, Buffer, BGIFileLen, ReadRes);
  1303.     Close(BGIFile);          (* Datei lesen und schließen *)
  1304.     FileMode      := fm;
  1305.     SVGADriverPtr := @Buffer;   (* Zeiger auf »Buffer«    *)
  1306.     (* für InstallUserDriver und RegisterBGIDriver: nur   *)
  1307.     (* einmal lesen!                                      *)
  1308.   END;
  1309.  
  1310.   IF SVGADriverPtr = NIL THEN BEGIN
  1311.     GraphError := grNoInitGraph;(*noch nicht initialisiert*)
  1312.     Exit;
  1313.   END;
  1314.  
  1315.   (* Aktuelle Daten in den Puffer holen und patchen:      *)
  1316.   Move(SVGADriverPtr^, BGI, SizeOf(BGI));
  1317.   (* geänderte Daten wieder in den Treiber schreiben:     *)
  1318.   PatchDriver(ModeNo);
  1319.   Move(BGI, SVGADriverPtr^, SizeOf(BGI));
  1320.   (* nach dem Patch muß der Treiber nochmal installiert   *)
  1321.   (* und registriert werden, da sonst die neuen Werte     *)
  1322.   (* nicht angenommen werden, bzw. der Zeiger auf den     *)
  1323.   (* Puffer nicht in Graph initialisiert wird!            *)
  1324. {$IFNDEF VER60}           (* Ein Bug in Turbo Pascal 5.x: *)
  1325.   GraphDriver := Graph.InstallUserDriver(SVGADriverName,
  1326.                                          SVGADriverPtr) + 5;
  1327. {$ELSE}                (* richtig in Turbo Pascal ab 6.0: *)
  1328.   GraphDriver := Graph.InstallUserDriver(SVGADriverName,
  1329.                                          SVGADriverPtr);
  1330. {$ENDIF}
  1331.   GraphDriver := Graph.RegisterBGIDriver(SVGADriverPtr);
  1332.   AlreadyPatched := TRUE;
  1333. {$IFDEF WriteBGI}
  1334.   WriteBGI2Disk;    (* <-- erzeugt aktuellen BGI-Treiber *)
  1335. {$ENDIF}
  1336. END;
  1337.  
  1338. PROCEDURE InitGraph(VAR GraphDriver,
  1339.                         GraphMode   : INTEGER;
  1340.                         PathToDriver: STRING);
  1341. (* ------------------------------------------------------ *)
  1342. (* Erweitert: Initialisiert zusätzlich auch SVGA. Die     *)
  1343. (* Routine patcht den SVGA-Treiber bei der Initialisie-   *)
  1344. (* rung des Grafikmodus (falls noch nicht erfolgt).       *)
  1345. (* ------------------------------------------------------ *)
  1346.  
  1347.   PROCEDURE EGA320Patch(PathToDriver: STRING);
  1348.   (* ermöglicht den Grafikmodus 320*200/16Col für EGA/VGA *)
  1349.   VAR   
  1350.     Result,
  1351.     GD, GM  : INTEGER;
  1352.     i       : BYTE;
  1353.   BEGIN
  1354.     SVGACard           := ET3000;     (* Defaultwerte für *)
  1355.     SVGAAspect[ET3000] := 8333;       (* EGA 320 * 200/16 *)
  1356.     SVGAMode           := $0D;        (* in die Tabellen  *) 
  1357.     ModeTableBufSize   := 32000;      (* eintragen        *)
  1358.     SVGAInit[ET3000]   := $0D;
  1359.     SVGAModeID[ET3000] := '320 x 200 EGA'#0;
  1360.     SVGAResX[ET3000]   := 319;
  1361.     SVGAResY[ET3000]   := 199;
  1362.     EGA320             := 0;
  1363.     GD                 := 0;       (* Treiberjustierungen *)
  1364.     GM                 := EGA320;  (* für »PatchDriver«   *)
  1365.     VGAPalette.Size    := 16;      (* Palette korrigieren *)
  1366.     FOR i := 0 TO  7 DO VGAPalette.Colors[i] := i;
  1367.     FOR i := 8 TO 15 DO VGAPalette.Colors[i] := i + 8;
  1368.  
  1369.     PatchBGI(GD, SVGAMode, PathToDriver, Result);(* Patch *)
  1370.  
  1371.     IF Result <> 0 THEN BEGIN                 (* Check    *)
  1372.       WriteLn('Initialisierungsfehler:'#13#10,
  1373.               GraphErrorMsg(Result));         (* Fehler ! *)
  1374.       Halt(1);
  1375.     END;
  1376.  
  1377.     GD := SVGA;                             (* Treiber    *)
  1378.     GM := EGA320;                           (* für System *)
  1379.     Graph.InitGraph(GD, GM, PathToDriver);  (* anmelden   *)
  1380.   END;                                        
  1381.  
  1382. VAR
  1383.   Dummy : INTEGER;
  1384. BEGIN
  1385.   IF NOT GraphInitDone THEN BEGIN
  1386.     InitMode        := BYTE(Ptr($0040, $0049)^);
  1387.     GraphGetMemPtr  := Graph.GraphGetMemPtr;
  1388.     GraphFreeMemPtr := Graph.GraphFreeMemPtr;
  1389.     OrgExitProc     := ExitProc;
  1390.     ExitProc        := @GraphExitProc;
  1391.     GraphInitDone := TRUE;
  1392.   END ELSE Exit;
  1393.  
  1394.   IF (GraphDriver = EGA) AND (GraphMode = EGA320) THEN BEGIN
  1395.     EGA320Patch(PathToDriver);
  1396.     Exit;
  1397.   END;
  1398.  
  1399.   IF GraphDriver IN [CGA..VGA] THEN BEGIN
  1400.     Graph.InitGraph(GraphDriver, GraphMode, PathToDriver);
  1401.     ScreenDriver := VGA;
  1402.     ScreenMode   := GraphMode;
  1403.     Exit;
  1404.   END;
  1405.  
  1406.   IF GraphDriver = Detect THEN       (* --> gd := Detect; *)
  1407.     DetectGraph(GraphDriver, Dummy);
  1408.  
  1409.   IF ScreenMode = $FF THEN BEGIN
  1410.     GraphMode  := GetMaxMode;
  1411.     ScreenMode := GraphMode;
  1412.   END;
  1413.  
  1414.   IF GraphDriver < EGA THEN IF NOT CharSetted THEN BEGIN
  1415.     GetIntVec($1F, Int1FSave);       (* Grafikzeichensatz *)
  1416.                                      (* initialisieren    *)
  1417.     IF Seg(Int1FSave^) = 0 THEN SetIntVec($1F, @GrafTable);
  1418.     CharSetted := TRUE;
  1419.   END; (* INT $1F setzen falls GRAFTABL nicht geladen ist *)
  1420.  
  1421.   IF GraphDriver = SVGA THEN BEGIN   (* --> gd := SVGA;   *)
  1422.     IF NOT AlreadyPatched THEN BEGIN
  1423.       IF ScreenDriver <> SVGA THEN
  1424.         DetectGraph(GraphDriver, GraphMode); (* InitCode! *)
  1425.       ScreenMode := SVGAHi;
  1426.       GraphMode  := SVGAHi;
  1427.       PatchBGI(GraphDriver, SVGAMode, PathToDriver, Result);
  1428.       GraphDriver := SVGA;
  1429.     END;
  1430.  
  1431.     IF Result = 0 THEN BEGIN
  1432.       Graph.InitGraph(GraphDriver, GraphMode, PathToDriver);
  1433.     END ELSE BEGIN
  1434.       Regs.AL := InitMode;
  1435.       Regs.AH := 0;
  1436.       Intr($10, Regs);
  1437.       WriteLn('Grafikinstallationsfehler.'#13#10,
  1438.                GraphErrorMsg(Result));
  1439.       Halt(1);
  1440.     END;
  1441.     GraphMode := Result;
  1442.   END ELSE
  1443.     Graph.InitGraph(GraphDriver, GraphMode, PathToDriver);
  1444.   IF GraphDriver = SVGA THEN BEGIN
  1445.     Graph.SetColor(White);
  1446.     GraphMode  := SVGAHi;
  1447.     ScreenMode := GraphMode;
  1448.   END;
  1449. END;
  1450.  
  1451. FUNCTION InstallUserDriver(n: STRING; p: POINTER): INTEGER;
  1452. BEGIN
  1453.   InstallUserDriver := Graph.InstallUserDriver(n, p);
  1454. END;
  1455.  
  1456. FUNCTION InstallUserFont(FFName: STRING): INTEGER;
  1457. BEGIN InstallUserFont := Graph.InstallUserFont(FFName); END;
  1458.  
  1459. PROCEDURE Line(x1, y1, x2, y2: INTEGER);
  1460. BEGIN Graph.Line(x1, y1, x2, y2); END;
  1461.  
  1462. PROCEDURE LineRel(dx, dy:INTEGER);
  1463. BEGIN Graph.LineRel(dx, dy); END;
  1464.  
  1465. PROCEDURE LineTo(x, y: INTEGER);
  1466. BEGIN Graph.LineTo(x, y); END;
  1467.  
  1468. PROCEDURE MoveRel(dx, dy: INTEGER);
  1469. BEGIN Graph.MoveRel(dx, dy); END;
  1470.  
  1471. PROCEDURE MoveTo(x, y: INTEGER);
  1472. BEGIN Graph.MoveTo(x, y); END;
  1473.  
  1474. PROCEDURE OutTextXY(x, y: INTEGER; TextString: STRING);
  1475. VAR
  1476.   c1, c2 : WORD;
  1477.   f      : Graph.FillSettingsType;
  1478. BEGIN
  1479.   CASE FontAttr OF
  1480.     Normal:
  1481.       Graph.OutTextXY(x, y, TextString);
  1482.     Bold:
  1483.       BEGIN
  1484.         Graph.OutTextXY(x + 1, y, TextString);
  1485.         Graph.OutTextXY(x    , y, TextString);
  1486.       END;
  1487.     OutLine:
  1488.       BEGIN
  1489.         c1 := Graph.GetColor;
  1490.         Graph.OutTextXY(x - 1, y    , TextString);
  1491.         Graph.OutTextXY(x - 1, y - 1, TextString);
  1492.         Graph.OutTextXY(x    , y - 1, TextString);
  1493.         Graph.OutTextXY(x + 1, y    , TextString);
  1494.         Graph.OutTextXY(x + 1, y + 1, TextString);
  1495.         Graph.OutTextXY(x    , y + 1, TextString);
  1496.         Graph.OutTextXY(x - 1, y + 1, TextString);
  1497.         Graph.SetColor(Graph.GetBkColor);
  1498.         Graph.OutTextXY(x, y, TextString);
  1499.         Graph.SetColor(c1);
  1500.       END;
  1501.     Shadow:
  1502.       BEGIN
  1503.         Graph.GetFillSettings(f);
  1504.         c1 := f.Color;
  1505.         c2 := Graph.GetColor;
  1506.         Graph.SetColor(c1);
  1507.         Graph.OutTextXY(x + 2, y + 2, TextString);
  1508.         Graph.SetColor(c2);
  1509.         Graph.OutTextXY(x, y, TextString);
  1510.       END;
  1511.     ELSE Result := grInvalidAttr;
  1512.   END;
  1513. END;
  1514.  
  1515. PROCEDURE OutText(TextString: STRING);
  1516. VAR
  1517.   c1, c2 : WORD;
  1518.   x,  y  : INTEGER;
  1519.   f      : Graph.FillSettingsType;
  1520. BEGIN
  1521.   CASE FontAttr OF
  1522.     Normal:
  1523.       Graph.OutText(TextString); 
  1524.     Bold:
  1525.       BEGIN
  1526.         x := Graph.GetX;
  1527.         y := Graph.GetY;
  1528.         Graph.OutTextXY(x    , y, TextString);
  1529.         Graph.OutTextXY(x + 1, y, TextString);
  1530.         x := x + Graph.TextWidth(TextString);
  1531.         Graph.MoveTo(Succ(x), y);
  1532.       END;
  1533.     OutLine:
  1534.       BEGIN
  1535.         x := Graph.GetX;
  1536.         y := Graph.GetY;
  1537.         c1 := Graph.GetColor;
  1538.         Graph.OutTextXY(x - 1, y    , TextString);
  1539.         Graph.OutTextXY(x - 1, y - 1, TextString);
  1540.         Graph.OutTextXY(x    , y - 1, TextString);
  1541.         Graph.OutTextXY(x + 1, y    , TextString);
  1542.         Graph.OutTextXY(x + 1, y + 1, TextString);
  1543.         Graph.OutTextXY(x    , y + 1, TextString);
  1544.         Graph.OutTextXY(x - 1, y + 1, TextString);
  1545.         Graph.SetColor(Graph.GetBkColor);
  1546.         Graph.OutTextXY(x, y, TextString);
  1547.         Graph.SetColor(c1);
  1548.         x := x + Graph.TextWidth(TextString);
  1549.         Graph.MoveTo(Succ(x), y);
  1550.       END;
  1551.     Shadow:
  1552.       BEGIN
  1553.         x := Graph.GetX;
  1554.         y := Graph.GetY;
  1555.         Graph.GetFillSettings(f);
  1556.         c1 := f.Color;
  1557.         c2 := Graph.GetColor;
  1558.         Graph.SetColor(c1);
  1559.         Graph.OutTextXY(x + 1, y + 1, TextString);
  1560.         Graph.SetColor(c2);
  1561.         Graph.OutTextXY(x, y, TextString);
  1562.         x := x + Graph.TextWidth(TextString);
  1563.         Graph.MoveTo(Succ(x), y);
  1564.       END;
  1565.     ELSE Result := grInvalidAttr;
  1566.   END;
  1567. END;
  1568.  
  1569. PROCEDURE PieSlice(x, y : INTEGER; SA, EA, R : WORD);
  1570. BEGIN Graph.PieSlice(x, y, SA, EA, R); END;
  1571.  
  1572. PROCEDURE PutImage(x, y : INTEGER; VAR BM; BitBlt: WORD);
  1573. BEGIN Graph.PutImage(x, y, BM, BitBlt); END;
  1574.  
  1575. PROCEDURE PutPixel(x, y : INTEGER; Pixel: WORD);
  1576. BEGIN Graph.PutPixel(x, y, Pixel); END;
  1577.  
  1578. PROCEDURE Rectangle(x1, y1, x2, y2 : INTEGER);
  1579. BEGIN Graph.Rectangle(x1, y1, x2, y2); END;
  1580.  
  1581. FUNCTION RegisterBGIDriver(Driver : POINTER): INTEGER;
  1582. VAR
  1583.   s: STRING[99];
  1584. BEGIN
  1585.   RegisterBGIDriver := Graph.RegisterBGIDriver(Driver);
  1586.   s[0] := #99;
  1587.   Move(Driver^, s[1], Ord(s[0])); (* welcher Treiber ???? *)
  1588.   IF Pos('(SuperVGA)', s) > 0 THEN BEGIN
  1589.     SVGADriverPtr     := Driver; (* den brauchen wir noch *)
  1590.     PatchExtDrv       := FALSE;  (* Treiber ist intern!!  *)
  1591.     RegisterBGIDriver := SVGA;   (* Dummywert über Null   *)
  1592.   END;
  1593. END;
  1594.  
  1595. FUNCTION RegisterBGIFont(Font: POINTER): INTEGER;
  1596. BEGIN RegisterBGIFont := Graph.RegisterBGIFont(Font); END;
  1597.  
  1598. PROCEDURE RestoreCrtMode;
  1599. BEGIN
  1600.   IF ScreenDriver = SVGA THEN BEGIN
  1601.    Regs.AX := InitMode;
  1602.    Intr($10, Regs);
  1603.   END ELSE Graph.RestoreCrtMode;
  1604. END;
  1605.  
  1606. PROCEDURE Sector(x, y : INTEGER; SA, EA, XR, YR : WORD);
  1607. BEGIN Graph.Sector(x, y, SA, EA, XR, YR); END;
  1608.  
  1609. PROCEDURE SetActivePage(Page: WORD);
  1610. BEGIN
  1611.   IF (Page > 0) AND (ScreenDriver = SVGA) THEN Page := 0;
  1612.   Graph.SetActivePage(Page);   (* bei SVGA nur eine Seite *)
  1613. END;
  1614.  
  1615. PROCEDURE SetAllPalette(VAR Palette);
  1616. BEGIN Graph.SetAllPalette(Palette); END;
  1617.  
  1618. PROCEDURE SetAspectRatio(XAsp, YAsp: WORD);
  1619. BEGIN Graph.SetAspectRatio(XAsp, YAsp); END;
  1620.  
  1621. PROCEDURE SetBkColor(ColorNum: WORD);
  1622. BEGIN Graph.SetBkColor(ColorNum); END;
  1623.  
  1624. PROCEDURE SetColor(Color: WORD);
  1625. BEGIN Graph.SetColor(Color); END;
  1626.  
  1627. PROCEDURE SetFillPattern(Pat : FillPatternType; Col : WORD);
  1628. BEGIN
  1629.   Graph.SetFillPattern(Graph.FillPatternType(Pat), Col);
  1630. END;
  1631.  
  1632. PROCEDURE SetFillStyle(Pattern: WORD; Color: WORD);
  1633. BEGIN Graph.SetFillStyle(Pattern, Color); END;
  1634.  
  1635. PROCEDURE SetGraphBufSize(BufSize: WORD);
  1636. BEGIN Graph.SetGraphBufSize(BufSize); END;
  1637.  
  1638. PROCEDURE SetGraphMode(Mode: INTEGER);
  1639. BEGIN Graph.SetGraphMode(Mode); END;
  1640.  
  1641. PROCEDURE SetLineStyle(L, P, T: WORD);
  1642. BEGIN Graph.SetLineStyle(L, P, T); END;
  1643.  
  1644. PROCEDURE SetPalette(ColorNum: WORD; Color: SHORTINT);
  1645. BEGIN Graph.SetPalette(ColorNum, Color); END;
  1646.  
  1647. PROCEDURE SetRGBPalette(ColorNum, R, G, B : INTEGER);
  1648. BEGIN Graph.SetRGBPalette(ColorNum, R, G, B); END;
  1649.  
  1650. PROCEDURE SetTextJustify(Horiz, Vert: WORD);
  1651. BEGIN Graph.SetTextJustify(Horiz, Vert); END;
  1652.  
  1653. PROCEDURE SetTextStyle(Font, Direction, CharSize: WORD);
  1654. BEGIN Graph.SetTextStyle(Font, Direction, CharSize); END;
  1655.  
  1656. PROCEDURE SetUserCharSize(MultX, DivX, MultY, DivY: WORD);
  1657. BEGIN Graph.SetUserCharSize(MultX, DivX, MultY, DivY); END;
  1658.  
  1659. PROCEDURE SetViewPort(x1,y1,x2,y2: INTEGER; Clip: BOOLEAN);
  1660. BEGIN Graph.SetViewPort(x1, y1, x2, y2, Clip); END;
  1661.  
  1662. PROCEDURE SetVisualPage(Page: WORD);
  1663. BEGIN
  1664.   IF (Page > 0) AND (ScreenDriver = SVGA) THEN Page := 0;
  1665.   Graph.SetVisualPage(Page);
  1666. END;
  1667.  
  1668. PROCEDURE SetWriteMode(WriteMode: INTEGER);
  1669. BEGIN Graph.SetWriteMode(WriteMode); END;
  1670.  
  1671. FUNCTION TextHeight(TextString: STRING): WORD;
  1672. BEGIN TextHeight := Graph.TextHeight(TextString); END;
  1673.  
  1674. FUNCTION TextWidth(TextString: STRING): WORD;
  1675. BEGIN TextWidth := Graph.TextWidth(TextString); END;
  1676.  
  1677. END.
  1678.  
  1679. (*--------------------------------------------------------*)
  1680. (*                 Ende von XGRAPH.PAS                    *)
  1681.