; Utilitaires en Assembleur pour l'animation par recouvrement de rectangle ; Assemblé avec TASM 4.0 par Jim Mischel 12/16/94. ; Remplit un rectangle dans le tampon spécifié. Appelable en C comme suit: ; ; void FillRect(char far * BufferPtr, int RectHeight, int RectWidth, ; int BufferWidth, int Color); ; .model small .code parms struc dw ? ;BP empilé dw ? ;adresse de retour empilée BufferPtr dd ? ;pointeur far sur le tampon dans lequel remplir RectHeight dw ? ;hauteur du rectangle à remplir RectWidth dw ? ;largeur du rectangle à remplir BufferWidth dw ? ;largeur du tampon dans lequel remplir Color dw ? ;couleur de remplissage parms ends public _FillRect _FillRect proc near cld push bp mov bp,sp push di les di,[bp+BufferPtr] mov dx,[bp+RectHeight] mov bx,[bp+BufferWidth] sub bx,[bp+RectWidth] mov al,byte ptr [bp+Color] mov ah,al ;double la couleur pour REP STOSW RowLoop: mov cx,[bp+RectWidth] shr cx,1 rep stosw adc cx,cx rep stosb add di,bx ;pointe sur la prochaine ligne à remplir dec dx ;décompte les rangées à remplir jnz RowLoop pop di pop bp ret _FillRect endp ; Affiche un sprite dans le tampon spécifié. Appelable en C comme suit: ; void DrawMasked(char far * BufferPtr, char * Pixels, char * Mask, ; int ImageHeight, int ImageWidth, int BufferWidth); parms2 struc dw ? ;BP empilé dw ? ;adresse de retour empilé BufferPtr2 dd ? ;pointeur far sur le tampon dans lequel afficher Pixels dw ? ;pointeur sur les pixels de l'image Mask dw ? ;pointeur sur le masque de l'image ImageHeight dw ? ;hauteur de l'image à afficher ImageWidth dw ? ;largeur de l'image à afficher BufferWidth2 dw ? ;largeur du tampon dans lequel afficher parms2 ends public _DrawMasked _DrawMasked proc near cld push bp mov bp,sp push si push di les di,[bp+BufferPtr2] mov si,[bp+Mask] mov bx,[bp+Pixels] mov dx,[bp+ImageHeight] mov ax,[bp+BufferWidth2] sub ax,[bp+ImageWidth] mov [bp+BufferWidth2],ax RowLoop2: mov cx,[bp+ImageWidth] ColumnLoop: lodsb ;récupère le prochain octet du masque and al,al ;affiche ce pixel? jz SkipPixel ;non mov al,[bx] ;oui, affiche le pixel mov es:[di],al SkipPixel: inc bx ;pointe sur le prochain pixel de source inc di ;pointe sur le prochain pixel de destination dec cx jnz ColumnLoop add di,[bp+BufferWidth2] ;pointe sur la prochaine ligne d'affichage à remplir dec dx ;décompte les rangées à remplir jnz RowLoop2 pop di pop si pop bp ret _DrawMasked endp ; Copie un rectangle d'un tampon à l'autre. Appelable en C comme suit: ; void CopyRect(DestBufferPtr, SrcBufferPtr, CopyHeight, CopyWidth, ; DestBufferWidth, SrcBufferWidth); parms3 struc dw ? ;BP empilé dw ? ;adresse de retour empilée DestBufferPtr dd ? ;pointeur far sur le tampon dans lequel copier SrcBufferPtr dd ? ;pointeur far à partir duquel copier CopyHeight dw ? ;hauteur du rectangle à copier CopyWidth dw ? ;largeur du rectangle à copier DestBufferWidth dw ? ;largeur du tampon dans lequel copier SrcBufferWidth dw ? ;largeur du tampon à partir duquel copier parms3 ends public _CopyRect _CopyRect proc near cld push bp mov bp,sp push si push di push ds les di,[bp+DestBufferPtr] lds si,[bp+SrcBufferPtr] mov dx,[bp+CopyHeight] mov bx,[bp+DestBufferWidth] sub bx,[bp+CopyWidth] mov ax,[bp+SrcBufferWidth] sub ax,[bp+CopyWidth] RowLoop3: mov cx,[bp+CopyWidth] ;nombre d'octets à copier shr cx,1 rep movsw ;copie autant de mots possible adc cx,cx rep movsb ;copie l'octet impair, si add si,ax ;pointe sur la prochaine ligne d'affichage de source add di,bx ;pointe sur la prochaine ligne d'affichage de destination dec dx ;décompte les rangées à remplir jnz RowLoop3 pop ds pop di pop si pop bp ret _CopyRect endp end