; Affiche tous les pixels de la liste de lignes horizontales du mode 13h, mode ; 320x200 en 256 couleurs du VGA. Utilise REP STOS pour remplir chaque ligne. ; ****************************************************************** ; NOTE: peut inverser les coordonnées X pour chaque ligne d'affichage, ; s'il est nécessaire que XStart < XEnd. Prévoit et que le coté le plus à droite sur ; toute ligne d'affichage soit au format +1; c'est-à-dire que XEnd est supérieure ; de 1 au pixel le plus à droite à afficher. Si XStart == XEnd, ; rien n'est affiché sur cette ligne d'affichage. ; ****************************************************************** ; Appelable en C near comme suit: ; void DrawHorizontalLineList(struct HLineList * HLineListPtr, int Color); ; Testé avec TASM 4.0 par 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 la plus haute HLinePtr dw ? ;pointeur sur la liste des lignes horizontales HLineList ends Parms struc dw 2 dup(?) ;adresse de retour & BP empilé HLineListPtr dw ? ;pointeur sur la structure HLineList Color dw ? ;couleur de remplissage 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 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 de ligne mov ax,SCREEN_WIDTH ;pointe sur la première ligne d'affichage mul [si+YStart] ; dans laquelle afficher mov dx,ax ;ES:DX pointe sur la première ligne d'affichage à ;afficher mov bx,[si+HLinePtr];pointe sur le descripteur XStart/XEnd ;pour la première ligne horizontale (en haut) mov si,[si+Lngth] ;nombre de lignes d'affichage à afficher and si,si ;y a-t-il d'autres lignes à afficher? jz FillDone ;non, nous avons donc fini mov al,byte ptr [bp+Color] ;couleur de remplissage mov ah,al ;duplique la couleur pour STOSW FillLoop: mov di,[bx+XStart] ;coté gauche de remplissage sur cette ligne mov cx,[bx+XEnd] ;coté droit de remplissage cmp di,cx ;est-ce que XStart > Xend ? jle NoSwap ;non, xchg di,cx ;oui, donc inversons les coté NoSwap: sub cx,di ;largeur de remplissage sur cette ligne jz LineFillDone ;saute si la largeur est zéro add di,dx ;offset du coté gauche de remplissage test di,1 ;le remplissage commence-t-il à une adresse impaire? jz MainFill ;non stosb ;oui, affiche 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 ;fini, si l'octet était le seul MainFill: shr cx,1 ;nombre de mots de remplissage rep stosw ;remplit autant de mots que possible adc cx,cx ;1 s'il y a un octet impair ;à faire, sinon 0 rep stosb ;remplit tout octet impair LineFillDone: add bx,size HLine ;pointe sur le descripteur de la prochaine ligne add dx,SCREEN_WIDTH ;pointe sur la prochaine ligne d'affichage dec si ;décompte les ligne à 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