; Programme pour illustrer les capacités de correspondance de couleur ; des registres de la palette EGA. ; ; Assemblé avec TASM 4.0, lié avec TLINK 6.10 ; Testé par Jim Mischel 11/21/94 ; VGA_SEGMENT equ 0a000h SC_INDEX equ 3c4h ;registre Index SC MAP_MASK equ 2 ;index du registre Map Mask dans SC BAR_HEIGHT equ 14 ;hauteur de chaque barre TOP_BAR equ BAR_HEIGHT*6 ;commence un peu en bas des barres ; pour laisser de la place à du texte ; stack segment para stack 'STACK' db 512 dup (?) stack ends ; Data segment word 'DATA' KeyMsg db 'Appuyez sur n'importe quelle touche pour voir le prochain jeu de couleur. ' db 'Il y a 64 jeux de couleurs en tout. ' db 0dh, 0ah, 0ah, 0ah, 0ah db 13 dup (' '), 'Attribute' db 38 dup (' '), 'Color$' ; ; Utilisé pour étiqueter les attributs des barres de couleur. ; AttributeNumbers label byte x= 0 rept 16 if x lt 10 db '0', x+'0', 'h', 0ah, 8, 8, 8 else db '0', x+'A'-10, 'h', 0ah, 8, 8, 8 endif x= x+1 endm db '$' ; ; Utilisé pour étiqueter les couleurs des barres de couleur. (les valeurs de couleur ; sont remplies à la volée.) ; ColorNumbers label byte rept 16 db '000h', 0ah, 8, 8, 8, 8 endm COLOR_ENTRY_LENGTH equ ($-ColorNumbers)/16 db '$' ; CurrentColor db ? ; ; Espace pour le tableau des 16 couleurs que nous passerons au BIOS, plus ; un overscan de noir. ; ColorTable db 16 dup (?), 0 Data ends ; Code segment assume cs:Code, ds:Data Start proc near cld mov ax,Data mov ds,ax ; ; Passe en mode graphique hi-res. ; mov ax,10h ;AH = 0 signifie initialisation ;du mode ;AL = 10h sélectionne le mode ;graphique ; hi-res int 10h ;interruption vidéo du BIOS ; ; Met le texte adéquat. ; mov ah,9 ;fonction affichage de chaîne de DOS mov dx,offset KeyMsg int 21h ; ; Met les barres de couleur dans une des valeurs possibles de pixel ; (que nous appellerons attributs). ; mov cx,16 ;nous mettrons 16 barres de couleur sub al,al ;commence par l'attribut 0 BarLoop: push ax push cx call BarUp pop cx pop ax inc ax ;sélectionne le prochain attribut loop BarLoop ; ; Met les étiquettes d'attributs. ; mov ah,2 ;fonction du paramètre de la position ; du curseur de l'interruption vidéo sub bh,bh ;page 0 mov dh,TOP_BAR/14 ;compter dans les rangées de ;caractères correspond au haut de ; la première barre, compter dans ; les lignes d'affichage mov dl,16 ;juste à la gauche des barres int 10h mov ah,9 ;fonction affichage de chaîne ;de DOS mov dx,offset AttributeNumbers int 21h ; ; Effectue une boucle via le jeu de couleur, un nouveau paramètre par touche clavier ; mov [CurrentColor],0 ;commence par la couleur zéro ; ColorLoop: ; ; Positionne les registres de palette au jeu de couleurs courant, composé ; de la couleur courante correspondante à l'attribut 0, couleur courante + 1 ; correspond à l'attribut 1, et ainsi de suite. ; mov al,[CurrentColor] mov bx,offset ColorTable mov cx,16 ;nous avons 16 couleurs à paramètrer PaletteSetLoop: and al,3fh ;limite aux valeurs de couleurs sur ;6 bits mov [bx],al ;construit la table de 16 couleurs ;utilisée pour positionner inc bx ; les registres de palette inc ax loop PaletteSetLoop mov ah,10h ;fonction palette d'interruption vidéo mov al,2 ;sous-fonction pour positionner les ;16 registres de palette et d'overscan ; en une seule fois mov dx,offset ColorTable push ds pop es ;ES:DX pointe sur la table de couleurs int 10h ;invoque l'interruption vidéo pour ;paramétrer la palette ; ; Donne des numéros aux couleurs, nous pouvons ainsi savoir quels sont les attributs ; qui correspondent aux valeurs de couleur, et à quoi ressemble chaque numéro de ; couleur (du moins sur cet écran). ; call ColorNumbersUp ; ; Attend une touche clavier afin de voir ce jeu de couleurs. ; WaitKey: mov ah,8 ;fonction entrée sans écho de DOS int 21h ; ; Passe au prochain jeu de couleurs. ; mov al,[CurrentColor] inc ax mov [CurrentColor],al cmp al,64 jbe ColorLoop ; ; Restaure le mode texte. ; mov ax,3 int 10h ; ; Terminé. ; Done: mov ah,4ch ;fonction terminer de DOS int 21h ; ; Met une barre composée de l'attribut spécifié (valeur de pixel), ; à la verticale correspondant à l'attribut. ; ; Entrée: AL = attribut ; BarUp proc near mov dx,SC_INDEX mov ah,al mov al,MAP_MASK out dx,al inc dx mov al,ah out dx,al ;positionne le registre Map Mask pour ; produire la couleur désirée mov ah,BAR_HEIGHT mul ah ;rangée du haut de la barre add ax,TOP_BAR ;commence par quelques lignes plus ;bas laisser de l'espace à du texte mov dx,80 ;les rangées sont de 80 octets de long mul dx ;l'offset en octets du début de la ;ligne d'affichage là où commence ; la barre add ax,20 ;l'offset en octets du coin supérieur ; gauche de la barre mov di,ax mov ax,VGA_SEGMENT mov es,ax ;ES:DI pointe sur l'offset du coin ;supérieur gauche de la barre mov dx,BAR_HEIGHT mov al,0ffh BarLineLoop: mov cx,40 ;les barres sont 40 de large rep stosb ;une ligne d'affichage de la barre add di,40 ;pointe sur le début de la prochaine ; ligne d'affichage ; de la barre dec dx jnz BarLineLoop ret BarUp endp ; ; Convertit AL en un nombre hexadécimal dans la plage 0-F. ; BinToHexDigit proc near cmp al,9 ja IsHex add al,'0' ret IsHex: add al,'A'-10 ret BinToHexDigit endp ; ; Affiche les valeurs de couleurs générées par les barres de couleur selon ; les positionnements courants de la palette à la droite des barres ; de couleur. ; ColorNumbersUp proc near mov ah,2 ;fonction de paramètre de positon du ; curseur de l'interruption vidéo sub bh,bh ;page 0 mov dh,TOP_BAR/14 ;compter en rangées de caractères ; correspond au haut de la ; première barre, compter en ; lignes d'affichage mov dl,20+40+1 ;juste à la droite des barres int 10h mov al,[CurrentColor] ;commence par la couleur ;courante mov bx,offset ColorNumbers+1 ;construit la chaîne de texte des numéros de couleurs mov cx,16 ;nous récupérons 16 couleurs à traiter ColorNumberLoop: push ax ;sauve les numéros de couleurs and al,3fh ;limite les valeurs de couleur sur 6 ; bits shr al,1 shr al,1 shr al,1 shr al,1 ;isole les quatre bits supérieurs ; du numéro de la couleur call BinToHexDigit ;convertit les quatre bits ; supérieurs du numéro de la ;couleur mov [bx],al ; et le met en texte pop ax ;récupère le numéro de couleur push ax ;sauve le numéro de la couleur and al,0fh ;isole les quatre bits inférieurs du ; numéro de la couleur call BinToHexDigit ;convertit les quatre bits ;inférieurs ; du numéro de la couleur en ASCII mov [bx+1],al ; et les met en texte add bx,COLOR_ENTRY_LENGTH ;pointe sur la prochaine ; entrée pop ax ;récupère le numéro de la couleur inc ax ;prochain numéro de la couleur loop ColorNumberLoop mov ah,9 ;fonction affichage de chaîne de DOS mov dx,offset ColorNumbers int 21h ;met les numéros d'attributs ret ColorNumbersUp endp ; Start endp Code ends end Start