ÚÄÄÄÄÄÄÄÄÄÄÄ¿ ³Cours d'asm³ ÀÂÄÄÄÄÄÄÄÄÄÂÙ ³LECON Nø2³ ÀÄÄÄÄÄÄÄÄÄÙ Cette fois on va faire un......allez essayer de deviner quoi :). On va faire un programme de Dessin!!! Bon pour faire un programme de dessin voyons ce dont on à besoin...d'une souris...et pis d'un ecran en mode graphique...et ensuite nous devrons créer des fonctions :)... Pour pouvoir afficher une image il faut d'abord passer en mode graphique car au démmarage de l'ordinateur(ou en mode dos normal) on est en mode texte. Pour cela on va très simplement faire appel à la fonction 0 de l'interruption 10h. Cette fonction permet de changer le mode de l'écran... ***FONCTION 0 DE L'INTERRUPTION 10H*** Paramètres d'entrée: -AH=00 -AL=mode vidéo ************************************** 2 modes vidéos nous interesse particulièrement: le mode 3h est celui dans lequel nous devrons revenir à la fin du programme(mode texte). Le mode 13h quand à lui est le mode graphique qui nous interesse car il permet 256 couleurs dans une résolution de 320*200 pixels(c'est notre mode graphique). Donc pour passer en mode graphique nous ferons simplement: ********** mov ah,0 mov al,13h int 10h ********** Donc nous voila en mode graphique...mais maintenant il faut absolument que nous sachions afficher un point...pour cela nous pourrions encore utilisé une interruption mais elle sont trop lentes pour ce genre de chose... Pour afficher un point sur l'écran nous devons pointer sur la mémoire vidéo. Pour cela nous allons utiliser le segment ES qui pointera sur la mémoire vidéo...pour faire cela il suffit simplement de faire pointer ES sur A000H: ************* mov ax,0a000H mov es,ax ************* Il y a deux choses que vous devez avoir noté rien qu'a ces 2 lignes, c'est qu'on ne peut pas écrire directement dans les segments...et que sur on veut mettre une valeure dans une variable et si celle si commence par une lettre (la valeur) et bien nous devons rajouter un 0 devant pour que le compil ne la prenne pas pour une variable... Pour mettre un point ce sera donc très simple il suffira de mettre par exemple dans di la valeure qu'on veut attendre et on met la couleur dans ce point. Un ptit exemple pour vous éclaircir les idées: *********************** mov di,50 mov es:[di], byte ptr 5 *********************** Ce ptit code fera apparaŒtre un point à la ligne 0 colonne 50...si nous avions voulu mettre un point dans la ligne 8 colonne 30 il suffisait de faire un ptit calcul: ligne*320+colonne=di... Pour se servir de la souris MS-DOS nous offre une panoplie de fonctions: **Initialiser la souris** fonction 00 de l'interruption 33h -ax=00 ************************* Cette fonction renvoit 0 si aucun pilote de souris n'est installé... **Affiche/cache la souris** fonction 01 de l'interruption 33h -ax=01 *************************** Si vous executez cette fonctions alors que la souris et visible, elle disparaitra et inversement... **Lit l'état de la souris** fonction 03 de l'interruption 33h -ax=03 *************************** Cette fonction renvoit dans bx l'état des boutons codé comme suit: bit0=1 le bouton gauche à été actionné bit1=1 le bouton droit à été actionné Elle renvoit dans cx, l'abscisse X du pointeur et dans dx l'ordonnée Y. Qqchose de bizarre c que cx doit être divisé par 2....car la souris met la valeure sur 640....et non pas sur 320... Une des choses les plus importantes dans l'asm est l'utilisation des jumps... Il existe en asm une grande quantité de jump dont je vais devoiler les secrets ici! Il existe en mémoire une sorte de registre qui contient des indicateurs qui sont soit à 0 ou 1...et les jumps ne font que les tester...il existe différentes fonctions qui modifient ces indicateurs mais la principale que nous allons utiliser est cmp, cette instruction permet simplement de comparer 2 registres ou un registre et une valeur.... **je****************************************** ce jump ne fait le saut qu'en cas d'égalité... Exemple: mov ax,5 cmp ax,5 je saute_car_5_est_egal_à_5 ********************************************** **jb****************************************** ce jump saut si la première valeure est inférieur à la deuxième... Exemple: mov ax,1 cmp ax,80 jb saute_car_1_est_plus_petit_que_80 ********************************************** Pour obtenir l'effet inverse, par exemple pour sauter si, dans notre deuxième exemple ax était plus grand que 80 il suffit d'intercaler un n au milieu du jump...par exemple pour jb sela donnerait jnb...simple non? Il existe aussi un autre saut, très simple, c jmp qui effectue un saut sans condition...... Ha j'oubliais, après le jump vous mettez ce qu'on appelle un label...c'est simplement un nom... **********Exemple********** mov ax,8 cmp bx,ax jb saut1 jmp saut2 saut1: saut2: *************************** Bon donc voila ce que devrait donner notre programme: ***************************************** .MODEL SMALL .STACK 100H .386 .DATA NOSOURIS DB "La souris n'as pas été trouvée :(...$" .CODE debut: ;DEBUT DU PROGRAMME mov ax,@DATA ;INITIALISE LE SEGMENT DATA mov ds,ax mov ax,0A000h ;POINTE LE SEGMENT ES SUR VIDEO mov es,ax mov ah,00 ;INITIALISE LE MODE VIDEO mov al,13h int 10h mov ax,0 ;INITIALISE LA SOURIS int 33h cmp ax,0 ;ET JUMP SI PAS DE PILOTES je no_souris mov ax,1 ;AFFICHE LA SOURIS int 33h infinit_loop: mov ax,3h ;TESTE L'ETAT DE LA SOURIS int 33h cmp bx,1 je button_1_pressed ;LOOK SI BUTTON 1 APPUYE cmp bx,2 ;LOOK SI BUTTON 2 APPUYE je button_2_pressed jmp infinit_loop ;SINON REGARDE ENCORE ETAT button_1_pressed: sub cx,2 ;ON SOUSTRAIT 2 à X ET Y POUR EVITER sub dx,2 ;DES PROBLEMES AVEC L'AFFICHAGE DE LA SOURIS mov ax,320 ;MULTIPLIE DX(Y) PAR 320 mul dx shr cx,1 ;DIVISE LES X PAR 2 add ax,cx ;ET AJOUTE LES X mov di,ax ;AFFICHE UN JOLI POINT TOUT BEAU =) mov es:[di],byte ptr 5 jmp infinit_loop ;ET PIS REGARDE SI ENCORE APPUYE button_2_pressed: jmp good_end ;QUITTE LE PROGRAMME SI 2éme BOUTTON PRESSE no_souris: mov ax,2 ;CACHE LA SOURIS int 33h mov ah,00 ;RETABLIT MODE TEXTE mov al,03h int 10h mov ah,09h ;AFFICHE ERREUR lea dx,NOSOURIS int 21h mov ax,4C00H ;ET QUITTE int 21h good_end: mov ax,2 ;CACHE LA SOURIS int 33h mov ah,00 ;RETABLIT MODE TEXTE mov al,03h int 10h mov ax,4C00H ;QUITTE int 21h END debut ;INFORME LE PROG QUE L'ON COMMENCE à debut ***************************************** Et voila mon deuxième cours finit.....j'éspére que vous aurez aimé...et puis il ne tient qu'à vous d'améliorer ce programme :)).