home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC Interdit
/
pc-interdit.iso
/
graph
/
scal_tst.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1994-10-17
|
6KB
|
138 lines
Uses Crt,Sprites,ModeXLib,Gif,Tools;
Procedure PutScalSprt(pg_ofs,x,y,scale_y:Integer;sSprite:spritetyp);
var planecount, {nombre de plans déjà copiés }
masqueplan:Byte; {masque le plan Write dans le registre 2 du TS }
Skip, {nombre d'octets à sauter }
ofs, {offset courant dans la mémoire d'écran }
plane, {numéro du plan courant }
Largeur, {largeur en nombre d'octets à copier dans une ligne }
dty:Word; {hauteur }
source:Pointer; {pointe sur les données graphiques quand ds varie}
ppp:Array[0..3] of Byte; {nombre de pixels par plan }
rel_y, {partie décimale de l'ordonnée relative }
add_y:Word; {partie décimale à additionner }
direction:Integer; {direction de déplacement (+/- 80)}
i:Word; {compteur d'itérations local }
Begin
if (x + sSprite.dtx > 319) {Clipping ? on arrête }
or (x < 0)
or (y + sSprite.dty*scale_y div 100 > 199) or (y < 0) then exit;
add_y:=100-abs(scale_y); {calcule le nombre à additionner }
if scale_y < 0 then direction:=-80 else direction:=80;
{fixe la direction }
Source:=sSprite.adr; {pointe sur les données graphiques }
dty:=sSprite.dty; {charge la hauteur en local }
plane:=x mod 4; {plan et }
ofs:=pg_ofs+80*y+(x div 4); {offset de début }
Largeur:=0; {initialise la largeur et le saut }
Skip:=0;
i:=sSprite.dtx shr 2; {nombre de groupes de 4 octets complets}
ppp[0]:=i;ppp[1]:=i; {nombre minimum d'octets à copier }
ppp[2]:=i;ppp[3]:=i;
For i:=1 to sSprite.dtx and 3 do{mémorise en ppp les pixels restants }
Inc(ppp[(plane+i - 1) and 3]);{ajoute les pixels en commençant par le plan de début }
asm
push ds {sauve ds}
mov ax,0a000h {charge le segment de destination (VGA)}
mov es,ax
lds si,source {ds:di va pointer sur la source (données graphiques) }
mov cx,plane {crée le masque de plan de début }
mov ax,1 {décale le bit 0 vers la gauche }
shl ax,cl
mov masqueplan,al {sauve le masque }
shl al,4 {le recopie dans le quartet supérieur }
or masqueplan,al
mov planecount,4 {4 plans à copier }
@lplane: {boucle des plans }
mov cl,byte ptr plane {charge le plan courant }
mov di,cx {en di}
mov cl,byte ptr ppp[di] {charge le nombre ppp correspondant en cx }
mov byte ptr Largeur,cl {recalcule skip }
mov ax,direction {forme la différence direction-largeur }
sub ax,cx
mov skip,ax {et écrit le résultat dans skip }
mov rel_y,0 {on recommence en y=0}
mov cx,Largeur {charge la largeur en cx }
or cl,cl {largeur 0, plan terminé }
je @planfini
mov di,ofs {charge en di l'offset de destination dans la mémoire d'écran }
mov ah,masqueplan {réduit le masque de plan aux bits [0..3] }
and ah,0fh
mov al,02h {active le registre 2 du TS (Write Plane Mask)}
mov dx,3c4h
out dx,ax
mov bx,dty {initialise le compteur de lignes y }
@lcopy_y: {boucle des lignes }
@lcopy_x: {boucle des pixels }
lodsb {lit un octet }
or al,al {si 0, passe}
je @Valeur0
stosb {sinon copie }
@entry:
loop @lcopy_x {suite de la boucle }
mov ax,rel_y {ajoute la partie décimale de la constante additionnelle }
add ax,add_y
cmp ax,100 {partie entière à augmenter ?}
jb @noaddovfl {non, on continue }
sub ax,100 {sinon met à jour la partie décimale }
sub di,direction {ligne suivante/précédente }
@noaddovfl:
mov rel_y,ax {réécrit la partie décimale }
dec bx {suite du décomptage de lignes }
je @planfini {compteur = 0, alors plan suivant }
add di,skip {sinon saute au début de ligne suivant }
mov cx,Largeur {réinitialise le compteur de colonnes }
jmp @lcopy_y {retourne dans la boucle des lignes }
@valeur0: {couleur du sprite 0 }
inc di {saute l'octet de destination }
jmp @entry {retourne dans la boucle }
@planfini: {fin de la boucle des lignes }
rol masqueplan,1 {masque le plan suivant }
mov cl,masqueplan {plan 0 sélectionné ?}
and cx,1 {(bit 1 à 1), alors}
add ofs,cx {incrémente de 1 l'offset de destination (bit 1 !)}
inc plane {incrémente le numéro de plan (indice dans ppp) }
and plane,3 {réduit de 0 à 3 }
dec planecount {déjà 4 plans copiés, on arrête }
jne @lplane
pop ds {restaure ds, ciao }
End; {asm}
End;
Var Logo:SpriteTyp;
Sinus:Array[0..99] of Word;
Hauteur:Integer;
i:Word;
Begin
Init_ModeX; {active le mode X }
LoadGif('sprites'); {charge une image avec un logo }
GetSprite(88+ 6*320,150,82,Logo); {initialise le logo }
LoadGif('phint'); {charge l'image d'arrière-plan }
p13_2_ModeX(48000,16000); {et la copie dans la page de fond }
Sin_Gen(Sinus,100,100,0); {calcule une table de sinus }
I:=0; {indice à 0 dans la table des sinus}
repeat
Inc(i); {incrémente l'index }
Hauteur:=Integer(Sinus[i mod 100]); {fixe la hauteur à partir du sinus }
CopyScreen(vpage,48000); {efface le fond }
PutScalSprt(vpage,85,100-Hauteur *84 div 200,Hauteur,Logo);
{copie dans la page courante le sprite en réduction }
Switch; {active la page }
WaitRetrace; {attend le retour de balayage vertical }
Until KeyPressed;
ReadLn;
TextMode(3); {revient au mode texte normal }
End.