Browse Source

* changed color scheme
all colors are in RGB format if more than 256 colors
+ added 24 and 32 bits per pixel mode
(compile with -dDEBUG)
24 bit mode with banked still as problems on pixels across
the bank boundary, but works in LinearFrameBufferMode
Look at install/demo/nmandel.pp

pierre 27 years ago
parent
commit
cf389c21e1

+ 125 - 24
rtl/dos/graph.pp

@@ -16,11 +16,21 @@
  **********************************************************************}
  **********************************************************************}
 unit GRAPH;
 unit GRAPH;
 
 
+{ there are some problems with ranges in this file !! (PM) }
+{$R-}
+{$Q-}
 { $DEFINE DEBUG}
 { $DEFINE DEBUG}
 {$I os.inc}
 {$I os.inc}
 
 
-{ Don't use smartlinking, becuase of the direct assembler that is used }
+{$ifdef DEBUG}
+{$define TEST_24BPP}
+{$define Test_Linear}
+{$endif DEBUG}
+
+{ Don't use smartlinking, because of the direct assembler that is used }
+{$ifndef VER0_99_8}
 {$SMARTLINK OFF}
 {$SMARTLINK OFF}
+{$endif not VER0_99_8}
 
 
 interface
 interface
 
 
@@ -33,6 +43,7 @@ procedure CloseGraph;
 function  GraphResult : Integer;
 function  GraphResult : Integer;
 procedure InitGraph(var GraphDriver:Integer;var GraphMode:Integer;const PathToDriver:String);
 procedure InitGraph(var GraphDriver:Integer;var GraphMode:Integer;const PathToDriver:String);
 procedure SetGraphMode(GraphMode : integer);
 procedure SetGraphMode(GraphMode : integer);
+procedure GraphDefaults;
 procedure RestoreCRTMode;
 procedure RestoreCRTMode;
 procedure SetGraphBufSize(BufSize : longint);
 procedure SetGraphBufSize(BufSize : longint);
 function  RegisterBGIdriver(driver : pointer) : integer;
 function  RegisterBGIdriver(driver : pointer) : integer;
@@ -101,9 +112,11 @@ procedure GetFillSettings(var FillInfo : FillSettingsType);
 procedure GetFillPattern(var FillPattern : FillPatternType);
 procedure GetFillPattern(var FillPattern : FillPatternType);
 procedure SetFillStyle(pattern : word;color : longint);
 procedure SetFillStyle(pattern : word;color : longint);
 procedure SetFillPattern(pattern : FillPatternType;color : longint);
 procedure SetFillPattern(pattern : FillPatternType;color : longint);
+{ just dummy not implemented yet }
+procedure FillPoly(points : word;var polypoints);
 
 
 { IMAGE.PPI }
 { IMAGE.PPI }
-function  ImageSize(x1,y1,x2,y2 : integer) : word;
+function  ImageSize(x1,y1,x2,y2 : integer) : longint;
 procedure GetImage(x1,y1,x2,y2 : integer;var BitMap);
 procedure GetImage(x1,y1,x2,y2 : integer;var BitMap);
 procedure PutImage(x,y : integer;var BitMap;BitBlt : word);
 procedure PutImage(x,y : integer;var BitMap;BitBlt : word);
 
 
@@ -126,8 +139,27 @@ function  InstallUserFont(const FontFileName : string) : integer;
 { TRIANGLE.PPI }
 { TRIANGLE.PPI }
 procedure FillTriangle(A,B,C:Pointtype);
 procedure FillTriangle(A,B,C:Pointtype);
 
 
+{ to compare colors on different resolutions }
+function ColorsEqual(c1,c2 : longint) : boolean;
+{ this will return true if the two colors will appear
+  equal in the current video mode }
+  
 procedure WaitRetrace;
 procedure WaitRetrace;
+{$ifdef debug}
+procedure pixel(offset:longint);
 function  Convert(color:longint):longint;
 function  Convert(color:longint):longint;
+function  UnConvert(color:longint):longint;
+{$endif debug}
+
+{$ifdef Test_linear}
+  const
+     UseLinear : boolean = false;
+     { the two below are the settings the work for ATI 3D Rage Pro !! }
+     switch_physical_address : boolean = true;
+     split_physical_address : boolean = false;
+{$endif Test_linear}
+
+{$I MODES.PPI}
 
 
 implementation
 implementation
 
 
@@ -192,8 +224,6 @@ type
     reserved2      : Array[1..458]of Byte;
     reserved2      : Array[1..458]of Byte;
    end;
    end;
 
 
-{$I MODES.PPI}
-
 const
 const
      CheckRange    : Boolean=true;
      CheckRange    : Boolean=true;
      isVESA2       : Boolean=false;
      isVESA2       : Boolean=false;
@@ -204,10 +234,14 @@ var    { X/Y Verhaeltnis des Bildschirm }
        XAsp , YAsp  : Word;
        XAsp , YAsp  : Word;
        { Zeilen & Spalten des aktuellen Graphikmoduses }
        { Zeilen & Spalten des aktuellen Graphikmoduses }
        _maxx,_maxy : longint;
        _maxx,_maxy : longint;
-       { aktuell eingestellte Farbe }
+       { Current color internal format (depending on bitsperpixel) }
        aktcolor : longint;
        aktcolor : longint;
-       { Hintegrundfarbe }
+       { Current color RGB value }
+       truecolor : longint;
+       { Current background color internal format (depending on bitsperpixel) }
        aktbackcolor : longint;
        aktbackcolor : longint;
+       { Current background color RGB value }
+       truebackcolor : longint;
        { Videospeicherbereiche }
        { Videospeicherbereiche }
        wbuffer,rbuffer,wrbuffer : ^byte;
        wbuffer,rbuffer,wrbuffer : ^byte;
        { aktueller Ausgabebereich }
        { aktueller Ausgabebereich }
@@ -229,6 +263,8 @@ var    { X/Y Verhaeltnis des Bildschirm }
        aktfillpattern : FillPatternType;
        aktfillpattern : FillPatternType;
        { Schreibmodus }
        { Schreibmodus }
        aktwritemode : word;
        aktwritemode : word;
+       { put background color around text }
+       ClearText : boolean;
        { Schrifteinstellung }
        { Schrifteinstellung }
        akttextinfo : TextSettingsType;
        akttextinfo : TextSettingsType;
        { momentan gesetzte Textskalierungswerte }
        { momentan gesetzte Textskalierungswerte }
@@ -252,15 +288,31 @@ var    { X/Y Verhaeltnis des Bildschirm }
    { Selectors for Protected Mode }
    { Selectors for Protected Mode }
        seg_WRITE    : word;
        seg_WRITE    : word;
        seg_READ     : word;
        seg_READ     : word;
+   { linear Frame Buffer }
+       LinearFrameBufferSupported : boolean;
+       FrameBufferLinearAddress : longint;
+       UseLinearFrameBuffer : Boolean;
+   const
+       EnableLinearFrameBuffer = $4000;
    { Registers for RealModeInterrupts in DPMI-Mode }
    { Registers for RealModeInterrupts in DPMI-Mode }
+   var
        dregs        : TRealRegs;
        dregs        : TRealRegs;
-       AW_Bank      : longint;
-{       AR_Bank      : Longint;}
+       { read and write bank are allways equal !! }
+       A_Bank       : longint;
+       AW_window    : longint;
+       AR_Window    : longint;
+       same_window  : boolean;
+   const
+       AWindow = 0;
+       BWindow = 1;
+       
    { Variables for Bankswitching }
    { Variables for Bankswitching }
+   var
        BytesPerLine : longint;
        BytesPerLine : longint;
        BytesPerPixel: Word;
        BytesPerPixel: Word;
        WinSize      : longint;   { Expample $0x00010000 . $0x00008000 }
        WinSize      : longint;   { Expample $0x00010000 . $0x00008000 }
        WinLoMask    : longint;   {          $0x0000FFFF   $0x00007FFF }
        WinLoMask    : longint;   {          $0x0000FFFF   $0x00007FFF }
+       WinLoMaskMinusPixelSize : longint;   {          $0x0000FFFF   $0x00007FFF }
        WinShift     : byte;
        WinShift     : byte;
        GranShift    : byte;
        GranShift    : byte;
        Granular     : longint;
        Granular     : longint;
@@ -272,6 +324,14 @@ var    { X/Y Verhaeltnis des Bildschirm }
        SwitchCS,SwitchIP : word;
        SwitchCS,SwitchIP : word;
 
 
 
 
+function ColorsEqual(c1,c2 : longint) : boolean;
+Begin
+  ColorsEqual:=((BytesPerPixel=1) and ((c1 and $FF)=(c2 and $FF))) or
+         ((GetMaxColor=$7FFF) and ((c1 and $F8F8F8)=(c2 and $F8F8F8))) or
+         ((GetMaxColor=$FFFF) and ((c1 and $F8FCF8)=(c2 and $F8FCF8))) or
+         ((BytesPerPixel>2) and ((c1 and $FFFFFF)=(c2 and $FFFFFF)));
+End;
+   
 function GraphErrorMsg(ErrorCode: Integer): string;
 function GraphErrorMsg(ErrorCode: Integer): string;
 Begin
 Begin
  GraphErrorMsg:='';
  GraphErrorMsg:='';
@@ -339,6 +399,9 @@ begin
   end;
   end;
 end;
 end;
 
 
+
+{$I COLORS.PPI}
+
 procedure graphdefaults;
 procedure graphdefaults;
       begin
       begin
          _graphresult:=grOk;
          _graphresult:=grOk;
@@ -352,9 +415,11 @@ procedure graphdefaults;
          aktlineinfo.thickness:=normwidth;
          aktlineinfo.thickness:=normwidth;
 
 
 
 
+         { std colors }
+         setstdcolors;
          { Zeichenfarbe }
          { Zeichenfarbe }
-         aktcolor:=(white shl 24)+(white shl 16)+(white shl 8)+white;
-         aktbackcolor:=black;
+         aktcolor:=convert(white);
+         aktbackcolor:=convert(black);
 
 
          { F�llmuster }
          { F�llmuster }
          setfillstyle(solidfill,white);
          setfillstyle(solidfill,white);
@@ -390,7 +455,6 @@ procedure graphdefaults;
 { #################  Ende der internen Routinen  ################ }
 { #################  Ende der internen Routinen  ################ }
 { ############################################################### }
 { ############################################################### }
 
 
-{$I COLORS.PPI}
 {$I PALETTE.PPI}
 {$I PALETTE.PPI}
 {$I PIXEL.PPI}
 {$I PIXEL.PPI}
 {$I LINE.PPI}
 {$I LINE.PPI}
@@ -439,6 +503,8 @@ procedure ClearViewport;
 var bank1,bank2,diff,c:longint;
 var bank1,bank2,diff,c:longint;
     ofs1,ofs2         :longint;
     ofs1,ofs2         :longint;
     y : integer;
     y : integer;
+    storewritemode : word;
+    
 begin
 begin
   if not isgraphmode then
   if not isgraphmode then
     begin
     begin
@@ -447,27 +513,29 @@ begin
     end;
     end;
   c:=aktcolor;
   c:=aktcolor;
   aktcolor:=aktbackcolor;
   aktcolor:=aktbackcolor;
+  storewritemode:=aktwritemode;
+  aktwritemode:=normalput;
   ofs1:=Y_ARRAY[aktviewport.y1] + X_ARRAY[aktviewport.x1] ;
   ofs1:=Y_ARRAY[aktviewport.y1] + X_ARRAY[aktviewport.x1] ;
   ofs2:=Y_ARRAY[aktviewport.y1] + X_ARRAY[aktviewport.x2] ;
   ofs2:=Y_ARRAY[aktviewport.y1] + X_ARRAY[aktviewport.x2] ;
   for y:=aktviewport.y1 to aktviewport.y2 do
   for y:=aktviewport.y1 to aktviewport.y2 do
   begin
   begin
     bank1:=ofs1 shr winshift;
     bank1:=ofs1 shr winshift;
     bank2:=ofs2 shr winshift;
     bank2:=ofs2 shr winshift;
-    if bank1 <> AW_BANK then
+    if bank1 <> A_BANK then
     begin
     begin
       Switchbank(bank1);
       Switchbank(bank1);
-      AW_BANK:=bank1;
     end;
     end;
     if bank1 <> bank2 then
     if bank1 <> bank2 then
     begin
     begin
       diff:=((bank2 shl winshift)-ofs1) div BytesPerPixel;
       diff:=((bank2 shl winshift)-ofs1) div BytesPerPixel;
       horizontalline(aktviewport.x1, aktviewport.x1+diff-1, y);
       horizontalline(aktviewport.x1, aktviewport.x1+diff-1, y);
-      Switchbank(bank2); AW_BANK:=bank2;
+      Switchbank(bank2);
       horizontalline(aktviewport.x1+diff, aktviewport.x2, y);
       horizontalline(aktviewport.x1+diff, aktviewport.x2, y);
     end else horizontalline(aktviewport.x1, aktviewport.x2, y);
     end else horizontalline(aktviewport.x1, aktviewport.x2, y);
     ofs1:=ofs1 + BytesPerLine;
     ofs1:=ofs1 + BytesPerLine;
     ofs2:=ofs2 + BytesPerLine;
     ofs2:=ofs2 + BytesPerLine;
   end;
   end;
+  aktwritemode:=storewritemode;
   aktcolor:=c;
   aktcolor:=c;
 end;
 end;
 
 
@@ -476,7 +544,7 @@ begin
   _graphresult:=grOk;
   _graphresult:=grOk;
   if not isgraphmode then
   if not isgraphmode then
     begin
     begin
-      _graphresult:=grnoinitgraph;;
+      _graphresult:=grnoinitgraph;
       exit;
       exit;
     end;
     end;
     _XAsp:=XAsp; _YAsp:=YAsp;
     _XAsp:=XAsp; _YAsp:=YAsp;
@@ -586,11 +654,16 @@ const
 
 
 procedure CloseGraph;
 procedure CloseGraph;
 begin
 begin
-  if isgraphmode then begin
-    SetVESAMode(startmode);
-    DoneVESA;
-    isgraphmode:=false;
-  end;
+  if isgraphmode then
+    begin
+       SetVESAMode(startmode);
+       { DoneVESA; only in exitproc !! PM }
+       isgraphmode:=false;
+       if assigned(buffermem) then
+         freemem(buffermem,buffersize);
+       buffermem:=nil;
+       buffersize:=0;
+     end;
 end;
 end;
 
 
 procedure InitGraph(var GraphDriver:Integer;var GraphMode:Integer;const PathToDriver:String);
 procedure InitGraph(var GraphDriver:Integer;var GraphMode:Integer;const PathToDriver:String);
@@ -624,6 +697,9 @@ begin
   while i>=0 do begin
   while i>=0 do begin
     isgraphmode:=SetVESAMode(GraphMode);
     isgraphmode:=SetVESAMode(GraphMode);
     if isgraphmode then begin
     if isgraphmode then begin
+      GetVESAInfo(GraphMode);
+      if UseLinearFrameBuffer then
+        isgraphmode:=SetVESAMode(GraphMode or EnableLinearFrameBuffer);
       for index:=0 to VESAInfo.XResolution do X_Array[index]:=index * BytesPerPixel;
       for index:=0 to VESAInfo.XResolution do X_Array[index]:=index * BytesPerPixel;
       for index:=0 to VESAInfo.YResolution do Y_Array[index]:=index * BytesPerLine;
       for index:=0 to VESAInfo.YResolution do Y_Array[index]:=index * BytesPerLine;
       SetGraphBufSize(bufferstandardsize);
       SetGraphBufSize(bufferstandardsize);
@@ -651,6 +727,8 @@ begin
          isgraphmode:=SetVESAMode(GraphMode);
          isgraphmode:=SetVESAMode(GraphMode);
          if isgraphmode then
          if isgraphmode then
            begin
            begin
+              if UseLinearFrameBuffer then
+                isgraphmode:=SetVESAMode(GraphMode or EnableLinearFrameBuffer);
               for index:=0 to VESAInfo.XResolution do
               for index:=0 to VESAInfo.XResolution do
                 X_Array[index]:=index * BytesPerPixel;
                 X_Array[index]:=index * BytesPerPixel;
               for index:=0 to VESAInfo.YResolution do
               for index:=0 to VESAInfo.YResolution do
@@ -789,12 +867,16 @@ begin
       _graphresult:=grNoInitGraph;;
       _graphresult:=grNoInitGraph;;
       exit;
       exit;
     end;
     end;
-  if (writemode<>xorput) and (writemode<>normalput) then
+  if (writemode and $7F<>xorput) and (writemode and $7F<>normalput) then
    begin
    begin
       _graphresult:=grError;
       _graphresult:=grError;
       exit;
       exit;
    end;
    end;
-  aktwritemode:=writemode;
+  aktwritemode:=(writemode and $7F);
+  if (writemode and $80)<>0 then
+    ClearText:=true
+  else
+    ClearText:=false;
 end;
 end;
 
 
 function GraphResult:Integer;
 function GraphResult:Integer;
@@ -813,9 +895,19 @@ begin
   isgraphmode:=false;
   isgraphmode:=false;
 end;
 end;
 
 
+var PrevExitProc : pointer;
+
+procedure GraphExit;
+begin
+  ExitProc:=PrevExitProc;
+  CloseGraph;
+  DoneVesa; { frees the ldt descriptos seg_read and seg_write !! }
+end;
+
 begin
 begin
   InitVESA;
   InitVESA;
-  if not DetectVESA then Oh_Kacke('VESA-BIOS not found...');
+  if not DetectVESA then
+    Oh_Kacke('VESA-BIOS not found...');
   startmode:=GetVESAMode;
   startmode:=GetVESAMode;
   bankswitchptr:=@switchbank;
   bankswitchptr:=@switchbank;
   GraphGetMemPtr:[email protected];
   GraphGetMemPtr:[email protected];
@@ -834,7 +926,16 @@ end.
 
 
 {
 {
   $Log$
   $Log$
-  Revision 1.6  1998-10-22 09:44:57  pierre
+  Revision 1.7  1998-11-18 09:31:29  pierre
+    * changed color scheme
+      all colors are in RGB format if more than 256 colors
+    + added 24 and 32 bits per pixel mode
+      (compile with -dDEBUG)
+      24 bit mode with banked still as problems on pixels across
+      the bank boundary, but works in LinearFrameBufferMode
+      Look at install/demo/nmandel.pp
+
+  Revision 1.6  1998/10/22 09:44:57  pierre
    * PatternBuffer was not set on entry !!
    * PatternBuffer was not set on entry !!
 
 
   Revision 1.5  1998/09/16 16:47:25  peter
   Revision 1.5  1998/09/16 16:47:25  peter

+ 13 - 4
rtl/dos/ppi/arc.ppi

@@ -44,7 +44,7 @@
        until (counter=ende) or
        until (counter=ende) or
          (((xp=xa[0]) or (xp=xa[1]) or (xp=xa[2])) and
          (((xp=xa[0]) or (xp=xa[1]) or (xp=xa[2])) and
          ((yp=ya[0]) or (yp=ya[1]) or (yp=ya[2])));
          ((yp=ya[0]) or (yp=ya[1]) or (yp=ya[2])));
-         if Counter=Ende then exit else putpixel(xp,yp,aktcolor);
+         if Counter=Ende then exit else putpixeli(xp,yp,aktcolor);
        end;
        end;
      repeat
      repeat
      if (((xp=xe[0]) or (xp=xe[1]) or (xp=xe[2])) and
      if (((xp=xe[0]) or (xp=xe[1]) or (xp=xe[2])) and
@@ -56,7 +56,7 @@
        counter:=counter+incr;
        counter:=counter+incr;
        xp:=PInteger(BufferMem)[counter+index1];
        xp:=PInteger(BufferMem)[counter+index1];
        yp:=PInteger(BufferMem)[counter+index2];
        yp:=PInteger(BufferMem)[counter+index2];
-       putpixel(xp,yp,aktcolor);
+       putpixeli(xp,yp,aktcolor);
      until counter=Ende;
      until counter=Ende;
    end;
    end;
 
 
@@ -87,8 +87,17 @@
 
 
 {
 {
   $Log$
   $Log$
-  Revision 1.1  1998-03-25 11:18:42  root
-  Initial revision
+  Revision 1.2  1998-11-18 09:31:30  pierre
+    * changed color scheme
+      all colors are in RGB format if more than 256 colors
+    + added 24 and 32 bits per pixel mode
+      (compile with -dDEBUG)
+      24 bit mode with banked still as problems on pixels across
+      the bank boundary, but works in LinearFrameBufferMode
+      Look at install/demo/nmandel.pp
+
+  Revision 1.1.1.1  1998/03/25 11:18:42  root
+  * Restored version
 
 
   Revision 1.3  1998/01/26 11:58:53  michael
   Revision 1.3  1998/01/26 11:58:53  michael
   + Added log at the end
   + Added log at the end

+ 88 - 6
rtl/dos/ppi/colors.ppi

@@ -15,6 +15,7 @@
 
 
 { GetBkColor , SetBkColor , GetColor , SetColor , GetMaxColor }
 { GetBkColor , SetBkColor , GetColor , SetColor , GetMaxColor }
 
 
+
 function Convert(Color:longint):longint;
 function Convert(Color:longint):longint;
 var c,r,g,b:longint;
 var c,r,g,b:longint;
 begin
 begin
@@ -33,14 +34,41 @@ begin
          C:=(Color and $FF000000);
          C:=(Color and $FF000000);
          Convert:=(C shr 24) + (C shr 16) + (C shr 8) + C;
          Convert:=(C shr 24) + (C shr 16) + (C shr 8) + C;
        end;
        end;
-    end else
+    end else if BytesPerPixel>2 then
+      Convert:=Color and $FFFFFF
+    else
     begin
     begin
        R:=(Color and $00FF0000) shr (24-VESAInfo.rm_size);
        R:=(Color and $00FF0000) shr (24-VESAInfo.rm_size);
        G:=(Color and $0000FF00) shr (16-VESAInfo.gm_size);
        G:=(Color and $0000FF00) shr (16-VESAInfo.gm_size);
        B:=(Color and $000000FF) shr (8-VESAInfo.bm_size);
        B:=(Color and $000000FF) shr (8-VESAInfo.bm_size);
        C:=(R shl VESAInfo.rf_pos) or (G shl VESAInfo.gf_pos) or
        C:=(R shl VESAInfo.rf_pos) or (G shl VESAInfo.gf_pos) or
           (B shl VESAInfo.bf_pos);
           (B shl VESAInfo.bf_pos);
-       Convert:=(C shl 16) or C;
+       if BytesPerPixel = 2 then
+         Convert:=(C shl 16) or C;
+    end;
+end;
+
+function Unconvert(Color:longint):longint;
+var c,r,g,b:longint;
+begin
+  if BytesPerPixel=1 then
+    begin
+       UnConvert:=Color and $FF;
+    end
+  else if BytesPerPixel>2 then
+    Unconvert:=Color and $FFFFFF
+  else
+    begin
+       C:=Color shr VesaInfo.bf_pos;
+       b:= C and ( (1 shl (VesaInfo.bm_size))-1);
+       b:= b shl (8-VesaInfo.bm_size);
+       C:=Color shr VesaInfo.gf_pos;
+       g:= C and ( (1 shl (VesaInfo.gm_size))-1);
+       g:= g shl (8-VesaInfo.gm_size);
+       C:=Color shr VesaInfo.rf_pos;
+       r:= C and ( (1 shl (VesaInfo.rm_size))-1);
+       r:= r shl (8-VesaInfo.rm_size);
+       Unconvert:= r*$10000+g*$100+b;
     end;
     end;
 end;
 end;
 
 
@@ -52,7 +80,7 @@ begin
       _graphresult:=grNoInitGraph;
       _graphresult:=grNoInitGraph;
       exit;
       exit;
     end;
     end;
-  getcolor:=aktcolor;
+  getcolor:=truecolor;
 end;
 end;
 
 
 { ----------------------------------------------------------------------- }
 { ----------------------------------------------------------------------- }
@@ -65,6 +93,7 @@ begin
     _graphresult:=grNoInitGraph;
     _graphresult:=grNoInitGraph;
   exit;
   exit;
   end;
   end;
+  truecolor:=color;
   aktcolor:=convert(Color);
   aktcolor:=convert(Color);
 end;
 end;
 
 
@@ -78,7 +107,7 @@ begin
       _graphresult:=grNoInitGraph;
       _graphresult:=grNoInitGraph;
       exit;
       exit;
     end;
     end;
-  getbkcolor:=aktbackcolor;
+  getbkcolor:=truebackcolor;
 end;
 end;
 
 
 procedure SetBkColor(Color : longint);
 procedure SetBkColor(Color : longint);
@@ -89,6 +118,7 @@ begin
       _graphresult:=grNoInitGraph;
       _graphresult:=grNoInitGraph;
       exit;
       exit;
     end;
     end;
+  truebackcolor:=color;
   aktbackcolor:=convert(Color);
   aktbackcolor:=convert(Color);
 end;
 end;
   
   
@@ -103,10 +133,62 @@ begin
   getmaxcolor:=(1 shl VESAInfo.BitsPerPixel)-1;
   getmaxcolor:=(1 shl VESAInfo.BitsPerPixel)-1;
 end;
 end;
 
 
+  procedure setstdcolors;
+
+    begin
+       if bytesperpixel>1 then
+         begin
+            black := stdcolors[0];
+            blue  := stdcolors[1];
+            green := stdcolors[2];
+            cyan  := stdcolors[3];
+            red   := stdcolors[4];
+            magenta := stdcolors[5];
+            brown := stdcolors[6];
+            lightgray := stdcolors[7];
+            darkgray := stdcolors[8];
+            lightblue := stdcolors[9];
+            lightgreen := stdcolors[10];
+            lightcyan := stdcolors[11];
+            lightred := stdcolors[12];
+            lightmagenta := stdcolors[13];
+            yellow := stdcolors[14];
+            white := stdcolors[15];
+         end
+       else
+         begin
+            black := 0;
+            blue  := 1;
+            green := 2;
+            cyan  := 3;
+            red   := 4;
+            magenta := 5;
+            brown := 6;
+            lightgray := 7;
+            darkgray := 8;
+            lightblue := 9;
+            lightgreen := 10;
+            lightcyan := 11;
+            lightred := 12;
+            lightmagenta := 13;
+            yellow := 14;
+            white := 15;
+         end;
+  end;
+    
 {
 {
   $Log$
   $Log$
-  Revision 1.1  1998-03-25 11:18:42  root
-  Initial revision
+  Revision 1.2  1998-11-18 09:31:31  pierre
+    * changed color scheme
+      all colors are in RGB format if more than 256 colors
+    + added 24 and 32 bits per pixel mode
+      (compile with -dDEBUG)
+      24 bit mode with banked still as problems on pixels across
+      the bank boundary, but works in LinearFrameBufferMode
+      Look at install/demo/nmandel.pp
+
+  Revision 1.1.1.1  1998/03/25 11:18:42  root
+  * Restored version
 
 
   Revision 1.3  1998/01/26 11:57:43  michael
   Revision 1.3  1998/01/26 11:57:43  michael
   + Added log at the end
   + Added log at the end

+ 15 - 6
rtl/dos/ppi/ellipse.ppi

@@ -51,14 +51,14 @@
     { umschalten zu verhindern }
     { umschalten zu verhindern }
     
     
     while aq <> count do begin
     while aq <> count do begin
-      PutPixel( PWord(buffermem)[aq]  ,PWord(buffermem)[aq+3],aktcolor);
-      PutPixel( PWord(buffermem)[aq+2],PWord(buffermem)[aq+3],aktcolor);
+      PutPixeli( PWord(buffermem)[aq]  ,PWord(buffermem)[aq+3],aktcolor);
+      PutPixeli( PWord(buffermem)[aq+2],PWord(buffermem)[aq+3],aktcolor);
       aq:=aq+4;
       aq:=aq+4;
     end;
     end;
     while aq <> 0 do begin
     while aq <> 0 do begin
       aq:=aq-4;
       aq:=aq-4;
-      PutPixel( PWord(buffermem)[aq]  ,PWord(buffermem)[aq+1],aktcolor);
-      PutPixel( PWord(buffermem)[aq+2],PWord(buffermem)[aq+1],aktcolor);
+      PutPixeli( PWord(buffermem)[aq]  ,PWord(buffermem)[aq+1],aktcolor);
+      PutPixeli( PWord(buffermem)[aq+2],PWord(buffermem)[aq+1],aktcolor);
     end;
     end;
   end;
   end;
 
 
@@ -112,8 +112,17 @@
  
  
 {
 {
   $Log$
   $Log$
-  Revision 1.1  1998-03-25 11:18:42  root
-  Initial revision
+  Revision 1.2  1998-11-18 09:31:32  pierre
+    * changed color scheme
+      all colors are in RGB format if more than 256 colors
+    + added 24 and 32 bits per pixel mode
+      (compile with -dDEBUG)
+      24 bit mode with banked still as problems on pixels across
+      the bank boundary, but works in LinearFrameBufferMode
+      Look at install/demo/nmandel.pp
+
+  Revision 1.1.1.1  1998/03/25 11:18:42  root
+  * Restored version
 
 
   Revision 1.3  1998/01/26 11:57:54  michael
   Revision 1.3  1998/01/26 11:57:54  michael
   + Added log at the end
   + Added log at the end

+ 30 - 3
rtl/dos/ppi/fill.ppi

@@ -81,7 +81,15 @@ begin
     bordercol:=bordercol and $FF;
     bordercol:=bordercol and $FF;
     fillcol:=aktfillsettings.color and $FF;
     fillcol:=aktfillsettings.color and $FF;
   end
   end
-  else begin
+{$ifdef TEST_24BPP}
+  else if BytesPerPixel=3
+  then begin
+    bordercol:=bordercol and $FFFFFF;
+    fillcol:=aktfillsettings.color and $FFFFFF;
+  end
+{$endif TEST_24BPP}
+  else if BytesPerPixel=2
+  then begin
     bordercol:=bordercol and $FFFF;
     bordercol:=bordercol and $FFFF;
     fillcol:=aktfillsettings.color and $FFFF;
     fillcol:=aktfillsettings.color and $FFFF;
   end;
   end;
@@ -97,6 +105,7 @@ begin
       exit;
       exit;
     end;
     end;
   Fillinfo:=aktfillsettings;
   Fillinfo:=aktfillsettings;
+  Fillinfo.color:=unconvert(aktfillsettings.color);
 end;
 end;
 
 
 procedure GetFillPattern(var FillPattern:FillPatternType);
 procedure GetFillPattern(var FillPattern:FillPatternType);
@@ -165,10 +174,28 @@ begin
     end;
     end;
   lineinfo:=aktlineinfo;
   lineinfo:=aktlineinfo;
 end;
 end;
+
+{ just dummy not implemented yet }
+procedure FillPoly(points : word;var polypoints);
+begin
+   { simply call drawpoly instead (PM) }
+   DrawPoly(points,polypoints);
+end;
+
+
 {
 {
   $Log$
   $Log$
-  Revision 1.1  1998-03-25 11:18:42  root
-  Initial revision
+  Revision 1.2  1998-11-18 09:31:33  pierre
+    * changed color scheme
+      all colors are in RGB format if more than 256 colors
+    + added 24 and 32 bits per pixel mode
+      (compile with -dDEBUG)
+      24 bit mode with banked still as problems on pixels across
+      the bank boundary, but works in LinearFrameBufferMode
+      Look at install/demo/nmandel.pp
+
+  Revision 1.1.1.1  1998/03/25 11:18:42  root
+  * Restored version
 
 
   Revision 1.3  1998/01/26 11:57:57  michael
   Revision 1.3  1998/01/26 11:57:57  michael
   + Added log at the end
   + Added log at the end

+ 27 - 17
rtl/dos/ppi/global.ppi

@@ -40,22 +40,22 @@
        Default = 0;
        Default = 0;
        
        
        { Farben f�r setpalette und setallpalette }
        { Farben f�r setpalette und setallpalette }
-       black = 0;
-       blue = 1;
-       green = 2;
-       cyan = 3;
-       red = 4;
-       magenta = 5;
-       brown = 6;
-       lightgray = 7;
-       darkgray = 8;
-       lightblue = 9;
-       lightgreen = 10;
-       lightcyan = 11;
-       lightred = 12;
-       lightmagenta = 13;
-       yellow = 14;
-       white = 15;
+       black : longint = 0;
+       blue  : longint = 1;
+       green : longint = 2;
+       cyan  : longint = 3;
+       red   : longint = 4;
+       magenta : longint = 5;
+       brown : longint = 6;
+       lightgray : longint = 7;
+       darkgray : longint = 8;
+       lightblue : longint = 9;
+       lightgreen : longint = 10;
+       lightcyan : longint = 11;
+       lightred : longint = 12;
+       lightmagenta : longint = 13;
+       yellow : longint = 14;
+       white : longint = 15;
 
 
        { Linenart f�r Get/SetLineStyle: }
        { Linenart f�r Get/SetLineStyle: }
        SolidLn = 0;
        SolidLn = 0;
@@ -114,6 +114,7 @@
        OrPut         = 2;
        OrPut         = 2;
        AndPut        = 3;
        AndPut        = 3;
        NotPut        = 4;
        NotPut        = 4;
+       ClearTextPut  = $80;
 
 
        { SetTextJustify constants }
        { SetTextJustify constants }
        LeftText   = 0;
        LeftText   = 0;
@@ -188,7 +189,16 @@
 
 
 {
 {
   $Log$
   $Log$
-  Revision 1.2  1998-03-26 10:41:15  florian
+  Revision 1.3  1998-11-18 09:31:34  pierre
+    * changed color scheme
+      all colors are in RGB format if more than 256 colors
+    + added 24 and 32 bits per pixel mode
+      (compile with -dDEBUG)
+      24 bit mode with banked still as problems on pixels across
+      the bank boundary, but works in LinearFrameBufferMode
+      Look at install/demo/nmandel.pp
+
+  Revision 1.2  1998/03/26 10:41:15  florian
     * some warnings fixed
     * some warnings fixed
 
 
   Revision 1.1.1.1  1998/03/25 11:18:42  root
   Revision 1.1.1.1  1998/03/25 11:18:42  root

+ 159 - 21
rtl/dos/ppi/ibm.ppi

@@ -31,6 +31,9 @@ end;
 
 
 function GetVESAInfo( Mode : WORD ):Boolean;
 function GetVESAInfo( Mode : WORD ):Boolean;
 var Result_:longint;
 var Result_:longint;
+    Temp,ReadFrameBufferLinearAddress : longint;
+    St : string;
+    w : word;
 begin
 begin
   Result_:=Global_dos_alloc($0200);
   Result_:=Global_dos_alloc($0200);
      Sel:=word(Result_);
      Sel:=word(Result_);
@@ -49,12 +52,24 @@ begin
   if (dregs.RealEAX and $1ff) =$4F then
   if (dregs.RealEAX and $1ff) =$4F then
     begin
     begin
       GetVESAInfo:=true;
       GetVESAInfo:=true;
+      { mode is supported only if bit 0 in modeAttributes is set }
+      if (VESAInfo.ModeAttributes and 1)=0 then
+        GetVESAInfo:=false;
       BytesPerLine:=VESAInfo.BPL;
       BytesPerLine:=VESAInfo.BPL;
       case VESAInfo.BitsPerPixel of
       case VESAInfo.BitsPerPixel of
        8     : BytesPerPixel:=1;
        8     : BytesPerPixel:=1;
        15,16 : BytesPerPixel:=2;
        15,16 : BytesPerPixel:=2;
+{$ifdef TEST_24BPP}
        24    : begin
        24    : begin
-               Oh_Kacke('24-Bit Modis nicht implementiert !');
+               BytesPerPixel:=3;
+               end;
+       32    : begin
+               BytesPerPixel:=4;
+               end;
+{$endif TEST_24BPP}
+       else    begin
+               str(VESAInfo.BitsPerPixel,St);
+               Oh_Kacke(St+'-Bit Mode not implemented !');
                exit;
                exit;
                end;
                end;
       end;
       end;
@@ -75,6 +90,9 @@ begin
      Granularity:=VESAInfo.WinGranularity;
      Granularity:=VESAInfo.WinGranularity;
      Granular:=VESAInfo.WinSize div Granularity;
      Granular:=VESAInfo.WinSize div Granularity;
      case Granular of
      case Granular of
+       256 : GranShift:=8;
+       128 : GranShift:=7;
+        64 : GranShift:=6;
         32 : GranShift:=5;
         32 : GranShift:=5;
         16 : GranShift:=4; 
         16 : GranShift:=4; 
          8 : GranShift:=3;
          8 : GranShift:=3;
@@ -82,14 +100,104 @@ begin
          2 : GranShift:=1;
          2 : GranShift:=1;
          1 : GranShift:=0;
          1 : GranShift:=0;
      end;
      end;
-     { set selector for writing }
+     (* { on my ATI rage pro card these field are zeroed !! (PM) }
+     
+     if VesaInfo.rf_pos=VesaInfo.bf_pos then
+       begin
+         VesaInfo.rm_size:=VESAInfo.BitsPerPixel div 3;
+         VesaInfo.bm_size:=VESAInfo.BitsPerPixel div 3;
+         VesaInfo.gm_size:=VESAInfo.BitsPerPixel -2*VesaInfo.bm_size;
+         VesaInfo.bf_pos:=0;
+         VesaInfo.gf_pos:=VesaInfo.bm_size;
+         VesaInfo.rf_pos:=VesaInfo.bm_size+VesaInfo.gm_size;
+       end;   *)
+       
      if isDPMI then begin
      if isDPMI then begin
        set_segment_base_address(seg_write,$A000 shl 4);
        set_segment_base_address(seg_write,$A000 shl 4);
        set_segment_limit(seg_write,$FFFF);
        set_segment_limit(seg_write,$FFFF);
-       seg_read:=seg_write;
+       set_segment_base_address(seg_read,$A000 shl 4);
+       set_segment_limit(seg_read,$FFFF);
      end;
      end;
+     { read and write window can be different !!! PM }
+     if ((VESAInfo.WinAAttributes and 5)=5) then
+       AW_Window:=AWindow
+     else if ((VESAInfo.WinBAttributes and 5)=5) then
+       AW_Window:=BWindow
+     else Oh_Kacke('No write window !! ');
+     if ((VESAInfo.WinAAttributes and 3)=3) then
+       AR_Window:=AWindow
+     else if ((VESAInfo.WinBAttributes and 3)=3) then
+       AR_Window:=BWindow
+     else Oh_Kacke('No read window !! ');
+     if AW_Window=AR_Window then
+       same_window:=true
+     else
+       same_window:=false;
+
+      if (VESAInfo.ModeAttributes and $80)=$80 then
+        LinearFrameBufferSupported:=true
+      else
+        LinearFrameBufferSupported:=false;
+
+{$ifdef Test_linear}
+      { try to swap the FrameBuffer Physical Address }
+      if switch_physical_address then
+        begin
+           w:=VESAInfo.PhysAddress and $FFFF;
+           VESAInfo.PhysAddress:=(w shl 16) or (VESAInfo.PhysAddress shr 16);
+        end;
+      if split_physical_address and not same_window then
+        begin
+           ReadFrameBufferLinearAddress:=Get_linear_addr(VESAInfo.PhysAddress and $FFFF0000,VGAInfo.TotalMem shl 16);
+           if int31error<>0 then
+             writeln(stderr,'Error in get linear address for ',hexstr(VESAInfo.PhysAddress and $FFFF0000,8));
+           FrameBufferLinearAddress:=Get_linear_addr((VESAInfo.PhysAddress and $FFFF) shl 16,VGAInfo.TotalMem shl 16);
+           if int31error<>0 then
+             writeln(stderr,'Error in get linear address for ',hexstr((VESAInfo.PhysAddress and $FFFF) shl 16,8));
+        end;
+      If LinearFrameBufferSupported then
+        begin
+           if same_window or not split_physical_address then
+             FrameBufferLinearAddress:=Get_linear_addr(VESAInfo.PhysAddress and $FFFF0000,VGAInfo.TotalMem shl 16);
+           if int31error<>0 then
+             writeln(stderr,'Error in get linear address for ',hexstr(VESAInfo.PhysAddress,8));
+        end
+      else
+{$endif Test_linear}
+        FrameBufferLinearAddress:=$A0000;
+        
+{$ifdef Test_linear}
+      If isDPMI and LinearFrameBufferSupported and UseLinear then
+        UseLinearFrameBuffer:=true
+      else
+        UseLinearFrameBuffer:=false;
+     if UseLinearFrameBuffer then
+       begin
+          set_segment_base_address(seg_write,FrameBufferLinearAddress);
+          set_segment_limit(seg_write,(VGAInfo.TotalMem shl 16)-1);
+          if split_physical_address and not same_window then
+            set_segment_base_address(seg_read,ReadFrameBufferLinearAddress)
+          else
+            set_segment_base_address(seg_read,FrameBufferLinearAddress);
+          set_segment_limit(seg_read,(VGAInfo.TotalMem shl 16)-1);
+          WinSize:=(VGAInfo.TotalMem shl 16);
+          WinLoMask:=(VGAInfo.TotalMem shl 16)-1;
+          WinShift:=16;
+          Temp:=VGAInfo.TotalMem;
+          while Temp>0 do
+            begin
+               inc(WinShift);
+               Temp:=Temp shr 1;
+            end;
+       end;
+{$endif Test_linear}
      SwitchCS:=hi(VESAInfo.RealWinFuncPtr);
      SwitchCS:=hi(VESAInfo.RealWinFuncPtr);
      SwitchIP:=lo(VESAInfo.RealWinFuncPtr);
      SwitchIP:=lo(VESAInfo.RealWinFuncPtr);
+     { usefull for boundary problems }
+     if BytesPerPixel=3 then
+       WinLoMaskMinusPixelSize:=WinLoMask-4
+     else
+       WinLoMaskMinusPixelSize:=WinLoMask-BytesPerPixel;
    end else GetVESAInfo:=false;
    end else GetVESAInfo:=false;
 end;
 end;
 
 
@@ -118,15 +226,17 @@ var RM:Word;
 begin
 begin
   isDPMI:=false;
   isDPMI:=false;
   rm:=get_run_mode;
   rm:=get_run_mode;
+{$ifdef Debug}
   case rm of
   case rm of
     0 : writeln('unknown mode');
     0 : writeln('unknown mode');
     1 : writeln('RAW mode');
     1 : writeln('RAW mode');
     2 : writeln('XMS detected');
     2 : writeln('XMS detected');
     3 : writeln('VCPI detected');
     3 : writeln('VCPI detected');
-    4 : begin writeln('DPMI detected'); 
-              isDPMI:=true; 
-              end;
+    4 : writeln('DPMI detected');
   end; { case }
   end; { case }
+{$endif Debug}
+  if rm=4 then
+    isDPMI:=true;
   if isDPMI then begin
   if isDPMI then begin
     seg_write:=allocate_ldt_descriptors(1);
     seg_write:=allocate_ldt_descriptors(1);
     seg_read:=allocate_ldt_descriptors(1);
     seg_read:=allocate_ldt_descriptors(1);
@@ -146,27 +256,55 @@ end;
 
 
 procedure Switchbank(bank:longint);
 procedure Switchbank(bank:longint);
 begin
 begin
+  with dregs do
+    begin
+       a_bank:=bank;
+       realedx:=bank shl granshift;
+       realcs:=switchcs;
+       realip:=switchip;
+       realebx:=aw_window;
+       realss:=0;
+       realsp:=0;
+    end;
   asm
   asm
-    leal   _DREGS,%edi
-    movl   bank,%eax
-    movzbl _GRANSHIFT,%ecx
-    shll   %cl,%eax
-    movl   %eax,20(%edi)    // RealEDX
-    movw   _SWITCHCS,%ax
-    movw   %ax,44(%edi)     // RealCS
-    movw   _SWITCHIP,%ax    // RealIP
-    movw   %ax,42(%edi)    
-    xorl   %ecx,%ecx
-    movl   %ecx,46(%edi)    // RealSS,RealSP
-    movl   %ecx,16(%edi)    // RealEBX 
-    movw   $0x0301,%ax
-    int    $0x31
+     leal   _DREGS,%edi
+     xorl   %ecx,%ecx
+     movl   %ecx,%ebx
+     movw   $0x0301,%ax
+     int    $0x31
+  end;
+  if not same_window then
+   with dregs do
+    begin
+       realedx:=bank shl granshift;
+       realcs:=switchcs;
+       realip:=switchip;
+       realebx:=ar_window;
+       realss:=0;
+       realsp:=0;
+       asm
+         leal   _DREGS,%edi
+         xorl   %ecx,%ecx
+         movl   %ecx,%ebx
+         movw   $0x0301,%ax
+         int    $0x31
+       end;
   end;
   end;
 end;
 end;
 
 
+
 {
 {
   $Log$
   $Log$
-  Revision 1.2  1998-10-09 10:26:36  peter
+  Revision 1.3  1998-11-18 09:31:35  pierre
+    * changed color scheme
+      all colors are in RGB format if more than 256 colors
+    + added 24 and 32 bits per pixel mode
+      (compile with -dDEBUG)
+      24 bit mode with banked still as problems on pixels across
+      the bank boundary, but works in LinearFrameBufferMode
+      Look at install/demo/nmandel.pp
+
+  Revision 1.2  1998/10/09 10:26:36  peter
     * rename result -> result_
     * rename result -> result_
 
 
   Revision 1.1.1.1  1998/03/25 11:18:42  root
   Revision 1.1.1.1  1998/03/25 11:18:42  root

+ 28 - 22
rtl/dos/ppi/image.ppi

@@ -28,13 +28,13 @@ begin
 x1:=x1+aktviewport.x1;
 x1:=x1+aktviewport.x1;
 y1:=y1+aktviewport.y1;
 y1:=y1+aktviewport.y1;
 x2:=x2+aktviewport.x1;
 x2:=x2+aktviewport.x1;
-y2:=y2+aktviewport.y1;        
+y2:=y2+aktviewport.y1;
 
 
-if (x1>_maxx) or (y1>_maxy) or (x2<0) or (y2<0) then exit;       
+if (x1>_maxx) or (y1>_maxy) or (x2<0) or (y2<0) then exit;
 
 
 target:=longint(@bitmap)+4;
 target:=longint(@bitmap)+4;
 pinteger(@bitmap)^:=x2-x1+1;
 pinteger(@bitmap)^:=x2-x1+1;
-pinteger(@bitmap+2)^:=y2-y1+1; 
+pinteger(@bitmap+2)^:=y2-y1+1;
 linesize:=(x2-x1+1)*BytesPerPixel;
 linesize:=(x2-x1+1)*BytesPerPixel;
 
 
 for i:=y1 to y2 do
 for i:=y1 to y2 do
@@ -42,19 +42,17 @@ for i:=y1 to y2 do
     ofs1:=Y_ARRAY[i]+X_ARRAY[x1];
     ofs1:=Y_ARRAY[i]+X_ARRAY[x1];
     ofs2:=Y_ARRAY[i]+X_ARRAY[x2];
     ofs2:=Y_ARRAY[i]+X_ARRAY[x2];
     bank1:=ofs1 shr WinShift;
     bank1:=ofs1 shr WinShift;
-    bank2:=ofs2 shr WinShift;  
-    if bank1 <> AW_BANK then 
+    bank2:=ofs2 shr WinShift;
+    if bank1 <> A_BANK then
       begin
       begin
         Switchbank(bank1);
         Switchbank(bank1);
-        AW_BANK:=bank1;
       end;
       end;
-    if bank1=bank2 
+    if bank1=bank2
       then ScreenToMem(ofs1 and WinLoMask,target,linesize)
       then ScreenToMem(ofs1 and WinLoMask,target,linesize)
-      else begin     
+      else begin
         diff:=(bank2 shl winshift)-ofs2;
         diff:=(bank2 shl winshift)-ofs2;
         ScreenToMem(ofs1 and WinLoMask,target,diff-BytesPerPixel);
         ScreenToMem(ofs1 and WinLoMask,target,diff-BytesPerPixel);
         Switchbank(bank2);
         Switchbank(bank2);
-        AW_BANK:=bank2;
         ScreenToMem((ofs1+diff) and WinLoMask,target+diff,linesize-diff);
         ScreenToMem((ofs1+diff) and WinLoMask,target+diff,linesize-diff);
       end; 
       end; 
     target:=target+linesize;
     target:=target+linesize;
@@ -88,7 +86,7 @@ procedure PutImage(x,y : integer;var BitMap;BitBlt : word);
          
          
          if aktviewport.clip then viewport:=aktviewport else viewport:=aktscreen; 
          if aktviewport.clip then viewport:=aktviewport else viewport:=aktscreen; 
          if (x > viewport.x2 ) or 
          if (x > viewport.x2 ) or 
-             (y > viewport.y2 ) or 
+             (y > viewport.y2 ) or
               (x+Increment < viewport.x1) or 
               (x+Increment < viewport.x1) or 
                (y+height < viewport.y1) then exit;
                (y+height < viewport.y1) then exit;
   
   
@@ -102,7 +100,7 @@ procedure PutImage(x,y : integer;var BitMap;BitBlt : word);
              end;
              end;
            { Clip unten }
            { Clip unten }
            
            
-           if y+height > viewport.y2 then 
+           if y+height > viewport.y2 then
                height:=viewport.y2-y;
                height:=viewport.y2-y;
            
            
            { Clip links }
            { Clip links }
@@ -128,10 +126,9 @@ procedure PutImage(x,y : integer;var BitMap;BitBlt : word);
      offset:=Y_ARRAY[i] + X_ARRAY[x];
      offset:=Y_ARRAY[i] + X_ARRAY[x];
      o1:=offset shr winshift;
      o1:=offset shr winshift;
      o2:=( offset + width ) shr winshift;
      o2:=( offset + width ) shr winshift;
-     if o1 <> AW_BANK then 
+     if o1 <> A_BANK then
        begin
        begin
          Switchbank(o1);
          Switchbank(o1);
-         AW_BANK:=o1;
        end;
        end;
      if o1 = o2 then
      if o1 = o2 then
      begin  
      begin  
@@ -148,27 +145,27 @@ procedure PutImage(x,y : integer;var BitMap;BitBlt : word);
        case bitblt of
        case bitblt of
          normalput : begin
          normalput : begin
                       MemToScreen (source,offset and WinLoMask,diff-BytesPerPixel);
                       MemToScreen (source,offset and WinLoMask,diff-BytesPerPixel);
-                      Switchbank(o2); AW_BANK:=o2;
+                      Switchbank(o2);
                       MemToScreen (source+diff,(offset+diff) and WinLoMask,width-diff);
                       MemToScreen (source+diff,(offset+diff) and WinLoMask,width-diff);
                      end;
                      end;
          andput    : begin
          andput    : begin
                       MemAndScreen (source,offset and WinLoMask,diff-BytesPerPixel);
                       MemAndScreen (source,offset and WinLoMask,diff-BytesPerPixel);
-                      Switchbank(o2); AW_BANK:=o2;
+                      Switchbank(o2);
                       MemAndScreen (source+diff,(offset+diff) and WinLoMask,width-diff);
                       MemAndScreen (source+diff,(offset+diff) and WinLoMask,width-diff);
                      end;
                      end;
          orput     : begin
          orput     : begin
                       MemOrScreen (source,offset and WinLoMask,diff-BytesPerPixel);
                       MemOrScreen (source,offset and WinLoMask,diff-BytesPerPixel);
-                      Switchbank(o2); AW_BANK:=o2;
+                      Switchbank(o2);
                       MemOrScreen (source++diff,(offset+diff) and WinLoMask,width-diff);
                       MemOrScreen (source++diff,(offset+diff) and WinLoMask,width-diff);
                      end;
                      end;
          xorput    : begin
          xorput    : begin
                       MemXorScreen(source,offset and WinLoMask,diff-BytesPerPixel);
                       MemXorScreen(source,offset and WinLoMask,diff-BytesPerPixel);
-                      Switchbank(o2); AW_BANK:=o2;
+                      Switchbank(o2);
                       MemXorScreen(source+diff,(offset+diff) and WinLoMask,width-diff);
                       MemXorScreen(source+diff,(offset+diff) and WinLoMask,width-diff);
                      end;
                      end;
          notput    : begin
          notput    : begin
                       MemNotScreen(source,offset and WinLoMask,diff-BytesPerPixel);
                       MemNotScreen(source,offset and WinLoMask,diff-BytesPerPixel);
-                      Switchbank(o2); AW_BANK:=o2;
+                      Switchbank(o2);
                       MemNotScreen(source+diff,(offset+diff) and WinLoMask,width-diff);
                       MemNotScreen(source+diff,(offset+diff) and WinLoMask,width-diff);
                      end;
                      end;
        end; { case }
        end; { case }
@@ -181,20 +178,29 @@ procedure PutImage(x,y : integer;var BitMap;BitBlt : word);
 end;
 end;
     
     
     
     
-    function ImageSize(x1,y1,x2,y2 : integer) : word;
+    function ImageSize(x1,y1,x2,y2 : integer) : longint;
 
 
       begin
       begin
          _graphresult:=grOk;
          _graphresult:=grOk;
          ImageSize:=(x2-x1+1)*(y2-y1+1)*BytesPerPixel+4;
          ImageSize:=(x2-x1+1)*(y2-y1+1)*BytesPerPixel+4;
-         { +4, da Breite und H”he mit abgespeichert werden }
+         { 4 bytes for Height and width in words at the beginning }
       end;
       end;
 
 
  
  
 
 
 {
 {
   $Log$
   $Log$
-  Revision 1.1  1998-03-25 11:18:42  root
-  Initial revision
+  Revision 1.2  1998-11-18 09:31:36  pierre
+    * changed color scheme
+      all colors are in RGB format if more than 256 colors
+    + added 24 and 32 bits per pixel mode
+      (compile with -dDEBUG)
+      24 bit mode with banked still as problems on pixels across
+      the bank boundary, but works in LinearFrameBufferMode
+      Look at install/demo/nmandel.pp
+
+  Revision 1.1.1.1  1998/03/25 11:18:42  root
+  * Restored version
 
 
   Revision 1.5  1998/03/03 22:48:42  florian
   Revision 1.5  1998/03/03 22:48:42  florian
     + graph.drawpoly procedure
     + graph.drawpoly procedure

+ 169 - 51
rtl/dos/ppi/line.ppi

@@ -14,6 +14,17 @@
 
 
 procedure DrawPattern(x1,x2,y:integer);
 procedure DrawPattern(x1,x2,y:integer);
 begin
 begin
+  if BytesPerPixel=3 then
+   { big problem one point can be across boundary !! }
+   begin
+     if ((Y_Array[y]+X_array[x1]) and winlomask)+3 > winlomask then
+       begin
+         { special point !! }
+         { not implemented yet !! }
+         inc(x1);
+       end;
+   end;
+   
   asm
   asm
     movswl x1,%ebx
     movswl x1,%ebx
     movswl x2,%ecx
     movswl x2,%ecx
@@ -34,57 +45,127 @@ begin
     movw   _SEG_WRITE,%ax
     movw   _SEG_WRITE,%ax
     movw   %ax,%es
     movw   %ax,%es
     testw  $1,_AKTWRITEMODE
     testw  $1,_AKTWRITEMODE
-    jnz    pl_xord
- pl_movd:
-    testw  $1,_BYTESPERPIXEL
-    jz     pl_movdw
-
+    jnz    .Lpl_xord
+ .Lpl_movd:
+    cmpw   $2,_BYTESPERPIXEL
+    je     .Lpl_movdw
+    jb     .Lpl_movdb
+    
+{$ifdef TEST_24BPP}
+    cmpw   $3,_BYTESPERPIXEL
+    je     .Lpl_movd24BPP
+ .align 4,0x90
+ .Lpl_movd32BPP:
+    andl   $7,%ebx
+    movl   (%esi,%ebx,4),%eax
+    andl   $0x00FFFFFF,%eax
+    movl   %eax,%es:(%edi)
+    addl   $4,%edi
+    cmpl   _WINLOMASKMINUSPIXELSIZE,%edi
+    ja     .Lpl_d_exit
+    incl   %ebx
+    decl   %ecx
+    jnz    .Lpl_movd32BPP
+    jz     .Lpl_d_exit    
+ .align 4,0x90
+ .Lpl_movd24BPP:
+    andl   $7,%ebx
+    movl   (%esi,%ebx,4),%eax
+    andl   $0x00FFFFFF,%eax
+    movl   %es:(%edi),%edx
+    andl   $0xFF000000,%edx
+    orl    %edx,%eax
+    movl   %eax,%es:(%edi)
+    addl   $3,%edi
+    cmpl   _WINLOMASKMINUSPIXELSIZE,%edi
+    ja     .Lpl_d_exit
+    incl   %ebx
+    decl   %ecx
+    jnz    .Lpl_movd24BPP
+    jz     .Lpl_d_exit    
+{$endif TEST_24BPP}
  .align 4,0x90
  .align 4,0x90
- pl_movdb:
+ .Lpl_movdb:
     andl   %edx,%ebx
     andl   %edx,%ebx
     movb   (%esi,%ebx,4),%al
     movb   (%esi,%ebx,4),%al
     movb   %al,%es:(%edi)
     movb   %al,%es:(%edi)
     incl   %edi
     incl   %edi
     incl   %ebx
     incl   %ebx
     decl   %ecx
     decl   %ecx
-    jnz    pl_movdb
-    jz     pl_d_exit    
+    jnz    .Lpl_movdb
+    jz     .Lpl_d_exit    
 
 
  .align 4,0x90
  .align 4,0x90
- pl_movdw:
+ .Lpl_movdw:
     andl   %edx,%ebx
     andl   %edx,%ebx
     movw   (%esi,%ebx,4),%ax
     movw   (%esi,%ebx,4),%ax
     movw   %ax,%es:(%edi)
     movw   %ax,%es:(%edi)
     addl   $2,%edi
     addl   $2,%edi
     incl   %ebx
     incl   %ebx
     decl   %ecx
     decl   %ecx
-    jnz    pl_movdw
-    jz     pl_d_exit    
- pl_xord:
-    testw  $1,_BYTESPERPIXEL
-    jz     pl_xordw
+    jnz    .Lpl_movdw
+    jz     .Lpl_d_exit    
+ .Lpl_xord:
+    cmpw   $2,_BYTESPERPIXEL
+    je     .Lpl_xordw
+    jb     .Lpl_xordb
+
+{$ifdef TEST_24BPP}
+    cmpw   $3,_BYTESPERPIXEL
+    je     .Lpl_xord24BPP
  .align 4,0x90
  .align 4,0x90
- pl_xordb:
+ .Lpl_xord32BPP:
+    andl   $7,%ebx
+    movl   (%esi,%ebx,4),%eax
+    andl   $0x00FFFFFF,%eax
+    movl   %es:(%edi),%edx
+    xorl   %edx,%eax
+    movl   %eax,%es:(%edi)
+    addl   $4,%edi
+    cmpl   _WINLOMASKMINUSPIXELSIZE,%edi
+    ja     .Lpl_d_exit
+    incl   %ebx
+    decl   %ecx
+    jnz    .Lpl_xord32BPP
+    jz     .Lpl_d_exit    
+ .align 4,0x90
+ .Lpl_xord24BPP:
+    andl   $7,%ebx
+    movl   (%esi,%ebx,4),%eax
+    andl   $0x00FFFFFF,%eax
+    movl   %es:(%edi),%edx
+    xorl   %edx,%eax
+    movl   %eax,%es:(%edi)
+    addl   $3,%edi
+    cmpl   _WINLOMASKMINUSPIXELSIZE,%edi
+    ja     .Lpl_d_exit
+    incl   %ebx
+    decl   %ecx
+    jnz    .Lpl_xord24BPP
+    jz     .Lpl_d_exit    
+{$endif TEST_24BPP}
+ .align 4,0x90
+ .Lpl_xordb:
     andl   %edx,%ebx
     andl   %edx,%ebx
     movb   (%esi,%ebx,4),%al
     movb   (%esi,%ebx,4),%al
     xorb   %al,%es:(%edi)
     xorb   %al,%es:(%edi)
     incl   %edi
     incl   %edi
     incl   %ebx
     incl   %ebx
     decl   %ecx
     decl   %ecx
-    jnz    pl_xordb
-    jz     pl_d_exit 
+    jnz    .Lpl_xordb
+    jz     .Lpl_d_exit 
  .align 4,0x90
  .align 4,0x90
- pl_xordw:
+ .Lpl_xordw:
     andl   %edx,%ebx
     andl   %edx,%ebx
     movw   (%esi,%ebx,4),%ax
     movw   (%esi,%ebx,4),%ax
     xorw   %ax,%es:(%edi)
     xorw   %ax,%es:(%edi)
     addl   $2,%edi
     addl   $2,%edi
     incl   %ebx
     incl   %ebx
     decl   %ecx
     decl   %ecx
-    jnz    pl_xordw
- pl_d_exit:
+    jnz    .Lpl_xordw
+ .Lpl_d_exit:
     popw   %es
     popw   %es
- pl_exit:
+ .Lpl_exit:
  end;
  end;
 end;
 end;
 
 
@@ -109,15 +190,14 @@ begin
   ofs1:= ofs1 + X_ARRAY[x1];
   ofs1:= ofs1 + X_ARRAY[x1];
   bank1:=ofs1 shr winshift;
   bank1:=ofs1 shr winshift;
   bank2:=ofs2 shr winshift;
   bank2:=ofs2 shr winshift;
-  if bank1 <> AW_BANK then
+  if bank1 <> A_BANK then
   begin
   begin
     Switchbank(bank1);
     Switchbank(bank1);
-    AW_BANK:=bank1;
   end;
   end;
   if bank1 <> bank2 then begin
   if bank1 <> bank2 then begin
      diff:=(((bank2 shl winshift)-ofs1) div BytesPerPixel)+x1;  
      diff:=(((bank2 shl winshift)-ofs1) div BytesPerPixel)+x1;  
      DrawPattern(x1,diff-1,y);
      DrawPattern(x1,diff-1,y);
-     Switchbank(bank2); AW_BANK:=bank2;
+     Switchbank(bank2);
      DrawPattern(diff,x2,y);
      DrawPattern(diff,x2,y);
   end else DrawPattern(x1,x2,y);
   end else DrawPattern(x1,x2,y);
 end;
 end;
@@ -125,7 +205,36 @@ end;
 
 
 procedure HorizontalLine(x1,x2,y:integer);
 procedure HorizontalLine(x1,x2,y:integer);
 { without bankswitching }
 { without bankswitching }
+{ nothing for 24BPP yet (PM) }
+{$ifdef TEST_24BPP}
+var i,j : longint;
+{$endif TEST_24BPP}
 begin
 begin
+{$ifdef TEST_24BPP}
+  if BytesPerPixel=3 then
+   { big problem one point can be across boundary !! }
+   begin
+     if ((Y_Array[y]+X_array[x1]) and winlomask)+3 > winlomask then
+       begin
+         { special point !! }
+         { not implemented yet !! }
+         inc(x1);
+       end;
+     j:=Y_array[y]+X_array[x1];
+     for i:=x1 to x2 do
+       begin
+          if aktwritemode=normalput then
+            pixel(j)
+          else
+            begin
+              putpixeli(i,y,aktcolor xor getpixel(i,y));
+            end;
+         inc(j,3);
+       end;
+      exit;
+   end;
+{$endif TEST_24BPP}
+   
   asm
   asm
     movw   %es,%dx
     movw   %es,%dx
     movzwl y,%ebx
     movzwl y,%ebx
@@ -144,40 +253,40 @@ begin
     movw   _SEG_WRITE,%bx
     movw   _SEG_WRITE,%bx
     movw   %bx,%es 
     movw   %bx,%es 
     testl  %esi,%esi                    // { Writemode ?       }
     testl  %esi,%esi                    // { Writemode ?       }
-    jnz    hl_xor
+    jnz    .Lhl_xor
     shrl   %ecx
     shrl   %ecx
-    jnc    _movw
+    jnc    .L_movw
     stosb
     stosb
- _movw:
+ .L_movw:
     shrl   %ecx
     shrl   %ecx
-    jnc    _movd
+    jnc    .L_movd
     stosw
     stosw
- _movd:
+ .L_movd:
     rep
     rep
     stosl
     stosl
-    jmp    hl_exit
+    jmp    .Lhl_exit
 
 
- hl_xor:   // -------------------------------------------------
+ .Lhl_xor:   // -------------------------------------------------
 
 
     movl   $4,%esi
     movl   $4,%esi
     shrl   %ecx
     shrl   %ecx
-    jnc    hl_xorw
+    jnc    .Lhl_xorw
     xorb   %al,%es:(%edi)
     xorb   %al,%es:(%edi)
     incl   %edi 
     incl   %edi 
- hl_xorw:
+ .Lhl_xorw:
     shrl   %ecx
     shrl   %ecx
-    jnc    hl_xord
+    jnc    .Lhl_xord
     xorw   %ax,%es:(%edi)
     xorw   %ax,%es:(%edi)
     addl   $2,%edi
     addl   $2,%edi
- hl_xord:   
-    jecxz  hl_exit
+ .Lhl_xord:   
+    jecxz  .Lhl_exit
  .align 4,0x90
  .align 4,0x90
- hl_xorloop:
+ .Lhl_xorloop:
     xorl   %eax,%es:(%edi)
     xorl   %eax,%es:(%edi)
     addl   %esi,%edi
     addl   %esi,%edi
     decl   %ecx
     decl   %ecx
-    jnz    hl_xorloop
- hl_exit:
+    jnz    .Lhl_xorloop
+ .Lhl_exit:
     movw   %dx,%es
     movw   %dx,%es
  end;
  end;
 end;
 end;
@@ -214,17 +323,16 @@ begin
         ofs2:=ofs+X_ARRAY[x2];
         ofs2:=ofs+X_ARRAY[x2];
         ofs:= ofs+X_ARRAY[x1];
         ofs:= ofs+X_ARRAY[x1];
         i1:=ofs shr winshift; i2:=ofs2 shr winshift;
         i1:=ofs shr winshift; i2:=ofs2 shr winshift;
-        if i1 <> aw_bank then 
+        if i1 <> a_bank then
           begin 
           begin 
             switchbank(i1); 
             switchbank(i1); 
-            aw_bank:=i1; 
           end;
           end;
         if i1=i2 then Horizontalline(x1,x2,y1)
         if i1=i2 then Horizontalline(x1,x2,y1)
           else                             
           else                             
             begin 
             begin 
             dx:=((i2 shl winshift)-ofs) div BytesPerPixel;
             dx:=((i2 shl winshift)-ofs) div BytesPerPixel;
             horizontalline(x1,x1+dx-1,y1);
             horizontalline(x1,x1+dx-1,y1);
-            Switchbank(i2); AW_BANK:=i2;
+            Switchbank(i2);
             horizontalline(dx+x1,x2,y1); 
             horizontalline(dx+x1,x2,y1); 
           end;
           end;
       end;
       end;
@@ -270,9 +378,11 @@ begin
    d:=i1 - dx;
    d:=i1 - dx;
   i2:=(dx shl 1)-i1;
   i2:=(dx shl 1)-i1;
 
 
+  { for 24BPP use slow checking code,easy and poor implementation ! PM }
 dontcheck:=(y1>=viewport.y1) and (y2<=viewport.y2) and 
 dontcheck:=(y1>=viewport.y1) and (y2<=viewport.y2) and 
            (x1>=viewport.x1) and (x1<=viewport.x2) and
            (x1>=viewport.x1) and (x1<=viewport.x2) and
-           (x2>=viewport.x1) and (x2<=viewport.x2);
+           (x2>=viewport.x1) and (x2<=viewport.x2) and
+           (BytesPerPixel<=2);
 
 
 if aktlineinfo.thickness=3 then 
 if aktlineinfo.thickness=3 then 
 
 
@@ -326,7 +436,7 @@ end else
      movl   %eax,i2long
      movl   %eax,i2long
      movl   _WBUFFER,%eax
      movl   _WBUFFER,%eax
      movl   %eax,.Lwbuffer
      movl   %eax,.Lwbuffer
-     movl   _WINSHIFT,%eax
+     movzbl _WINSHIFT,%eax
      movb   %al,.Lwinshift
      movb   %al,.Lwinshift
      movl   _WINLOMASK,%eax
      movl   _WINLOMASK,%eax
      movl   %eax,.Lwinlomask
      movl   %eax,.Lwinlomask
@@ -366,13 +476,12 @@ line1_loop:
       .byte 0x88                      // _WINSHIFT
       .byte 0x88                      // _WINSHIFT
       
       
       pushl  %edi
       pushl  %edi
-      cmpl   _AW_BANK,%eax
+      cmpl   _A_BANK,%eax
       je     line1_dontswitch
       je     line1_dontswitch
       
       
       pushl  %ebx
       pushl  %ebx
       pushl  %edx
       pushl  %edx
       pushl  %esi   
       pushl  %esi   
-      movl   %eax,_AW_BANK             // newbank
       pushl  %eax
       pushl  %eax
       movl   _BANKSWITCHPTR,%eax
       movl   _BANKSWITCHPTR,%eax
       call   %eax
       call   %eax
@@ -510,10 +619,10 @@ begin
      end;
      end;
      aktlineinfo.linestyle:=linestyle;
      aktlineinfo.linestyle:=linestyle;
      if aktlineinfo.linestyle=UserBitLn then
      if aktlineinfo.linestyle=UserBitLn then
-        aktlineinfo.pattern:=pattern
-        else
-        aktlineinfo.pattern:=linepatterns[aktlineinfo.linestyle];
-        aktlineinfo.thickness:=thickness;
+       aktlineinfo.pattern:=pattern
+     else
+       aktlineinfo.pattern:=linepatterns[aktlineinfo.linestyle];
+     aktlineinfo.thickness:=thickness;
 end;
 end;
 
 
     procedure DrawPoly(points : word;var polypoints);
     procedure DrawPoly(points : word;var polypoints);
@@ -544,7 +653,16 @@ end;
 
 
 {
 {
   $Log$
   $Log$
-  Revision 1.2  1998-09-02 08:16:00  pierre
+  Revision 1.3  1998-11-18 09:31:37  pierre
+    * changed color scheme
+      all colors are in RGB format if more than 256 colors
+    + added 24 and 32 bits per pixel mode
+      (compile with -dDEBUG)
+      24 bit mode with banked still as problems on pixels across
+      the bank boundary, but works in LinearFrameBufferMode
+      Look at install/demo/nmandel.pp
+
+  Revision 1.2  1998/09/02 08:16:00  pierre
     * local asm labels with global variable names removed !!
     * local asm labels with global variable names removed !!
 
 
   Revision 1.1.1.1  1998/03/25 11:18:42  root
   Revision 1.1.1.1  1998/03/25 11:18:42  root

+ 68 - 17
rtl/dos/ppi/modes.ppi

@@ -12,26 +12,77 @@
 
 
  **********************************************************************}
  **********************************************************************}
 
 
-const VESANumber=10;
-      VESAModes : Array[0..VESANumber] of word=
-      ($100,    {   640x400x256 }
-       $101,    {   640x480x256 }
-       $110,    {   640x480x32K }
-       $111,    {   640x480x64k }
-       $103,    {   800x600x256 }
-       $113,    {   800x600x32k }
-       $114,    {   800x600x64k }
-       $105,    {  1024x768x256 }
-       $116,    {  1024x768x32k }
-       $107,    { 1280x1024x256 }
-       $117);   {  1024x768x64k }
-     
- 
+const
+{$ifndef TEST_24BPP}
+   VESANumber=13;
+{$else TEST_24BPP}
+   VESANumber=16;
+{$endif TEST_24BPP}
+      VESAModes : Array[0..VESANumber-1] of word=
+      ( $100    {   640x400x256 }
+       ,$101    {   640x480x256 }
+       ,$110    {   640x480x32K }
+       ,$111    {   640x480x64k }
+       ,$103    {   800x600x256 }
+       ,$113    {   800x600x32k }
+       ,$114    {   800x600x64k }
+       ,$105    {  1024x768x256 }
+       ,$116    {  1024x768x32k }
+       ,$117    {  1024x768x64k }
+       ,$107    { 1280x1024x256 }
+       ,$119    { 1280x1024x32K }
+       ,$11A    { 1280x1024x64K }
+{$ifdef TEST_24BPP}
+       ,$112    {   640x480x16M }
+       ,$115    {   800x600x16M }
+       ,$118    {  1024x768x16M }
+       ,$11B    { 1280x1024x16M }
+{$endif TEST_24BPP}
+       );
+
+  G640x400x256      = $100;
+  G640x480x256      = $101;
+  G800x600x256      = $103;
+  G1024x768x256     = $105;
+
+  G1280x1024x256    = $107;   { Additional modes. }
+
+  G640x480x32K      = $110;
+  G640x480x64K      = $111;
+  G640x480x16M      = $112;
+  
+  G800x600x32K      = $113;
+  G800x600x64K      = $114;
+  G800x600x16M      = $115;
+
+  G1024x768x32K     = $116;
+  G1024x768x64K     = $117;
+  G1024x768x16M     = $118;
+
+  G1280x1024x32K    = $119;
+  G1280x1024x64K    = $11A;
+  G1280x1024x16M    = $11B;
+
+(*   G320x200x16M32    = 33;       { 32-bit per pixel modes. }
+  G640x480x16M32    = 34;
+  G800x600x16M32    = 35;
+  G1024x768x16M32   = 36;
+  G1280x1024x16M32  = 37; *)
+
 
 
 {
 {
   $Log$
   $Log$
-  Revision 1.1  1998-03-25 11:18:42  root
-  Initial revision
+  Revision 1.2  1998-11-18 09:31:38  pierre
+    * changed color scheme
+      all colors are in RGB format if more than 256 colors
+    + added 24 and 32 bits per pixel mode
+      (compile with -dDEBUG)
+      24 bit mode with banked still as problems on pixels across
+      the bank boundary, but works in LinearFrameBufferMode
+      Look at install/demo/nmandel.pp
+
+  Revision 1.1.1.1  1998/03/25 11:18:42  root
+  * Restored version
 
 
   Revision 1.5  1998/01/26 11:58:22  michael
   Revision 1.5  1998/01/26 11:58:22  michael
   + Added log at the end
   + Added log at the end

+ 12 - 3
rtl/dos/ppi/palette.ppi

@@ -81,8 +81,8 @@ begin
   asm
   asm
     movl   palette,%edi
     movl   palette,%edi
     movw   $0,(%edi)
     movw   $0,(%edi)
-    testw  $2,_BYTESPERPIXEL
-    jnz    gp_end
+    cmpl   $2,_BYTESPERPIXEL
+    jge    gp_end
     movw   $0x100,(%edi)
     movw   $0x100,(%edi)
     movl   $767,%ecx
     movl   $767,%ecx
     xorl   %eax,%eax
     xorl   %eax,%eax
@@ -102,7 +102,16 @@ gp_end:
 end;
 end;
 {
 {
   $Log$
   $Log$
-  Revision 1.2  1998-07-18 21:29:59  carl
+  Revision 1.3  1998-11-18 09:31:39  pierre
+    * changed color scheme
+      all colors are in RGB format if more than 256 colors
+    + added 24 and 32 bits per pixel mode
+      (compile with -dDEBUG)
+      24 bit mode with banked still as problems on pixels across
+      the bank boundary, but works in LinearFrameBufferMode
+      Look at install/demo/nmandel.pp
+
+  Revision 1.2  1998/07/18 21:29:59  carl
     * bugfix of palette setting with wrong asm counter
     * bugfix of palette setting with wrong asm counter
       (from Ingemar Ragnemalm)
       (from Ingemar Ragnemalm)
 
 

+ 159 - 51
rtl/dos/ppi/pixel.ppi

@@ -12,7 +12,8 @@
 
 
  **********************************************************************}
  **********************************************************************}
 
 
-procedure putpixel(x,y:integer;colour:longint);
+ { internal put pixel with colour in internal format }
+procedure putpixeli(x,y:integer;colour:longint);
 var viewport:viewporttype;
 var viewport:viewporttype;
 begin
 begin
 if aktviewport.clip then viewport:=aktviewport else viewport:=aktscreen;
 if aktviewport.clip then viewport:=aktviewport else viewport:=aktscreen;
@@ -44,34 +45,60 @@ if aktviewport.clip then viewport:=aktviewport else viewport:=aktscreen;
       movl   _Y_ARRAY(,%eax,4),%eax
       movl   _Y_ARRAY(,%eax,4),%eax
       addl   _X_ARRAY(,%ebx,4),%eax     
       addl   _X_ARRAY(,%ebx,4),%eax     
       movl   %eax,%esi
       movl   %eax,%esi
-      movl   _WINSHIFT,%ecx                // { offset / winsize        }
+      movzbl _WINSHIFT,%ecx                // { offset / winsize        }
       shrl   %cl,%eax                      // 
       shrl   %cl,%eax                      // 
-      cmpl   _AW_BANK,%eax                 // { same bank ?             }
+      cmpl   _A_BANK,%eax                 // { same bank ?             }
       je     p_dont_switch                 // { yep                     } 
       je     p_dont_switch                 // { yep                     } 
-      movl   %eax,_AW_BANK                 // { newbank                 }
+      pushl  %esi
       pushl  %eax                          // 
       pushl  %eax                          // 
       movl   _BANKSWITCHPTR,%eax           // { switchbank              }
       movl   _BANKSWITCHPTR,%eax           // { switchbank              }
       call   %eax                          //
       call   %eax                          //
+      popl   %esi
   p_dont_switch:
   p_dont_switch:
       andl   _WINLOMASK,%esi
       andl   _WINLOMASK,%esi
       movl   colour,%eax
       movl   colour,%eax
       addl   _WBUFFER,%esi
       addl   _WBUFFER,%esi
       movw   _SEG_WRITE,%bx
       movw   _SEG_WRITE,%bx
       movw   _BYTESPERPIXEL,%cx
       movw   _BYTESPERPIXEL,%cx
-      movw   %ds,%dx
-      movw   %bx,%ds
-      testl  $1,%ecx
-      jz     pp_2BPP
-      movb   %al,(%esi)
-      jnz    pp_exit
-  pp_2BPP:
-      movw   %ax,(%esi)
+      movw   %bx,%gs
+      cmpl   $2,%ecx
+      je     pp_16BPP
+      jb     pp_8BPP
+{$ifdef TEST_24BPP}
+      cmpl   $3,%ecx
+      je     pp_24BPP
+  pp_32BPP:
+      movl   %eax,%gs:(%esi)
+      jmp    pp_exit
+  pp_24BPP:
+      movl   _WINLOMASKMINUSPIXELSIZE,%edi
+      cmpl   %edi,%esi
+      ja     pp_exit
+      movl   %gs:(%esi),%edi
+      andl   $0xFF000000,%edi
+      andl   $0x00FFFFFF,%eax
+      orl    %edi,%eax
+      movl   %eax,%gs:(%esi)
+      jmp    pp_exit
+{$endif TEST_24BPP}
+  pp_8BPP:
+      movb   %al,%gs:(%esi)
+      jmp    pp_exit
+  pp_16BPP:
+      movw   %ax,%gs:(%esi)
   pp_exit:
   pp_exit:
-      movw   %dx,%ds
+      (* movw   %dx,%ds use %gs now
+      does not need to be kept constant PM *)
   p_exit:
   p_exit:
   end; 
   end; 
 end; { proc }
 end; { proc }
 
 
+procedure putpixel(x,y:integer;colour:longint);
+begin
+  colour:=convert(colour);
+  putpixeli(x,y,colour);
+end;
+
 procedure pixel(offset:longint);
 procedure pixel(offset:longint);
  { wird nur intern aufgerufen, umrechnung auf Viewport und Range- }
  { wird nur intern aufgerufen, umrechnung auf Viewport und Range- }
  { checking muessen von aufrufender Routine bereits erledigt sein }
  { checking muessen von aufrufender Routine bereits erledigt sein }
@@ -80,14 +107,15 @@ procedure pixel(offset:longint);
    asm
    asm
       movl   offset,%eax             
       movl   offset,%eax             
       movl   %eax,%esi
       movl   %eax,%esi
-      movl   _WINSHIFT,%ecx                // { offset / winsize        }
+      movzbl _WINSHIFT,%ecx                // { offset / winsize        }
       shrl   %cl,%eax                      // 
       shrl   %cl,%eax                      // 
-      cmpl   _AW_BANK,%eax                 // { same bank ?             }
+      cmpl   _A_BANK,%eax                 // { same bank ?             }
       je     dont_switch                   // { yep                     } 
       je     dont_switch                   // { yep                     } 
-      movl   %eax,_AW_BANK                 // { newbank                 }
+      pushl  %esi
       pushl  %eax                          // 
       pushl  %eax                          // 
       movl   _BANKSWITCHPTR,%eax           // { switchbank              }
       movl   _BANKSWITCHPTR,%eax           // { switchbank              }
       call   %eax                          //
       call   %eax                          //
+      popl   %esi
  dont_switch:
  dont_switch:
       movl   _WINLOMASK,%eax
       movl   _WINLOMASK,%eax
       andl   %eax,%esi
       andl   %eax,%esi
@@ -96,31 +124,71 @@ procedure pixel(offset:longint);
       movw   _BYTESPERPIXEL,%bx
       movw   _BYTESPERPIXEL,%bx
       addl   _WBUFFER,%esi
       addl   _WBUFFER,%esi
       movw   _SEG_WRITE,%dx
       movw   _SEG_WRITE,%dx
-      movw   %ds,%di
-      movw   %dx,%ds
+      movw   %dx,%gs
       testl  %ecx,%ecx
       testl  %ecx,%ecx
       jz     dmove
       jz     dmove
-      shrl   %ebx
-      jnc    dxor2BPP
-      xorb   %al,(%esi)
-      jnc    pd_exit
- dxor2BPP:
-      xorw   %ax,(%esi)
-      jnc    pd_exit 
+      cmpl   $2,%ebx
+      je     dxor16BPP
+      jb     dxor8BPP
+{$ifdef TEST_24BPP}
+      cmpl   $3,%ebx
+      je     dxor24BPP
+ dxor32BPP:
+      movl   %gs:(%esi),%edx
+      andl   $0x00FFFFFF,%eax
+      xorl   %edx,%eax
+      movl   %eax,%gs:(%esi)
+      jmp    pd_exit
+ dxor24BPP:
+      movl   _WINLOMASKMINUSPIXELSIZE,%ecx
+      cmpl   %ecx,%esi
+      ja     pd_exit
+      movl   %gs:(%esi),%edx
+      andl   $0x00FFFFFF,%eax
+      xorl   %edx,%eax
+      movl   %eax,%gs:(%esi)
+      jmp    pd_exit
+{$endif TEST_24BPP}
+ dxor8BPP:
+      xorb   %al,%gs:(%esi)
+      jmp    pd_exit
+ dxor16BPP:
+      xorw   %ax,%gs:(%esi)
+      jmp    pd_exit
  dmove:      
  dmove:      
-      shrl   %ebx
-      jnc    dmove2BPP
-      movb   %al,(%esi)
-      jc     pd_exit
- dmove2BPP:
-      movw   %ax,(%esi)  
+      cmpl   $2,%ebx
+      je    dmove16BPP
+      jb    dmove8BPP
+{$ifdef TEST_24BPP}
+      cmpl   $3,%ebx
+      je     dmove24BPP
+ dmove32BPP:
+      andl   $0x00FFFFFF,%eax
+      movl   %eax,%gs:(%esi)
+      jmp    pd_exit
+ dmove24BPP:
+      movl   _WINLOMASKMINUSPIXELSIZE,%ecx
+      cmpl   %ecx,%esi
+      ja     pd_exit
+      movl   %gs:(%esi),%edx
+      andl   $0xFF000000,%edx
+      andl   $0x00FFFFFF,%eax
+      orl    %edx,%eax
+      movl   %eax,%gs:(%esi)
+      jmp    pd_exit
+{$endif TEST_24BPP}
+ dmove8BPP:
+      movb   %al,%gs:(%esi)
+      jmp    pd_exit
+ dmove16BPP:
+      movw   %ax,%gs:(%esi)
  pd_exit:
  pd_exit:
-      movw   %di,%ds 
    end; 
    end; 
 end; { proc }
 end; { proc }
 
 
 function getpixel(x,y:integer):longint;
 function getpixel(x,y:integer):longint;
 var viewport:viewporttype;
 var viewport:viewporttype;
+    col : longint;
 begin
 begin
 if aktviewport.clip then viewport:=aktviewport else viewport:=aktscreen;
 if aktviewport.clip then viewport:=aktviewport else viewport:=aktscreen;
   asm
   asm
@@ -140,22 +208,21 @@ if aktviewport.clip then viewport:=aktviewport else viewport:=aktscreen;
       that depends on alignment settings !! PM *)
       that depends on alignment settings !! PM *)
       lea    viewport,%edx
       lea    viewport,%edx
       cmpw   (%edx),%bx
       cmpw   (%edx),%bx
-      jl     gp_exit                        // wenn x < x1 Ende
+      jl     gp_eexit                        // wenn x < x1 Ende
       cmpw   4(%edx),%bx
       cmpw   4(%edx),%bx
-      jg     gp_exit                        // wenn x > x2 Ende
+      jg     gp_eexit                        // wenn x > x2 Ende
       cmpw   2(%edx),%ax
       cmpw   2(%edx),%ax
-      jl     gp_exit                        // wenn y < y1 Ende
+      jl     gp_eexit                        // wenn y < y1 Ende
       cmpw   6(%edx),%ax
       cmpw   6(%edx),%ax
-      jg     gp_exit                        // wenn y > y2 Ende
+      jg     gp_eexit                        // wenn y > y2 Ende
       movl   _Y_ARRAY(,%eax,4),%eax
       movl   _Y_ARRAY(,%eax,4),%eax
       addl   _X_ARRAY(,%ebx,4),%eax     
       addl   _X_ARRAY(,%ebx,4),%eax     
       movl   %eax,%esi
       movl   %eax,%esi
-      movl   _WINSHIFT,%ecx                // { offset / winsize        }
+      movzbl _WINSHIFT,%ecx                // { offset / winsize        }
       shrl   %cl,%eax                      // 
       shrl   %cl,%eax                      // 
-      cmpl   _AW_BANK,%eax                 // { same bank ?             }
+      cmpl   _A_BANK,%eax                  // { same bank ?             }
       je     g_dont_switch                 // { yep                     }
       je     g_dont_switch                 // { yep                     }
       pushl  %esi                          // { save Offset             }       
       pushl  %esi                          // { save Offset             }       
-      movl   %eax,_AW_BANK                 // { newbank                 }
       pushl  %eax                          // 
       pushl  %eax                          // 
       movl   _BANKSWITCHPTR,%eax           // { switchbank              }
       movl   _BANKSWITCHPTR,%eax           // { switchbank              }
       call   %eax                          //
       call   %eax                          //
@@ -164,28 +231,69 @@ if aktviewport.clip then viewport:=aktviewport else viewport:=aktscreen;
       movl   _WINLOMASK,%eax
       movl   _WINLOMASK,%eax
       andl   %eax,%esi
       andl   %eax,%esi
       xorl   %eax,%eax
       xorl   %eax,%eax
-      movl   _BYTESPERPIXEL,%edx
+      movzwl _BYTESPERPIXEL,%edx
       addl   _WBUFFER,%esi   
       addl   _WBUFFER,%esi   
-      movw   _SEG_WRITE,%bx
-      movw   %ds,%cx
-      movw   %bx,%ds   
-      testl  $1,%edx                       // { 1 or 2 BytesPerPixel ? }
-      jnz    g_8BPP
-      movw   %ds:(%esi),%ax
-      jnz    g_Result
+      movw   _SEG_READ,%bx
+      movw   %bx,%gs
+      cmpl   $2,%edx                       // { 1 or 2 BytesPerPixel ? }
+      je     g_16BPP
+      jb     g_8BPP
+{$ifdef TEST_24BPP}
+      cmpl   $3,%edx                       // { 1 or 2 BytesPerPixel ? }
+      je     g_24BPP
+  g_32BPP:
+      movl   %gs:(%esi),%eax
+      andl   $0x00FFFFFF,%eax
+      jmp    g_Result
+  g_24BPP:
+      movl   _WINLOMASKMINUSPIXELSIZE,%edi
+      cmpl   %edi,%esi
+      ja     g_ErrorResult
+      movl   %gs:(%esi),%eax
+      andl   $0x00FFFFFF,%eax
+      jmp    g_Result
+  g_ErrorResult:
+      movl   $-3,%edi
+      addl   _WINLOMASK,%edi
+      cmpl   %edi,%esi
+      ja     g_nohope
+      decl   %esi
+      movl   %gs:(%esi),%eax
+      shrl   $8,%eax
+      jmp    g_Result
+  g_nohope:
+      movl   $0xABCDEF,%eax
+      jmp    g_Result
+{$endif TEST_24BPP}
+  g_16BPP:
+      movw   %gs:(%esi),%ax
+      jmp    g_Result
   g_8BPP:    
   g_8BPP:    
-      movb   %ds:(%esi),%al
+      movb   %gs:(%esi),%al
+      jmp    g_Result
+  gp_eexit:
+      xorl   %eax,%eax
+      jmp    gp_exit
   g_Result:    
   g_Result:    
-      movw   %cx,%ds
-      movl   %eax,__RESULT 
   gp_exit:
   gp_exit:
+      movl   %eax,col
   end;
   end;
+    getpixel:=unconvert(col);
 end; { proc }
 end; { proc }
 
 
 
 
 {
 {
   $Log$
   $Log$
-  Revision 1.2  1998-10-22 08:22:06  pierre
+  Revision 1.3  1998-11-18 09:31:40  pierre
+    * changed color scheme
+      all colors are in RGB format if more than 256 colors
+    + added 24 and 32 bits per pixel mode
+      (compile with -dDEBUG)
+      24 bit mode with banked still as problems on pixels across
+      the bank boundary, but works in LinearFrameBufferMode
+      Look at install/demo/nmandel.pp
+
+  Revision 1.2  1998/10/22 08:22:06  pierre
    * mandel problem fixed !!
    * mandel problem fixed !!
 
 
   Revision 1.1.1.1  1998/03/25 11:18:42  root
   Revision 1.1.1.1  1998/03/25 11:18:42  root

+ 12 - 2
rtl/dos/ppi/stdcolor.ppi

@@ -78,10 +78,20 @@ $F42C4040,$F52C3C40,$F62C3440,$F72C3040,
 $F8000000,$F9000000,$FA000000,$FB000000,
 $F8000000,$F9000000,$FA000000,$FB000000,
 $FC000000,$FD000000,$FE000000,$FF000000
 $FC000000,$FD000000,$FE000000,$FF000000
 );
 );
+
 {
 {
   $Log$
   $Log$
-  Revision 1.1  1998-03-25 11:18:42  root
-  Initial revision
+  Revision 1.2  1998-11-18 09:31:41  pierre
+    * changed color scheme
+      all colors are in RGB format if more than 256 colors
+    + added 24 and 32 bits per pixel mode
+      (compile with -dDEBUG)
+      24 bit mode with banked still as problems on pixels across
+      the bank boundary, but works in LinearFrameBufferMode
+      Look at install/demo/nmandel.pp
+
+  Revision 1.1.1.1  1998/03/25 11:18:42  root
+  * Restored version
 
 
   Revision 1.3  1998/01/26 11:58:38  michael
   Revision 1.3  1998/01/26 11:58:38  michael
   + Added log at the end
   + Added log at the end

+ 14 - 3
rtl/dos/ppi/text.ppi

@@ -253,7 +253,9 @@
                b1:=defaultfontdata[offs+j];    { Offset der Charzeile }      
                b1:=defaultfontdata[offs+j];    { Offset der Charzeile }      
                xpos:=i shl 3+x;
                xpos:=i shl 3+x;
                for k:=0 to 7 do begin
                for k:=0 to 7 do begin
-                 if (b1 and mask) <> 0 then putpixel(xpos+k,j+y,aktcolor);
+                 if (b1 and mask) <> 0 then putpixeli(xpos+k,j+y,aktcolor)
+                 else if ClearText then
+                  putpixeli(xpos+k,j+y,aktbackcolor);
                  mask:=mask shr 1;
                  mask:=mask shr 1;
                end;
                end;
              end;
              end;
@@ -459,8 +461,17 @@
  
  
 {
 {
   $Log$
   $Log$
-  Revision 1.1  1998-03-25 11:18:42  root
-  Initial revision
+  Revision 1.2  1998-11-18 09:31:42  pierre
+    * changed color scheme
+      all colors are in RGB format if more than 256 colors
+    + added 24 and 32 bits per pixel mode
+      (compile with -dDEBUG)
+      24 bit mode with banked still as problems on pixels across
+      the bank boundary, but works in LinearFrameBufferMode
+      Look at install/demo/nmandel.pp
+
+  Revision 1.1.1.1  1998/03/25 11:18:42  root
+  * Restored version
 
 
   Revision 1.3  1998/01/26 11:58:41  michael
   Revision 1.3  1998/01/26 11:58:41  michael
   + Added log at the end
   + Added log at the end

+ 31 - 7
rtl/dos/ppi/vesadeb.ppi

@@ -18,7 +18,7 @@
       VGAInfo.VESASignature[1],VGAInfo.VESASignature[2],VGAInfo.VESASignature[3],
       VGAInfo.VESASignature[1],VGAInfo.VESASignature[2],VGAInfo.VESASignature[3],
       VGAInfo.VESASignature[4],VGAInfo.VESAhiVersion,'.',VGAInfo.VESAloVersion);
       VGAInfo.VESASignature[4],VGAInfo.VESAhiVersion,'.',VGAInfo.VESAloVersion);
     writeln('Memory installed : ',VGAInfo.Totalmem * 64,'K');
     writeln('Memory installed : ',VGAInfo.Totalmem * 64,'K');
-    writeln;
+    writeln('startmode = ',HexStr(StartMode,4));
     write('Mode $',HexStr(GraphMode,4),'            : ');
     write('Mode $',HexStr(GraphMode,4),'            : ');
       if (VESAInfo.ModeAttributes and 1)=0 then write('not '); writeln('supported');
       if (VESAInfo.ModeAttributes and 1)=0 then write('not '); writeln('supported');
     writeln('Resolution            : ',VESAInfo.XResolution,'x',VESAInfo.YResolution);
     writeln('Resolution            : ',VESAInfo.XResolution,'x',VESAInfo.YResolution);
@@ -42,25 +42,49 @@
              Writeln('OffscreenOffset    : 0x',HexStr(VESAInfo.OffScreenPtr,8));
              Writeln('OffscreenOffset    : 0x',HexStr(VESAInfo.OffScreenPtr,8));
              Writeln('OffscreenMem       : ',VESAInfo.OffScreenMem,'KB');           
              Writeln('OffscreenMem       : ',VESAInfo.OffScreenMem,'KB');           
        end;
        end;
+      if (VESAInfo.ModeAttributes and $200)<>0 then
+         write('(VBE/AF v1.0P) application must call EnableDirectAccess '+
+           'before calling bank-switching functions');
     end;
     end;
     writeln;
     writeln;
     writeln('BankSwitchRoutine at: ',HexStr(VESAInfo.RealWinFuncPtr,8));
     writeln('BankSwitchRoutine at: ',HexStr(VESAInfo.RealWinFuncPtr,8));
-    write('WindowA: read: '); if VESAInfo.WinAAttributes and 3<>0 then write('yes')else write('no ');
-    write('    write: ');     if VESAInfo.WinAAttributes and 7<>0 then write('yes')else write('no ');
+    write('WindowA: read: '); if (VESAInfo.WinAAttributes and 3)=3 then write('yes')else write('no ');
+    write('    write: ');     if (VESAInfo.WinAAttributes and 5)=5 then write('yes')else write('no ');
     writeln('   Segment:  ',HexStr(VESAInfo.segWinA,4));
     writeln('   Segment:  ',HexStr(VESAInfo.segWinA,4));
-    write('WindowB: read: '); if VESAInfo.WinBAttributes and 3<>0 then write('yes')else write('no ');
-    write('    write: ');     if VESAInfo.WinBAttributes and 7<>0 then write('yes')else write('no ');
+    write('WindowB: read: '); if (VESAInfo.WinBAttributes and 3)=3 then write('yes')else write('no ');
+    write('    write: ');     if (VESAInfo.WinBAttributes and 5)=5 then write('yes')else write('no ');
     writeln('   Segment:  ',HexStr(VESAInfo.segWinB,4));
     writeln('   Segment:  ',HexStr(VESAInfo.segWinB,4));
     writeln('Granularity  : ',VESAInfo.WinGranularity);
     writeln('Granularity  : ',VESAInfo.WinGranularity);
     writeln('WinSize      : ',VESAInfo.Winsize,' KByte');
     writeln('WinSize      : ',VESAInfo.Winsize,' KByte');
     writeln('BytesPerLine : ',BytesPerLine);
     writeln('BytesPerLine : ',BytesPerLine);
     writeln('BytesPerPixel: ',BytesPerPixel);
     writeln('BytesPerPixel: ',BytesPerPixel);
+    if isDPMI then
+      begin
+         write('Write selector linear base: ',hexstr(get_segment_base_address(seg_write),8));
+         writeln(' linear limit: ',hexstr(get_segment_limit(seg_write),8));
+      end;
+    if not same_window then
+      begin
+         write('Read selector linear base: ',hexstr(get_segment_base_address(seg_read),8));
+         writeln(' linear limit: ',hexstr(get_segment_limit(seg_read),8));
+      end;
+{$ifndef FPC_PROFILE}
     readln;
     readln;
+{$endif not FPC_PROFILE}
  
  
 {
 {
   $Log$
   $Log$
-  Revision 1.1  1998-03-25 11:18:42  root
-  Initial revision
+  Revision 1.2  1998-11-18 09:31:43  pierre
+    * changed color scheme
+      all colors are in RGB format if more than 256 colors
+    + added 24 and 32 bits per pixel mode
+      (compile with -dDEBUG)
+      24 bit mode with banked still as problems on pixels across
+      the bank boundary, but works in LinearFrameBufferMode
+      Look at install/demo/nmandel.pp
+
+  Revision 1.1.1.1  1998/03/25 11:18:42  root
+  * Restored version
 
 
   Revision 1.3  1998/01/26 11:58:49  michael
   Revision 1.3  1998/01/26 11:58:49  michael
   + Added log at the end
   + Added log at the end