************************** *** ESTIENNE Sebastien *** *** 2004 *** ************************** *************************** *** Function gGhost *** *************************** gGhost movem.l D0/A0-A2,-(A7) ; on empile clr.b D0 ; raz de D0 move.l 28(A7),A0 ; recup @ plateau move.l 24(A7),A1 ; recup @ herodata move.l 20(A7),A2 ; recup @ dataghost bgGhost cmpi.b #nbGhost,D0 ; verif si traite ts ghost beq sgGhost move.l A0,-(A7) ; empile @ plateau move.l A1,-(A7) ; empile @ herodata move.b (A2)+,-(A7) ; empile ghosty move.b (A2)+,-(A7) ; empile ghostx bsr lGhost ; deplace un fantome sub.l #1,A2 ; revient @ ghostx move.b (A7)+,(A2) ; maj ghostx & A7++ sub.l #1,A2 ; va @ de ghosty move.b (A7)+,(A2) ; maj ghosty & A7++ add.l #8,A7 ; on depile add.l #2,A2 ; va ghosty ghost suivant add.b #1,D0 ; passe au ghost suivant bra bgGhost sgGhost movem.l (A7)+,D0/A0-A2 ; on depile rts fgGhost *************************** *** Function lGhost *** *************************** lGhost movem.l D0-D5/A0-A1,-(A7) ; on empile clr.l D0 ; raz de D0 clr.l D1 ; raz de D1 clr.l D2 ; raz de D2 clr.l D3 ; raz de D3 clr.l D4 ; raz de D4 clr.l D5 ; raz de D5 move.l 44(A7),A0 ; recup @ plateau move.b 36(A7),D0 ; recup ghostx = D0 move.b 38(A7),D1 ; recup ghosty = D1 add.b D1,D2 ; D2 = y mulu.l #80,D2 ; D2 = 80*y add.l D0,D2 ; D2 = 80*y+x sub.l #81,D2 ; D2 = 80*y+x-correction adda.l D2,A0 ; va @ de ce fantome btst.b #1,(A0) ; si bit a 1 beq ftst11 ; sinon suite btst.b #2,(A0) ; si bit a 1 bne lGhost2 ; alors ghost avance pas ftst11 btst.b #2,(A0) ; si bit a 1 bne lGhost1 ; alors ghost avance pas btst.b #1,(A0) ; si bit a 0 bne lGhost0 ; ghost va avancer suba.l D2,A0 ; sinon avance, pas repos @ bra slGhost lGhost2 bclr.b #1,(A0) ; => 10 depl ds 2 trs suba.l D2,A0 ; repos @ plateau bra rlGhost ; va fin lGhost1 bclr.b #2,(A0) ; => 00 bset.b #1,(A0) ; => 01 depl prochain tr suba.l D2,A0 ; repos @ plateau bra rlGhost ; va fin lGhost0 suba.l D2,A0 ; repos @ plateau clr.l D2 ; raz de D2 move.l 40(A7),A1 ; recup @ herodata move.b (A1)+,D3 ; D3 = heroy move.b (A1),D2 ; D2 = herox cmp.b D0,D2 ; cmp ghostx & herox beq egal ; sur autre axe bra negal ; suite egal cmp.b D1,D3 ; cmp ghosty & heroy beq slGhost ; fin (hero=ghost) bra negal negal cmp.b D2,D0 ; cmp herox & ghostx bhi supx ; D0>D2 sub.b D0,D2 ; D2-D0->D2 move.b D2,D4 ; D4 = D2 move.b (A1),D2 ; D2 = herox bra xxx ; vers cmp axe y supx sub.b D2,D0 ; D0-D2->D0 move.b D0,D4 ; D4 = D0 move.b 36(A7),D0 ; D0 = ghostx bra xxx ; vers cmp axe y xxx cmp.b D3,D1 ; cmp heroy & ghosty bhi supy ; D1>D3 sub.b D1,D3 ; D3-D1->D3 move.b D3,D5 ; D5 = D3 sub.l #1,A1 ; revient @ heroy ds datahero move.b (A1),D3 ; D3 = heroy bra yyy ; vers cmp dist supy sub.b D3,D1 ; D1-D3->D1 move.b D1,D5 ; D5 = D1 move.b 38(A7),D1 ; D1 = ghosty bra yyy ; vers cmp dist yyy add.b #1,D4 ; correction add.b #1,D5 ; correction cmp.b D5,D4 ; cmp dist y et x bhi mvxxx ; D4>D5 (dx>dy) depl x bra mvyyy ; D5>=D4 (dy>=dx) depl y mvxxx cmp.b D2,D0 ; cmp herox & ghostx bhi mvxxxg ; D0>D2 depl gauche bra mvxxxd ; D2>D0 depl droite mvyyy cmp.b D3,D1 ; cmp heroy & ghosty bhi mvyyyh ; D1>D3 depl haut bra mvyyyb ; D3>D1 depl bas mvxxxg cmp.b #0,D5 ; verif si deja passe beq slGhost clr.l D5 ; raz de D5 add.b D1,D5 ; D5 = D1 = y mulu.l #80,D5 ; D5 = 80*y add.l D0,D5 ; D5 = 80*y+x sub.l #1,D5 ; D5 = 80*y+(x-1) sub.l #81,D5 ; D5 = 80*y+(x-1)-81 adda.l D5,A0 ; va @ case gauche ghost btst.b #2,(A0) ; test si autre ghost bne mvyyy2 btst.b #1,(A0) ; idem bne mvyyy2 bra mvxxxg2 ; continue mvyyy2 suba.l D5,A0 ; repos @ plateau debut clr.b D5 ; raz de D5 bra mvyyy ; essaye de depl en y mvxxxg2 btst.b #7,(A0) ; test si mur beq mvxxxg3 bset.b #1,(A0) ; depl fantome mvxxxg3 bset.b #2,(A0) ; idem mvxxxg4 btst.b #0,(A0) ; test si hero beq mvxxxg5 bset.b #1,(A0) ; depl fantome mvxxxg5 sub.b #1,D0 ; ghostx - 1 move.l D0,-(A7) ; empile nv ghostx move.l D1,-(A7) ; empile ghosty bsr setCursor ; positionne curseur add.l #8,A7 ; on depile move.b (A0),-(A7) ; empile case bsr lDisplay ; actualise ecran add.l #2,A7 ; on depile add.l #1,A0 ; va anc place hero bclr.b #1,(A0) ; eff ghost case du plateau add.b #1,D0 ; remet D0 val ini move.l D0,-(A7) ; empile ghostx move.l D1,-(A7) ; empile ghosty bsr setCursor ; positionne curseur add.l #8,A7 ; on depile move.b (A0),-(A7) ; empile case bsr lDisplay ; actualise ecran add.l #2,A7 ; on depile sub.b #1,D0 ; nv pos x du ghost sub.l #1,A0 ; nv pos @ plateau du ghost suba.l D5,A0 ; revient @ debut plateau bra rlGhost ; vers fin mvxxxd cmp.b #0,D5 ; verif si deja passe beq slGhost clr.l D5 add.b D1,D5 ; calcul mulu.l #80,D5 add.l D0,D5 add.l #1,D5 sub.l #81,D5 adda.l D5,A0 btst.b #2,(A0) ; test si autre ghost bne mvyyy3 btst.b #1,(A0) bne mvyyy3 bra mvxxxd2 mvyyy3 suba.l D5,A0 clr.b D5 bra mvyyy mvxxxd2 btst.b #7,(A0) ; test si mur beq mvxxxd3 bset.b #1,(A0) mvxxxd3 bset.b #2,(A0) mvxxxd4 btst.b #0,(A0) ; test si hero beq mvxxxd5 bset.b #1,(A0) mvxxxd5 add.b #1,D0 ; depl ghost move.l D0,-(A7) move.l D1,-(A7) bsr setCursor add.l #8,A7 move.b (A0),-(A7) bsr lDisplay add.l #2,A7 sub.l #1,A0 bclr.b #1,(A0) sub.b #1,D0 move.l D0,-(A7) move.l D1,-(A7) bsr setCursor add.l #8,A7 move.b (A0),-(A7) bsr lDisplay add.l #2,A7 add.b #1,D0 add.l #1,A0 suba.l D5,A0 bra rlGhost mvyyyh cmp.b #0,D4 ; verif si deja passe beq slGhost clr.l D4 add.b D1,D4 ; calcul sub.b #1,D4 mulu.l #80,D4 add.l D0,D4 sub.l #81,D4 adda.l D4,A0 btst.b #2,(A0) ; test si autre ghost bne mvxxx2 btst.b #1,(A0) bne mvxxx2 bra mvyyyh2 mvxxx2 suba.l D4,A0 clr.b D4 bra mvxxx mvyyyh2 btst.b #7,(A0) ; test si mur beq mvyyyh3 bset.b #1,(A0) mvyyyh3 bset.b #2,(A0) mvyyyh4 btst.b #0,(A0) ; test si hero beq mvyyyh5 bset.b #1,(A0) mvyyyh5 sub.b #1,D1 ; depl ghost move.l D0,-(A7) move.l D1,-(A7) bsr setCursor add.l #8,A7 move.b (A0),-(A7) bsr lDisplay add.l #2,A7 add.l #80,A0 bclr.b #1,(A0) add.b #1,D1 move.l D0,-(A7) move.l D1,-(A7) bsr setCursor add.l #8,A7 move.b (A0),-(A7) bsr lDisplay add.l #2,A7 sub.b #1,D1 sub.l #80,A0 suba.l D4,A0 bra rlGhost mvyyyb cmp.b #0,D4 ; verif si deja passe beq slGhost clr.l D4 add.b D1,D4 ; calcul add.b #1,D4 mulu.l #80,D4 add.l D0,D4 sub.l #81,D4 adda.l D4,A0 btst.b #2,(A0) ; test si autre ghost bne mvxxx3 btst.b #1,(A0) bne mvxxx3 bra mvyyyb2 mvxxx3 suba.l D4,A0 clr.b D4 bra mvxxx mvyyyb2 btst.b #7,(A0) ; test si mur beq mvyyyb3 bset.b #1,(A0) mvyyyb3 bset.b #2,(A0) mvyyyb4 btst.b #0,(A0) ; test si hero beq mvyyyb5 bset.b #1,(A0) mvyyyb5 add.b #1,D1 ; depl ghost move.l D0,-(A7) move.l D1,-(A7) bsr setCursor add.l #8,A7 move.b (A0),-(A7) bsr lDisplay add.l #2,A7 sub.l #80,A0 bclr.b #1,(A0) sub.b #1,D1 move.l D0,-(A7) move.l D1,-(A7) bsr setCursor add.l #8,A7 move.b (A0),-(A7) bsr lDisplay add.l #2,A7 add.b #1,D1 add.l #80,A0 suba.l D4,A0 bra rlGhost rlGhost move.b D0,36(A7) ; nv ghostx en sortie move.b D1,38(A7) ; nv ghosty en sortie slGhost movem.l (A7)+,D0-D5/A0-A1 ; on depile rts flGhost ****************************** *** Function ghostHero *** ****************************** ghostHero movem.l D0/A1-A2,-(A7) ; on empile move.l 20(A7),A1 ; recup @ herodata move.l 16(A7),A2 ; recup @ dataghost clr.b D0 ; raz de D0 add.l #3,A1 ; va vies du hero cmp.b #0,(A1) ; verif si nb vies=0 beq ughostHero ; ds ce cas quitte sub.l #3,A1 ; revient @ debut herodata bghostHero cmp.b #nbGhost,D0 ; verif si ts ghost traite beq ughostHero ; ds ce cas fin cmpm.b (A1)+,(A2)+ ; cmp heroy & ghosty bne sghostHero cmpm.b (A1)+,(A2)+ ; cmp herox & ghostx bne rghostHero add.l #1,A1 ; va @ vies hero sub.b #1,(A1) ; enleve une vie au hero sub.l #3,A1 ; revient @ debut de herodata bra ughostHero rghostHero sub.l #1,A1 ; pr revenir @ debut herodata sghostHero sub.l #1,A1 ; idem add.b #1,D0 ; ghost suivant bra bghostHero ughostHero movem.l (A7)+,D0/A1-A2 ; on depile rts fghostHero