; Programme pour illustrer une utilisation du mode write 2 du VGA et d'EGA en ; affichant des lignes avec des motifs de couleur. ; Assemblé avec TASM 4.0, lié avec TLINK 6.10 ; Testé par Jim Mischel 11/21/94 ; Stack segment para stack 'STACK' db 512 dup(0) Stack ends SCREEN_WIDTH_IN_BYTES equ 80 GRAPHICS_SEGMENT equ 0a000h ;segment bitmap du mode 10 SC_INDEX equ 3c4h ;registre Index Sequence Controller MAP_MASK equ 2 ;index du registre Map Mask GC_INDEX equ 03ceh ;registre Index Graphics Controller GRAPHICS_MODE equ 5 ;index du registre Graphics Mode BIT_MASK equ 8 ;index du registre Bit Mask Data segment para common 'DATA' Pattern0 db 16 db 0, 1, 2, 3, 4, 5, 6, 7, 8 db 9, 10, 11, 12, 13, 14, 15 Pattern1 db 6 db 2, 2, 2, 10, 10, 10 Pattern2 db 8 db 15, 15, 15, 0, 0, 15, 0, 0 Pattern3 db 9 db 1, 1, 1, 2, 2, 2, 4, 4, 4 Data ends Code segment para public 'CODE' assume cs:Code, ds:Data Start proc near mov ax,Data mov ds,ax mov ax,10h int 10h ;sélectionne le mode vidéo 10h (640x350) ; ; Affiche 8 lignes radiales dans le quart supérieur gauche dans le motif 0. ; mov bx,0 mov cx,0 mov si,offset Pattern0 call QuadrantUp ; ; Affiche 8 lignes radiales dans le quart supérieur droit dans le motif 1. ; mov bx,320 mov cx,0 mov si,offset Pattern1 call QuadrantUp ; ; Affiche 8 lignes radiales dans le quart inférieur gauche dans le motif 2. ; mov bx,0 mov cx,175 mov si,offset Pattern2 call QuadrantUp ; ; Affiche 8 lignes radiales dans le quart inférieur droit dans le motif 3. ; mov bx,320 mov cx,175 mov si,offset Pattern3 call QuadrantUp ; ; Attend une touche clavier avant de revenir en mode texte et de finir. ; mov ah,01h int 21h mov ax,03h int 10h mov ah,4ch int 21h ; ; Affiche 8 lignes radiales avec le motif spécifié dans le mode 10h spécifié ; quadrant. ; ; Entrée: ; BX = coordonnée X du coin supérieur gauche du quart ; CX = coordonnée Y du coin supérieur gauche du quart ; SI = pointeur sur le motif, sous la forme suivante: ; Octet 0: Longueur du motif ; Octet 1: Début du motif, une couleur par octet ; ; AX, BX, CX, DX sont détruits ; QuadrantUp proc near add bx,160 add cx,87 ;pointe sur le centre du quadrant mov ax,0 mov dx,160 call LineUp ;affiche une ligne horizontale sur le bord droit mov ax,1 mov dx,88 call LineUp ;affiche une ligne diagonale en haut à droite mov ax,2 mov dx,88 call LineUp ;affiche une ligne verticale sur le bord supérieur mov ax,3 mov dx,88 call LineUp ;affiche une ligne diagonale en haut à gauche mov ax,4 mov dx,161 call LineUp ;affiche une ligne horizontale sur le bord gauche mov ax,5 mov dx,88 call LineUp ;affiche une ligne diagonale en bas à gauche mov ax,6 mov dx,88 call LineUp ;affiche une ligne verticale sur le bord du bas mov ax,7 mov dx,88 call LineUp ;affiche une ligne diagonale en bas à droite ret QuadrantUp endp ; ; Affiche une ligne horizontale, verticale, ou diagonale (l'une des huit lignes ; radiales) de longueur spécifiée depuis le point de départ spécifié ; ; Entrée: ; AX = direction de la ligne, comme suit: ; 3 2 1 ; 4 * 0 ; 5 6 7 ; BX = coordonnée X du point de départ ; CX = coordonnée Y du point de départ ; DX = longueur de la ligne (nombre de pixels affichés) ; ; Tous les registres sont préservés. ; ; Table de vecteurs vers les routines de chacune des 8 lignes. ; LineUpVectors label word dw LineUp0, LineUp1, LineUp2, LineUp3 dw LineUp4, LineUp5, LineUp6, LineUp7 ; ; Macro pour afficher une ligne horizontale, verticale, ou diagonale. ; ; Entrée: ; XParm = 1 pour afficher à droite, -1 pour afficher à gauche, 0 pour ne pas ; se déplacer à l'horizontale. ; YParm = 1 pour afficher en haut, -1 pour afficher en bas, 0 pour ne pas se ; déplacer à la verticale. ; BX = emplacement X de départ ; CX = emplacement Y de départ ; DX = nombre de pixels à afficher ; DS:SI = motif de la ligne ; MLineUp macro XParm, YParm local LineUpLoop, CheckMoreLine mov di,si ;met de coté l'offset de départ du motif lodsb ;récupère la longueur du motif mov ah,al LineUpLoop: lodsb ;récupère la couleur de ce pixel... call DotUpInColor ;et l'affiche if XParm EQ 1 inc bx endif if XParm EQ -1 dec bx endif if YParm EQ 1 inc cx endif if YParm EQ -1 dec cx endif dec ah ;à la fin du motif? jnz CheckMoreLine mov si,di ;récupère le début du motif lodsb mov ah,al ;réinitialise le compteur du motif CheckMoreLine: dec dx jnz LineUpLoop jmp LineUpEnd endm LineUp proc near push ax push bx push cx push dx push si push di push es mov di,ax mov ax,GRAPHICS_SEGMENT mov es,ax push dx ;sauve la longueur de la ligne ; ; Active l'écriture de tous les plans. ; mov dx,SC_INDEX mov al,MAP_MASK out dx,al inc dx mov al,0fh out dx,al ; ; Selectionne le mode write 2. ; mov dx,GC_INDEX mov al,GRAPHICS_MODE out dx,al inc dx mov al,02h out dx,al ; ; Vecteur vers la routine correcte. ; pop dx ;récupère la longueur de la ligne shl di,1 jmp cs:[LineUpVectors+di] ; ; Ligne horizontale vers la droite. ; LineUp0: MLineUp 1, 0 ; ; Ligne diagonale vers le haut à droite. ; LineUp1: MLineUp 1, -1 ; ; Ligne verticale en haut. ; LineUp2: MLineUp 0, -1 ; ; Ligne diagonale vers le haut à gauche. ; LineUp3: MLineUp -1, -1 ; ; Ligne horizontale vers la gauche. ; LineUp4: MLineUp -1, 0 ; ; Ligne diagonale vers le bas à gauche. ; LineUp5: MLineUp -1, 1 ; ; Ligne verticale en bas. ; LineUp6: MLineUp 0, 1 ; ; Ligne diagonale vers le bas à droite. ; LineUp7: MLineUp 1, 1 LineUpEnd: pop es pop di pop si pop dx pop cx pop bx pop ax ret LineUp endp ; ; Affiche un point dans une couleur spécifiée à l'emplacement spécifié. ; Suppose que le VGA est en mode write 2 avec les écritures de tous les plans ; activées et que ES pointe sur la mémoire vidéo. ; ; Entrée: ; AL = couleur du point ; BX = coordonnée X du point ; CX = coordonnée Y du point ; ES = segment de la mémoire vidéo ; ; Tous les registres sont préservés. ; DotUpInColor proc near push bx push cx push dx push di ; ; ES:DI pointe sur l'octet de la mémoire vidéo dans lequel se place le pixel, avec ; le masque de bit configuré pour accéder à ce pixel dans l'octet adressé. ; push ax ;préserve la couleur du point mov ax,SCREEN_WIDTH_IN_BYTES mul cx ;offset de départ de la ligne d'affichage du haut mov di,ax mov cl,bl and cl,111b mov dx,GC_INDEX mov al,BIT_MASK out dx,al inc dx mov al,80h shr al,cl out dx,al ;paramètre le masque de bits pour le pixel shr bx,1 shr bx,1 shr bx,1 ;X en octets add di,bx ;offset du pixel de l'octet mov al,es:[di] ;charge les latches pop ax ;récupère la couleur du point stosb ;écrit le point dans la couleur désirée pop di pop dx pop cx pop bx ret DotUpInColor endp Start endp Code ends end Start