home *** CD-ROM | disk | FTP | other *** search
- {$A+,B-,D-,E-,F-,G-,I-,L-,N-,O-,P-,Q-,R-,S-,T-,V-,X-}
- {$M 16384,0,16384}
- (*===================================================================*)
- (* MAKESVGA.PAS *)
- (* Copyright (C) 1993 te-wi Verlag, München *)
- (* Patch des EGAVGA.BGI v3.0 für 800x600 *)
- (*===================================================================*)
-
- PROGRAM MakeSVGA;
- USES
- Dos;
- CONST
- BGILen = 5527; (* Dateilänge von EGAVGA.BGI *)
- mode : BYTE = $58; (* Voreinstellung: Paradise *)
- x : WORD = 799; (* x-Auflösung: 800 - 1 *)
- y : WORD = 599; (* y-Auflösung: 600 - 1 *)
- asp : WORD = 10000; (* Aspect-Ratio *)
- col : BYTE = 100; (* Spalten: x DIV 8 *)
-
- VAR
- Infile,
- OutFile: STRING;
- f : File;
- buf : ARRAY[0..Pred(BGILen)] OF BYTE;
- result : WORD;
- s : STRING;
- i : INTEGER;
- dir : DirStr;
- name : NameStr;
- ext : ExtStr;
-
- BEGIN
- WriteLn(^M^J'SVGA-Patch v2.0, (c) 1993 te-wi Verlag');
- IF ParamCount < 2 THEN BEGIN
- WriteLn('Aufruf: <Quelle> <Ziel> [<Moduswert>]');
- WriteLn('Voreinstellung für Moduswert = 6Ah (VESA)'#10);
- WriteLn(' Liste der Werte für Standardkarten 800x600 in 16 ' +
- 'Farben:');
- WriteLn(^I'Tseng ET3000/ET400 (auch Sigma-BIOS)'^I'$29');
- WriteLn(^I'Paradise/Western Digital/Award'^I^I'$58');
- WriteLn(^I'Trident'^I^I^I^I^I'$5B');
- WriteLn(^I'Video Seven'^I^I^I^I'$62');
- WriteLn(^I'OAK OTI-SVGA'^I^I^I^I'$52');
- WriteLn(^I'ATI VGA Wonder'^I^I^I^I'$54');
- WriteLn(^I'Tecmar'^I^I^I^I^I'$16');
- WriteLn(^I'SVGA-kompatibler VESA-Modus'^I^I'$6A');
- WriteLn;
- WriteLn('Rufen Sie bitte das Programm noch einmal '
- + 'mit den richtigen Parametern auf.'#10);
- END ELSE BEGIN
- InFile := ParamStr(1);
- FSplit(Infile, Dir, Name, Ext);
- IF Ext = '' THEN Infile := Infile + '.BGI';
- OutFile := ParamStr(2);
- FSplit(Outfile, Dir, Name, Ext);
- IF Ext = '' THEN Outfile := Outfile + '.BGI';
- IF ParamCount < 3 THEN Mode := $6A (* VESA *)
- ELSE Val(ParamStr(3), Mode, i);
- IF i <> 0 THEN BEGIN
- WriteLn('Falscher Wert für Modusinitialisierung!');
- Halt(0);
- END;
- Assign(f, InFile); {$F-} Reset(f, 1); {$F+}
- IF IOResult <> 0 THEN BEGIN
- WriteLn('Treiber nicht gefunden!');
- Halt;
- END;
- IF FileSize(f) <> BGILen THEN BEGIN
- WriteLn('Dies war der falsche Treiber!');
- Halt;
- END;
- (* richtige Datei gefunden, also ins ARRAY einlesen: *)
- BlockRead(f, buf, BGILen, result);
- Close(f);
-
- (* Zuerst geben wir dem Kind einen neuen Namen: *)
- s := 'SuperVGA) 3.00'^M^J'- Patch für 800x600, 16 ' +
- 'Farben, für Turbo 7.0 von jb 1993';
- FOR i := 1 TO Length(s) DO Buf[$1A + i] := Ord(s[i]);
- s := 'SVGA';
- FOR i := 0 TO 4 DO Buf[$008E + i] := Ord(s[i]);
- Buf[$93] := 00; Buf[$94] := 00;
-
- (* Y-Achse anpassen: *)
- Buf[$042E] := Lo(y); Buf[$042F] := Hi(y); (* Modus 0 *)
- Buf[$1027] := Lo(y); Buf[$1028] := Hi(y);
- Buf[$12D6] := Lo(y); Buf[$12D7] := Hi(y);
- (* X-Achse anpassen: *)
- Buf[$045C] := Lo(x); Buf[$045D] := Hi(x);
- Buf[$12D4] := Lo(x); Buf[$12D5] := Hi(x);
-
- (* ID für Modus 0 anpassen, die restlichen löschen: *)
- s := '800 x 600 SVGA'#0;
- FOR i := 0 TO $0F DO Buf[$120F + i] := Ord(s[i]);
- FOR i := $121E TO $124E DO Buf[i] := 0;
-
- (* Zeilenzahl für die neue Grafikauflösung anpassen: *)
- Buf[$0456] := col; Buf[$05DA] := col;
- Buf[$0626] := col; Buf[$0660] := col;
- Buf[$06AC] := col;
-
- (* Größe des Bildschirmpuffers auf 64 Kbyte festlegen: *)
- Buf[$0433] := $FE; Buf[$0434] := $FF; (* Modus 0 *)
-
- (* Die Initialisierung sollte nicht vergessen werden: *)
- Buf[$431] := mode; Buf[$1030] := mode; (* Modus 0 *)
- Buf[$477] := $10; (* Anzahl der verfügbaren Farben *)
-
- (* Zu guter Letzt muß die Modetabelle 0 auch noch *)
- (* angepaßt werden: *)
- Buf[$125A] := Lo(x); Buf[$125B] := Hi(x); (* X1 *)
- Buf[$125C] := Lo(y); Buf[$125D] := Hi(y); (* Y1 *)
- Buf[$125E] := Lo(x); Buf[$125F] := Hi(x); (* X2 *)
- Buf[$1260] := Lo(y); Buf[$1261] := Hi(y); (* Y2 *)
- Buf[$1262] := $28; Buf[$1263] := $23; (* W1 *)
- Buf[$1264] := $58; Buf[$1265] := $1B; (* W2 *)
- Buf[$1266] := Lo(asp); Buf[$1267] := Hi(asp); (* Asp *)
- Buf[$1268] := $08; Buf[$1269] := $08; (* W3 *)
- Buf[$126A] := $90; Buf[$126B] := $90; (* Col *)
-
- (* ... außerdem muß man die EGA-Palette 0 korrigieren: *)
-
- Buf[$11B3] := 20; Buf[$11B5] := 56; Buf[$11B6] := 57;
- Buf[$11B7] := 58; Buf[$11B8] := 59; Buf[$11B9] := 60;
- Buf[$11BA] := 61; Buf[$11BB] := 62; Buf[$11BC] := 63;
-
- (* ... dann müssen noch zwei Patches in den Treiber *)
- (* geschrieben werden, da sonst falsch gerechnet wird: *)
- Buf[$03F7] := $90; Buf[$03F8] := $90; Buf[$03F9] := $52;
- Buf[$03FA] := $B8; Buf[$03FB] := 100; Buf[$03FC] := $00;
- Buf[$03FD] := $F7; Buf[$03FE] := $E7; Buf[$03FF] := $89;
- Buf[$0400] := $C7; Buf[$0401] := $5A; Buf[$0402] := $B1;
- Buf[$0403] := $03; Buf[$0404] := $90;
-
- Buf[$056F] := $52; Buf[$0570] := $89; Buf[$0571] := $C7;
- Buf[$0572] := $B8; Buf[$0573] := col; Buf[$0574] := $00;
- Buf[$0575] := $F7; Buf[$0576] := $E7; Buf[$0577] := $89;
- Buf[$0578] := $C7; Buf[$0579] := $5a; Buf[$057A] := $90;
- Buf[$057B] := $90; Buf[$057C] := $90; Buf[$057D] := $90;
- Buf[$057E] := $90;
-
- Buf[$102E] := $EB; (* JMP anstelle eines JNB *)
-
- (* womit wir fertig wären und den Treiber nur noch *)
- (* zurückschreiben müssen: *)
- Assign(f, OutFile);
- Rewrite(f, 1);
- Blockwrite(f, Buf, SizeOf(Buf), result);
- Close(f);
- (* ... und eine Erfolgsmeldung ausgeben: *)
- WriteLn('Treiber erfolgreich gepatcht!');
- END;
- END.
- (*===================================================================*)