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

{
Here's a demo for a REAL smooth textscroll. Reset lines to something usefull,
cut the sideborders, place some readable text, and your scroller is ready! ;-)

}
program smoothtextscroll;
{ by Bas van Gaalen and Sven van Heel, Holland, PD }
uses crt;
const vidseg:word=$b800; lines=23;
var ofs:byte;

procedure vertrace; assembler; asm
  mov dx,03dah; @vert1: in al,dx; test al,8; jnz @vert1
  @vert2: in al,dx; test al,8; jz @vert2; end;

procedure setaddress(ad:word); assembler; asm
  mov dx,3d4h; mov al,0ch; mov ah,[byte(ad)+1]; out dx,ax
  mov al,0dh; mov ah,[byte(ad)]; out dx,ax; end;

procedure setsmooth(smt:byte); assembler; asm
  mov dx,03c0h; mov al,13h+32; out dx,al; inc dx; in al,dx
  and al,11110000b; mov ah,smt; or al,ah; dec dx; out dx,al; end;

procedure setup(ad:word); assembler;
asm
  mov dx,3d4h
  mov al,18h
  mov ah,[byte(ad)]
  out dx,ax
  mov al,7
  out dx,al
  inc dx
  in al,dx
  dec dx
  mov ah,[byte(ad)+1]
  and ah,00000001b
  shl ah,4
  and al,11101111b
  or al,ah
  mov ah,al
  mov al,7
  out dx,ax

  mov al,9
  out dx,al
  inc dx
  in al,dx
  dec dx
  mov ah,[byte(ad)+1]
  and ah,00000010b
  shl ah,5
  and al,10111111b
  or al,ah
  mov ah,al
  mov al,9
  out dx,ax

  mov dx,03c0h
  mov al,10h+32
  out dx,al
  inc dx
  in al,dx
  and al,11011111b
  or al,00100000b
  dec dx
  out dx,al
end;

var x,y,i:word; cx:byte;
begin
  setup(lines*16);
  setaddress((25-lines)*80);
  gotoxy(1,1);
  writeln('Hey, a smooth textscroll...');
  x:=0; cx:=0;
  randomize;
  repeat
    vertrace;
    setsmooth(x); ofs:=ofs mod 4;
    x:=(1+x) mod 9; if x=0 then begin
      for y:=0 to lines-1 do begin
        move(mem[$b800:160*(25-lines+y)+4],mem[$b800:160*(25-lines+y)+2],158);
        mem[$b800:(25-lines+y)*160+158]:=random(26)+32;
      end;
    end;
  until keypressed;
  textmode(lastmode);
end.

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