; Programme pour illustrer la rotation des données et la fonctionnalité masque de ; bit du Graphics Controller. Affiche des caractères de 8x8 à un emplacement ; spécifié, utilisant la police 8x8 ROM de VGA. Conçu pour utiliser ; les modes 0Dh, 0Eh, 0Fh, 10h, et 12h. ; 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_WIDTH_IN_BYTES equ 044ah ;l'offset de la variable BIOS FONT_CHARACTER_SIZE equ 8 ;nombre d'octets dans chaque caractère de police ; ; le registre VGA équivaut à. ; GC_INDEX equ 3ceh ;registre index GC GC_ROTATE equ 3 ;rotation de données/fonction logique de ;l'index de registre GC GC_BIT_MASK equ 8 ;index de registre masque de bit de GC ; dseg segment para common 'DATA' TEST_TEXT_ROW equ 69 ;rangée pour afficher le texte test sur TEST_TEXT_COL equ 17 ; la colonne sur laquelle est affichée le texte test TEST_TEXT_WIDTH equ 8 ;à la largeur en pixels de caractère TestString label byte db 'Hello, world!',0 ;chaîne de test à afficher. FontPointer dd ? ;offset de police dseg ends ; ; Macro pour positionner le registre indexé INDEX de la puce GC à SETTING. ; SETGC macro INDEX, SETTING mov dx,GC_INDEX mov ax,(SETTING SHL 8) OR INDEX out dx,ax 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 640x480. ; mov ax,012h int 10h ; ; Paramètre le pilote pour utiliser la police 8x8 ; mov ah,11h ;fonction générateur de caractère de BIOS VGA, mov al,30h ;retourne en sous-fonction mov bh,3 ;récupère le pointeur de police 8x8 int 10h call SelectFont ; ; Affiche la chaîne test. ; mov si,offset TestString mov bx,TEST_TEXT_ROW mov cx,TEST_TEXT_COL StringOutLoop: lodsb and al,al jz StringOutDone call DrawChar add cx,TEST_TEXT_WIDTH jmp StringOutLoop StringOutDone: ; ; Réinitialise les registres data rotate et bit mask. ; SETGC GC_ROTATE, 0 SETGC GC_BIT_MASK, 0ffh ; ; Attend une touche clavier. ; mov ah,1 int 21h ; ; Retourne au mode texte. ; mov ax,03h int 10h ; ; quitte vers DOS. ; mov ah,4ch int 21h Start endp ; ; Routine pour afficher un caractère texte dans un mode graphique linéaire ; (0Dh, 0Eh, 0Fh, 010h, 012h). ; La police utilisée devrait être utilisée par FontPointer. ; ; Input: ; AL = caractère à afficher ; BX = rangée à afficher du caractère texte ; CX = colonne à afficher du caractère texte ; ; Force la fonction ALU "à se déplacer". ; DrawChar proc near push ax push bx push cx push dx push si push di push bp push ds ; ; Positionne DS:SI pour pointer sur la police et ES pour pointer sur la mémoire ; vidéo. ; lds si,[FontPointer] ;pointe sur la police mov dx,VGA_VIDEO_SEGMENT mov es,dx ;pointe sur la mémoire vidéo ; ; Calcule l'adresse écran du début de l'octet du caractère. ; push ds ;pointe sur le segment de données du BIOS sub dx,dx mov ds,dx xchg ax,bx mov di,ds:[SCREEN_WIDTH_IN_BYTES] ;retrouve la largeur ;d'écran pop ds mul di ;calcule l'offset de départ de la rangée push di ;met de coté la largueur d'écran mov di,cx ;met de coté la colonne and cl,0111b ;garde seulement l'adresse de la colonne en octets shr di,1 shr di,1 shr di,1 ;divise la colonne par 8 pour faire une adresse 8 bits add di,ax ;et pointe sur l'octet ; ; Calcule l'adresse de la police du caractère. ; sub bh,bh shl bx,1 ;suppose 8 octets par caractère; utilise shl bx,1 ; un multiplicateur sinon shl bx,1 ;l'offset dans la police de caractère add si,bx ;l'offset dans le segment de caractère ; ; Configure la rotation GC. ; mov dx,GC_INDEX mov al,GC_ROTATE mov ah,cl out dx,ax ; ; Configure BH comme masque de bit de la moitié gauche, ; BL comme rotation de la moitié droite. ; mov bx,0ffffh shr bh,cl neg cl add cl,8 shl bl,cl ; ; Affiche le caractère, la moitié gauche en premier, puis la moitié droite dans ; l'octet suivant, en utilisant la rotation de données pour positionner le ; caractère au travers de la limite de l'octet puis en utilisant le masque de bit ; pour récupérer la partie correcte du caractère dans chaque octet. ; Ne vérifie pas si le caractère est aligné sur un octet ou si une ; rotation et une seule écriture sont requises. ; mov bp,FONT_CHARACTER_SIZE mov dx,GC_INDEX pop cx ;récupère la largeur de l'écran dec cx dec cx ; -2 car cela fait deux octets pour chaque caractère CharacterLoop: ; ; Paramètre le masque de bit pour la moitié gauche du caractère. ; mov al,GC_BIT_MASK mov ah,bh out dx,ax ; ; Récupère le prochain octet du caractère & l'écrit dans la mémoire vidéo. ; (la moitié gauche du caractère.) ; mov al,[si] ;récupère l'octet du caractère mov ah,es:[di] ;charge les latches stosb ;écrit l'octet du caractère ; ; Paramètre le masque de bits pour la moitié droite du caractère. ; mov al,GC_BIT_MASK mov ah,bl out dx,ax ; ; Re-récupère l'octet du caractère & l'écrit dans la mémoire vidéo. ; (Moitié droite du caractère.) ; lodsb ;récupère l'octet du caractère mov ah,es:[di] ;charge les latches stosb ;écrit l'octet du caractère ; ; Pointe sur la prochaine ligne de caractères dans la mémoire vidéo. ; add di,cx ; dec bp jnz CharacterLoop ; pop ds pop bp pop di pop si pop dx pop cx pop bx pop ax ret DrawChar endp ; ; Paramètre le pointeur sur la police à afficher depuis ES:BP. ; SelectFont proc near mov word ptr [FontPointer],bp ;sauve le pointeur mov word ptr [FontPointer+2],es ret SelectFont endp ; cseg ends end start