program super_scroller;

{$M $3200,0,0 }   { 8K stack, no heap }
uses crt,dos;

type
  screen = array [1..25,1..160] of char;

var
  n:integer;
  a:char;
  normint:procedure;

  function getchar(x,y:integer):char;
  var
    t:screen absolute $b800:0000;
  begin
    getchar:=t[y,x*2-1];
  end;

  procedure putchar(x,y:integer;ch:char);
  var
    t:screen absolute $b800:0000;
  begin
    t[y,x*2-1]:=ch;
  end;

{$f+}
  procedure scroll; interrupt;
  var
    ch:char;
    i,x,y:integer;
  begin
    x:=wherex;
    y:=wherey;
    n:=n+1;
    if n>25 then n:=1;
    ch:=getchar(1,n);
    for i:=1 to 79 do
    begin
      putchar(i,n,getchar(i+1,n));
    end;
    putchar(80,n,ch);
    gotoxy(x,y);
    inline ($9C); { PUSHF -- Push flags }
    normint;
  end;
{$f-}

begin
{  gotoxy(1,25);
  write('This is a test!');
  for n:=1 to 200 do
  begin
      scroll;
  end;}
  n:=0;
  GetIntVec($8,@normint);
  SetIntVec($8,Addr(scroll));
{  gotoxy(1,25);
  write('This is a test');
  gotoxy(1,1);
{  repeat
  until keypressed;
{  for n:=1 to 30 do readln;}
{  setIntVec($8,Addr(normint));}
  keep(0);
end.
