[Back to EGAVGA SWAG index] [Back to Main SWAG index] [Original]
{
I also wanted to put a picture bigger than the screen to scroll over
For the intro. -- ANIVGA --
}
Program ScrollExample;
{Demonstrates how to use the VGA's hardware scroll to do some nice opening}
{sequence: the Program loads 3 Graphic pages With data and then scrolls }
{them by. note that this erases the contents of the background page and }
{thus shouldn't be used While animating sprites in parallel!}
Uses
ANIVGA, Crt;
Procedure IntroScroll(n,wait:Word);
{ in: n = # rows to scroll up using hardware zoom}
{ wait = time (in ms) to wait after each row }
{rem: Scrolling *always* starts at page 0 (=$A000:0000) }
{ Thus, issuing "Screen(1-page)" afterwards is a must!}
{ if you put the routine into ANIVGA.PAS, you should delete all the}
{ Constants following this line}
Const
StartIndex=0;
endIndex=StartIndex+3;
{offsetadressen der Grafikseiten (in Segment $A000):}
offset_Adr:Array[StartIndex..endIndex] of Word=($0000,$3E80,$7D00,$BB80);
CrtAddress=$3D4; {if monochrome: $3B4}
StatusReg =$3DA; {if monochrome: $3BA}
begin
Screen(0); {position at $A000:0000}
Asm
xor SI,SI {use page address 0 }
and SI,3
SHL SI,1
ADD SI,ofFSET offset_Adr-StartIndex*2 {call this "defensive Programming"..}
LODSW
MOV BX,AX
MOV CX,n
MOV SI,wait
@oneline:
ADD BX,LinESIZE
CLI {no inTs please!}
MOV DX,StatusReg
@WaitnotHSyncLoop:
in al,dx
and al,1
jz @WaitnotHSyncLoop
@WaitHSyncLoop:
in al,dx
and al,1
jz @WaitHSyncLoop
MOV DX,CrtAddress {Crt-controller}
MOV AL,$0D {LB-startaddress-register}
OUT DX,AL
inC DX
MOV AL,BL
OUT DX,AL {set new LB of starting address}
DEC DX
MOV AL,$0C
OUT DX,AL
inC DX
MOV AL,BH {dto., HB}
OUT DX,AL
STI
PUSH BX
PUSH CX
PUSH SI
PUSH SI
CALL Crt.Delay
POP SI
POP CX
POP BX
LOOP @oneline
end;
end;
begin
InitGraph; {Program VGA into Graphic mode, clear all pages}
{--- Start of Intro ---}
Screen(0); {or SCROLLPAGE, just an aesthetic question...}
{Load 3 pages With pics, or draw them:}
LoadPage('1st.PIC',0);
LoadPage('2nd.PIC',1);
LoadPage('3rd.PIC',BackgndPage);
IntroScroll(3*200,20); {scroll up 3 pages, wait 20ms}
Delay(3000); {wait a few seconds}
Screen(1-page); {restore correct mode}
{--- end of Intro ---}
{now do your animations as usual}
{...}
CloseRoutines;
end.
{
if you adjust LoadPage() to allow loading into Graphic page 3 (=SCROLLPAGE),
too, you may easily do a 4 screen hardware scroll!
}
[Back to EGAVGA SWAG index] [Back to Main SWAG index] [Original]