; Programme pour restaurer un écran graphique EGA en mode 10h depuis ; le fichier SNAPSHOT.SCR. ; ; Assemblé avec TASM 4.0, lié avec TLINK 6.10 ; Testé par Jim Mischel 11/21/94 ; VGA_SEGMENT equ 0a000h SC_INDEX equ 3c4h ;registre Index SC MAP_MASK equ 2 ;index du registre Map Mask dans SC DISPLAYED_SCREEN_SIZE equ (640/8)*350 ;nombre d'octets affichés par plan dans un ; écran graphique hi-res ; stack segment para stack 'STACK' db 512 dup (?) stack ends ; Data segment word 'DATA' Filename db 'SNAPSHOT.SCR',0 ;nom du fichier depuis lequel ; nous restaurerons ErrMsg1 db '*** SNAPSHOT.SCR ne peut pas s'ouvrir ** ;*',0dh,0ah,'$' ErrMsg2 db '*** Erreur de lecture depuis SNAPSHOT.SC ;R ***',0dh,0ah,'$' WaitKeyMsg db 0dh, 0ah, 'Done. Appuyez sur n'importe qu' ;elle touche...',0dh,0ah,'$' Handle dw ? ;handle du fichier depuis lequel nous ; restaurerons Plane db ? ;plan à écrire Data ends ; Code segment assume cs:Code, ds:Data Start proc near mov ax,Data mov ds,ax ; ; Passe en mode graphique hi-res. ; mov ax,10h ;AH = 0 initialisation du mode ; AL = 10h sélectionne le mode graphique ; hi-res int 10h ;interruption vidéo du BIOS ; ; Ouvre SNAPSHOT.SCR. ; mov ah,3dh ;fonction ouverture du fichier de DOS mov dx,offset Filename sub al,al ;ouvre pour lire int 21h mov [Handle],ax ;sauve le handle jnc RestoreTheScreen ;nous sommes prêts à restaurer ; s'il n'y a aucune erreur mov ah,9 ;fonction affichage de chaîne de DOS mov dx,offset ErrMsg1 int 21h ;notifie l'erreur jmp short Done ;et terminé ; ; Effectue une boucle via les 4 plans, permet l'écriture plan par plan ; en les lisant sur le disque. Notez que les 4 plans peuvent être écrits à ; A000:0000; le registre Map Mask sélectionne les plans qui sont lisibles ; à n'importe quel moment. Nous ne rendons qu'un seul plan lisible à la fois. ; RestoreTheScreen: mov [Plane],0 ;commence par le plan 0 RestoreLoop: mov dx,SC_INDEX mov al,MAP_MASK ;positionne Index SC sur le registre ; Map Mask out dx,al inc dx mov cl,[Plane] ;récupère le nombre de plans que ;nous voulons restaurer mov al,1 shl al,cl ;positionne le bit enabling writes ;sur le seul plan désiré out dx,al ;paramètre la lecture depuis le plan ; désiré mov ah,3fh ;fonction de lecture de fichier de DOS mov bx,[Handle] mov cx,DISPLAYED_SCREEN_SIZE ;nombre d'octets à lire sub dx,dx ;commence le chargement des octets à ; A000:0000 push ds mov si,VGA_SEGMENT mov ds,si int 21h ;lit la partie affichée de ce plan pop ds jc ReadError cmp ax,DISPLAYED_SCREEN_SIZE ;avons-nous lu tous ;les octets? jz RestoreLoopBottom ReadError: mov ah,9 ;fonction affichage de chaîne de DOS mov dx,offset ErrMsg2 int 21h ;notifie l'erreur jmp short DoClose ;et terminé RestoreLoopBottom: mov al,[Plane] inc ax ;pointe sur le prochain plan mov [Plane],al cmp al,3 ;avons-nous traité tous les plans? jbe RestoreLoop ;non, passons au prochain ;plan ; ; Ferme SNAPSHOT.SCR. ; DoClose: mov ah,3eh ;fonction fermeture de fichier de DOS mov bx,[Handle] int 21h ; ; Attend une touche clavier. ; mov ah,8 ;fonction entrée sans écho de DOS int 21h ; ; Restaure le mode texte. ; mov ax,3 int 10h ; ; Fini. ; Done: mov ah,4ch ;fonction terminer de DOS int 21h Start endp Code ends end Start