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

    {
     OK, Sean! I hope this will help you to understand
      my explanation!

     Copper-BAR with 1000 lines (c) Aki Tikkala,1995
    }

    uses crt;
    const
         lines = 1000; delays =30; start = 15; endo = 115;

    var
       x,y,p1,p2,z,r,g,b,gr,gm,ss,red_p,blue_p,green_p,green2_p:integer;
       blue2_p,red2_p,max : integer;
       x1,x2,red_pnt : pointer;
       red_s,blue_s,green_s,green2_s,red2_s,capu :byte;
       cup : boolean;
       cloop:array[1..127] of integer;
       colors:array[1..lines,1..3] of integer;
       clear:array[1..lines,1..3] of integer;
       stab:array[0..255] of word;

    procedure setpalette(c,r,g,b:byte);assembler;
    asm;mov dx,3c8h;mov al,c;mov ah,r;out dx,ax;inc dx;
    mov al,g;out dx,al;mov al,b;out dx,al;end;

    procedure init2;
    begin
          x1 := ptr(seg(colors),ofs(colors)); x2 := ptr(seg(clear),ofs(clear));
          blue_s := 20;green_S := 10;green2_s := 0; red_S := 30;
          max := lines-127; for x := 1 to lines do for z := 1 to 3 do begin
          clear[x,z] := 0; colors[x,z] := 0; end;
          for x := 1 to 63 do begin cloop[x] := x; cloop[x+63] := 63-x;
          end;
    end;

    procedure draw;
    begin
       move(x2^,x1^,sizeof(colors));
       for x := start to endo do
            begin
                 colors[x+green2_p,1] := cloop[x];colors[x+green2_p,2] := 0;
                 colors[x+green2_p,3] := cloop[x];end;
        for x := start to endo do
            begin
                  colors[x+green_p,1] := 0; colors[x+green_p,2] := cloop[x];
                  colors[x+green_p,3] := 0;  end;
        for x := start to endo do
            begin
                 colors[x+blue_p,1] := 0;colors[x+blue_p,2] := 0;
                 colors[x+blue_p,3] := cloop[x];  end;
        for x := start to endo  do
            begin
                  colors[x+red_p,1] := cloop[x];colors[x+red_p,2] := 0;
                  colors[x+red_p,3] := 0; end;
    end;

    procedure main;
    begin
         blue_p := stab[blue_s];inc(blue_s);
         green_p := stab[green_s];inc(green_s);
         green2_p := stab[green2_s];inc(green2_s);
         red_p := stab[red_s];inc(red_s);draw;
    end;

    procedure wait;assembler;
    asm;mov dx,3dah;@w1:in al,dx;test al,8;jnz @w1;
    @w2:in al,dx;test al,8;jz @w2;end;

    procedure waitline;assembler;
    asm;mov dx,3dah;@a1:in al,dx;and al,01;jne @a1;@a2:in al,dx;
    and al,9;cmp al,1;jne @a2;end;

    begin
        for x:=0 to 255 do stab[x]:=round((round(sin(2*pi*x/255)*127)+128)*3.35);
        init2; cup := true; capu := 1;asm; mov ax,0013h;int 10h; end;
        repeat
             wait;
             for b := 1 to delays do waitline; {Do some delay}
        for b := 1 to lines do setpalette(0,colors[b,1],colors[b,2],colors[b,3]);
             main;
        until keypressed;
    end.

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