je suis en train d'essayer de faire un snake en ASM pour ion, le déplacement fonctionne ainsi que le "game over" quant on sort, mais la queu ne s'efface pas malgrès un code qui selon moi devrait le faire (j'ai l'impression que le point effacé est le symétrique du bon point par raport au centre de l'écran mais je ne suis pas sur.
Voici le code:
.nolist #include "ion.inc" #define var_b saferam1 #define var_c var_b+1 #define longueur_listes var_c+1 #define pointeur longueur_listes+1 .list #ifdef TI83P .org progstart-2 .db $BB,$6D #else .org progstart #endif ret jr nc,start .db "PTDEPLAC",0 start: ld a,45 ld (var_b),a ld a,30 ld (var_c),a ld e,251 ld a,8 ld (longueur_listes),a ld a,7 ld (pointeur),a ld hl,listeX ld (hl),38 inc hl ld (hl),39 inc hl ld (hl),40 inc hl ld (hl),41 inc hl ld (hl),42 inc hl ld (hl),43 inc hl ld (hl),44 inc hl ld (hl),45 ld hl,listeY ld (hl),30 inc hl ld (hl),30 inc hl ld (hl),30 inc hl ld (hl),30 inc hl ld (hl),30 inc hl ld (hl),30 inc hl ld (hl),30 inc hl ld (hl),30 inc hl boucle: ld a,(var_b) cp 1 jp z,gameover cp 94 jp z,gameover ld b,a ld a,(var_c) cp 1 jp z,gameover cp 62 jp z,gameover ld c,a ld d,1 bcall _ipoint ld a,(pointeur);;;;;;;;;;;;;;;;;;;;;;;;;;; début du bout de code sensé effacer le bout de la queu inc a ld c,a ld a,(longueur_listes) cp c call z,pointeur_dehors ld a,c ld (pointeur),a ld hl,listeX ld b,0 ld c,a add hl,bc ld a,(hl) ld d,a ld hl,listeY ld a,(pointeur) ld b,0 ld c,a add hl,bc ld a,(hl) ld c,a ld b,d ld d,0 bcall _ipoint;;;;;;;;;;;;;;;;;;;;;;;;;;;;fin du code sensé effacer le bout de la queu ld hl,listeX ld b,0 add hl,bc ld a,(var_b) ld (hl),a ld hl,listeY ld b,0 add hl,bc ld a,(var_c) ld (hl),a ld a,$FF out (1),a ld a,$FE out (1),a in a,(1) ld h,10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ici c'est la vitesse call ralentir nonfleche: cp 254 jp z,haut cp 253 jp z,gauche cp 251 jp z,droite cp 247 jp z,bas ld a,e jp nonfleche jp boucle gauche: ld a,251 cp e jp z,droite ld hl,var_b ld e,253 dec (hl) jp boucle droite: ld a,253 cp e jp z,gauche ld hl,var_b ld e,251 inc (hl) jp boucle haut: ld a,247 cp e jp z,bas ld hl,var_c ld e,254 dec (hl) jp boucle bas: ld a,254 cp e jp z,haut ld hl,var_c ld e,247 inc (hl) jp boucle ralentir: dec h ei halt di jp nz,ralentir ret pointeur_dehors: ld c,0 ret gameover: bcall _getkey ret listeX: .db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 .db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 .db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 .db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 .db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 listeY: .db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 .db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 .db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 .db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 .db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 .end
Merci d'avance
Sandro
PS : le snake utilise la technique du pointeur sur une chaîne dont seule une valeur varie à chaque tour de boucle; le code est sensé suprimer le bout de la queu avant que la suite du programme atribue cet emplacement à la tête.