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

program Julia;
{program computes and displays a Julia Set using VGA 256 color graphics in
 mode 13h.  written by Andrew Key and released to the public domain.  not
 guaranteed -- use at own risk (but it has been put through limited tests...)
 }
uses
  Crt;

const
  MX = 100;  {horizontal number of pixels}
  MY = 100;  {vertical num. of pixels}

type
  Complex = record                           {Data type for complex numbers}
              A,Bi: real;
            end;
  VGAMemType = array[1..200,1..320] of byte; {addressed y,x}

var
  Num, C: Complex;
  X,Y,SaveMode,I: integer;
  ch: char;
  VGAMem : VGAMemType Absolute $A000:$0000;  {accesses actual video memory}

procedure SetMode(mode: integer); assembler; {sets video card to specified
                                              mode}
  asm
    mov ax,mode
    int $10            {Video interrupt}
  end;

function CurrentMode: integer; assembler;    {returns current video mode}
  asm
    mov ax,$0f00
    int $10
    xor ah,ah
  end;

procedure SqCplx(var N: complex);  {squares a variable of type Complex)}
  var
    temp: real;
  begin
    temp:= (N.A * N.A) - (N.Bi * N.Bi);
    N.Bi:= 2 * N.A * N.Bi;
    N.A:= temp;
  end;

procedure AddCplx(var X: complex; Y: complex);
{Adds two complex variables -- X := X + Y}
  begin
    X.A := X.A + Y.A;
    X.Bi:= X.Bi + Y.Bi;
  end;

function SqDist(X: complex): real;
{Computes the square of the distance from the point X to the origin}
  begin
    SqDist := X.A * X.A + X.Bi * X.Bi;
  end;

procedure ClrVidScr; {Clears video screen in mode 13h}
  var x,y: integer;
  begin
    for x:=1 to 320 do
      for y:=1 to 200 do
        VGAMem[y,x]:=0;
  end;

begin
  {Get values for complex constant}
  ClrScr;
  write('Real part: ');
  readln(C.A);
  write('Imaginary part: ');
  readln(C.Bi);

  {set video mode to 320*200*256 VGA and clear screen}
  SaveMode:= CurrentMode;  {save current mode}
  SetMode($13);            {set mode 13h}
  ClrVidScr;

  {compute julia set}
  for y:= 0 to (MY-1) do
    for x:= 0 to (MX-1) do
      begin
        Num.A := -2 + x / ( MX / 4);  {compute REAL component}
        Num.Bi:= 2 - y / ( MX / 4);   {compute IMAGINARY component}
        I:=0;                         {reset number of iterations}
        repeat
          SqCplx(Num);                {square the complex number}
          AddCplx(Num,C);             {and add the complex constant}
          Inc(I);
        until ((I>=255) or (SqDist(Num)>4));
        VGAMem[y+1,x+1]:=I;           {plot the point}
      end;

  {julia set completed}
  ch:=readkey;                        {wait for a keypress}
  SetMode(SaveMode);                  {return to original mode}
end.

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