home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / pascal / das_buch / grafik / makesvga.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1993-05-09  |  6.1 KB  |  154 lines

  1. {$A+,B-,D-,E-,F-,G-,I-,L-,N-,O-,P-,Q-,R-,S-,T-,V-,X-}
  2. {$M 16384,0,16384}
  3. (*===================================================================*)
  4. (*                            MAKESVGA.PAS                           *)
  5. (*               Copyright (C) 1993 te-wi Verlag, München            *)
  6. (*                 Patch des EGAVGA.BGI v3.0 für 800x600             *)
  7. (*===================================================================*)
  8.  
  9. PROGRAM MakeSVGA;
  10. USES
  11.   Dos;
  12. CONST
  13.   BGILen  = 5527;                       (* Dateilänge von EGAVGA.BGI *)
  14.   mode   : BYTE = $58;                  (* Voreinstellung: Paradise  *)
  15.   x      : WORD = 799;                  (* x-Auflösung: 800 - 1      *)
  16.   y      : WORD = 599;                  (* y-Auflösung: 600 - 1      *)
  17.   asp    : WORD = 10000;                (* Aspect-Ratio              *)
  18.   col    : BYTE = 100;                  (* Spalten: x DIV 8          *)
  19.  
  20. VAR
  21.   Infile,
  22.   OutFile: STRING;
  23.   f      : File;
  24.   buf    : ARRAY[0..Pred(BGILen)] OF BYTE;
  25.   result : WORD;
  26.   s      : STRING;
  27.   i      : INTEGER;
  28.   dir    : DirStr;
  29.   name   : NameStr;
  30.   ext    : ExtStr;
  31.  
  32. BEGIN
  33.   WriteLn(^M^J'SVGA-Patch v2.0, (c) 1993 te-wi Verlag');
  34.   IF ParamCount < 2 THEN BEGIN
  35.     WriteLn('Aufruf: <Quelle> <Ziel> [<Moduswert>]');
  36.     WriteLn('Voreinstellung für Moduswert = 6Ah (VESA)'#10);
  37.     WriteLn(' Liste der Werte für Standardkarten 800x600 in 16 ' +
  38.             'Farben:');
  39.     WriteLn(^I'Tseng ET3000/ET400 (auch Sigma-BIOS)'^I'$29');
  40.     WriteLn(^I'Paradise/Western Digital/Award'^I^I'$58');
  41.     WriteLn(^I'Trident'^I^I^I^I^I'$5B');
  42.     WriteLn(^I'Video Seven'^I^I^I^I'$62');
  43.     WriteLn(^I'OAK OTI-SVGA'^I^I^I^I'$52');
  44.     WriteLn(^I'ATI VGA Wonder'^I^I^I^I'$54');
  45.     WriteLn(^I'Tecmar'^I^I^I^I^I'$16');
  46.     WriteLn(^I'SVGA-kompatibler VESA-Modus'^I^I'$6A');
  47.     WriteLn;
  48.     WriteLn('Rufen Sie bitte das Programm noch einmal '
  49.           + 'mit den richtigen Parametern auf.'#10);
  50.   END ELSE BEGIN
  51.     InFile := ParamStr(1);
  52.     FSplit(Infile, Dir, Name, Ext);
  53.     IF Ext = '' THEN Infile := Infile + '.BGI';
  54.     OutFile := ParamStr(2);
  55.     FSplit(Outfile, Dir, Name, Ext);
  56.     IF Ext = '' THEN Outfile := Outfile + '.BGI';
  57.     IF ParamCount < 3 THEN Mode := $6A                       (* VESA *)
  58.                       ELSE Val(ParamStr(3), Mode, i);
  59.     IF i <> 0 THEN BEGIN
  60.       WriteLn('Falscher Wert für Modusinitialisierung!');
  61.       Halt(0);
  62.     END;
  63.     Assign(f, InFile); {$F-} Reset(f, 1); {$F+}
  64.     IF IOResult <> 0 THEN BEGIN
  65.       WriteLn('Treiber nicht gefunden!');
  66.       Halt;
  67.     END;
  68.     IF FileSize(f) <> BGILen THEN BEGIN
  69.       WriteLn('Dies war der falsche Treiber!');
  70.       Halt;
  71.     END;
  72.     (* richtige Datei gefunden, also ins ARRAY einlesen: *)
  73.     BlockRead(f, buf, BGILen, result);
  74.     Close(f);
  75.  
  76.     (* Zuerst geben wir dem Kind einen neuen Namen:      *)
  77.     s := 'SuperVGA) 3.00'^M^J'- Patch für 800x600, 16 ' +
  78.          'Farben, für Turbo 7.0 von jb 1993';
  79.     FOR i := 1 TO Length(s) DO Buf[$1A + i] := Ord(s[i]);
  80.     s := 'SVGA';
  81.     FOR i := 0 TO 4 DO Buf[$008E + i] := Ord(s[i]);
  82.     Buf[$93] := 00; Buf[$94] := 00;
  83.  
  84.     (* Y-Achse anpassen: *)
  85.     Buf[$042E] := Lo(y); Buf[$042F] := Hi(y); (* Modus 0 *)
  86.     Buf[$1027] := Lo(y); Buf[$1028] := Hi(y);
  87.     Buf[$12D6] := Lo(y); Buf[$12D7] := Hi(y);
  88.     (* X-Achse anpassen: *)
  89.     Buf[$045C] := Lo(x); Buf[$045D] := Hi(x);
  90.     Buf[$12D4] := Lo(x); Buf[$12D5] := Hi(x);
  91.  
  92.     (* ID für Modus 0 anpassen, die restlichen löschen:  *)
  93.     s := '800 x 600 SVGA'#0;
  94.     FOR i := 0 TO $0F DO Buf[$120F + i] := Ord(s[i]);
  95.     FOR i := $121E TO $124E DO Buf[i] := 0;
  96.  
  97.     (* Zeilenzahl für die neue Grafikauflösung anpassen: *)
  98.     Buf[$0456] := col; Buf[$05DA] := col;
  99.     Buf[$0626] := col; Buf[$0660] := col;
  100.     Buf[$06AC] := col;
  101.  
  102.   (* Größe des Bildschirmpuffers auf 64 Kbyte festlegen: *)
  103.     Buf[$0433] := $FE; Buf[$0434] := $FF;     (* Modus 0 *)
  104.  
  105.   (* Die Initialisierung sollte nicht vergessen werden:  *)
  106.     Buf[$431] := mode; Buf[$1030] := mode;    (* Modus 0 *)
  107.     Buf[$477]  := $10; (* Anzahl der verfügbaren Farben  *)
  108.  
  109.   (* Zu guter Letzt muß die Modetabelle 0 auch noch      *)
  110.   (* angepaßt werden:                                    *)
  111.     Buf[$125A] := Lo(x);   Buf[$125B] := Hi(x);   (* X1  *)
  112.     Buf[$125C] := Lo(y);   Buf[$125D] := Hi(y);   (* Y1  *)
  113.     Buf[$125E] := Lo(x);   Buf[$125F] := Hi(x);   (* X2  *)
  114.     Buf[$1260] := Lo(y);   Buf[$1261] := Hi(y);   (* Y2  *)
  115.     Buf[$1262] := $28;     Buf[$1263] := $23;     (* W1  *)
  116.     Buf[$1264] := $58;     Buf[$1265] := $1B;     (* W2  *)
  117.     Buf[$1266] := Lo(asp); Buf[$1267] := Hi(asp); (* Asp *)
  118.     Buf[$1268] := $08;     Buf[$1269] := $08;     (* W3  *)
  119.     Buf[$126A] := $90;     Buf[$126B] := $90;     (* Col *)
  120.  
  121.   (* ... außerdem muß man die EGA-Palette 0 korrigieren: *)
  122.  
  123.     Buf[$11B3] := 20; Buf[$11B5] := 56; Buf[$11B6] := 57;
  124.     Buf[$11B7] := 58; Buf[$11B8] := 59; Buf[$11B9] := 60;
  125.     Buf[$11BA] := 61; Buf[$11BB] := 62; Buf[$11BC] := 63;
  126.  
  127.   (* ... dann müssen noch zwei Patches in den Treiber     *)
  128.   (* geschrieben werden, da sonst falsch gerechnet wird:  *)
  129.     Buf[$03F7] := $90; Buf[$03F8] := $90; Buf[$03F9] := $52;
  130.     Buf[$03FA] := $B8; Buf[$03FB] := 100; Buf[$03FC] := $00;
  131.     Buf[$03FD] := $F7; Buf[$03FE] := $E7; Buf[$03FF] := $89;
  132.     Buf[$0400] := $C7; Buf[$0401] := $5A; Buf[$0402] := $B1;
  133.     Buf[$0403] := $03; Buf[$0404] := $90;
  134.  
  135.     Buf[$056F] := $52; Buf[$0570] := $89; Buf[$0571] := $C7;
  136.     Buf[$0572] := $B8; Buf[$0573] := col; Buf[$0574] := $00;
  137.     Buf[$0575] := $F7; Buf[$0576] := $E7; Buf[$0577] := $89;
  138.     Buf[$0578] := $C7; Buf[$0579] := $5a; Buf[$057A] := $90;
  139.     Buf[$057B] := $90; Buf[$057C] := $90; Buf[$057D] := $90;
  140.     Buf[$057E] := $90;
  141.  
  142.     Buf[$102E] := $EB;         (* JMP anstelle eines JNB *)
  143.  
  144.   (* womit wir fertig wären und den Treiber nur noch     *)
  145.   (* zurückschreiben müssen:                             *)
  146.     Assign(f, OutFile);
  147.     Rewrite(f, 1);
  148.     Blockwrite(f, Buf, SizeOf(Buf), result);
  149.     Close(f);
  150.   (* ... und eine Erfolgsmeldung ausgeben: *)
  151.     WriteLn('Treiber erfolgreich gepatcht!');
  152.   END;
  153. END.
  154. (*===================================================================*)