; Programme pour illustrer la permutation du mode graphique en ; mode texte et revient sans perdre de bitmap graphique. ; 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 GRAPHICS_SEGMENT equ 0a000h ;segment bitmap du mode 10 TEXT_SEGMENT equ 0b800h ;segment bitmap du mode 3 SC_INDEX equ 3c4h ;registre Index Sequence Controller MAP_MASK equ 2 ;index du registre Map Mask GC_INDEX equ 3ceh ;registre Index Graphics Controller READ_MAP equ 4 ;index du registre Read Map Data segment para common 'DATA' GStrikeAnyKeyMsg0 label byte db 0dh, 0ah, 'mode graphique', 0dh, 0ah db 'Appuyez sur n'importe quelle touche pour continuer...', 0dh, 0ah, '$' GStrikeAnyKeyMsg1 label byte db 0dh, 0ah, 'mode graphique à nouveau', 0dh, 0ah db 'Appuyez sur n'importe quelle touche pour continuer...', 0dh, 0ah, '$' TStrikeAnyKeyMsg label byte db 0dh, 0ah, 'mode texte', 0dh, 0ah db 'SAppuyez sur n'importe quelle touche pour continuer...', 0dh, 0ah, '$' Plane2Save db 2000h dup (?) ;zone de sauvegarde pour les données du plan 2 ;où la police est chargée CharAttSave db 4000 dup (?) ;zone de sauvegarde de la mémoire éffacée ;par les données caractère/attribut ;en mode texte Data ends Code segment para public 'CODE' assume cs:Code, ds:Data Start proc near mov ax,10h int 10h ;sélectionne le mode vidéo 10h (640x350) ; ; Remplit le bitmap graphique avec un motif coloré. ; cld mov ax,GRAPHICS_SEGMENT mov es,ax mov ah,3 ;motif de remplissage initial mov cx,4 ;quatre plans à remplir mov dx,SC_INDEX mov al,MAP_MASK out dx,al ;laisse le pointeur Index SC sur le registre inc dx ; Map Mask FillBitMap: mov al,10h shr al,cl ;génère un masque de map pour ce plan out dx,al ;paramètre le masque de map pour ce plan sub di,di ;commence à offset 0 mov al,ah ;récupère le motif de remplissage push cx ;préserve le compteur de plan mov cx,8000h ;remplit 32K de mots rep stosw ;remplit ce plan pop cx ;récupère le compteur de plan shl ah,1 shl ah,1 loop FillBitMap ; ; Apparaît le message "appuyez sur n'importe quelle touche". ; mov ax,Data mov ds,ax mov dx,offset GStrikeAnyKeyMsg0 mov ah,9 int 21h ; ; Attend une touche clavier. ; mov ah,01h int 21h ; ; Sauve les 8K du plan 2 qui seront utilisés par la police. ; mov dx,GC_INDEX mov al,READ_MAP out dx,al inc dx mov al,2 out dx,al ;configure la lecture du plan 2 mov ax,Data mov es,ax mov ax,GRAPHICS_SEGMENT mov ds,ax sub si,si mov di,offset Plane2Save mov cx,2000h/2 ;sauve 8K (longueur de la police par défaut) rep movsw ; ; Passe en mode texte sans vider la mémoire vidéo. ; mov ax,083h int 10h ; ; Sauve le bit-map du mode texte. ; mov ax,Data mov es,ax mov ax,TEXT_SEGMENT mov ds,ax sub si,si mov di,offset CharAttSave mov cx,4000/2 ;longueur d'un écran texte en mots rep movsw ; ; Remplit l'écran en mode texte avec des points et apparaît le message ; "appuyez sur n'importe quelle touche". ; mov ax,TEXT_SEGMENT mov es,ax sub di,di mov al,'.' ;caractère de remplissage mov ah,7 ;attribut de remplissage mov cx,4000/2 ;longueur d'un écran texte en mots rep stosw mov ax,Data mov ds,ax mov dx,offset TStrikeAnyKeyMsg mov ah,9 int 21h ; ; Attend une touche clavier. ; mov ah,01h int 21h ; ; Restaure l'écran en mode texte dans l'état où il était en entrant ; en mode texte. ; mov ax,Data mov ds,ax mov ax,TEXT_SEGMENT mov es,ax mov si,offset CharAttSave sub di,di mov cx,4000/2 ;longueur d'écran texte en mots rep movsw ; ; Revient en mode 10h sans vider la mémoire vidéo. ; mov ax,90h int 10h ; ; Restaure la partie du plan 2 qui à été éffécé par la police. ; mov dx,SC_INDEX mov al,MAP_MASK out dx,al inc dx mov al,4 out dx,al ;configure l'écriture du plan 2 mov ax,Data mov ds,ax mov ax,GRAPHICS_SEGMENT mov es,ax mov si,offset Plane2Save sub di,di mov cx,2000h/2 ;restaure 8K (longueur de la police par défaut) rep movsw ; ; Apparaît le message "appuyez sur n'importe quelle touche". ; mov ax,Data mov ds,ax mov dx,offset GStrikeAnyKeyMsg1 mov ah,9 int 21h ; ; 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 Start endp Code ends end Start