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

    {
    NB>{Hello All! I've recently coded this screen saver.It really looks like
    NB>snow is falling all over, don't you think?

    Yeah, it looked pretty neat!

    NB>However, I did not set out to do a snow screen saver and if you exp
    NB>with it a little you will see that it can even turn out to be a fir
    NB>If anyone can improve this code or make anything out of it, I would
    NB>very pleased to have a copy of the source.

    Ok, I played around with it a bit today, and following is my modified
    version.  I pretty much just cleaned it up, got rid of all the unused
    variables and stuff (there were quite a few <G>) for readability,
    simplified a the calculations, and removed a lot of the overhead, and
    removed most of the global variables.  You will see that now you can
    have a lot more snowflakes without it bogging out.  I also removed the
    custom palette because you can get pretty much the same colours using
    the default palette (indexes 19-31).  It can probably be simplified
    even further (ie. remove the x and y tables and just use newPos table).
    Oh yeah, I threw in a little snowflake explosion at the start too :-).

    (********************************************************************
     Originally by    : Nick Batalas, 14-6-1994
     Modifications by : Eric Coolman, 19-6-1994
    ********************************************************************)
    }

    Program SnowFall;
    Uses crt;                                  { for keypressed only }

    const
      Flakes = 500;            { try less flakes for faster snowfall }

    {---------------- Stuff not specific to snowfall ----------------}
    Procedure vidMode(mode : byte);assembler;
      asm mov ah,$00;  mov al,mode; int 10h; end;

    Procedure setPixel(pixPos : word; color : byte);
    begin
        mem[$A000:pixPos] := color;
    end;

    {---------------------------MAIN PROGRAM-------------------------}

    var
      CurFlake : integer;                        { snowflake counter }
      i : longint;                       { to add velocity to flakes }
      x,y, newPos: array[0..Flakes] of word;         { lookup tables }
    BEGIN
      randomize;
      for curFlake:=0 to Flakes do        { set up snow lookup table }
      begin
        x[curFlake]:=random(319);
        y[curFlake]:=random(199);
      end;

      vidMode($13);                       { 320x200x256 graphics mode }

      i := 0; { change to 100 or higher to get rid of start explosion }

      repeat
        inc(i);

        for curFlake:=0 to Flakes do
          begin
            setPixel(newPos[curFlake], 0);     { erase old snowflake }
            newPos[curFlake] :=      { set up and draw new snowflake }
              round(x[curFlake]*(i*0.01)) +                  { new X }
              round(y[curFlake]*(i*0.01)) * 320;             { new Y }
            setPixel(newPos[curFlake], (curFlake mod 13) + 19);
          end;

        while (port[$3da] and $08) = $08 do;  { wait for vRetrace to }
        while (port[$3da] and $08) = $00 do;  { start and end        }
      until keypressed;

      vidMode($03);                       { return to 80x25 textmode }
    end.

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