[Back to EGAVGA SWAG index] [Back to Main SWAG index] [Original]

    {
    I tested out an 8 bit DAC mode with a 3d rendered image for ANIVGA v1.2
    compatible TeleGame SDK.  There were portions of the image which actually
    popped out of the screen like a 3d movie.  Now very realistic 3d sprites and
    images are possible with TeleGame.  There is no impediment to display speed
    with this technique.  The higher color variation allows anti-aliasing and
    smooth blending.

    Here is ATT 20c491 specific code from VGADOC3 for Orchid Fahrenheit VA/VLB:
    program Orchid;
    }
    uses ANIVGA, CRT;
    CONST
          Pic1 = 'HIPALACE.PIC';
          PalName = 'HI.PAL';
          ch : Char = #0;
    VAR
        i : Integer;
        dac8 : Boolean;
        DAC_RS2 : word;    {These address bits are fed to the }
        {DAC_RS3 : word;    RS2 and RS3 pins of the palette chip}
        daccomm : word;    { temp to trigger DAC reads }
        Dac6Colors : Palette;     { 6 bit dac RGB values 0..63 }
        Dac8Colors : Palette;     { 8 bit dac RGB values 0..255 }
    type
      pel = record
               index, red, green, blue : byte;
            end;
    procedure disable;  {Disable interupts}
    begin
      inline($fa);   { CLI instruction }
    end;  {disable}
    procedure enable;   {Enable interrupts}
    begin
      inline($fb);   { STI instruction }
    end;  {enable}
    procedure outp(reg, val : word);  {Write the low byte of VAL to I/O port REG}
    begin
      port[reg] := val;
    end;  {outp}
    function inp(reg : word) : byte;  {Reads a byte from I/O port REG}
    begin
      reg := port[reg];
      inp := reg;
    end;  {inp}
    function trigdac : word;  {Reads $3C6 4 times}
    var x : word;
    begin
      x := inp($3c6);
      x := inp($3c6);
      x := inp($3c6);
      trigdac := inp($3c6);
    end;
    procedure dac2pel;    {Force DAC back to PEL mode}
    begin
      if inp($3c8)=0 then;
    end;  {dac2pel}
    procedure dac2comm;   {Enter command mode of HiColor DACs}
    begin
      dac2pel;
      daccomm := trigdac;
    end;  {dac2comm}
    procedure readpelreg(index : word; var p : pel);
    begin
      p.index := index;
      disable;
      outp($3C7, index);
      p.red   := inp($3C9);
      p.blue  := inp($3C9);
      p.green := inp($3C9);
      enable;
    end;  {readpelreg}
    procedure writepelreg(var p : pel);
    begin
      disable;
      outp($3C8, p.index);
      outp($3C9, p.red);
      outp($3C9, p.blue);
      outp($3C9, p.green);
      enable;
    end;  {writepelreg}
    function setcomm(cmd : word) : word;
    begin
      dac2comm;
      outp($3c6, cmd);
      dac2comm;
      setcomm := inp($3c6);
    end;  {setcomm}
    function dacis8bit : boolean;
    var
      pel2, x, v : word;
      pel1 : pel;
    begin
      pel2 := inp($3C8);
      readpelreg(255, pel1);
      v := pel1.red;
      pel1.red := 255;
      writepelreg(pel1);
      readpelreg(255, pel1);
      x := pel1.red;
      pel1.red := v;
      writepelreg(pel1);
      outp($3C8, pel2);
      dacis8bit := (x=255);
    end;  {dacis8bit}
    function prepDAC : word;     {Sets DAC up to receive command word}
    begin
      dac2comm;
      prepDAC := inp($3C6);
      dac2comm;
    end;  {prepDAC}
    procedure dacmode(andmsk, ormsk : word);
    begin
      ormsk := ormsk and (not andmsk);
      if DAC_RS2 <> 0 then
      begin
        outp($3C6+DAC_RS2,(inp($3C6+DAC_RS2) AND andmsk) OR ormsk);
      end
      else begin
        outp($3C6,(prepDAC AND andmsk) OR ormsk);
        dac2pel;
      end;
    end;  {dacmode}
    procedure testdac;      {Test for type of DAC}
    begin
      DAC_RS2 := 0;
      { DAC_RS3 := 0; }
    end;
    procedure setdac6;
    begin
      dacmode(0, 0);
    end; {setdac6}
    procedure setdac8;
    begin
      dacmode($FD, 2);
    end; {setdac8}
    BEGIN  {main}
     testdac;
     dac8 := false;          {default is normal VGA 6 bit RGB values}
     InitGraph;
     IF LoadPalette(PalName, 0, actualColors) =0
      THEN BEGIN
            CloseRoutines;
            WRITELN('Couldn''t access file '+PalName+' : '+GetErrorMessage);
            Halt
           END
      ELSE BEGIN
           SetPalette(actualColors,TRUE);
           move(actualColors, Dac6Colors, SizeOf(Palette));
           END;
     { sample 8 bit palette converted from a 6 bit palette }
     move(actualColors, Dac8Colors, SizeOf(Palette));
     { index, red, green, blue }
     for i := 0 to 63 do begin
            Dac8Colors[i].red       := i*4;
            Dac8Colors[i].green     := 0;
            Dac8Colors[i].blue      := 0;
            Dac8Colors[i+$40].red   := 0;
            Dac8Colors[i+$40].green := i*4;
            Dac8Colors[i+$40].blue  := 0;
            Dac8Colors[i+$80].red   := 0;
            Dac8Colors[i+$80].green := 0;
            Dac8Colors[i+$80].blue  := i*4;
            Dac8Colors[i+$C0].red   := i*4;
            Dac8Colors[i+$C0].green := i*4;
            Dac8Colors[i+$C0].blue  := i*4;
     end; {for}
     LoadPage(Pic1, SCROLLPAGE);
     GetBackgroundFromPage(SCROLLPAGE);
     Animate; {just to initialize pages}
        repeat
             if keypressed then while keypressed do ch := upcase(readkey);
             case ch of
              'F': FadeIn(BACKGNDPAGE,2000,Fade_Squares);  { sample fade }
              'P': begin                                   { pixel noise }
                     FillPage(1-PAGE, Black);
                     FOR i := 1 TO 20000 DO
                     BEGIN
                      PutPixel(Random(Succ(XMAX)),Random(Succ(YMAX)),Random(256));
                     END;
                   end;
              ' ': begin                         { Space toggles DAC 8/6 }
                    dac8 := not dac8;
                    if dac8 then begin
                         setdac8;
                         SetPalette(Dac8Colors, FALSE);
                         OutTextXY(16,10,BACKGNDPAGE,'DAC=8');
                         end
                    else begin
                         setdac6;
                         SetPalette(Dac6Colors, FALSE);
                         end;
                   end;
             end; {case}
        until (ch = #27)
        setdac6;
        dac2comm;     {Reset DAC}
        outp($3c6,0);
        dac2pel;
     CloseRoutines;
    END.

[Back to EGAVGA SWAG index] [Back to Main SWAG index] [Original]