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.