home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC Interdit
/
pc-interdit.iso
/
graph
/
tscroll.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1994-10-07
|
3KB
|
89 lines
Program defilement_mode_texte;
Uses ModeXLib,Crt;
Var x, {abscisse en pixels}
x_dir, {direction horizontale }
y, {ordonnée en pixels }
y_dir:Word; {direction verticale }
Procedure Wait_In_Display;assembler;
{symétrique de Wait_In_Retrace, attend la génération
de l'image par le rayon cathodique }
asm
mov dx,3dah {Input Status 1}
@wait2:
in al,dx
test al,8h
jnz @wait2 {Image présente ? -> terminé }
End;
Procedure Wait_In_Retrace;assembler;
{attend le retour de balayage vertical, réinitialise
en même temps le flip-flop de l'ATC en effectuant
un accès en lecture au registre Input Status 1 }
asm
mov dx,3dah {Input Status 1}
@wait1:
in al,dx
test al,8h
jz @wait1 {balayage actif ? -> terminé }
End;
Procedure FillScreen;
{remplit la mémoire d'écran avec une image de test de 160*50 caractères}
var i:word;
Begin
For i:=0 to 160*50 do Begin {boucle des caractères}
If i mod 10 <> 0 Then {enregistrer le compteur de colonnes ?}
mem[$b800:i shl 1]:= {non, alors '-'}
Ord('-') Else
mem[$b800:i shl 1]:= {oui, numéro de colonne décompté en dizaines }
((i mod 160) div 10) mod 10 + Ord('0');
If i mod 160 = 0 Then {colonne 0 ? -> enregistre le compteur de lignes }
mem[$b800:i shl 1]:=(i div 160) mod 10 + Ord('0');
End;
End;
Procedure V_Pan(n:Byte);assembler;
{exécute un panoramique vertical}
asm
mov dx,3d4h {registre 8 du CRTC (Inittial Row Adress)}
mov al,8
mov ah,n {fixe le déplacement panoramique }
out dx,ax
End;
Procedure H_Pan(n:Byte);assembler;
{exécute un panoramique horizontal }
asm
mov dx,3c0h {Index/Data Port de l'ATC}
mov al,13h or 32d {sélectionne le registre 13 h (Horizontal Pixel Paning)}
out dx,al {met à 1 le bit 5 (Palette RAM Address Source)}
mov al,n { pour ne pas couper l'écran }
or al,32d {fixe le déplacement panoramique }
out dx,al
End;
Begin
TextMode(3); {mode 3 du BIOS (80*25 caractères, couleur)}
FillScreen; {construit l'image de test }
portw[$3d4]:=$5013; {double largeur d'écran virtuelle (160 caractères)}
x:=0; {initialise les coordonnées et directions }
x_dir:=1;
y:=0;
y_dir:=1;
Repeat
Inc(x,x_dir); {déplacement horizontal et vertical }
Inc(y,y_dir);
If (x<=0) or (x>=80*9) {changement de direction au bord }
Then x_dir:=-x_dir;
if (y<=0) or (y>=25*16)
Then y_dir:=-y_dir;
Wait_in_Display; {attend la génération de l'image }
SetStart((y div 16 *160) {recale l'adresse de début (défilement grossier }
+ x div 9);
Wait_in_Retrace; {attend le retour de balayage }
V_Pan(y mod 16); {panoramique vertical (défilement fin)}
H_Pan((x-1) mod 9); {panoramique horizontal (défilement fin)}
Until KeyPressed; {attend une frappe de touche }
TextMode(3); {remet le mode vidéo normal }
End.