1

Bonsoir à tous,
Je bloque sur un bout de mon programme(je précise que j'ai une ti82stats.fr): il devrait faire 1000 tours de boucle, et en sortir si on appuie sur "entrer". Cependant, il ne fait qu'un tour... je ne comprends vraiment pas.
Voici le code:
        call _clrlcdfull
	ld bc,1000
CONF:	ld a,colonedroite
	out (1),a
	in a,(1)
	cp kpentrer
	jr z,SORTIR     ;On va à "sortir" si entrer a été pressé
	dec bc     
	ld a,b
	or c            ;a=0 si bc=0
	jr nz,CONF

;Ce qui suit est défini dans le header:
Colonedroite    .equ $FD
KpEntrer	.equ 254

Merci d'avance!

2

Est-ce que tu as vérifié que vraiment àucune des autres commandes ne modifie bc ?

Par exemple je ne sais pas si out/in modifie à ou non.

Dans le doute empile bc au juste après CONF et dépile le juste avant de le dec.

Je ne peux pas tester ton code, je peux le tester lundi si tu es toujours bloqué.

3

Tu es sûr que ça ne fait qu'un tour ? 1000 boucles ne prendront qu'une fraction d'une minute. Je l'ai testé avec l'émulateur et ça fonctionne justement comme tu veux wink (mais ça passe très vite). Une autre chose peut être que [Enter] est toujours appuyée après avoir éxécuté le programme.

4

Le problème vient effectivement du fait que quand on lance le prgm, on appuye sur entrer, et comme ça va vite, entrer peut toujours être pressé lorsque le prgm s'éxécute. Il suffit donc de remplacer entrer par une autre touche.
Merci beaucoup wink

5

Ah j'etais bien a cote de la plaque smile

6

On pourrait aussi verifier que tu as "relâché"(? que tu n'appuies pas sur) la touche [enter]:
    call _clrlcdfull 
	ld bc,1000
	ld a,colonedroite 
	out (1),a 		;faut pas changer cette valeur à chaque iteration
CONF:
	dec bc      
	ld a,b 
	or c            ;a=0 si bc=0 
	jr z,SORTIR		;si bc=0, quitter boucle
	in a,(1) 
	cp kpentrer
changer_jr = $+1
	jr z,CONF
	ld a,SORTIR-changer_jr-1
	ld (changer_jr),a
	jr CONF
SORTIR:
	ret
Ça ne quittera le boucle si tu n'as pas d'abord relâché et repressé entrer (ou l'on arrive à 1000 itérations) smile Il y a sûrement d'autres méthodes meilleures, par exemple je pensais que l'on pourrait peut-être utiliser "jp (hl)", faire un appel à la routine jusque avant y entrer, ou même changer le jr z à jr nz avec du SMC, mais c'était trop compliqué et d'ailleurs ce code-ci devrait marcher sans problèmes (mais il faut noter que si tu l'éxécutes avec un shell il est probable qu'il ne fonctionne correctement que la première fois, à cause du "program writeback", tu aurais besoin d'initialiser "changer_jr")

7

Merci pour vos réponses (désolé, je n'ai pas pu me connecter plus tôt)
@ chickendude: Heuu, je n'ai pas trop compris ce que tu as modifié (je n'ai pas le niveau suffisant je crains), mais je te remercie smile