*/
Got something to write about? Check out our Article Builder.
*/

View \VGA256.PAS

Full Source Code To Vision Bbs System

Submitted By: WEBMASTER
Rating: (Not rated) (Rate It)


{-------------------------------------------------------------------}
{ A simple program to illustrate how to plot pixels and draw lines  }
{ in the 320x200 256 color mode available on the VGA and MCGA cards }
{                                                                   }
{ Last update: 5/24/88 by John Sieraski 76117,2022                  }
{-------------------------------------------------------------------}

{$R-,S-}

uses
  Crt, Dos;

procedure PutPixel(X, Y : word; Color : byte);
{ Plot a pixel at (X, Y) in Color }
begin
  Mem[$A000:Y*320+X] := Color;
end;

procedure Switch(var First, Second : integer);
{ Exchange the values of First and second }
var
  Temp : integer;
begin
  Temp := First;
  First := Second;
  Second := Temp;
end; { Switch }

procedure Line(X1, Y1, X2, Y2, Color : integer);
{ Uses Bressenham's algorithm for drawing a line }
var
  LgDelta, ShDelta, LgStep, ShStep, Cycle, PointAddr : integer;

begin
  LgDelta := X2 - X1;
  ShDelta := Y2 - Y1;
  if LgDelta < 0 then
    begin
      LgDelta := -LgDelta;
      LgStep := -1;
    end
  else
    LgStep := 1;
  if ShDelta < 0 then
    begin
      ShDelta := -ShDelta;
      ShStep := -1;
    end
  else
    ShStep := 1;
  if LgDelta > ShDelta then
    begin
      Cycle := LgDelta shr 1; { LgDelta / 2 }
      while X1 <> X2 do
      begin
        Mem[$A000:Y1*320+X1] := Color; { PutPixel(X1, Y1, Color); }
        Inc(X1, LgStep);
        Inc(Cycle, ShDelta);
        if Cycle > LgDelta then
        begin
          Inc(Y1, ShStep);
          Dec(Cycle, LgDelta);
        end;
      end;
    end
  else
    begin
      Cycle := ShDelta shr 1; { ShDelta / 2 }
      Switch(LgDelta, ShDelta);
      Switch(LgStep, ShStep);
      while Y1 <> Y2 do
      begin
        Mem[$A000:Y1*320+X1] := Color; { PutPixel(X1, Y1, Color); }
        Inc(Y1, LgStep);
        Inc(Cycle, ShDelta);
        if Cycle > LgDelta then
        begin
          Inc(X1, ShStep);
          Dec(Cycle, LgDelta);
        end;
      end;
    end;
end; { Line }

procedure SetMode(Mode : byte);
{ Interrupt $10, sub-function 0 - Set video mode }
var
  Regs : Registers;
begin
  with Regs do
  begin
    AH := 0;
    AL := Mode;
  end;
  Intr($10, Regs);
end; { SetMode }

var
  Row   : integer;
  Color : byte;
  Ch    : char;
begin
  SetMode($13){ 320x200 256 color mode for VGA and MCGA cards }
  Color := 0;
  for Row := 0 to 199 do           { Draw some lines }
  begin
    if Odd(Row) then
    begin
      Line(0, Row, 319, Row, Color);
      Inc(Color);
    end;
  end;
  Ch := ReadKey;
  TextMode(co80);
end.

corner
© 1996-2008 CommunityHeaven LLC. All rights reserved. Reproduction in whole or in part, in any form or medium without express written permission is prohibited.
Violators of this policy may be subject to legal action. Please read our Terms Of Use and Privacy Statement for more information.
North American business development: Nicolai Wadstrom. Publisher: Lars Hagelin.