include "tios.h" include "flib.h" include "linelib.h" include "hexlib.h" xdef _main xdef _comment randnum MACRO move.w #5,d0 jsr flib::random ;on retranche 2 pour avoir positif + négatif sub.w #2,d0 muls \2,d0 ; cette fois on gére le niveau, on multiplie par fact qui change selon le niveau add.w d0,\1 ENDM drawline MACRO movem.l d0-d3/a0,-(a7) lea tios::main_lcd,a0 move.w \4,d3 move.w \3,d2 move.w \2,d1 move.w \1,d0 jsr linelib::fline movem.l (a7)+,d0-d3/a0 ENDM WriteStr MACRO move.w \3,-(a7) pea \4(PC) move.w \2,-(a7) move.w \1,-(a7) jsr tios::DrawStrXY lea 10(a7),a7 ENDM SetFont MACRO move.w \1,-(a7) jsr tios::FontSetSys lea 2(a7),a7 ENDM _main: init: move.w #2,fact ;initialise le facteur difficulté à 2 = medium jsr flib::zap_screen SetFont #2 WriteStr #0,#0,#0,present ;présentations diverses SetFont #1 WriteStr #50,#10,#1,author WriteStr #45,#20,#1,email WriteStr #80,#50,#1,hf WriteStr #0,#100,#0,press move.w #1,curs jsr flib::idle_loop jsr flib::zap_screen choixdiff: ;affiche la boite de dialogue choix difficulté WriteStr #0,#60,#1,sel ; "ruse" : on affiche le texte sélectionné en inversé move.w #1,ss1 ; 1 indice pour chaque difficulté : =1 si pas sélectionné move.w #1,ss2 ; =0 si sélectionné move.w #1,ss3 cmp.w #1,curs bne cp2 move.w #0,ss1 cp2: cmp.w #2,curs bne cp3 move.w #0,ss2 cp3: cmp.w #3,curs bne cp4 move.w #0,ss3 cp4: ; un petit encadrement pour faire joli move.w #100,-(a7) move.w #100,-(a7) move.w #68,-(a7) move.w #48,-(a7) jsr flib::frame_rect lea 8(a7),a7 ;on replace le pointeur de la pile au bon endroit WriteStr #50,#70,ss1,choix1 ; on écrit les 3 textes avec leurs indices pour le mode WriteStr #50,#80,ss2,choix2 ; => celui sélectionné sera inversé WriteStr #50,#90,ss3,choix3 jsr flib::idle_loop cmp.w #344,d0 bne dd1 cmp.w #3,curs beq dd1 add.w #1,curs dd1: cmp.w #338,d0 bne dd2 cmp.w #1,curs beq dd2 sub.w #1,curs dd2: cmp.w #$d,d0 beq dd3 cmp.w #264,d0 beq fin jsr flib::zap_screen jmp choixdiff dd3: ;là on commence vraiment le jeu move.w curs,fact jsr flib::zap_screen ; move a0,-(a7) lea tios::main_lcd,a0 ; on fait pointé a0 sur la mémoire LCD pour pas avoir d'erreur style move.l #0,d4 ; ADRESS ERROR avec linelib move.l d4,score1 ;initialise le score move.w #50,d5 move.w #75,d0 move.w d0,x move.w #121,d4 ; le compteur pour la boucle : on fait 120 tours deb: randnum d5,#1 ;on commence à remplir le tableau : à chaque fois, on peut bouger de 0, 1 ou 2 ; dans les 2 sens d'ou 5 possibilités (random) ; pour avoir les négatifs cmp.w #1,d5 ; on est trop à gauche ? bge cont1 move.w #1,d5 ; on rattrape ca cont1: cmp.w #150,d5 ; on est trop à droite ? ble dp1 move.w #150,d5 ; on rattrape ca dp1: move.w d4,d1 lea bords(PC),a0 ; on fait pointé a0 sur le tableau des bords du terrain lsl.w #1,d1 move.w d5,0(a0,d1) ; on place la nouvelle valeur à sa place drawline #0,d4,d5,d4 ; en parallèle on affiche les lignes à l'écran move.w d5,d2 add.w #50,d2 drawline #200,d4,d2,d4 dbra d4,deb ; on boucle 120 fois (hauteur de l'écran de jeu) apr: move.w #$0700,d0 ;ici on redirige les interruptions pour éviter un ralentissement du trap #1 ;aux controles effectués par la TI move.l $64,oldint#1 ;Merci Thomas FERNIQUE pour toutes ces explications !!! bclr.b #2,$600001 move.l #newint#1,$64 bset.b #2,$600001 trap #1 apres: ; boucle principale jsr scrollscreen ;on fait défilé l'écran à chaque tour move.w x,d0 ; on affiche notre petit curseur move.w d0,d2 add.w #2,d2 sub.w #2,d0 drawline d0,#3,d2,#3 ;on l'affiche un peu plus loin avec linelib, avec scrolling => rectangle jsr testcrash ; on vérifie qu'on ne sort pas du terrain cmp.w #1,d5 beq fin jsr defile ; on met à jour le tableau (défile aussi) et on rajoute les lignes tout en bas bsr GetKeys ; on teste les touches pressées par le joueur move.w x,d5 btst.b #6,keys bne testgauche add.w #1,d5 testgauche: ;on regarde ce qu'on fait : on fait bouger notre curseur si besoin btst.b #4,keys bne rien sub.w #1,d5 rien: move.w d5,x jmp apres defile: add.l #1,score1 move.w #1,d4 boucle2: ;on fait défiler le terrain donc il faut faire défiler le tableau BORDS move.w d4,d6 lea bords(PC),a0 lsl.w #1,d6 move.w 0(a0,d6),d2 ; on prend chaque élément du tableau sub.w #1,d4 ;on pointe la case juste avant move.w d4,d6 lsl.w #1,d6 move.w d2,0(a0,d6) ;et on replace l'élément dans cette case add.w #2,d4 cmp.w #120,d4 ;on ne peut pas utiliser DBRA ici car décalage vers le bas beq dernier jmp boucle2 dernier: ;il reste la dernière case à redéfinir avec un RANDOM move.w #119,d4 randnum d2,fact ;on fait un RANDOM de 5 cmp.w #1,d2 ;on effectue les tests de dépassements bge test1 move.w #1,d2 test1: cmp.w #150,d2 blt s1 move.w #150,d2 s1: lsl.w #1,d4 move.w d2,0(a0,d4) ;on insère la nouvelle case en bas du tableau drawline #0,#119,d2,#119 ;ca y est on l'affiche => 1ere moitié add.w #50,d2 drawline #200,#119,d2,#119 ;=>2e moitié rts scrollscreen: ;procédure du défilement de l'écran movem.w d0/a0-a1,-(a7) lea LCD_MEM,a0 ;on fait pointer a0 au tout début de la mémoire LCD lea LCD_MEM+30,a1 ;et a1 à la ligne suivante ds la mémoire LCD move.w #1904,d0 \scroll: move.w (a1)+,(a0)+ ;on recopie tout simplement ce qu'il y a là où pointe a1 sur là où pointe a0 dbra d0,\scroll ;et ceci 1905 fois pour tout l'écran movem.w (a7)+,d0/a0-a1 rts ;fini ! testcrash: move.w #0,d5 ; on vérifie si on touche le bord movem.w d0-d4/a0,-(a7) lea bords(PC),a0 move #1,d4 lsl.w #1,d4 move.w 0(a0,d4),d2 ; on prend la coordonnée du bord cmp.w x,d2 ; et on compare avec la gauche bgt perdu add.w #50,d2 cmp.w x,d2 ;puis la droite blt perdu movem.w (a7)+,d0-d4/a0 move.w #0,d5 rts perdu: move.w #$0700,d0 ;remet int#1 et rétabli les interruptions pour idle_loop par exemple trap #1 bclr.b #2,$600001 move.l oldint#1(pc),$64 bset.b #2,$600001 trap #1 jsr flib::idle_loop movem.w (a7)+,d0-d4/a0 move.w #1,d5 rts GetKeys: move.w d0,$600018 ;on a besoin que de la 1ere ligne nop nop nop nop nop nop move.b $60001B,keys rts newint#1: add.w #1,timer ;pas utile si le temps ne sert pas rte fin: SetFont #1 jsr flib::zap_screen ;on affiche le score fait WriteStr #70,#50,#0,sc clr.l d0 move.l score1,d0 move.l #8,d1 move.l #12,d2 move.l #4,d4 jsr hexlib::put_hex cmp #1,fact beq easy cmp #2,fact beq med cmp #3,fact beq hard easy: ;on teste avec le highscore du niveau correspondant move.l h1,d0 cmp.l score1,d0 bge pasdhighscore move.l score1,h1 WriteStr #0,#100,#0,high jmp pasdhighscore med: move.l h2,d0 cmp.l score1,d0 bge pasdhighscore move.l score1,h2 WriteStr #0,#100,#0,high jmp pasdhighscore hard: move.l h3,d0 cmp.l score1,d0 bge pasdhighscore move.l score1,h3 WriteStr #0,#100,#0,high pasdhighscore: ;enfin on affiche la liste des HIGHSCORES jsr flib::idle_loop jsr flib::zap_screen WriteStr #0,#0,#1,act WriteStr #10,#16,#1,choix1 WriteStr #10,#24,#1,choix2 WriteStr #10,#32,#1,choix3 move.w #40,-(a7) move.w #109,-(a7) move.w #14,-(a7) move.w #9,-(a7) jsr flib::frame_rect lea 8(a7),a7 move.l h1,d0 move.l #2,d1 move.l #7,d2 jsr hexlib::put_hex move.l h2,d0 move.l #3,d1 move.l #7,d2 jsr hexlib::put_hex move.l h3,d0 move.l #4,d1 move.l #7,d2 jsr hexlib::put_hex jsr flib::idle_loop rts bords ds.w 121 keys dc.w 0 timer dc.w 0 x dc.w 0 _comment dc.b "v0.5 by Christophe Fondacci",0 present dc.b "Tunnel v0.5 beta for PlusShell",0 author dc.b "by christophe fondacci",0 email dc.b "fondacci@club-internet.fr",0 hf dc.b "Have fun !",0 press dc.b " Press ENTER to start ",0 high dc.b " You made a highscore ! ",0 act dc.b "The current highscores are :",0 sc dc.b "Your score is :",0 sel dc.b "Choose your level :",0 choix1 dc.b "Easy ",0 choix2 dc.b "Medium ",0 choix3 dc.b "Hard ",0 oldint#1 dc.l 0 h1 dc.l 0 h2 dc.l 0 h3 dc.l 0 score1 dc.l 0 fact dc.w 0 ss1 dc.w 0 ss2 dc.w 0 ss3 dc.w 0 curs dc.w 0 end