Browse Source

* fixed set/getvgargbpalette for VGA 16 color modes

Jonas Maebe 26 years ago
parent
commit
0fa97f88ea
1 changed files with 52 additions and 38 deletions
  1. 52 38
      rtl/inc/graph/graph.inc

+ 52 - 38
rtl/inc/graph/graph.inc

@@ -87,6 +87,10 @@
 
 
     NUM_MODES       =   $8       ; { # of Mode X Variations           }
     NUM_MODES       =   $8       ; { # of Mode X Variations           }
 
 
+    { in 16 color modes, the actual colors used are no 0..15, but: }
+    ToRealCols16: Array[0..15] of word =
+      (0,1,2,3,4,5,7,20,56,57,58,59,60,61,62,63);
+
   var
   var
      ScrWidth : word absolute $40:$4a;
      ScrWidth : word absolute $40:$4a;
 
 
@@ -1662,49 +1666,56 @@ const CrtAddress: word = 0;
 
 
    { VGA is never a direct color mode, so no need to check ... }
    { VGA is never a direct color mode, so no need to check ... }
    Procedure SetVGARGBPalette(ColorNum, RedValue, GreenValue,
    Procedure SetVGARGBPalette(ColorNum, RedValue, GreenValue,
-      BlueValue : Integer); {$ifndef fpc}far;{$endif fpc} assembler;
-    asm
-      { on some hardware - there is a snow like effect       }
-      { when changing the palette register directly          }
-      { so we wait for a vertical retrace start period.      }
-      mov dx, $03da
-    @1:
-      in    al, dx          { Get input status register    }
-      test  al, $08         { check if in vertical retrace }
-      jnz   @1              { yes, complete it             }
-                            { we have to wait for the next }
-                            { retrace to assure ourselves  }
-                            { that we have time to complete }
-                            { the DAC operation within      }
-                            { the vertical retrace period   }
-     @2:
-      in    al, dx
-      test  al, $08
-      jz    @2              { repeat until vertical retrace start }
-
-      mov dx, $03c8       { Set color register address to use }
-      mov ax, [ColorNum]
-      out dx, al
-      inc dx              { Point to DAC registers            }
-      mov ax, [RedValue]  { Get RedValue                      }
-{      and ax, $ff        } { mask out all upper bits           }
-      shr al, 2           { convert to LSB RGB format         }
-      out dx, al
-      mov ax, [GreenValue]{ Get RedValue                      }
-{      and ax, $ff        } { mask out all upper bits           }
-      shr al, 2           { convert to LSB RGB format         }
-      out dx, al
-      mov ax, [BlueValue] { Get RedValue                      }
-{      and ax, $ff        } { mask out all upper bits           }
-      shr al, 2           { convert to LSB RGB format         }
-      out dx, al
-    end;
+      BlueValue : Integer); {$ifndef fpc}far;{$endif fpc}
+    begin
+      { translate the color number for 16 color mode }
+      If MaxColor = 16 Then
+        ColorNum := ToRealCols16[ColorNum];
+      asm
+        { on some hardware - there is a snow like effect       }
+        { when changing the palette register directly          }
+        { so we wait for a vertical retrace start period.      }
+        mov dx, $03da
+      @1:
+        in    al, dx          { Get input status register    }
+        test  al, $08         { check if in vertical retrace }
+        jnz   @1              { yes, complete it             }
+                              { we have to wait for the next }
+                              { retrace to assure ourselves  }
+                              { that we have time to complete }
+                              { the DAC operation within      }
+                              { the vertical retrace period   }
+       @2:
+        in    al, dx
+        test  al, $08
+        jz    @2              { repeat until vertical retrace start }
+
+        mov dx, $03c8       { Set color register address to use }
+        mov ax, [ColorNum]
+        out dx, al
+        inc dx              { Point to DAC registers            }
+        mov ax, [RedValue]  { Get RedValue                      }
+  {      and ax, $ff        } { mask out all upper bits           }
+        shr al, 2           { convert to LSB RGB format         }
+        out dx, al
+        mov ax, [GreenValue]{ Get RedValue                      }
+  {      and ax, $ff        } { mask out all upper bits           }
+        shr al, 2           { convert to LSB RGB format         }
+        out dx, al
+        mov ax, [BlueValue] { Get RedValue                      }
+  {      and ax, $ff        } { mask out all upper bits           }
+        shr al, 2           { convert to LSB RGB format         }
+        out dx, al
+      end
+    End;
 
 
 
 
    { VGA is never a direct color mode, so no need to check ... }
    { VGA is never a direct color mode, so no need to check ... }
   Procedure GetVGARGBPalette(ColorNum: integer; Var
   Procedure GetVGARGBPalette(ColorNum: integer; Var
       RedValue, GreenValue, BlueValue : integer); {$ifndef fpc}far;{$endif fpc}
       RedValue, GreenValue, BlueValue : integer); {$ifndef fpc}far;{$endif fpc}
    begin
    begin
+     If MaxColor = 16 Then
+       ColorNum := ToRealCols16[ColorNum];
      Port[$03C7] := ColorNum;
      Port[$03C7] := ColorNum;
      { we must convert to lsb values... because the vga uses the 6 msb bits }
      { we must convert to lsb values... because the vga uses the 6 msb bits }
      { which is not compatible with anything.                               }
      { which is not compatible with anything.                               }
@@ -2451,7 +2462,10 @@ const CrtAddress: word = 0;
 
 
 {
 {
 $Log$
 $Log$
-Revision 1.21  1999-09-27 23:34:40  peter
+Revision 1.22  1999-10-08 14:28:18  jonas
+  * fixed set/getvgargbpalette for VGA 16 color modes
+
+Revision 1.21  1999/09/27 23:34:40  peter
   * new graph unit is default for go32v2
   * new graph unit is default for go32v2
   * removed warnings/notes
   * removed warnings/notes