[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]