; Routine d'initialisation du Mode X (320x240, en 256 couleurs).Fonctionne sur ; tous les VGAs. ; **************************************************************** ; * Révisé le 6/19/91 pour sélectionner la bonne horloge; règle * ; * problèmes de rotation verticale sur les moniteurs à fréquence fixe (IBM ;851X) ; **************************************************************** ; Appelable en C near comme suit: ; void Set320x240Mode(void); ; Testé avec TASM 4.0 par Jim Mischel 12/16/94. ; Modifié d'après le code d'initialisation de mode du domaine public de John ;Bridges. SC_INDEX equ 03c4h ; Index Sequence Controller CRTC_INDEX equ 03d4h ; Index CRT Controller MISC_OUTPUT equ 03c2h ; registre Miscellaneous Output SCREEN_SEG equ 0a000h ;segment de la mémoire vidéo en mode X .model small .data ;Paires Index/données pour mes registres CRT Controller qui diffèrent entre ;le mode 13h et le mode X. CRTParms label word dw 00d06h ; total vertical dw 03e07h ;overflow (bit 8 des comptes verticaux) dw 04109h ;hauteur de la cellule (2 pour double parcours) dw 0ea10h ; début de sync v dw 0ac11h ;fin de sync v et cr0-cr7 protection dw 0df12h ;affiche à la verticale dw 00014h ;désactive le mode dword dw 0e715h ;début de blank v dw 00616h ;fin de blank v dw 0e317h ;active le mode octet CRT_PARM_LENGTH equ (($-CRTParms)/2) .code public _Set320x240Mode _Set320x240Mode proc near push bp ;préserve la stack frame de l'appelant push si ;préserve les variables registre C push di ; (ne pas compter sur BIOS pour préserver quoi que ce soit) mov ax,13h ;le BIOS paramètre le mode standard 256 int 10h ; couleurs(320x200 linéaire) mov dx,SC_INDEX mov ax,0604h out dx,ax ;désactive le mode chain4 mov ax,0100h out dx,ax ;réinitialisation synchrone en positionnant Misc Output ;par mesure de sécurité, même si l'horloge reste telle quelle mov dx,MISC_OUTPUT mov al,0e3h out dx,al ;sélectionne l'horloge 25 MHz & la fréquence de parcours de 60 Hz mov dx,SC_INDEX mov ax,0300h out dx,ax ;annule la réinitialisation (relance le séquenceur) mov dx,CRTC_INDEX ;reprogramme le CRT Controller mov al,11h ;le registre VSync End contient le bit de protection out dx,al ; en écriture du registre inc dx ;registre Data CRT Controller in al,dx ;récupère le paramètre courant du registre VSync End and al,7fh ;supprime la protection en écriture out dx,al ; de divers registres CRTC dec dx ; Index CRT Controller cld mov si,offset CRTParms ;pointe sur la table de paramètre CRT mov cx,CRT_PARM_LENGTH ;nombre d'entrées de la table SetCRTParmsLoop: lodsw ;récupère la prochaine paire Index/Données CRT out dx,ax ;paramètre la prochaine paire Index/Données CRT loop SetCRTParmsLoop mov dx,SC_INDEX mov ax,0f02h out dx,ax ;autorise les écritures sur les quatre plans mov ax,SCREEN_SEG ;maintenant vide la mémoire vidéo, 8 pixels mov es,ax ; à la fois sub di,di ;ES:DI pointe sur la mémoire vidéo sub ax,ax ;efface les pixels de valeur zéro mov cx,8000h ;nombre de mots dans la mémoire vidéo rep stosw ;vide toute la mémoire vidéo pop di ;restaure les variables registre C pop si pop bp ;restaure la stack frame de l'appelant ret _Set320x240Mode endp end