; Programme pour illustrer l'utilisation des registres DAC en sélectionnant ; un jeu contigu et fluide de 256 couleurs, puis en remplissant l'écran ; avec des losanges concentriques dans toutes les 256 couleurs afin ; qu'elles se mélangent les unes aux autres pour former ; un dégradé de couleurs. ; ; Compilé avec TASM 4.0, lié avec TLINK 6.10 ; Testé par Jim Mischel 11/21/94 ; .model small .stack 200h .data ; Table utilisée pour paramétrer toutes les 256 entrées DAC. ; ; Format de la table: ; Byte 0: registre DAC 0 valeur du rouge ; Byte 1: registre DAC 0 valeur du vert ; Byte 2: registre DAC 0 valeur du bleu ; Byte 3: registre DAC 1 valeur du rouge ; Byte 4: registre DAC 1 valeur du vert ; Byte 5: registre DAC 1 valeur du bleu ; : ; Byte 765: registre DAC 255 valeur du rouge ; Byte 766: registre DAC 255 valeur du vert ; Byte 767: registre DAC 255 valeur du bleu ColorTable label byte ; Les 64 premières entrées sont d'un vert pur de plus en plus pâle. X=0 REPT 64 db 0,63-X,0 X=X+1 ENDM ; Les 64 prochaines entrées sont d'un bleu pur de plus en plus intense. X=0 REPT 64 db 0,0,X X=X+1 ENDM ; Les 64 prochaines entrées vont de violet à rouge. X=0 REPT 64 db X,0,63-X X=X+1 ENDM ; Les 64 dernières entrées sont d'un rouge de plus en plus pâle. X=0 REPT 64 db 63-X,0,0 X=X+1 ENDM .code Start: mov ax,0013h ;AH=0 sélectionne la fonction ;initialisation du mode, ;AL=13h sélectionne le mode 320x200 int 10h ;en 256 couleurs ;charge les registres du DAC avec les ;paramétrages de couleur mov ax,@data ;ES pointe sur le segment mov es,ax ;de données par défaut mov dx,offset ColorTable ;ES:DX pointe sur le début du bloc ;des trois valeurs de octets RVB ;pour charger dans les registres du DAC mov ax,1012h ;AH=10h sélectionne la fonction ;initialisation de couleur, ;AL=12h sélectionne la sous-fonction ;set block of DAC registers sub bx,bx ;charge le bloc des registres ;commençant au registre numéro 0 ;du DAC mov cx,100h ;positionne tous les 256 registres int 10h ;charge les registres du DAC ;remplit maintenant la largeur de ;l'écran avec des losanges ;concentriques dans tous les attributs ;des 256 couleurs mov ax,0a000h ;DS pointe sur le segment de la mov ds,ax ;mémoire vidéo affiche des lignes ;diagonales dans le quart supérieur ;gauche de l'écran mov al,2 ;commence avec l'attribut de couleur ;numéro 2 mov ah,-1 ;parcourt les couleurs mov bx,320 ;affiche de haut en bas (distance ;d'une ligne à l'autre) mov dx,160 ;largeur du rectangle mov si,100 ;hauteur du rectangle sub di,di ;commence à (0,0) mov bp,1 ;affiche de gauche à droite (distance ; d'une colonne à l'autre) call FillBlock ;l'affiche ; ;affiche les lignes diagonales dans le quart ; supérieur droit de l'écran mov al,2 ;commence avec l'attribut couleur ;numéro 2 mov ah,-1 ;parcourt les couleurs mov bx,320 ;affiche de haut en bas (distance ;une ligne à l'autre) mov dx,160 ;largeur du rectangle mov si,100 ;hauteur du rectangle mov di,319 ;commence à (319,0) mov bp,-1 ;affiche de droite à gauche (distance ; d'une colonne à l'autre) call FillBlock ;l'affiche ;affiche les lignes diagonales dans ;le quart inférieur ;gauche de l'écran mov al,2 ;commence avec l'attribut couleur ;numéro 2 mov ah,-1 ;parcourt les couleurs mov bx,-320 ;affiche de bas en haut (distance ;d'une ligne à l'autre) mov dx,160 ;largeur du rectangle mov si,100 ;hauteur du rectangle mov di,199*320;commence à (0,199) mov bp,1 ;affiche de gauche à droite (distance ;d'une colonne à l'autre) call FillBlock ;l'affiche ;affiche les lignes diagonales dans le ;quart inférieur droit de l'écran mov al,2 ;commence avec l'attribut couleur ;numéro 2 mov ah,-1 ;parcourt les couleurs mov bx,-320 ;affiche de bas en haut (distance ;d'une ligne à l'autre) mov dx,160 ;largeur du rectangle mov si,100 ;hauteur du rectangle mov di,199*320+319 ;commence à (319,199) mov bp,-1 ;affiche de droite à gauche (distance ;d'une colonne à l'autre) call FillBlock ;l'affiche mov ah,1 ;attend une touche clavier int 21h ; mov ax,0003h ;revient en mode texte int 10h ; mov ah,4ch ;fini--retourne à DOS int 21h ; Remplit les zones rectangulaires spécifiées de l'écran avec les lignes ; diagonales. ; ; Entrée: ; AL = attribut initial avec lequel afficher ; AH = moyenne par laquelle avancer l'attribut d'un ; pixel à l'autre ; BX = distance pour avancer d'un pixel à l'autre ; DX = largeur du rectangle à remplir ; SI = hauteur du rectangle à remplir ; DS:DN = adresse de l'écran du premier pixel à afficher ; BP = offset du début d'une colonne au début de la ; prochaine FillBlock: FillHorzLoop: push di ;préserve le pointeur sur le haut de ;la colonne push ax ;préserve l'attribut initial mov cx,si ;hauteur de la colonne FillVertLoop: mov [di],al ;paramètre le pixel add di,bx ;pointe sur la prochaine rangée dans ;la colonne add al,ah ;avance l'attribut loop FillVertLoop ; pop ax ;restaure l'attribut initial add al,ah ;avance le prochain attribut au ;début de la prochaine colonne pop di ;retrouve le pointeur sur le début ;de la colonne add di,bp ;pointe sur la prochaine colonne dec dx ;avons-nous traité toutes les ;colonnes? jnz FillHorzLoop ;non, passons à la prochaine ;colonne ret ; end Start