home *** CD-ROM | disk | FTP | other *** search
- 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.
-