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


{Hello All! I've recently coded this screen saver.It really looks like snow
is falling all over, don't you think?
However, I did not set out to do a snow screen saver and if you experiment
with it a little you will see that it can even turn out to be a firework!
If anyone can improve this code or make anything out of it, I would be
very pleased to have a copy of the source.
Please, excuse my English.I haven't practised it for a long time.}

PROGRAM SnowScreenSaver; {Nick Batalas 14-6-1994}
USES crt,dos;
const
  dots =100;   {Set this to more than 100 and the result is awful}

var
  j,k : integer; {loop variables}
  i : longint;
  x,y : array[1..dots] of integer;
  cols    : array[1..dots] of byte;
  f,g : word;

{--------------Procedures Needed For This Great Screen Saver------------}
PROCEDURE SetVideoMode(mode : byte);assembler;
  ASM
    mov AH,0
    mov AL,mode
    int 10h
  END;

PROCEDURE writeDACreg(color,red,green,blue : byte);
  BEGIN
     port[$03C8]:=color;
     port[$03C9]:=red;
     port[$03C9]:=green;
     port[$03C9]:=blue;
  END;

PROCEDURE SetBordColB(color : byte); Assembler;
  ASM
    mov AH,10h
    mov AL,01h
    mov BH,color
    int 10h
  END;

PROCEDURE PutPixel1(x, y : word; color : byte);
  BEGIN
    mem[$A000:x+y*320] := color;
  END;

PROCEDURE HideTextCursor;
  VAR
    regs : registers;

  BEGIN
    regs.ah:= 1;
    regs.cx:=$2000;
    intr($10,regs);
  END;

Procedure WaitrBest;Assembler;
  ASM
    cli
    mov dx,3DAh
    @l1:
    in al,dx
    and al,08h
    jnz @l1
    @l2:
    in al,dx
    and al,08h
    jz  @l2
    sti
  END;

FUNCTION xf3(ux,t : real) : word;   {Calculates the speed of a point}
  BEGIN                             {on the x axis}
    xf3 := round(ux*t)  +160;
  END;

FUNCTION yf3(uy,g,t : real) : word; {Calculates the speed of a point}
  VAR                               {on the y axis (which is affected}
    u,tmax,hmax : real;             {by gravity)}
    ym : array[1..200] of word;
    a  : word;
  BEGIN
    u := uy-g*t;
    a:= round(uy*t-1/2*g*t*t);
    yf3 := 200-a ;
  END;

Function RandomCol :byte;   {Just a random value between 7 and 15 (I think)}
  BEGIN
    randomcol:=random(6)+9;
  END;

{-------------------------------MAIN PROGRAMME-------------------------}
BEGIN
  hideTextCursor;
  j:=-50;                   {calculate the values of the speed of each dot}
  for k:=1 to dots do begin {with this loop}
    j:=j+3;
    x[k]:=j;
    y[k]:=random(150);
  END;
  For i:=1 to dots do      {Calculate the color of each dot}
    cols[i]:= randomcol;
  SetVideoMode($13);
  For i:= 1 to 63 do
    writedacreg(15,i,i,i);
  writedacreg(7,15,15,15);       {modify color registers in order}
  writedacreg(8,20,20,20);       {to give a sense of depth to the}
  writedacreg(9,25,25,25);       {dots}
  writedacreg(10,30,30,30);
  writedacreg(11,35,35,35);
  writedacreg(12,40,40,40);
  writedacreg(13,45,45,45);
  writedacreg(14,50,50,50);
  For i:=1 to 5 do             {the background color turns to dark blue}
    writedacreg(0,0,0,i);
  setbordcolb(0);
  i:=18500;
  j:=1;
  Repeat
    i:=i+1;
    FOR k:=1 to dots do
      putpixel1(xf3(x[k],0.01*i),yf3(y[k],j,0.01*i),cols[k]);
    waitrbest;
    FOR k:=1 to dots do
      putpixel1(xf3(x[k],0.01*i),yf3(y[k],j,0.01*i),0);
  Until keypressed;
  SetVideoMode(3);

END.

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