; Programme pour mettre un écran graphique EGA en mode10h, puis pour le sauvegarder ; dans 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 GC_INDEX equ 3ceh ;registre Index GC READ_MAP equ 4 ;index du registre Read Map dans GC 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' SampleText db 'Ce texte est affiché en mode hi-res db 'EGA mode graphique 10h.', 0dh, 0ah, 0ah db 'Sauve l'écran(y compris ce texte).. ;.' db 0dh, 0ah, '$' Filename db 'SNAPSHOT.SCR',0 ;nom du fichier dans lequel ;nous allons sauvegarder ErrMsg1 db '*** SNAPSHOT.SCR ne peut pas s'ouvrir ** ;*',0dh,0ah,'$' ErrMsg2 db '*** Erreur d'écriture dans SNAPSHOT.SCR ;***',0dh,0ah,'$' WaitKeyMsg db 0dh, 0ah, 'Done. Appuyer sur n'importe qu' ;elle touche...',0dh,0ah,'$' Handle dw ? ;handle du fichier de sauvegarde Plane db ? ;plan à lire 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 signifie mode activé, AL = 10h ; sélectionne le mode graphique hi-res int 10h ;interruption vidéo du BIOS ; ; Met du texte afin que l'écran ne soit pas vide. ; mov ah,9 ;fonction d'affichage de chaîne de DOS mov dx,offset SampleText int 21h ; ; Supprime SNAPSHOT.SCR s'il existe. ; mov ah,41h ;fonction de fichier sans lien de DOS mov dx,offset Filename int 21h ; ; Crée le fichier SNAPSHOT.SCR. ; mov ah,3ch ;fonction création de fichier de DOS mov dx,offset Filename sub cx,cx ;fait un fichier normal int 21h mov [Handle],ax ;sauve le handle jnc SaveTheScreen ;nous sommes prêt à sauvegarder ;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, en les rendant lisibles l'un après l'autre ; et en les écrivant sur le disque. Notez que les 4 plans sont lisibles à ; A000:0000; le registre Read Map sélectionne le plan qui est lisible ; à n'importe quel moment. ; SaveTheScreen: mov [Plane],0 ;commence par le plan 0 SaveLoop: mov dx,GC_INDEX mov al,READ_MAP ;positionne Index GC sur le registre ; Read Map out dx,al inc dx mov al,[Plane] ;récupère le nombre de plans que ;nous voulons ; sauvegarder out dx,al ;initialise la lecture du plan désiré mov ah,40h ;fonction d'écriture de fichier de DOS mov bx,[Handle] mov cx,DISPLAYED_SCREEN_SIZE ;nombre d'octets à ;sauvegarder sub dx,dx ;écrit tous les octets affichés à A0 ;00:0000 push ds mov si,VGA_SEGMENT mov ds,si int 21h ;écrit la partie affichée de ce plan pop ds cmp ax,DISPLAYED_SCREEN_SIZE ;tous les octets ont- ;ils été écrits? jz SaveLoopBottom mov ah,9 ;fonction affichage de chaîne de DOS mov dx,offset ErrMsg2 int 21h ;notifie l'erreur jmp short DoClose ;et terminé SaveLoopBottom: mov al,[Plane] inc ax ;pointe sur le prochain plan mov [Plane],al cmp al,3 ;avons-nous traité tous les plans? jbe SaveLoop ;non, traitons le prochain ; ; Ferme SNAPSHOT.SCR. ; DoClose: mov ah,3eh ;fonction de fermeture de fichier de ; DOS mov bx,[Handle] int 21h ; ; Attend une touche clavier. ; mov ah,9 ;fonction affichage de chaîne de DOS ; mov dx,offset WaitKeyMsg int 21h ;prompt 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