; Programme qui affiche une diagonale pour illustrer l'utilisation d'un ; registre Color Don't Care positionné à 0FFh pour supporter des opérations ; lecture-modification-écriture rapides dans la mémoire VGA en write 3 en ; affichant une diagonale. ; ; Note: Fonctionne seulement sur VGA. ; ; 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 GRAPHICS_MODE EQU 5 ;index du registre Graphics Mode ;dans GC COLOR_DONT_CARE EQU 7 ;index du registre Color Don't Care ;dans GC ; code segment word 'CODE' assume cs:code Start proc near ; ; Sélectionne le mode graphique 12h. ; mov ax,12h int 10h ; ; Sélectionne le mode write 3 et le mode read 1. ; mov dx,GC_INDEX mov al,GRAPHICS_MODE out dx,al inc dx in al,dx ;les registres VGA sont lisibles or al,00001011b ;bit 3=1 sélectionne le mode ; read 1, et les bits 1 & 0=11 ; sélectionnent le mode write 3 jmp $+2 ;délai entre IN et OUT du même port out dx,al dec dx ; ; Configure set/reset pour afficher toujours en blanc. ; mov al,SET_RESET out dx,al inc dx mov al,0fh out dx,al dec dx mov al,ENABLE_SET_RESET out dx,al inc dx mov al,0fh out dx,al dec dx ; ; Positionne Color Don't Care à 0, aussi les lectures dans la mémoire VGA ;retournent toujours 0FFh. ; mov al,COLOR_DONT_CARE out dx,al inc dx sub al,al out dx,al ; ; Configure le pointeur de la mémoire initial et le masque de pixel. ; mov ax,VGA_SEGMENT mov ds,ax sub bx,bx mov al,80h ; ; Affiche 400 points sur une diagonale glissant vers le bas à droite. ; mov cx,400 DrawDiagonalLoop: and [bx],al ;lit la mémoire vidéo, en chargeant ;les latches, puis écrit AL sur VGA ;AL devient le masque de bit, et ;set/reset ;fournit les données écrites actuelles add bx,SCREEN_WIDTH ;pointe sur la prochaine ligne ;d'affichage ror al,1 ;déplace le masque de pixel un pixel ;sur la droite adc bx,0 ;avance au prochain octet si le masque ;de pixel est déroulé loop DrawDiagonalLoop ; ; Attend une touche clavier pour finir, puis retourne au mode texte et ; à DOS. ; 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 ;terminé Start endp code ends end Start