;puissance4 v1.0 par Julien Coppolani include "tios.h" include "flib.h" xdef _main xdef _comment _main: move.l #tios::main_lcd,a0 adda.w #248,a0 ; 248 = 8 + 30*8 move.l a0,a1 adda.w #3388,a1 move.w #7,d0 jsr flib::zap_screen _boucle: move.w #112,d1 suba.w #3388,a1 ;3388 = 31*112 - 2 _boucle2: bset #7,(a1) adda.w #30,a1 dbra.w d1,_boucle2 move.l #$FFFFFFFF,(a0)+ ; move.l #$FFFFFFFF,(a0)+ ; tait horizontal (de 14 octets) move.l #$FFFFFFFF,(a0)+ ; move.w #$FFFF,(a0)+ ; adda.w #466,a0 ; 466 = 16 + 30*15 dbra.w d0,_boucle move.w #0,-(a7) jsr tios::FontSetSys move.w #4,(a7) pea player(pc) move.w #60,-(a7) move.w #194,-(A7) jsr tios::DrawStrXY lea 8(a7),a7 pea julien(pc) move.w #123,-(a7) move.w #66,-(a7) jsr tios::DrawStrXY lea 8(a7),a7 pea numeros(pc) move.w #1,-(a7) move.w #70,-(a7) jsr tios::DrawStrXY lea 10(a7),a7 move.l #48,d3 ; nbre de pions plaçés lea table(pc),a3 ; a3 : adresse de table lea tableau(pc),a2 ; a2 : adresse de tableau movea.l a3,a6 move.w #27,d0 ; - 27 = (49+7)/2-1 - _reset: ; initialise table et tableau clr.l (a6)+ ; dbra d0,_reset ; _debut: lea sprite2(pc),a0 lea sprite4(pc),a5 tst.b joueur ; ne teste que le 1er byte de joueur beq _merde0 lea sprite1(pc),a0 lea sprite3(pc),a5 _merde0: adda.w #2,a0 move.l #tios::main_lcd,a4 adda.w #2066,a4 move.w #14,d0 _showjoue: move.w (a0)+,(a4) bclr.w #7,(a4) adda.w #30,a4 dbra.w d0,_showjoue suba.w #32,a0 ; réinitialise l'adresse du sprite (1 ou 3) _debut1: jsr flib::idle_loop cmpi.b #13,d0 beq _main cmpi.b #264,d0 ; d0 : code de la touche beq _fin2 cmpi.b #48,d0 beq _debut1 move.w d0,d6 andi.b #%11111000,d0 ; filtre les chiffres 0..7 cmpi.b #%00110000,d0 ; bne _debut1 subi.b #49,d6 move.w d6,d5 ; car d6 va être modifié et besoin de sa valeur ultérieurement lsl.w #1,d5 move.w 0(a3,d5.w),d4 ; lit la valeur dans table[colonne] move.w d5,-(a7) cmpi.b #7,d4 bge _debut1 move.w d4,ligne move.w d6,colonne clr.b inc bchg #0,joueur ; ( byte et non mot : joueur est soit $0101, soit $0001 ) movea.l a5,a6 ; sauve a5 dans a6 move.w d4,d1 mulu #7,d1 add.w d6,d1 lsl.w #1,d1 move.w d1,d2 ; sauve d1 dans d2, lequel permettra de restaurer d1 par la suite clr.b d5 ; --vertical-- clr.b d7 _tantque1: move.w ligne,d4 subq.w #1,d4 move.w d2,d1 subi.w #14,d1 _tantque10: tst.w d1 blt _vert1 move.w 0(a2,d1.w),d0 cmp.w joueur,d0 bne _vert1 tst.b d7 beq _continue bsr _affiche _continue: subi.w #14,d1 addq.b #1,d5 subq.w #1,d4 bra _tantque10 _vert1: tst.b d7 bne _horiz cmpi.b #3,d5 blt _horiz moveq.b #1,d7 bra _tantque1 _horiz: clr.b d5 clr.b d7 move.w ligne,d4 _tantque2: move.w colonne,d6 subq.w #1,d6 move.w d2,d1 subi.w #2,d1 _tantque20: tst.w d6 blt _tantque3 move.w 0(a2,d1.w),d0 cmp.w joueur,d0 bne _tantque3 tst.b d7 beq _continue2 bsr _affiche _continue2: subq.w #2,d1 addq.b #1,d5 subq.w #1,d6 bra _tantque20 _tantque3: move.w colonne,d6 addq.w #1,d6 move.w d2,d1 addq.w #2,d1 _tantque30: cmp.w #6,d6 bgt _hor2 move.w 0(a2,d1.w),d0 cmp.w joueur,d0 bne _hor2 tst.b d7 beq _continue3 bsr _affiche _continue3: addq.w #2,d1 addq.w #1,d6 addq.b #1,d5 bra _tantque30 _hor2: tst.b d7 bne _diag1 cmpi.b #3,d5 blt _diag1 moveq.b #1,d7 bra _tantque2 _diag1: clr.b d5 clr.b d7 _tantque4: move.w colonne,d6 subq.w #1,d6 move.w ligne,d4 subq.w #1,d4 move.w d2,d1 subi.w #16,d1 _tantque40: tst.w d6 blt _tantque5 tst.w d4 blt _tantque5 move.w 0(a2,d1.w),d0 cmp.w joueur,d0 bne _tantque5 tst.b d7 beq _continue4 bsr _affiche _continue4: subi.w #16,d1 addq.b #1,d5 subq.w #1,d6 subq.w #1,d4 bra _tantque40 _tantque5: move.w colonne,d6 move.w ligne,d4 addq.w #1,d6 addq.w #1,d4 move.w d2,d1 addi.w #16,d1 _tantque50: cmp.w #6,d6 bgt _dia1 cmp.w #6,d4 bgt _dia1 move.w 0(a2,d1.w),d0 cmp.w joueur,d0 bne _dia1 tst.b d7 beq _continue5 bsr _affiche _continue5: addi.w #16,d1 addq.w #1,d6 addq.w #1,d4 addq.w #1,d5 bra _tantque50 _dia1: tst.b d7 bne _diag2 cmpi.b #3,d5 blt _diag2 moveq.b #1,d7 bra _tantque4 _diag2: clr.b d5 clr.b d7 _tantque6: move.w colonne,d6 addq.w #1,d6 move.w ligne,d4 subq.w #1,d4 move.w d2,d1 subi.w #12,d1 _tantque60: tst.w d4 blt _tantque7 cmpi.w #6,d6 bgt _tantque7 move.w 0(a2,d1.w),d0 cmp.w joueur,d0 bne _tantque7 tst.b d7 beq _continue6 bsr _affiche _continue6: subi.w #12,d1 addq.b #1,d5 addq.w #1,d6 subq.w #1,d4 bra _tantque60 _tantque7: move.w colonne,d6 move.w ligne,d4 subq.w #1,d6 addq.w #1,d4 move.w d2,d1 addi.w #12,d1 _tantque70: tst.w d6 blt _dia2 cmpi.w #6,d4 bgt _dia2 move.w 0(a2,d1.w),d0 cmp.w joueur,d0 bne _dia2 tst.b d7 beq _continue7 bsr _affiche _continue7: addi.w #12,d1 subq.w #1,d6 addq.w #1,d4 addq.w #1,d5 bra _tantque70 _dia2: tst.b d7 bne _zut cmpi.b #3,d5 blt _zut moveq.b #1,d7 bra _tantque6 _zut: move.b inc,d1 cmp.b #1,d1 ; fin ? beq _merde2 movea.l a0,a5 ; si pas fin alors pions normaux _merde2: move.w colonne,d6 move.w ligne,d4 bsr _affiche move.w (a7)+,d5 addq.w #1,0(a3,d5.w) move.w joueur,0(a2,d2.w) cmp.b #1,d1 beq _fin dbra.w d3,_debut _fin: move.w #2,-(a7) jsr tios::FontSetSys move.w #4,(a7) cmp.w #-1,d3 beq _nul pea win(pc) move.w #10,-(a7) move.w #0,-(a7) jsr tios::DrawStrXY lea 8(a7),a7 divu #2,d3 swap d3 tst.b d3 beq _joueur1 pea jou2(pc) bra _joueur2 _nul: pea jounul(pc) bra _joueur2 _joueur1: pea jou1(pc) _joueur2: move.w #0,-(a7) move.w #0,-(a7) jsr tios::DrawStrXY lea 10(a7),a7 jsr flib::idle_loop cmp.b #13,d0 beq _main _fin2: rts _affiche: move.b #1,inc move.w d4,-(a7) move.w d6,-(a7) lsl.w #4,d4 ; addq #8,d4 ; neg.w d4 ; addi.w #112,d4 ; mulu #30,d4 ; calcule les coordonnées du sprite à afficher lsl.w #1,d6 ; addq.w #8,d4 ; add.w d6,d4 ; move.l #tios::main_lcd,a4 ; adda.w d4,a4 ; move.w #15,d0 _showpion: move.w (a5)+,(a4) adda.w #30,a4 dbra.w d0,_showpion movea.l a6,a5 move.w (a7)+,d6 move.w (a7)+,d4 rts sprite1 dc.w %1111111111111111, dc.w %1000001111100000, dc.w %1000111111111000, dc.w %1001110000011100, dc.w %1011100000001110, dc.w %1011000000000110, dc.w %1110000000000011, dc.w %1110000000000011, dc.w %1110000000000011, dc.w %1110000000000011, dc.w %1110000000000011, dc.w %1011000000000110, dc.w %1011100000001110, dc.w %1001110000011100, dc.w %1000111111111000, dc.w %1000001111100000 sprite2 dc.w %1111111111111111, dc.w %1000000000000000, dc.w %1011000000000110, dc.w %1011100000001110, dc.w %1001110000011100, dc.w %1000111000111000, dc.w %1000011101110000, dc.w %1000001111100000, dc.w %1000000111000000, dc.w %1000001111100000, dc.w %1000011101110000, dc.w %1000111000111000, dc.w %1001110000011100, dc.w %1011100000001110, dc.w %1011000000000110, dc.w %1000000000000000 sprite3 dc.w %1111111111111111, dc.w %1111110000011111, dc.w %1111000000000111, dc.w %1110001111100011, dc.w %1100011111110001, dc.w %1100111111111001, dc.w %1001111111111100, dc.w %1001111111111100, dc.w %1001111111111100, dc.w %1001111111111100, dc.w %1001111111111100, dc.w %1100111111111001, dc.w %1100011111110001, dc.w %1110001111100011, dc.w %1111000000000111, dc.w %1111110000011111 sprite4 dc.w %1111111111111111, dc.w %1111111111111111, dc.w %1100111111111001, dc.w %1100011111110001, dc.w %1110001111100011, dc.w %1111000111000111, dc.w %1111100010001111, dc.w %1111110000011111, dc.w %1111111000111111, dc.w %1111110000011111, dc.w %1111000111000111, dc.w %1110001111100011, dc.w %1100011111110001, dc.w %1100111111111001, dc.w %1111111111111111, dc.w %1111111111111111 table ds.w 7 ; table contenant l'ordonnée du dernier pion plaçé de chaque colonne tableau ds.w 49 joueur dc.w 1 colonne dc.w 0 ligne dc.w 0 inc dc.b 0 player dc.b "Player's turn",0 julien dc.b "Puissance 4 by Julien COPPOLANI",0 numeros dc.b "1 2 3 4 5 6 7",0 jou1 dc.b "Player 1",0 jou2 dc.b "Player 2",0 win dc.b "has won!",0 jounul dc.b "Draw !",0 _comment: dc.b "essai",0 end