PROGRAM Smooth;

USES CRT;

PROCEDURE SmoothDown; {Zieht das 'Fenster' nach unten}
VAR Offset,y : WORD;
BEGIN
 FOR y := 0 TO 319 DO BEGIN
  Offset := y*80;
  PORT[$3d4] := $0d;
  PORT[$3d5] := Lo(Offset);   {Lo-Byte des Offsets setzen}
  PORT[$3d4] := $0c;
  PORT[$3d5] := Hi(Offset);   {Hi-Byte des Offsets setzen}
  Delay(10);                  {Anpassen!}
 END;
END;

PROCEDURE SmoothUp;  {Zieht das 'Fenster' nach oben}
VAR Offset,y : WORD;
BEGIN
 FOR y := 319 DOWNTO 0 DO BEGIN
  Offset := y*80;
  PORT[$3d4] := $0d;
  PORT[$3d5] := Lo(Offset);   {Lo-Byte des Offsets setzen}
  PORT[$3d4] := $0c;
  PORT[$3d5] := Hi(Offset);   {Hi-Byte des Offsets setzen}
  Delay(10);                  {Anpassen!}
 END;
END;

PROCEDURE Bildschirmfuellen;
VAR x,y : WORD;
BEGIN
 PORTW[$03ce] := $0ff08; {BitMaske $FF setzen = Alle Pixel setzen}
 PORTW[$03ce] := $0003;  {šberschreibModus}
 PORTW[$03ce] := $0205;  {WriteModus 2}
 FOR y := 0 TO 799 DO
  FOR x := 0 TO 79 DO
   IF y < 480 THEN MEM[$0a000:y*80+x] := y ELSE {0-479 : Horizontal}
    MEM[$0a000:y*80+x] := x;  {Bildschirm 480-799 : Vertikal}
END;

BEGIN
 asm mov ax,0012h; int 10h; end; {Modus 12h einschalten}
  Bildschirmfuellen;
  SmoothDown;
  SmoothUp;
  ReadLn;
 asm mov ax,0003h; int 10h; end; {TextModus}
END.