; Programme pour illustrer l'opération des ALU et des latches du ; Graphics Controller de VGA. Affiche une variété de motifs dans un fond rayé ; à l'horizontale en utilisant l'une après l'autre les quatre fonctions logiques ; disponibles (données restant telles quelles, AND, OR, XOR) ; pour mélanger les images avec le fond. ; 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(?) stack ends ; VGA_VIDEO_SEGMENT equ 0a000h ;segment de la mémoire vidéo VGA SCREEN_HEIGHT equ 350 SCREEN_WIDTH_IN_BYTES equ 80 DEMO_AREA_HEIGHT equ 336 ;nombre de lignes d'affichage dans la ;zone de démonstration de ;la fonctions logique DEMO_AREA_WIDTH_IN_BYTES equ 40 ;largeur en octets de la zone ;de démonstration de la fonctions logique VERTICAL_BOX_WIDTH_IN_BYTES equ 10 ;largeur en octets de la boite utilisée ;pour la démonstration de chaque ;fonctions logique ; ; VGA register equates. ; GC_INDEX equ 3ceh ;registre index GC GC_ROTATE equ 3 ;fonction logique/rotation de données ;du registre index GC GC_MODE equ 5 ;registre index de mode GC ; dseg segment para common 'DATA' ; ; Chaine utilisée pour "étiqueter" les fonctions logiques. ; LabelString label byte db 'UNMODIFIED AND OR XOR ' LABEL_STRING_LENGTH equ $-LabelString ; ; chaînes utilisées pour "étiqueter" les motifs unis. ; FillPatternFF db 'Fill Pattern: 0FFh' FILL_PATTERN_FF_LENGTH equ $ - FillPatternFF FillPattern00 db 'Fill Pattern: 000h' FILL_PATTERN_00_LENGTH equ $ - FillPattern00 FillPatternVert db 'Fill Pattern: Vertical Bar' FILL_PATTERN_VERT_LENGTH equ $ - FillPatternVert FillPatternHorz db 'Fill Pattern: Horizontal Bar' FILL_PATTERN_HORZ_LENGTH equ $ - FillPatternHorz ; dseg ends ; ;Macro pour positionner à SETTING le registre indexé INDEX du circuit GC . ; SETGC macro INDEX, SETTING mov dx,GC_INDEX mov ax,(SETTING SHL 8) OR INDEX out dx,ax endm ; ; ;Macro pour appeler la fonction d'écriture de chaîne de BIOS pour afficher une ;chaîne de texte TEXT_STRING, de longueur TEXT_LENGTH ;, à l'emplacement ROW,COLUMN. ; TEXT_UP macro TEXT_STRING, TEXT_LENGTH, ROW, COLUMN mov ah,13h ;fonction d'écriture de chaîne de BIOS mov bp,offset TEXT_STRING ;ES:BP pointe sur la chaîne mov cx,TEXT_LENGTH mov dx,(ROW SHL 8) OR COLUMN ;position sub al,al ;la chaîne est de caractère seulement ; le curseur n'est pas déplacé mov bl,7 ;l'attribut texte est blanc (gris ;clair) int 10h endm ; cseg segment para public 'CODE' assume cs:cseg, ds:dseg start proc near mov ax,dseg mov ds,ax ; ; Sélectionne le mode graphique 640x350. ; mov ax,010h int 10h ; ; ES pointe sur la mémoire VGA. ; mov ax,VGA_VIDEO_SEGMENT mov es,ax ; ; Affiche le fond des barres horizontales. ; mov dx,SCREEN_HEIGHT/4 ;nombre de barres à afficher (chacune d'une hauteur de 4 ;pixels) sub di,di ;commence à l'offset 0 dans la ;mémoire vidéo mov ax,0ffffh ;motif uni pour les zones ;claires ;des barres mov bx,DEMO_AREA_WIDTH_IN_BYTES / 2 ;longueur de ;chaque barre mov si,SCREEN_WIDTH_IN_BYTES - DEMO_AREA_WIDTH_IN_ ;BYTES mov bp,(SCREEN_WIDTH_IN_BYTES * 3) - DEMO_AREA_WID ;TH_IN_BYTES BackgroundLoop: mov cx,bx ;longueur de la barre rep stosw ;affiche la moitié supérieure de la ;barre add di,si ;pointe sur le début de la moitié ;inférieure de la barre mov cx,bx ;longueur de la barre rep stosw ;affiche la moitié inférieure de la ;barre add di,bp ;pointe sur le début de la partie ;supérieure de la prochaine barre dec dx jnz BackgroundLoop ; ; Affiche les boites verticales remplies de divers motifs de remplissage ; utilisant les quatre fonctions logiques à la suite. ; SETGC GC_ROTATE, 0 ;sélectionne la fonction logique ;donnée telle quelle "... mov di,0 call DrawVerticalBox ;.et affiche la boite ; SETGC GC_ROTATE, 08h ;sélectionne la fonction logique ; AND... mov di,10 call DrawVerticalBox ;.et affiche la boite ; SETGC GC_ROTATE, 10h ;sélectionne la fonction logique ; OR... mov di,20 call DrawVerticalBox ;.et affiche la boite ; SETGC GC_ROTATE, 18h ;sélectionne la fonction logique ; XOR... mov di,30 call DrawVerticalBox ;.et affiche la boite ; ; Réinitialise la fonction logique "donnée telle quelle", état par défaut. ; SETGC GC_ROTATE, 0 ; ; Etiquette l'écran. ; push ds pop es ;les chaînes que nous afficherons ;sont passés au BIOS en faisant ;pointer ES:BP sur elles ; ; "Etiquette" des fonctions logiques, utilisant la fonction d'écriture de chaîne ; du BIOS VGA. ; TEXT_UP LabelString, LABEL_STRING_LENGTH, 24, 0 ; ; "Etiquette" des motifs de remplissage, utilisant la fonction d'écriture de ; chaîne du BIOS VGA. ; TEXT_UP FillPatternFF, FILL_PATTERN_FF_LENGTH, 3, 42 TEXT_UP FillPattern00, FILL_PATTERN_00_LENGTH, 9, 42 TEXT_UP FillPatternVert, FILL_PATTERN_VERT_LENGTH, 15, ; 42 TEXT_UP FillPatternHorz, FILL_PATTERN_HORZ_LENGTH, 21, ; 42 ; ; Attend jusqu'à ce que une touche soit pressée pour réinitialiser le mode de ;l'écran & quitter. ; WaitForKey: mov ah,1 int 16h jz WaitForKey ; ; Termine, reinitialise le mode de l'écran et quitte. ; Done: mov ah,0 int 16h mov ax,3 ;réinitialise le mode texte int 10h mov ah,4ch ;quitte vers DOS int 21h ; start endp ; ; Routine pour afficher une boite de taille 80x336, utilisant la fonction logique ; actuellement sélectionnée, Le coin supérieur gauche à l'adresse du décalage de la ; mémoire vidéo de DI. ; La boite est remplie de quatre motifs. Le quart supérieur est rempli ; d'un motif 0FFh (uni), le deuxième quart d'un motif 00h ; (vide), le troisième de 33h (barre verticale de deux pixels de large ; et le dernier d'un motif de barre horizontale de deux pixels de haut. ; Macro pour afficher une colonne de largeur spécifiée en octets, dont la hauteur ; est le quart de celle de la boite, avec le motif de remplissage spécifié. ; DRAW_BOX_QUARTER macro FILL, WIDTH local RowLoop, ColumnLoop mov al,FILL ;motif de remplissage mov dx,DEMO_AREA_HEIGHT / 4 ;1/4 de la hauteur de ;la boite RowLoop: mov cx,WIDTH ColumnLoop: mov ah,es:[di] ;charge le contenu de la mémoire ;vidéo dans les latches GC ;(nous ne nous intéressons pas ;pour le moment à la lecture dans AH) stosb ;écrit le motif, qui est logiquement ;combiné avec le contenu du latch pour chaque ; plan puis écrit dans la mémoire vidéo loop ColumnLoop add di,SCREEN_WIDTH_IN_BYTES - WIDTH ;pointe sur le début de la prochaine ligne du ; bas de la boite dec dx jnz RowLoop endm ; DrawVerticalBox proc near DRAW_BOX_QUARTER 0ffh, VERTICAL_BOX_WIDTH_IN_BYTES ;1er motif de remplissage: uni DRAW_BOX_QUARTER 0, VERTICAL_BOX_WIDTH_IN_BYTES ;2ème motif de remplissage:vide DRAW_BOX_QUARTER 033h, VERTICAL_BOX_WIDTH_IN_BYTES ;3ème motif de remplissage:barre verticale ; de deux pixels de large mov dx,DEMO_AREA_HEIGHT / 4 / 4 ;4ème motif de remplissage: barre horizontale ;des jeux de quatre lignes d'affichage sub ax,ax mov si,VERTICAL_BOX_WIDTH_IN_BYTES ;largeur de la ;zone de remplissage HorzBarLoop: dec ax ;remplissage 0ffh (plus rapide de ;faire des DEC de mot que d'octet) mov cx,si ;largeur à remplir HBLoop1: mov bl,es:[di] ;charge les latches (ne s'intéresse ;pas aux valeurs) stosb ;écrit le motif vide via les ALU loop HBLoop1 add di,SCREEN_WIDTH_IN_BYTES - VERTICAL_BOX_WIDTH_ ;IN_BYTES mov cx,si ;largeur à remplir HBLoop2: mov bl,es:[di] ;charge les latches stosb ;écrit le motif plein via les ALU loop HBLoop2 add di,SCREEN_WIDTH_IN_BYTES - VERTICAL_BOX_WIDTH_IN_BYTES inc ax ;remplissage de 0 (plus rapide de ;faire des DEC de mot que d'octet) mov cx,si ;largeur à remplir HBLoop3: mov bl,es:[di] ;charge les latches stosb ;écrit le motif vide via les ALU loop HBLoop3 add di,SCREEN_WIDTH_IN_BYTES - VERTICAL_BOX_WIDTH_IN_BYTES mov cx,si ;largeur à remplir HBLoop4: mov bl,es:[di] ;charge les latches stosb ;écrit le motif vide via les ALU loop HBLoop4 add di,SCREEN_WIDTH_IN_BYTES - VERTICAL_BOX_WIDTH_IN_BYTES dec dx jnz HorzBarLoop ; ret DrawVerticalBox endp cseg ends end start