; Affiche tous les pixels dans la liste de lignes horizontales transmises, en ; mode 13h, le mode 320x200 en 256 couleurs de VGA. Utilise REP STOS pour remplir ; chaque ligne. ; Appelable depuis C near comme suit: ; void DrawHorizontalLineList(struct HLineList * HLineListPtr, ; int Color); ; ; Lié avec L21-1.C, L21-3.C, et L22-2.C en modèle Small ; Testé avec TASM 4.0 et Borland C++ 4.02 ap Jim Mischel 12/16/94. ; SCREEN_WIDTH equ 320 SCREEN_SEGMENT equ 0a000h HLine struc XStart dw ? ;coordonnée X du pixel le plus ;à gauche ;dans la ligne XEnd dw ? ;coordonnée X du pixel le plus ;à droite ;dans la ligne HLine ends HLineList struc Lngth dw ? ;nombre de lignes horizontales YStart dw ? ;coordonnée Y de la ligne supérieure HLinePtr dw ? ;pointeur sur la liste des lignes ;horizontales HLineList ends Parms struc dw 2 dup(?) ;adresse de retour & BP empilés HLineListPtr dw ? ;pointeur sur la structure HLineList Color dw ? ;couleur avec laquelle remplir Parms ends .model small .code public _DrawHorizontalLineList align 2 _DrawHorizontalLineList proc push bp ;préserve la stack frame de l'appelant mov bp,sp ;pointe sur notre stack frame push si ;préserve les variables registre de ;l'appelant push di cld ;traite les pointeurs des instructions ;de chaîne inc mov ax,SCREEN_SEGMENT mov es,ax ;ES pointe sur la mémoire vidéo ; pour REP STOS mov si,[bp+HLineListPtr] ;pointe sur la liste des ;lignes mov ax,SCREEN_WIDTH ;pointe sur le début de la ;première ligne mul [si+YStart] ;d'affichage dans laquelle ;dessiner mov dx,ax ;ES:DX pointe sur la première ;ligne d'affichage ; à afficher mov bx,[si+HLinePtr];pointe sur le descripteur XS ;tart/XEnd pour la première ;(la plus en haut) ligne ;horizontale mov si,[si+Lngth] ;nombre de lignes d'affichage à ;dessiner and si,si ;y a t-til encore d'autres ; lignes à afficher? jz FillDone ;non, nous avons fini mov al,byte ptr [bp+Color] ;couleur de ;remplissage mov ah,al ;duplique la couleur pour STOSW FillLoop: mov di,[bx+XStart] ;bord gauche de remplissage de ;cette ligne mov cx,[bx+XEnd] ;bord droit de remplissage sub cx,di js LineFillDone ;saute si la largeur est négative inc cx ;largeur de remplissage de cette ;ligne add di,dx ;offset du bord gauche de ;remplissage test di,1 ;le remplissage commence-t-il à ; une adresse impaire? jz MainFill ;non stosb ;oui, afficher l'octet de tête ;impair pour aligner sur un mot le ;reste du remplissage dec cx ;décompte l'octet de tête impair ; du remplissage jz LineFillDone ;terminé si c'était le seul octet MainFill: shr cx,1 ;nombre de mots à remplir rep stosw ;remplit le plus de mots possibles adc cx,cx ;1 s'il y a un octet impair restant ;à traiter, 0 sinon rep stosb ;remplit tout octet impair restant LineFillDone: add bx,size HLine ;point sur le descripteur de l ;a prochaine ligne add dx,SCREEN_WIDTH ;point sur la prochaine ligne ;d'affichage dec si ;décompte les lignes à remplir jnz FillLoop FillDone: pop di ;restaure les variables registre de ;l'appelant pop si pop bp ;restaure la stack frame de l'appelant ret _DrawHorizontalLineList endp end