瀏覽代碼

add run time option -novesa for go32v2 os target

git-svn-id: trunk@27787 -
pierre 11 年之前
父節點
當前提交
cda643cea4
共有 2 個文件被更改,包括 52 次插入4 次删除
  1. 12 1
      ide/fp.pas
  2. 40 3
      ide/vesa.pas

+ 12 - 1
ide/fp.pas

@@ -40,7 +40,7 @@ uses
   {$ifdef USE_MINGW_GDB}
   {$ifdef USE_MINGW_GDB}
     fpmingw,
     fpmingw,
   {$else}
   {$else}
-    fpcygwin, 
+    fpcygwin,
   {$endif}
   {$endif}
 {$endif Windows}
 {$endif Windows}
 {$endif NODEBUG}
 {$endif NODEBUG}
@@ -53,6 +53,9 @@ uses
 {$ifdef go32v2}
 {$ifdef go32v2}
   dpmiexcp,
   dpmiexcp,
 {$endif go32v2}
 {$endif go32v2}
+{$ifdef VESA}
+  vesa,
+{$endif VESA}
   keyboard,video,mouse,
   keyboard,video,mouse,
 {$ifdef HasSignal}
 {$ifdef HasSignal}
   fpcatch,
   fpcatch,
@@ -169,6 +172,12 @@ begin
             LFNSupport:=false;
             LFNSupport:=false;
           end else
           end else
 {$endif go32v2}
 {$endif go32v2}
+{$ifdef VESA}
+        if UpcaseStr(Param)='NOVESA' then
+          begin
+            disableVESA:=true;
+          end else
+{$endif VESA}
         if UpcaseStr(Param)='README' then
         if UpcaseStr(Param)='README' then
           begin
           begin
             ShowReadme:=true;
             ShowReadme:=true;
@@ -365,6 +374,8 @@ BEGIN
   InitCompilerSwitches;
   InitCompilerSwitches;
 
 
 {$ifdef VESA}
 {$ifdef VESA}
+  writeln(stderr,'If program stops, try again using -novesa option');
+  flush(stderr);
   InitVESAScreenModes;
   InitVESAScreenModes;
 {$endif}
 {$endif}
   InitRedir;
   InitRedir;

+ 40 - 3
ide/vesa.pas

@@ -130,6 +130,9 @@ function VESAReturnMemoryWindow(Window: byte; var Position: word): boolean;
 function RegisterVesaVideoMode(Mode : word) : boolean;
 function RegisterVesaVideoMode(Mode : word) : boolean;
 Procedure FreeVesaModes;
 Procedure FreeVesaModes;
 
 
+const
+  DisableVESA : boolean = false;
+
 implementation
 implementation
 
 
 uses
 uses
@@ -190,6 +193,8 @@ var r: registers;
     OK: boolean;
     OK: boolean;
     M: MemPtr;
     M: MemPtr;
 begin
 begin
+  if disableVESA then
+    exit(false);
   StrToMem('VBE2',B.Signature);
   StrToMem('VBE2',B.Signature);
   GetDosMem(M,SizeOf(B));
   GetDosMem(M,SizeOf(B));
   M.MoveDataTo(B,sizeof(B));
   M.MoveDataTo(B,sizeof(B));
@@ -207,6 +212,8 @@ var OK: boolean;
     VI: TVESAInfoBlock;
     VI: TVESAInfoBlock;
 begin
 begin
   FillChar(B,SizeOf(B),0);
   FillChar(B,SizeOf(B),0);
+  if disableVESA then
+    exit(false);
   OK:=VESAGetInfo(VI);
   OK:=VESAGetInfo(VI);
   if OK then
   if OK then
   begin
   begin
@@ -243,6 +250,11 @@ var OK: boolean;
     VI: TVESAInfoBlock;
     VI: TVESAInfoBlock;
     S: array[0..256] of char;
     S: array[0..256] of char;
 begin
 begin
+  if disableVESA then
+    begin
+      VESAGetOemString:='VESA disabled';
+      exit;
+    end;
   FillChar(S,SizeOf(S),0);
   FillChar(S,SizeOf(S),0);
   OK:=VESAGetInfo(VI);
   OK:=VESAGetInfo(VI);
   if OK then
   if OK then
@@ -255,6 +267,8 @@ var r : registers;
     M : MemPtr;
     M : MemPtr;
     OK: boolean;
     OK: boolean;
 begin
 begin
+  if disableVESA then
+    exit(false);
   r.ah:=$4f; r.al:=$01; r.cx:=Mode;
   r.ah:=$4f; r.al:=$01; r.cx:=Mode;
   GetDosMem(M,sizeof(B));
   GetDosMem(M,sizeof(B));
   r.es:=M.DosSeg; r.di:=M.DosOfs; {r.ds:=r.es;}
   r.es:=M.DosSeg; r.di:=M.DosOfs; {r.ds:=r.es;}
@@ -312,6 +326,8 @@ function VESASetMode(Mode: word): boolean;
 var r: registers;
 var r: registers;
     OK: boolean;
     OK: boolean;
 begin
 begin
+  if disableVESA then
+    exit(false);
   r.ah:=$4f; r.al:=$02; r.bx:=Mode;
   r.ah:=$4f; r.al:=$02; r.bx:=Mode;
   dos.intr($10,r);
   dos.intr($10,r);
   OK:=(r.ax=$004f);
   OK:=(r.ax=$004f);
@@ -322,6 +338,10 @@ function VESAGetMode(var Mode: word): boolean;
 var r : registers;
 var r : registers;
     OK: boolean;
     OK: boolean;
 begin
 begin
+  if disableVESA then
+    exit(false);
+  if disableVESA then
+    exit(false);
   r.ah:=$4f; r.al:=$03;
   r.ah:=$4f; r.al:=$03;
   dos.intr($10,r);
   dos.intr($10,r);
   OK:=(r.ax=$004f);
   OK:=(r.ax=$004f);
@@ -333,6 +353,8 @@ function VESASelectMemoryWindow(Window: byte; Position: word): boolean;
 var r : registers;
 var r : registers;
     OK : boolean;
     OK : boolean;
 begin
 begin
+  if disableVESA then
+    exit(false);
   r.ah:=$4f; r.al:=$05; r.bh:=0; r.bl:=Window; r.dx:=Position;
   r.ah:=$4f; r.al:=$05; r.bh:=0; r.bl:=Window; r.dx:=Position;
   dos.intr($10,r);
   dos.intr($10,r);
   OK:=(r.ax=$004f);
   OK:=(r.ax=$004f);
@@ -343,6 +365,8 @@ function VESAReturnMemoryWindow(Window: byte; var Position: word): boolean;
 var r  : registers;
 var r  : registers;
     OK : boolean;
     OK : boolean;
 begin
 begin
+  if disableVESA then
+    exit(false);
   r.ah:=$4f; r.al:=$05; r.bh:=1; r.bl:=Window;
   r.ah:=$4f; r.al:=$05; r.bh:=1; r.bl:=Window;
   dos.intr($10,r);
   dos.intr($10,r);
   OK:=(r.ax=$004f);
   OK:=(r.ax=$004f);
@@ -354,9 +378,10 @@ function VESAInit: boolean;
 var OK: boolean;
 var OK: boolean;
     VI: TVESAInfoBlock;
     VI: TVESAInfoBlock;
 begin
 begin
-  OK:=VESAGetInfo(VI);
-  if OK then
-
+  if disableVESA then
+    OK:=false
+  else
+    OK:=VESAGetInfo(VI);
   VESAInit:=OK;
   VESAInit:=OK;
 end;
 end;
 
 
@@ -394,6 +419,8 @@ function SetVESAMode(const VideoMode: TVideoMode): Boolean;
 
 
   begin
   begin
      res:=false;
      res:=false;
+     if disableVESA then
+       exit(res);
      VH:=VesaVideoModeHead;
      VH:=VesaVideoModeHead;
      while assigned(VH) do
      while assigned(VH) do
        begin
        begin
@@ -635,8 +662,12 @@ begin
   SysDoneVideo();
   SysDoneVideo();
 end;
 end;
 
 
+function SetVESAVideoDriver : boolean; forward;
+
 procedure VesaInitVideo;
 procedure VesaInitVideo;
 begin
 begin
+  if not SetVESAVideoDriver then
+    exit;
 {$ifdef TESTGRAPHIC}
 {$ifdef TESTGRAPHIC}
   if IsGraphicMode then
   if IsGraphicMode then
     begin
     begin
@@ -673,7 +704,10 @@ Var
   i : longint;
   i : longint;
 {$endif TESTGRAPHIC}
 {$endif TESTGRAPHIC}
 
 
+function SetVESAVideoDriver : boolean;
 BEGIN
 BEGIN
+  if disableVESA then
+    exit(false);
 { Get the videodriver to be used }
 { Get the videodriver to be used }
   GetVideoDriver (Driver);
   GetVideoDriver (Driver);
 { Change needed functions }
 { Change needed functions }
@@ -706,4 +740,7 @@ BEGIN
 {$endif TESTGRAPHIC}
 {$endif TESTGRAPHIC}
 
 
   SetVideoDriver (Driver);
   SetVideoDriver (Driver);
+  SetVESAVideoDriver:=true;
+END;
+
 END.
 END.