MODULE Sparks;

IMPORT g:   Graphics,
       I:   Intuition,
       sys: SYSTEM;

(* $OvflChk- $RangeChk- $StackChk- $NilChk- $ReturnChk- $CaseChk- *)

CONST
  maxLines = 64;
  maxLineSet = {0..5};
  erase = 0;
  x = 0;
  y = 1;
  start = 0;
  end   = 1;

TYPE
  point = ARRAY 2 OF INTEGER; (* x,y *)
  line  = ARRAY 2 OF point;   (* start,end *)

VAR
  i: INTEGER;
  ns: I.NewScreen;
  screen: I.ScreenPtr;
  Ciapra[0BFE001H]: SHORTSET;
  lines: ARRAY maxLines OF line;
  l: line;
  cl: INTEGER;
  color,coldir: INTEGER;
  deltas: line;


PROCEDURE colors; (* $EntryExitCode- *)
BEGIN
sys.INLINE(
      0000H,0F00H,0F30H,0F60H,0F90H,0FC0H,0FF0H,0CF0H,
      09F0H,06F0H,03F0H,00F0H,00F3H,00F6H,00F9H,00FCH,
      00FFH,00CFH,009FH,006FH,003FH,000FH,030FH,060FH,
      090FH,0C0FH,0F0FH,0F3FH,0F6FH,0F9FH,0FCFH,0FFFH);
END colors;


PROCEDURE DrawLine(VAR l: line; color: INTEGER);

VAR rp: g.RastPortPtr;

BEGIN
  rp := sys.ADR(screen.rastPort);
  g.SetAPen(rp,color);
  g.SetDrMd(rp,g.jam1);
  g.Move(rp,l[start,x],l[start,y]);
  g.Draw(rp,l[end,  x],l[end,  y]);
END DrawLine;


PROCEDURE Adjust(VAR c,dc: INTEGER; max: INTEGER);

VAR
  i: INTEGER;
  VHPosR[0DFF006H]: SET;

BEGIN
  i := dc - 8;
  INC(c,i);
  IF (c<0) OR (c>=max) THEN
    DEC(c,i);
    i := sys.VAL(INTEGER,VHPosR*{0..3});
    IF i>7 THEN INC(i,1) END;
    dc := i;
  END;
END Adjust;



BEGIN

  ns.width  := g.gfx.normalDisplayColumns DIV 2;
  ns.height := -1;
  ns.depth  := 5;
  ns.type   := I.customScreen+{I.screenQuiet};
  screen := I.OpenScreen(ns);

  IF screen#NIL THEN

    g.LoadRGB4(sys.ADR(screen.viewPort),sys.VAL(LONGINT,colors),32);

    color:=1; coldir := 1;

    REPEAT

      DrawLine(lines[cl],erase);

      INC(color,coldir);
      CASE color OF 1,31: coldir := -coldir ELSE END;

      i := start;
      REPEAT
        Adjust(l[i,x],deltas[i,x],screen.width);
        Adjust(l[i,y],deltas[i,y],screen.height);
        INC(i);
      UNTIL i>end;

      DrawLine(l,color);
      lines[cl] := l;

      cl := sys.VAL(INTEGER,sys.VAL(SET,cl+1)*maxLineSet);

    UNTIL NOT(6 IN Ciapra);

    I.CloseScreen(screen);

  END

END Sparks.

