Micro-organisme contre bardack :d

Contenu du snippet

ceci est l'etude (tres simpliste ) de la propagation de bactérie dans un milieu fermé

Projet ESI , Asm n°2

un chti clin d'oeuil a notre ami Bardack =D

Source / Exemple :


.model small
.stack 100h
.486
jumps
locals
extrn random : proc
extrn InitRnd : proc

;==========================================
; donne
;==========================================
.data
asci             db 47 ;va etre utilisé pour le compteur de mort ;)-->la faucheuse [init='0']
asci2            db 48 ;deuxieme chiffre du compteur
proximite        DW 0  ;Nombre de Micro orga qui sont suceptibles d entourer un congenère
handle           dw ?  ;Handle utiliser pour la manipulation de fichier

cinq		 dw 5   ; |
deux		 dw 2   ; |-> variables utilisées pour les divisions
trente           dw 30  ; |

posx		 dw ?   ; Coordonnée en abscisse
posy		 dw ?   ; Coordonnée en Ordonnée

superpose       DW 0  ; Boolean , declarant si il y a supperposition ou non
efface		 dw 0 ;boolean reglant la couleur 1=colorie en noir :)
reproduction	 dw 0 ;boolean reglant le check reproduction
entoure          dw ? ; Boolean , renvoir 0-> pas entouré , 1-> entouré

saverandom	 dw ? ;Sauvegarde du retours AX (random)
saveEnergie	 dw ? ;Sauvegarde des Energie , posx , posy
saveposx	 dw ? ;Sauvegarde de la coordonne en X
saveposy	 dw ? ;Sauvegarde de la coordonne en Y

cpt		 dw ? ; compteur
nb_morga	 dw 30   ;nombre de micro orga initials
nb_Morgarestant  dw 30   ;id nb_Morga mais utiliser pour le test de superposition
nb_nouriture	 dw 576 ; nombre initial de nouriture

tab_orga	 dw	(13000)   dup (0)   ;tab contenant les infos sur les morga initialisé a zero
lenght_tabOrga   dw  $-tab_orga             ;Longueur du vecteur
tab_nouriture	 dw	(120*40)   dup (0)  ; tableau contanant les coordonnées de nouritures initialisé a zero
lenght_tabNouriture dw  $-tab_nouriture     ;Longueur du vecteur

fichier          db       'Organismes.txt',0  ; Nom du fichier qui va recevoir les info des Morga

;*******Variables de TXT *********
enplus		       db " enfant ok$"
mort                   db " Morts :'($"
titre2		       db 'Legende................',10,13
                       db 'Rouge = Micro-Organisme ...',10,13
                       db 'Vert  = Nouriture .........',10,13,'$'

Intro	     db    ' ',10,13
             db    ' ',10,13
             db    ' ',10,13
             db    '	 **********	  ************	   ******   ******     ************',10,13
	     db    '	 ***    ***	  ****		   ******* *******	       ****',10,13
	     db    '	 ***    ***	  ****		   ***************	       ****',10,13
	     db    '	 **********	  ************	   *****     *****     ************',10,13
	     db    '	 **********	  ************	   *****     *****     ************',10,13
	     db    '	 ***    ***		  ****	   *****     *****     ****	   ',10,13
	     db    '	 ***    ***		  ****	   *****     *****     ****	   ',10,13
	     db    '	 ***    ***	  ************	   *****     *****     ************',10,13
	     db    ' ',10,13
             db    ' ',10,13
             db    ' ',10,13
             db    ' Auteur : Digital snake 		  ',10,13
	     db    ' ------ |  		  ',10,13
	     db    '        |  Prof : PBT	 	  ',10,13
	     db    '        |  Version : 26/03/03   ',10,13
	     db    ' ',10,13
	     db    ' ',10,13
	     db    '                     ->  Etude de la vie de MicroBacteries  <-   ',10,13
	     db    '				                ',10,13
	     db    ' ',10,13
	     db    ' ',10,13
	     db    ' ',10,13
	     db    ' ',10,13
	     db    '	[Pour quitter appuyer sur la touche Q]    ',10,13
	     db    '				   ',10,13
	     db    '				   ',10,13
	     db    '				   ',10,13,'$'

;==========================================
; code
;==========================================
.code
main proc
  mov ax,@data
  mov ds,ax
;================================ repete 1 foi =================================
  call mode_graphique	  ;on appel le mode video 640*480	              ;*
;----------------------                                                       ;*
  mov dx,offset Intro     ;Affiche l intro a l'ecran                          ;*
  CALL ecrit                                                                  ;*
  CALL clavier            ;attente d'une touche au clavier pour commancer     ;*
;----------------------                                                       ;*
  call mode_graphique	  ;on appel le mode video 640*480	              ;*
  call damier		  ;affichage de la zone de vie des Micro orga	      ;*
;----------------------                                                       ;*
    mov posx,40         ;compteur du nombre de mort                           ;*
    mov posy,27                                                               ;*
    CALL curseur                                                              ;*
    CALL char						                      ;*
  call titrelegende	 ;========================================	      ;*
;----------------------  ; ==initialisation tableau micro orga ==	      ;*
			 ;========================================	      ;*
  mov bx,0		 ; donne le morga de départ bx=indice du tab_orga     ;*
  mov cx,nb_morga							      ;*
									      ;*
  @@bouclecoordonneemorga:						      ;*
  push cx								      ;*
		       call donnecoordonneeimorga			      ;*
		       add bx,2  ; passe au morga suivant		      ;*
  pop cx								      ;*
  loop @@bouclecoordonneemorga						      ;*
			 ;=========================================	      ;*
;----------------------  ; == initialisation tableau micro orga ==	      ;*
			 ;=========================================	      ;*
mov bx,0		 ;indice de départ				      ;*
mov cx,nb_nouriture	 ;traitement des 150 premiers nouritures	      ;*
									      ;*
@@bouclecoordonneenouriture:						      ;*
push cx 							              ;*
		       call donnecoordonneeinouriture			      ;*
		       add bx,2 ;on passe a la nouriture suivante	      ;*
pop cx								              ;*
loop @@bouclecoordonneenouriture					      ;*
;----------------------
CALL test_si_entoure   ;au cas ou initialement un Morga est entouré           ;*
;=============================================================================
  call dessine_nouriture     ;ecran de base , affiche les morga 	      ;*
  call dessine_morga	     ; et les nouritures			      ;*
		       ;**************                                        ;*
;====================== boucle de jeux =======================================
		       ;**************                                        ;*
CALL InitRnd               ;initialisation pour le random
@@debut:		   ;début de la boucle

    mov efface,1		       ;booleen 1-> on efface
  call dessine_morga	       ;dessine carre noir
  call test_correspondance     ;test visant a voir si les coordonnées morga
			       ;sont les meme que celle de la nouriture
  call test_reproduction       ;on test si les Morga sont aptes a se reproduire

  call mouvement	       ;détermine la nouvelle coordonnée des morga

  CALL test_si_entoure         ;test si un Morga est entourer par d autres Morga
  call add_nouriture	       ;add de la nouriture et la desine (celle en plus)

    mov efface,0		       ;booleen 0->on efface pas
  call dessine_morga	       ;dessine carre rouge
  call fin_prog                ;test si on a appuyer sur Q pour une pause clavier ,->go out

;----------------------

  mov ax,nb_morga              ;test de sortie du programme (2000 -> on sortirais du vecteur !)
  cmp ax,2000
  jge fin
;----------------------
JMP @@debut                    ;Boucle-->on recommance

;=======================================================================
  call clavier	   ;procédure de pause
  jmp fin	   ;goto fin
main endp
;==========================================
;== Procedures				 ==
;==========================================
test_superposition proc
;on va parcourir le tableau des Micro orga en partant du premier et analyser de
;cette facon les suivant et leur position
;-> si il y a meme position on s'arrangera pour donner de nouvelle coordonnées
;->!!! le BX DOIT etre positionner sur posx !!!

           push cx
           mov si,bx
           mov si,2         ;si est l indice du Morga suivant celui k on analyse
           cmp si,bx
                  JE @@finICI
           mov cx,nb_Morgarestant
           cmp cx,0
           JE @@finICI
           @@boucle:
                         cmp tab_orga[si],0
                         JNE @@vivant
                         ADD si,8
                         JMP @@boucle
              @@vivant:
                 push bx
                 push si                    ;au depart les indices sont sur posx
                      mov ax,tab_orga[bx]
                      cmp ax,tab_orga[si]
                      JNE @@suivant
                            ADD bx,2                      ;indice sur posy
                            ADD si,2
                        mov ax,tab_orga[bx]
                        cmp ax,tab_orga[si]
                        JNE @@suivant
                            mov superpose,1

               @@suivant:
                  pop si
                  pop bx
                  ADD si,8
                  cmp si,bx
                  JE @@finICI
           LOOP @@boucle

    @@finICI: pop cx
RET
test_superposition endp
;-----------------------------------------------------------------------
char proc                          ;Procédure qui fais un compte du nombre de morts
	pusha
	cmp asci,57                ;si on est au dessus de 9
	JL @@premierchiffre        ;->on continue car <9
        mov asci,47                ;->remise a zero
        CALL char2                 ;->on passe au second chiffre

@@premierchiffre:
                mov posx,40
                mov posy,27
                CALL curseur
	mov	ah,09h		; Affichage
	INC     asci
        mov	al,asci 	; D'un char correspondant au code ascii
	mov	bh,0
	mov	bl,01000011b	; couleur
	mov	cx,1		; Un seul caractère
	int	10h
	popa
	ret
char endp
char2 proc
	pusha
	cmp asci2,57
	JL @@premierchiffre
        mov asci2,47

@@premierchiffre:
                mov posx,39         ;compteur du nombre de mort
                mov posy,27
                CALL curseur
	mov	ah,09h		; Affichage
	INC     asci2
        mov	al,asci2 	; D'un char correspondant au code ascii
	mov	bh,0
	mov	bl,01000011b	; couleur
	mov	cx,1		; Un seul caractère
	int	10h
	popa
	ret
char2 endp
;-----------------------------------------------------------------------
test_reproduction proc
pusha
			 mov bx,0 ;indice positionner sur l age
			 mov cx,1500

			 @@Boucle:
			     push bx

				   mov ax,tab_orga[bx]	 ; test si plus de 400 ans
				   cmp ax,400
				   JL @@suivant 	 ;si non aller a suivant

				   ADD bx,6		 ;test si Energie + de 400E
				   mov ax,tab_orga[bx]
				   cmp ax,400
				   JL @@suivant 	 ;si non passer a suivant

                 @@A_maturite:
                 @@Fils_1:         sub dx,dx		 ;car on fais une div
				   div deux		;l'énergie du pere est diviser par 2
				   mov tab_orga[bx],ax	;==1er fils== prend la 1/2 de l energie
				   mov saveEnergie,ax	;sauvegarde du niveau d energie
				   SUB bx,6		;indice remis sur age
				   mov tab_orga[bx],1	;Age reinitialisé a 1
				   ADD bx,2		;BX surr posx

                                   mov ax,tab_orga[bx]
				   mov saveposx,ax	;sauvegarde de la derniere posx
				   ADD bx,2		;BX sur posy
				   mov ax,tab_orga[bx]
				   mov saveposy,ax	;sauvegarde de la derniere posy
				   ADD bx,2		;BX sur energie

				     @@TQ_trouvePasLibre:

							   mov ax,tab_orga[bx]	;bx sur energie
							   cmp ax,0
							   JLE @@libre
							   add bx,8
							   JMP @@TQ_trouvePasLibre

						      @@libre:

							    mov ax,saveEnergie
							    mov tab_orga[bx],ax ;Lenergie sera iddentike
							    sub bx,4		;bx sur posx

							    push bx
                @@Donne_coordonne_fils:
                                                            push 1
							    push 800
							    CALL random

				  cmp eax,96		;=====1 er cas=======
		      jge @@suite1
		                  mov ax,saveposx
				  mov tab_orga[bx],ax	;indice sur posx
				  sub tab_orga[bx],5	;decremente d'une case
				  mov ax,tab_orga[bx]
				  cmp ax,0
				  jge @@ok1
				  mov tab_orga[bx],600	;cas ou l'on depasse le tab en x -> passage autre bord
			    @@ok1:
				  add bx,2		;indice sur posy
				  mov ax,saveposy
				  mov tab_orga[bx],ax
				  sub tab_orga[bx],5	;decremente d'une case
				  mov ax,tab_orga[bx]
				  cmp ax,0
				  jge @@fincmp
				  mov tab_orga[bx],400	;cas de dépassement
				  jmp @@fincmp

		   @@suite1:
				  cmp eax,200		;====2 eme cas======
		      jge @@suite2
				  add bx,2		;indice sur posy
				  mov ax,saveposy
				  mov tab_orga[bx],ax
				  sub tab_orga[bx],5	;decremente d'une case
				  mov ax,tab_orga[bx]
				  cmp ax,0
				  jge @@fincmp
				  mov tab_orga[bx],400	 ;cas de depassement
				  jmp @@fincmp

		   @@suite2:
				  cmp eax,296	       ;======3 eme cas=====
		      jge @@suite3
				  mov ax,saveposx
				  mov tab_orga[bx],ax
				  add tab_orga[bx],5   ;incremente d'une case
				  mov ax,tab_orga[bx]
				  cmp ax,600	       ; cas du depassement
				  jle @@ok2
				  mov tab_orga[bx],0
			    @@ok2:
				  add bx,2	       ;indice sur posy
				  mov ax,saveposy
				  mov tab_orga[bx],ax
				  sub tab_orga[bx],5   ;decremente d'une case
				  mov ax,tab_orga[bx]
				  cmp ax,0	       ;cas du depassement
				  jge @@fincmp
				  mov tab_orga[bx],400
				  jmp @@fincmp

		   @@suite3:
				   cmp eax,400		 ;=====4 eme cas=====
		      jge @@suite4
				   mov ax,saveposx
				   mov tab_orga[bx],ax		 ;indice sur posx
				   add tab_orga[bx],5	 ;incremente d'une case
				   mov ax,tab_orga[bx]
				   cmp ax,600		  ;test depassement
				   jle @@fincmp
				   mov tab_orga[bx],0
				   jmp @@fincmp

		   @@suite4:
				   cmp eax,496		 ;========5eme cas=======
		      jge @@suite5
				   mov ax,saveposx
				   mov tab_orga[bx],ax		  ;indice sur posx
				   add tab_orga[bx],5
				   mov ax,tab_orga[bx]
				   cmp ax,600
				   jle @@ok3
				   mov tab_orga[bx],0
			     @@ok3:
				   add bx,2		 ;indice sur posy
				   mov ax,saveposy
				   mov tab_orga[bx],ax
				   add tab_orga[bx],5
				   mov ax,tab_orga[bx]
				   cmp ax,400		 ;test depassement
				   jle @@fincmp
				   mov tab_orga[bx],0
				   jmp @@fincmp

		   @@suite5:
				   cmp eax,600		;=====6eme cas===========
		      jge @@suite6
				   mov ax,saveposx
				   mov tab_orga[bx],ax		;indice sur posy
				   add tab_orga[bx],5
				   mov ax,tab_orga[bx]
				   cmp ax,400
				   jle @@fincmp
				   mov tab_orga[bx],0
				   jmp @@fincmp

		   @@suite6:			       ;=======7eme cas===========
				   cmp eax,696
		      jge @@suite7
				   ADD bx,2	      ;indice sur posx
				   mov ax,saveposx
				   mov tab_orga[bx],ax
                                   sub tab_orga[bx],5
				   mov ax,tab_orga[bx]
				   cmp ax,0
				   jge @@ok4
				   mov tab_orga[bx],600
			      @@ok4:
				   add bx,2	      ;indice sur posy
				   mov ax,saveposy
				   mov tab_orga[bx],ax
                                   add tab_orga[bx],5
				   mov ax,tab_orga[bx]
				   cmp ax,400
				   jle @@fincmp
				   mov tab_orga[bx],0
				   jmp @@fincmp

		   @@suite7:
				   cmp eax,800	      ;===8eme cas================
		   jg @@probleme
				   mov ax,saveposx
				   mov tab_orga[bx],ax	      ;indice sur posx
				   sub tab_orga[bx],5
				   mov ax,tab_orga[bx]
				   cmp ax,0
				   jge @@fincmp
				   mov tab_orga[bx],600
				   jmp @@fincmp
                  @@probleme:
                  JMP @@Donne_coordonne_fils

                                               @@fincmp:    pop bx

                                                            mov ax,saveposx
                                                            mov posx,ax
                                                            mov ax,saveposy
                                                            mov posy,ax
							    mov al,12h
							    CALL carre

							    sub bx,2	      ;bx sur age

							     mov tab_orga[bx],1

							     INC nb_Morga

			      @@suivant:
			     pop bx
				       ADD bx,8 ; Morga suivant (age)

			 Loop @@boucle
popa
RET
test_reproduction endp
;-----------------------------------------------------------------------
test_correspondance proc
			mov bx,6	  ;position indice sur morga 1 , energie
			mov si,0	  ;position indice tab_orga posx initial
mov cx,nb_nouriture
@@boucle2:
	push cx
	    mov cx,nb_Morga
	    @@boucle1:	      ;== Parcours Tab_orga et compare chaque Morga
		    push bx
		    push si
					    ; == Pour chaque nouriture
		       mov ax,tab_orga[bx]  ;== TEst vivant ou non ? ==
		       cmp ax,0 	    ;========Morga=============
		       Jne @@vivant
		       INC cx
		       JMP @@endMorga	    ;on va a la fin de la premiere boucle
		 @@vivant:
		       sub bx,4    ;indice sur posx Morga
		       mov ax,tab_orga[bx]
		       cmp ax,tab_nouriture[si] ;si=posx Nouriture
		       JNE @@endMorga	;=goto fin si posxM != posxN

		       add bx,2    ;indice sur posy Morga
		       add si,2    ;indice sur posy Nouriture
		       mov ax,tab_orga[bx]
		       cmp ax,tab_nouriture[si]
		       JNE @@endMorga
		    @@Correspondance:
				     add bx,2
				     ADD tab_orga[bx],30
				     SUB si,2
				     MOV tab_nouriture[si],0

		 @@endMorga:

		    pop si
		    pop bx

		    ADD bx,8   ; indice placer sur Energie Morga suivant
	     Loop @@boucle1
	 ADD si,4
	 Mov bx,6
     pop cx
  Loop @@boucle2
ret
test_correspondance endp
;-----------------------------------------------------------------------
mouvement proc
	      mov cx,nb_morga
	      mov bx,6
	      @@boucle_mouvement:

		    mov ax,tab_orga[bx]    ;on va tester si on a afaire a un morga vivant
		    cmp ax,0		   ;energie plus de zero
		    jg @@debutdeplacement  ;=vivant on commence les coordonnées nouvelles
		    add bx,8		   ; indice sur morga suivant (energie)
		    jmp @@boucle_mouvement ;= mort , on passe au morga suivant

                 mov nb_Morgarestant,1  ;utiliser pour le test de correspondance
		 @@debutdeplacement:
				  push 0	 ;donne une des 8 cases aux alentours
				  push 800
				  call random
				  push bx	 ;sauvegarde de l'indice morga (energie)

				  cmp eax,96		;=====1 er cas=======
		      jge @@suite1
				  sub bx,4		;indice sur posx
				  sub tab_orga[bx],5	;decremente d'une case
				  mov ax,tab_orga[bx]
				  
                                  cmp ax,0
				  jge @@ok1
				  mov tab_orga[bx],600	;cas ou l'on depasse le tab en x -> passage autre bord
			    @@ok1:
				  add bx,2		;indice sur posy
				  sub tab_orga[bx],5	;decremente d'une case

                    @@oksuperpo1: mov ax,tab_orga[bx]
                                  cmp ax,0
				  jge @@fincmp
				  mov tab_orga[bx],400	;cas de dépassement
				  jmp @@fincmp

		   @@suite1:
				  cmp eax,200		;====2 eme cas======
		      jge @@suite2
				  sub bx,2		;indice sur posy
				  sub tab_orga[bx],5	;decremente d'une case
				  
                     @@oksuperpo2:  mov ax,tab_orga[bx]
				  cmp ax,0
				  jge @@fincmp
				  mov tab_orga[bx],400	 ;cas de depassement
				  jmp @@fincmp

		   @@suite2:
				  cmp eax,296	       ;======3 eme cas=====
		      jge @@suite3
				  sub bx,4	       ;indice sur posx
				  add tab_orga[bx],5   ;incremente d'une case
				  mov ax,tab_orga[bx]
				  cmp ax,600	       ; cas du depassement
				  jle @@ok2
				  mov tab_orga[bx],0
			    @@ok2:
				  add bx,2	       ;indice sur posy
				  sub tab_orga[bx],5   ;decremente d'une case

                    @@oksuperpo3: mov ax,tab_orga[bx]
				  cmp ax,0	       ;cas du depassement
				  jge @@fincmp
				  mov tab_orga[bx],400
				  jmp @@fincmp

		   @@suite3:
				   cmp eax,400		 ;=====4 eme cas=====
		      jge @@suite4
				   sub bx,4		 ;indice sur posx
				   add tab_orga[bx],5	 ;incremente d'une case

                      @@oksuperpo4:mov ax,tab_orga[bx]
				   cmp ax,600		  ;test depassement
				   jle @@fincmp
				   mov tab_orga[bx],0
				   jmp @@fincmp

		   @@suite4:
				   cmp eax,496		 ;========5eme cas=======
		      jge @@suite5
				   sub bx,4		  ;indice sur posx
				   add tab_orga[bx],5
				   mov ax,tab_orga[bx]
				   cmp ax,600
				   jle @@ok3
				   mov tab_orga[bx],0
			     @@ok3:
				   add bx,2		 ;indice sur posy
				   add tab_orga[bx],5

                     @@oksuperpo5: mov ax,tab_orga[bx]
				   cmp ax,400		 ;test depassement
				   jle @@fincmp
				   mov tab_orga[bx],0
				   jmp @@fincmp

		   @@suite5:
				   cmp eax,600		;=====6eme cas===========
		      jge @@suite6
				   sub bx,2		;indice sur posy
				   add tab_orga[bx],5
				   mov ax,tab_orga[bx]
				   cmp ax,400
				   jle @@fincmp
				   mov tab_orga[bx],0
				   jmp @@fincmp

		   @@suite6:			       ;=======7eme cas===========
				   cmp eax,696
		      jge @@suite7
				   sub bx,4	      ;indice sur posx
				   sub tab_orga[bx],5
				   mov ax,tab_orga[bx]
				   cmp ax,0
				   jge @@ok4
				   mov tab_orga[bx],600
			      @@ok4:
				   add bx,2	      ;indice sur posy
				   add tab_orga[bx],5
				   mov ax,tab_orga[bx]
				   cmp ax,400
				   jle @@fincmp
				   mov tab_orga[bx],0
				   jmp @@fincmp

		   @@suite7:
				   cmp eax,800	      ;===8eme cas================
		   jg @@probleme
				   sub bx,4	      ;indice sur posx
				   sub tab_orga[bx],5
				   mov ax,tab_orga[bx]
				   cmp ax,0
				   jge @@fincmp
				   mov tab_orga[bx],600
				   jmp @@fincmp

	 @@probleme: pop bx
		     jmp @@boucle_mouvement

	 @@fincmp:

		  pop bx	    ;indice replacé sur energie de morga traité

		  dec tab_orga[bx]  ;decremente energie
		  mov ax,tab_orga[bx]
		  cmp ax,0
		  JG @@incage
                  sub bx,6
                  mov tab_orga[bx],0                                                                                                                            ;*
                CALL char
                  JMP @@endnow

	@@incage:	  sub bx,6	    ;indice sur l'age
		          inc tab_orga[bx]  ;incremente son age
	@@endnow:	  add bx,14	    ;indice sur energie du morga suivant
	                  mov superpose,0
	                  INC nb_Morgarestant

       loop @@boucle_mouvement
ret
mouvement endp
;-----------------------------------------------------------------------
test_si_entoure proc
                    mov bx,6
  ;lorsque l on rentre dans cette procedure l'indice BX est positionnée sur l Energie du Tab_orga
  ;in va faloir tester di autour de la case du Morga , il y en a d'autres si il ne sais plus bouger ->il meut
  Mov cx,nb_Morga
  @@Boucle_traite_TT_orga:
                    mov ax,tab_orga[bx]    ;on va tester si on a afaire a un morga vivant
		    cmp ax,0		   ;energie plus de zero
		    JNE @@ok
		    ADD bx,8
		    JMP @@Boucle_traite_TT_orga

              @@ok:
              mov proximite,0     ;init de la proximite pour chaque Morga
              push bx
              push cx
              mov cx,nb_Morga
              mov si,6             ;indice sur' Energie 1 ER Morga  [ici utilisé est SI]
              @@Test_tt_les_autres:
                            mov ax,tab_orga[si]    ;on va tester si on a afaire a un morga vivant
		            cmp ax,0		   ;energie plus de zero
		            JNE @@ok2
		            ADD si,8

		            @@ok2:
		              @@CAS_1:        ;test si Morga au Nord a gauche
		                   push bx       ;Sauvegarde des Indices ->sur Energie
		                   push si
		                       sub bx,4              ;bx sur posx
                                       mov ax,tab_orga[bx]   ;
                                       sub si,4              ;si sur posx
                                       dec ax                ;test sur X-1
                                       cmp ax,tab_orga[si]
                                       JNE @@CAS_2
                                          ADD bx,2           ;bx sur posy
                                          ADD si,2           ;si sur posy
                                          mov ax,tab_orga[bx]
                                          dec ax             ;test sur Y-1
                                          cmp ax,tab_orga[si]
                                          JNE @@CAS_2
                                           INC proximite

                              @@CAS_2:        ;test si Morga au nord centre
                                   pop si
                                   pop bx    ;-->on revient au indice sur Energie
                                   push bx
                                   push si   ;-->sauvegarde des indices
                                       sub bx,4         ;bx,si sur posx
                                       sub si,4
                                       mov ax,tab_orga[bx]
                                       cmp ax,tab_orga[si]
                                       JNE @@CAS_3
                                          ADD bx,2         ;bx,si sur posy
                                          ADD si,2
                                          mov ax,tab_orga[bx]
                                          dec ax
                                          cmp ax,tab_orga[si]
                                          JNE @@CAS_3
                                           INC proximite

                              @@CAS_3:       ;test avec la case nord DRoite
                                   pop si
                                   pop bx  ;recuperation des indices sur energie
                                   push bx
                                   push si  ;-->sauvegarde des indices
                                       sub bx,4       ;indice sur posx
                                       sub si,4
                                       mov ax,tab_orga[bx]
                                       INC ax
                                       cmp tab_orga[si],ax
                                       JNE @@CAS_4
                                          ADD bx,2     ;indice sur posy
                                          ADD si,2
                                          mov ax,tab_orga[bx]
                                          DEC ax
                                          cmp tab_orga[si],ax
                                          JNE @@CAS_4
                                            INC proximite

                              @@CAS_4:        ;test sur la case centre droite
                                   pop si
                                   pop bx  ;recuperation des indices sur energie
                                   push bx
                                   push si  ;-->sauvegarde des indices
                                        sub bx,4     ;indice sur posx
                                        sub si,4
                                        mov ax,tab_orga[bx]
                                        INC ax
                                        cmp ax,tab_orga[si]
                                        JNE @@CAS_5
                                           ADD bx,2  ;indice sur posy
                                           ADD si,2
                                           mov ax,tab_orga[bx]
                                           cmp ax,tab_orga[si]
                                           JNE @@CAS_5
                                              INC proximite

                              @@CAS_5:       ;test sur case SUD droite
                                   pop si
                                   pop bx  ;recuperation des indices sur energie
                                   push bx
                                   push si  ;-->sauvegarde des indices
                                      sub bx,4    ;indice sur posx
                                      sub si,4
                                      mov ax,tab_orga[bx]
                                      INC ax
                                      cmp ax,tab_orga[si]
                                      JNE @@CAS_6
                                        ADD bx,2   ;indice sur posy
                                        ADD si,2
                                        mov ax,tab_orga[bx]
                                        INC ax
                                        cmp ax,tab_orga[si]
                                        JNE @@CAS_6
                                          INC proximite

                              @@CAS_6:         ;Test sur case sud centre
                                   pop si
                                   pop bx  ;recuperation des indices sur energie
                                   push bx
                                   push si  ;-->sauvegarde des indices
                                       SUB bx,4   ;indice sur posx
                                       SUB si,4
                                       mov ax,tab_orga[bx]
                                       cmp ax,tab_orga[si]
                                       JNE @@CAS_7
                                         ADD bx,2   ;indice sur posy
                                         ADD si,2
                                         mov ax,Tab_orga[bx]
                                         INC ax
                                         cmp ax,tab_orga[si]
                                         JNE @@CAS_7
                                            INC proximite

                              @@CAS_7:        ;Test sur case Sud gauche
                                   pop si
                                   pop bx  ;recuperation des indices sur energie
                                   push bx
                                   push si  ;-->sauvegarde des indices
                                       sub bx,4    ;indice sur posx
                                       sub si,4
                                       mov ax,tab_orga[bx]
                                       DEC ax
                                       cmp ax,tab_orga[si]
                                       JNE @@CAS_8
                                         ADD bx,2  ;indice sur posy
                                         ADD si,2
                                         mov ax,tab_orga[bx]
                                         INC ax
                                         cmp ax,tab_orga[si]
                                         JNE @@CAS_8
                                            INC proximite

                              @@CAS_8:       ;Test sur case gauche
                                   pop si
                                   pop bx  ;recuperation des indices sur energie
                                   push bx
                                   push si
                                      sub bx,4
                                      sub si,4
                                      mov ax,tab_orga[bx]
                                      dec ax
                                      cmp ax,tab_orga[si]
                                      JNE @@fin_cas
                                         add bx,2
                                         add si,2
                                         mov ax,tab_orga[bx]
                                         inc ax 
                                         JNE @@fin_cas
                                            INC proximite

     @@fin_cas:
              pop si
              pop bx
                  ADD si,8
              LOOP @@Test_tt_les_autres

              pop cx
              pop bx

        @@Test_si_proximite_egal_8:
                                    cmp proximite,8
                                    JNE @@pas_egal
                                    mov tab_orga[bx],0  ;=>si l orga a une proximite de 8
                                                        ;  il dois mourir =>car plus de place pour vivre
        @@pas_egal:
              ADD bx,8           ;passage au Morga suivant
  LOOP @@Boucle_traite_TT_orga

RET
test_si_entoure endp
;-----------------------------------------------------------------------
donnecoordonneeimorga proc	  ;procedure d'initialisation du tab des morga

	      mov tab_orga[bx],1    ;age=1 il est donc vivant

	      push 0
	      push 119
	      call random
	      mul cinq		  ; appel random ds ax

	      add bx,2		    ;indice en posx
	      mov tab_orga[bx],ax   ;donne nbre aleatoire

	      push 0
	      push 79
	      call random
	      mul cinq		  ; appel random ds ax

	      add bx,2		   ;indice en posy
	      mov tab_orga[bx],ax  ;nbre aleatoire ds posy

	      add bx,2		    ;indice en energie
	      push 150
	      push 250
	      CALL random
	      mov tab_orga[bx],ax   ;energie=[150-250] initialisation
ret
donnecoordonneeimorga endp
;-----------------------------------------------------------------------
donnecoordonneeinouriture proc

	      push 0
	      push 119
	      call random
	      mul cinq
	      mov tab_nouriture[bx],ax	;indice sur posx ,donne nbre aleatoire

	      push 0
	      push 79
	      call random
	      mul cinq
	      add bx,2			;indice sur posy
	      mov tab_nouriture[bx],ax	;donne nbre aleatoire
ret
donnecoordonneeinouriture endp
;-----------------------------------------------------------------------
add_nouriture proc		     ;nb_nouriture+=(nb_nouriture/nb_orga)
  pusha
		  MOV si,0    ;indice sur posx de nouriture
		  mov ax,nb_Morga
		  sub dx,dx
		  DIV trente
		  MOV cx,ax    ;nbre d de nouriture rajoutée

				;on va remplir le tableau de nouriture
		  @@Boucle:
			     ;== seul les cases posx=0 seront comblée ==;
			  mov ax,tab_nouriture[si]
			  cmp ax,0
			  JNE @@okp

			  push 0
			  push 120
			  CALL random
			  mul cinq
			  mov tab_nouriture[si],ax   ;posx de tab_nouriture

			  mov posx,ax

			  push 0
			  push 80
			  CALL random
			  mul cinq
			  ADD si,2		     ;posy de tab_nouriture
			  mov tab_nouriture[si],ax

			  mov posy,ax

			  mov al,02h
			  CALL carre

			  ADD si,2		     ;posx suivant

			  JMP @@suivant
		     @@okp:
			  INC cx
			  ADD si,4
		     @@suivant:

		  Loop @@Boucle
  popa
ret
add_nouriture endp
;------------------------------------------------------------------------
dessine_nouriture proc		   ;procedure qui va parcourire le vecteur et dessiner
				   ;les cases avec nouritures
    mov cx,nb_nouriture
    mov si,0
    @@boucle1:
		mov ax,tab_nouriture[si]   ;test pour voir si il y a de la nouriture
		cmp ax,1		   ;car impossible k il y en ai en posx=0
		jge @@ok
		add si,4
		jmp @@boucle1
	   @@ok:
		mov ax,tab_nouriture[si]
		mov posx,ax

		add si,2
		mov ax,tab_nouriture[si]
		mov posy,ax

		mov al,02h
		call carre
		add si,2
    loop @@boucle1
ret
dessine_nouriture endp
;-----------------------------------------------------------------------
dessine_morga proc
		       ;== parcours du vecteur tab_orga ==

		       mov bx,6    ;indice sur energie Morga n°1
		       mov cx,nb_morga

		       @@bouclem:
			 push bx
				     mov ax,tab_orga[bx]     ;== 1/ test si vivant ==
				     cmp ax,0
				     jg @@vivant
				     INC cx
				     jmp @@finboucle

				@@vivant:
					   sub bx,4    ;indice sur posx
					   mov ax,tab_orga[bx]
					   mov posx,ax ;donne la coordonnée

					   add bx,2   ;indice sur posy
					   mov ax,tab_orga[bx]
					   mov posy,ax ;donne la coordonnée

			  pusha
				  mov ax,efface   ;on va tester si il sagit de colorier
				  cmp ax,0	  ;la case ou se trouve le morga ou de l'effacer
				  jne @@couleur_noir
		     @@couleur_rouge:
				  mov al,04h
				  jmp @@couleurok
		     @@couleur_noir:
				  mov al,00h
		     @@couleurok:
				  call carre	  ;appel procedure pour dessiner le carre
			  popa

		     @@finboucle:

		     pop bx
		     add bx,8  ;indice sur energie suivant

		     loop @@bouclem

ret
dessine_morga endp
;--------------------------------------------------------
carre proc
	 push cx
	 mov cx,4
	 inc posy
	 inc posx
   @@bouclecaseok:		;l'utilisation est tres simple,donner les coordonnées
	 call colorie_caseok2	;du pixel en haut a gauche(max sup gauche)
	 inc posy		;avec posx & posy
	 loop @@bouclecaseok
	 sub posy,4
	 pop cx
	 ret
carre endp
;--************phase_suiv*******************--
colorie_caseok2 proc	  ;comme on a afaire a une boucle impriqué
	 push cx	  ;le chois de ssroutine est plus judicieux
	 mov cx,4	  ;colorie_caseok2 est donc relié a colorie_caseok
    @@bouclecase2ok:
	 call pixel
	 inc posx
	 loop @@bouclecase2ok
	 sub posx,4
	 pop cx
	 ret
colorie_caseok2 endp
;-----------------------------------------------------------
damier proc
  mov al,07h
    mov posx,0
    mov posy,0
   lignes_horizontales:
			 mov cx,82
			 @@boucle2h:
				     push cx
				     mov cx,605

				     @@boucle1h:
						call pixel
						inc posx
				     loop @@boucle1h

				     add posy,5
				     mov posx,0
				     pop cx
			loop @@boucle2h
    mov posx,0
    mov posy,0
   lignes_vertivales:
			mov cx,122
			@@boucle2v:
				    push cx
				    mov cx,405

				    @@boucle1v:
					       call pixel
					       inc posy
				    loop @@boucle1v

				    add posx,5
				    mov posy,0
				    pop cx
			loop @@boucle2v
	   ret
damier endp
;-----------------------------------------------------
titrelegende proc

mov posx,5
mov posy,26
call curseur
mov dx,offset titre2
call ecrit

mov posx,41
mov posy,27
call curseur
mov dx,offset mort
call ecrit
	    ret
titrelegende endp
;-----------------------------------------------------
mode_graphique proc
	mov	al,12h ; mode graphique 12h->640*480
	mov	ah,00h
	int	10h
	ret
mode_graphique endp
;------------------------------------------------------
pixel proc	     ;procédure permettant l'affichage
  pushad	     ;d'un pixel,selon les coordonnées
  mov ah,0ch	     ;ici posx et posy
		  ;   mov al,01h	     ;01-->bleu
  mov bx,0000h
  mov cx,posx
  mov dx,posy
  int 10h
  popad
  ret
pixel endp
;------------------------------------------------
;***************************************
;*Test si appui sur Q pour quitter     *
;***************************************
fin_prog proc
pusha
mov     ah,0bh
int     21h
cmp     al,0ffh
jne     fin_test_q

mov     ah,01
int     21h
cmp     al,113  ;113 = valeur ascii de la lettre Q
jne     fin_test_q
CALL clavier
JMP  fin

fin_test_q:

     popa
     ret
fin_prog endp
;---------------------------------------------------
clavier proc
	pusha
	mov	ah,07h	     ; attente d'une touche
	int	21h
	popa
	ret
clavier endp
;-------------------------------------------------
curseur proc near		 ;ssroutine de positionnement du curseur
		 push ax	 ;utilisé pour l'affichage
		 mov dl,byte ptr posx
		 mov dh,byte ptr posy
		 mov ax,0200h
		 int 10h
		 pop ax
		 ret
curseur endp
;-------------------------------------------------
ecrit proc			  ;écriture, va etre utilisé avec un mov dx,offset .nom.
		 pusha
		 mov  ax,0900h
		 int  21h
		 popa
		 ret
ecrit endp
;--------------------------------------------------
; fin du programme**************************
fin:
  ; création d'un fichier et ouverture
  MOV	AH,3CH
  MOV	CX,0000000b		; attibuts standards
  MOV	DX,offset fichier
  int	21h
  MOV	handle,AX

  ; écriture d'un buffer
  MOV	AH,40h
  MOV	BX,handle
  MOV	CX,lenght_tabOrga
  mov dx,'0'
  ADD tab_orga,dx
  MOV	DX,offset tab_orga
  int	21h

  ; femeture du fichier
  MOV	AH,3Eh
  MOV	BX,handle
  int	21h

	mov	al,03h	      ;modevideo 03h (texte)
	mov	ah,00h
	int	10h
	mov	ax,04c00h
	int	21h
end main
;-------------------------------------------------------------

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.