; Programme pour illustrer l'utilisation du mode read 1 (mode de comparaison de ;couleurs) pour détecter des collisions dans la mémoire vidéo. Affiche une ligne jaune ; sue un fond bleu, puis affiche une ligne perpendiculaire verte jusqu'à ce que la ; ligne jaune soit atteinte. ; ; Assemblé avec TASM 4.0, lié avec TLINK 6.10 ; Testé par Jim Mischel 11/21/94 ; stack segment word stack 'STACK' db 512 dup (?) stack ends ; VGA_SEGMENT EQU 0a000h SCREEN_WIDTH EQU 80 ;en octets GC_INDEX EQU 3ceh ;registre Index GC SET_RESET EQU 0 ;index du registre Set/Reset dans GC ENABLE_SET_RESET EQU 1 ;index du registre Enable Set/Reset ;dans GC COLOR_COMPARE EQU 2 ;index du registre Color Compare ;dans GC GRAPHICS_MODE EQU 5 ;index du registre Graphics Mode ;dans GC BIT_MASK EQU 8 ;index du registre Bit Mask dans GC ; code segment word 'CODE' assume cs:code Start proc near cld ; ; Sélectionne le mode graphique 10h. ; mov ax,10h int 10h ; ; Remplit l'écran de bleu. ; mov al,1 ;le bleu est la couleur 1 call SelectSetResetColor ;paramètre pour afficher ;en bleu mov ax,VGA_SEGMENT mov es,ax sub di,di mov cx,7000h rep stosb ;la valeur écrite actuellement n'a ;pas d'importance, car set/reset ; fournit les données écrites ; dans la mémoire vidéo ; ; Affiche une ligne verticale jaune. ; mov al,14 ;le jaune est la couleur 14 call SelectSetResetColor ;paramètre pour afficher ;en jaune mov dx,GC_INDEX mov al,BIT_MASK out dx,al ;Index GC pointe sur Bit Mask inc dx ;pointe sur Data GC mov al,10h out dx,al ;positionne Bit Mask à 10h mov di,40 ;commence au milieu de la ligne ;supérieure mov cx,350 ;hauteur entière de l'écran VLineLoop: mov al,es:[di] ;charge les latches stosb ;écrit le prochain pixel de la ligne ;jaune set/reset ;fournit les données écrites dans la ;mémoire vidéo, et AL est ;actuellement ignoré) add di,SCREEN_WIDTH-1 ;pointe sur la prochaine ;line d'affichage loop VLineLoop ; ; Sélectionne le mode write 0 et le mode read 1. ; mov dx,GC_INDEX mov al,GRAPHICS_MODE out dx,al ;Index GC pointe sur le registre ;Graphics Mode inc dx ;pointe sur Data GC mov al,00001000b ;le bit 3=1 est le mode read 1, ;bits 1 & 0=00 ; sont le mode write 0 out dx,al ;met Graphics Mode en mode read 1, ; mode write 0 ; ; Affiche une ligne horizontale verte, pixel par pixel, de gauche ; à droite jusqu'à ce que color compare reporte qu'un pixel jaune a été trouvé. ; ; Affiche en vert. ; mov al,2 ;le vert est la couleur 2 call SelectSetResetColor ;paramètre pour afficher ;en vert ; ; Paramètre color compare pour rechercher du jaune. ; mov dx,GC_INDEX mov al,COLOR_COMPARE out dx,al ;Index GC pointe sur le registre ;Color Compare inc dx ;pointe sur DataGC mov al,14 ;nous recherchons du jaune, couleur ;14 out dx,al ;paramètrons color compare pour ;rechercher du jaune dec dx ;pointe sur Index GC ; ; Configure un accès rapide au registre Bit Mask. ; mov al,BIT_MASK out dx,al ;Index GC pointe sur le registre Bit ; Mask inc dx ;pointe sur Data GC ; ; Paramètre le masque de pixels initial et l'offset de la mémoire vidéo. ; mov al,80h ;masque de pixels initial mov di,100*SCREEN_WIDTH ;commence au coin gauche ;de la ligne d'affichage 100 HLineLoop: mov ah,es:[di] ;effectue une lecture en ;mode read ;1 (color compare) ce qui charge ; alors les latches. and ah,al ;le pixel courant est-il jaune? jnz WaitKeyAndDone ;oui-nous avons atteint la ligne ; jaune, nous avons donc fini out dx,al ;positionne le registre Bit Mask ; de telle sorte que nous modifions ; seulement le pixel intéressant à mov es:[di],al ;afficher. La valeur écrite est ;non pertinente, car set/reset fournit ;les données écrites dans la ;mémoire vidéo ror al,1 ;décale le masque de pixel vers le ;prochain pixel adc di,0 ;avance l'offset de la mémoire vidéo ; si le masque de pixel est déroulé ; ; Ralentit la vitesse par souci de visibilité (ajuste en fonction des besoins). ; mov cx,0 DelayLoop: loop DelayLoop jmp HLineLoop ; ; Attend une touche clavier pour finir, puis retourne en mode texte et ; à DOS. ; WaitKeyAndDone: WaitKeyLoop: mov ah,1 int 16h jz WaitKeyLoop sub ah,ah int 16h mov ax,3 int 10h ;retourne en mode texte mov ah,4ch int 21h ;finit Start endp ; ; Active set/reset pour tous les plans, et positionne la couleur set/reset color ; à AL. ; SelectSetResetColor proc near mov dx,GC_INDEX push ax ;préserve la couleur mov al,SET_RESET out dx,al ;Index GC pointe sur le registre ;Set/Reset inc dx ;pointe sur Data GC pop ax ;récupère la couleur out dx,al ;positionne le registre Set/Reset sur ; la couleur sélectionnée dec dx ;pointe sur Index GC mov al,ENABLE_SET_RESET out dx,al ;Index GC pointe sur le registre ;Enable Set/Reset inc dx ;pointe sur Data GC mov al,0fh out dx,al ;active set/reset pour tous les plans ret SelectSetResetColor endp code ends end Start