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

{
> You can't scroll bits with pageflips, you can, however, do a hardware
> pixel by pixel scroll (pixel panning).

{ Example for hardware scroll, Arne de Bruijn, 1994, PD }
uses Graph,Crt;

procedure SetStart(X,Y:word); assembler;
asm
 mov dx,3dah          { Port $3DA }
 in al,dx             { Read = clear $3C0 to index }
 mov dl,0c0h          { Port $3C0 }
 mov al,33h           { Index $13 = Horiz Pixel Panning, +$20 = enable disp }
 out dx,al            { Send index }
 mov bx,X             { Calculate pixel number (lower 3 bits) }
 mov al,bl
 and al,7
 out dx,al            { Send pixel number }
 mov ax,80
 mul Y                { Offset is Y*80+(X div 8) }
 shr bx,1
 shr bx,1
 shr bx,1             { bx shr 3, is bx div 8 }
 add bx,ax
 mov dx,03d4h         { Port $3D4 }
 mov al,0ch           { Index $0C, high start }
 mov ah,bh            { Data  high byte of BX, is high byte of offset }
 out dx,ax            { Send to VGA }
 inc ax               { Index $0D, low start }
 mov ah,bl            { Data  low byte of BX, is low byte of offset }
 out dx,ax            { Send to VGA }
end;

procedure SetWidth(B:byte); assembler;
asm
 mov dx,3d4h          { Port $3D4 }
 mov al,13h           { Index $13, set display memory width }
 mov ah,B             { Data  B   }
 out dx,ax            { Send to VGA }
end;

var
 SX,SY,I:word;
 gd,gm:integer;
 a:char;
begin
 gd:=vga; gm:=vgahi;
 InitGraph(gd,gm,'e\bp\bgi'); { Init BGI and VGA to 640x480x16 }
 asm
  mov ax,0dh          { Change VGA to 320x200x16 to show scrolling }
  int 10h             { (BGI still thinks 640x480x16, so we can scroll) }
 end;
 SetWidth(40);           { Set video display memory width at 640 }
 for I:=0 to 100 do
  begin
   SetColor(Random(16));
   Line(Random(640),Random(480),Random(640),Random(480));
  end;
 SX:=0; SY:=0;
 repeat
  SetStart(SX,SY);
  a:=readkey;
  case a of
   #0:
    case readkey of
     #75:if SX>0 then Dec(SX);
     #77:if SX<639 then Inc(SX);
     #72:if SY>0 then Dec(SY);
     #80:if SY<479 then Inc(SY);
    end;
  end;
 until A=#27;
 CloseGraph;
end.

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