; Programme pour illustrer l'affichage de texte très rapide du mode ; write 3 du VGA. ; Affiche une chaîne de caractères 8x14 à des emplacements aléatoires sans ; affecter le fond, en utilisant la police 8x14 en ROM du VGA. ; Conçu pour l'utilisation des modes 0Dh, 0Eh, 0Fh, 10h, et 12h. ; S'exécute seulement sur les VGA ( Modèles 50 & supérieurs et IBM Display Adapter ; et 100% compatibles). ; 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é ;de VGA SCREEN_WIDTH_IN_BYTES equ 044ah ;offset de la variable BIOS FONT_CHARACTER_SIZE equ 14 ;nombre d'octets dans chaque ;caractère de police ; ; VGA register equates. ; SC_INDEX equ 3c4h ;registre index SC SC_MAP_MASK equ 2 ;index du registre map mask SC GC_INDEX equ 3ceh ;registre index GC GC_SET_RESET equ 0 ;index du registre set/reset ;GC GC_ENABLE_SET_RESET equ 1 ;index du registre enable ;set/reset GC GC_ROTATE equ 3 ;rotation des données/fonction ;logique ;index du registre GC_MODE equ 5 ;registre Mode GC GC_BIT_MASK equ 8 ;index du registre bit mask G ;C ; dseg segment para common 'DATA' TEST_TEXT_ROW equ 69 ;rangée du texte test à afficher TEST_TEXT_COL equ 17 ;colonne du texte test à afficher TEST_TEXT_COLOR equ 0fh ;blanc de forte intensité TestString label byte db 'Hello, world!',0 ;chaîne test à afficher. FontPointer dd ? ;offset de police dseg ends ; 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 l'écran tout en bleu, en utilisant la lisibilité du registre VGA ; pour préserver les bits réservés. ; mov dx,GC_INDEX mov al,GC_SET_RESET out dx,al inc dx in al,dx and al,0f0h or al,1 ;seul le plan bleu est ;initialisé,les autres sont ;réinitialisés out dx,al dec dx mov al,GC_ENABLE_SET_RESET out dx,al inc dx in al,dx and al,0f0h or al,0fh ;active set/reset pour tous les ; plans out dx,al mov dx,VGA_VIDEO_SEGMENT mov es,dx ;pointe sur la mémoire vidéo mov di,0 mov cx,8000h ;remplit tous les 32k mots mov ax,0ffffh ;à cause de set/reset, la valeur ;écrite actuellement n'a pas ;d'importance rep stosw ;remplit avec le bleu ; ; Paramètre le pilote pour utiliser la police 8x14. ; mov ah,11h ;Fonction génératrice de ;caractère du BIOS VGA, mov al,30h ;retourne les informations mov bh,2 ;récupère le pointeur de police ; 8x14 int 10h call SelectFont ; ; Affiche la chaîne test. ; mov si,offset TestString mov bx,TEST_TEXT_ROW mov cx,TEST_TEXT_COL mov ah,TEST_TEXT_COLOR call DrawString ; ; Attend une touche clavier, puis paramètre le mode texte & fin. ; mov ah,1 int 21h ;attend une touche clavier mov ax,3 int 10h ;restaure le mode texte ; ; Quitte vers DOS. ; mov ah,4ch int 21h Start endp ; ; Routine pour afficher une chaîne de texte de gauche à droite dans un mode ; graphique linéaire (0Dh, 0Eh, 0Fh, 010h, 012h) avec des caractères larges de ; 8 points. Le fond autour des pixels qui forment les caractères ; est préservé. ; La police utilisée doit être pointée par FontPointer. ; ; Entrée: ; AH = couleur à afficher dans la chaîne ; BX = rangée à afficher sur la chaîne ; CX = colonne du début de la chaîne ; DS:SI = chaîne à afficher ; ; Force la fonction ALU à "se déplacer". ; Force le mode write 3. ; DrawString proc near push ax push bx push cx push dx push si push di push bp push ds ; ; Configure set/reset pour produire une couleur de caractère, en utilisant la ; lisibilité du registre VGA pour préserver le paramétrage des bits réservés 7-4. ; mov dx,GC_INDEX mov al,GC_SET_RESET out dx,al inc dx in al,dx and al,0f0h and ah,0fh or al,ah out dx,al ; ; Sélectionne le mode write 3, en utilisant le registre VGA ; pour laisser tels quels les bits autres que ceux du mode write. ; mov dx,GC_INDEX mov al,GC_MODE out dx,al inc dx in al,dx or al,3 out dx,al mov dx,VGA_VIDEO_SEGMENT mov es,dx ;pointe sur la mémoire vidéo ; ; Calcule l'adresse d'écran du début de l'octet du caractère. ; push ds ;pointe sur le segment de ;données BIOS sub dx,dx mov ds,dx mov di,ds:[SCREEN_WIDTH_IN_BYTES] ;reprend la ;largeur d'écran du BIOS pop ds mov ax,bx ;rangée mul di ;calcule l'offset du début de ;la rangée push di ;met de coté la largeur d'écran mov di,cx ;met de coté la colonne and cl,0111b ;garde seulement l'adresse de ; la colonne dans l'octet shr di,1 shr di,1 shr di,1 ;divise la colonne par 8 pour ;faire une adresse d'octets add di,ax ;et pointe sur l'octet ; ; Configure la rotation GC. Dans le mode write 3, il s'agit de la rotation ; de la donnée du processeur avant d'avoir effectué un AND avec le registre Bit ; Mask pour former le masque de bit. Force la fonction ALU à "se déplacer". Utilise ; la lisibilité du registre VGA pour laisser tels quels les bits réservés. ; mov dx,GC_INDEX mov al,GC_ROTATE out dx,al inc dx in al,dx and al,0e0h or al,cl out dx,al ; ; Configure BH comme masque de bits pour la moitié gauche, BL comme rotation pour ; la moitié droite. ; mov bx,0ffffh shr bh,cl neg cl add cl,8 shl bl,cl ; ; Affiche tous les caractères, la partie gauche en premier, puis la partie droite ; dans l'octet suivant, en utilisant la rotation des données pour positionner le ; caractère au travers de la limite d'octet puis en utilisant le mode write 3 pour ; combiner les données du caractère avec le masque de bits pour activer la valeur ; set/reset (la couleur du caractère) via seulement la partie correcte (là où les ; bits de la police caractère sont à 1) du caractère pour chaque octet. ; Si les bits de la police du caractère sont à 0, la couleur de fond ; est préservée. ; Ne vérifie pas si le caractère est aligné sur un octet et si une ; rotation et une seule écriture sont requises. ; ; Affiche la moitié gauche de chaque caractère dans la chaîne. ; pop cx ;récupère la largeur d'écran push si push di push bx ; ; Paramètre le masque de bit pour la moitié gauche du caractère. ; mov dx,GC_INDEX mov al,GC_BIT_MASK mov ah,bh out dx,ax LeftHalfLoop: lodsb and al,al jz LeftHalfLoopDone call CharacterUp inc di ;pointe sur le prochain caractère jmp LeftHalfLoop LeftHalfLoopDone: pop bx pop di pop si ; ; Affiche la moitié droite de chaque caractère dans la chaîne. ; inc di ;la moitié droite de chaque ;caractère est à la ;limite d'octet ; ; Paramètre le masque de bit pour la moitié droite du caractère. ; mov dx,GC_INDEX mov al,GC_BIT_MASK mov ah,bl out dx,ax RightHalfLoop: lodsb and al,al jz RightHalfLoopDone call CharacterUp inc di ;pointe sur le prochain caractère jmp RightHalfLoop RightHalfLoopDone: ; pop ds pop bp pop di pop si pop dx pop cx pop bx pop ax ret DrawString endp ; ; Affiche un caractère. ; ; Entrée: ; AL = caractère ; CX = largeur d'écran ; ES:DI = adresse du caractère à afficher ; CharacterUp proc near push cx push si push di 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 ; ; Calcule l'adresse de la police du caractère. ; mov bl,14 ;14 octets par caractère mul bl add si,ax ;offset dans le segment de la ;police du caractère mov bp,FONT_CHARACTER_SIZE dec cx ; -1 car un octet par caractère CharacterLoop: 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 du caractère dans la mémoire vidéo. ; add di,cx ; dec bp jnz CharacterLoop ; pop ds pop di pop si pop cx ret CharacterUp 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