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

    program SinusScroll;
    { Enhanced sinus-scroll, by Bas van Gaalen, Holland, PD }
    const
      GSeg = $a000;
      Sofs = 140; Samp = 40; Slen = 255;
      Size = 2; Curve = 3;
      Xmax = 279 div Size; Ymax = 7;
      ScrSpd = -1;
      ScrText : string =
        ' Hai world... This looks a bit like the scroll of the second part'+
        ' of Future Crew''s Unreal demo (part one)...     It''s not filled'+
        ' but it sure looks nicer (imho)...                               ';
    type SinArray = array[0..Slen] of word;
    var Stab : SinArray; Fseg,Fofs : word;

    procedure CalcSinus; var I : word; begin
      for I := 0 to Slen do Stab[I] := round(sin(I*4*pi/Slen)*Samp)+Sofs; end;

    procedure GetFont; assembler; asm
      mov ax,1130h; mov bh,1; int 10h; mov Fseg,es; mov Fofs,bp; end;

    procedure SetGraphics(Mode : word); assembler; asm
      mov ax,Mode; int 10h end;

    function keypressed : boolean; assembler; asm
      mov ah,0bh; int 21h; and al,0feh; end;

    procedure Scroll;
    type
      ScrArray = array[0..Xmax,0..Ymax] of byte;
      PosArray = array[0..Xmax,0..Ymax] of word;
    var
      PosTab : PosArray;
      BitMap : ScrArray;
      X,I,SinIdx : word;
      Y,ScrIdx,CurChar : byte;
    begin
      fillchar(BitMap,sizeof(BitMap),0);
      fillchar(PosTab,sizeof(PosTab),0);
      ScrIdx := 1; SinIdx := 0;
      repeat
        Curchar := ord(ScrText[ScrIdx]);
        inc(ScrIdx); if ScrIdx = length(ScrText) then ScrIdx := 1;
        for I := 0 to 7 do begin
          move(BitMap[1,0],BitMap[0,0],(Ymax+1)*Xmax);
          for Y := 0 to Ymax do
            if ((mem[Fseg:Fofs+8*CurChar+Y] shl I) and 128) <> 0 then
              BitMap[Xmax,Y] := ((ScrIdx+Y-I) mod 60)+32 else BitMap[Xmax,Y] := 0;
          while (port[$3da] and 8) <> 0 do;
          while (port[$3da] and 8) = 0 do;
          for X := 0 to Xmax do
            for Y := 0 to Ymax do begin
              mem[GSeg:PosTab[X,Y]] := 0;
              PosTab[X,Y] := (Size*Y+STab[(SinIdx+X+Curve*Y) mod
    SLen])*320+Size*X+STab[(X+Y) mod SLen]-SOfs;          mem[GSeg:PosTab[X,Y]] :=
    BitMap[X,Y];
            end;
          SinIdx := (SinIdx+ScrSpd) mod SLen;
        end;
      until keypressed;
    end;

    begin
      CalcSinus;
      GetFont;
      SetGraphics($13);
      Scroll;
      SetGraphics(3);
    end.

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