Posté le 09/07/2011 à 10:31 Membre depuis le 25/03/2011, 207 messages
Bonjour/bonsoir,
Je voudrais savoir si quelcun aurrait une idée pourquoi avec ce code, j'optient un "PLUSMOIN.z80:39: warning: Number is too large to fit in 8 bits, truncating" en jaune lors de la compillation.

Ce sont les lignes suivies d'une multitude de point-virgules

	.nolist 
#include "ion.inc" 
	.list 
#ifdef TI83P 
	.org progstart-2 
	.db $BB,$6D 
#else 
	.org progstart 
#endif 
	ret 
	jr nc,start 
	.db "PLUSMOIN",0 
 
start: 
#define	nombrecherche	saferam1
#define	n_essais	nombrecherche+1
#define	numerau_essaye	n_essais+1



	ld	b,255
	ld	a,r
	ld	(nombrecherche),a;		a:réponse corecte
	ld	a,0
	ld	(numerau_essaye),a;		b:compteur du nombre essayé
	ld	a,0
	ld	(n_essais),a;		d:comptenr des tentatives


debut:
	ld	hl,$0000
	ld	(pencol),hl
	ld	hl,interval
	bcall _vputs

boucle:
	ld	hl,$0001
	ld	(currow),hl
	;ld	l,numerau_essaye;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	ld	h,0
	bcall _disphl
	bcall _getkey



	cp	3
	jp	z,haut
	cp	4
	jp	z,bas
	cp	5
	jp	z,entrer


	cp	9
	jp	nz,boucle
	ret	

haut:
	;ld	b,numerau_essaye;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	inc	b
	;ld	b,numerau_essaye;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	jp	boucle

bas:
	;ld	b,numerau_essaye
	dec	b
	;ld	b,numerau_essaye
	jp	boucle
entrer:
	bcall _clrlcdf
	;ld	a,n_essais;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	inc	a
	ld	(n_essais),a
	ld	hl,$EE07
	ld	(currow),hl
	ld	l,a
	ld	h,0
	bcall _disphl

	;ld	e,numerau_essaye;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	;ld	a,nombrecherche;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	cp	e
	jp	z,victoire
	jp	p,moins
	jp	m,plus
victoire:
	ld	hl,$0302
	ld	(pencol),hl
	ld	hl,vict
	bcall _vputs
	ret
moins:
	ld	hl,$0F00
	ld	(pencol),hl
	ld	hl,moin
	bcall _vputs
	jp	boucle
plus:
	ld	hl,$0F00
	ld	(pencol),hl
	ld	hl,plu
	bcall _vputs
	jp	boucle
	

interval:
	.db"C'est entre 0 et 255",0
vict:
	.db"Victoire !!!",0
moin:
	.db"C'est moins!",0
plu:
	.db"C'est plus! ",0
.end


Merci d'avance
Sandro
Posté le 09/07/2011 à 10:53 Membre depuis le 02/02/2009, 672 messages
Salut,

Je suis content de voir tes gros progrès wink

ld l, numerau_essaye

Copie une adresse 16 bit dans l qui est seulement 8 bits.

Essaye plutôt :
ld hl, numerau_essaye
push af
ld a, (hl)
ld l,a
pop af

Ou quelque chose de ce genre

Posté le 09/07/2011 à 12:45 Membre depuis le 15/03/2005, 3470 messages
Enfaite même si la valeur stockée à l'adresse saferam1 est un octet, sans utiliser les parenthèses ce que tu charges dans "l" est l'adresse (16 bit) et non pas la valeur (cf http://tift.tuxfamily.org/asmpourlesnuls.html au chapitre "Les variables"). Le plus simple c'est de faire :
	ex af,af'
	ld a,(numerau_essaye)
	ld l,a
	ex af,af'

Plus rapide mais à n'utiliser que si les interruptions sont désactivées ( http://www.mworld.fr/html/projects/calc/ti-82/tutoriel/progasm/guide/lesson17.html ).

edit : Ah et les #define je serais toi je les mettrais dans le .nolist, puisque de toute façons le compilateur ne les listera pas dans le fichier .lst (fichier qui sert justement à savoir où sont les lignes à problème).
Posté le 11/07/2011 à 02:10 Membre depuis le 03/06/2011, 520 messages
Tu as aussi:
ld hl,$EE07
ld (currow),hl

Qu'est-ce que c'est le $EE ?

Pour charger la valeur d'une addresse dans un registre (qui ne soit pas "a") tu as normalement deux options:
1. Avec a:
ld a,(addresse)
ld l,a

2. Avec hl:
ld hl,addresse
ld e,(hl)


Chaque un 17 t-states, 4 octets. Et dans ton programme tu n'as pas besoin de préserver "a", alors il ne faut pas mettre le push/pop ni l'ex af,af'.

Et pour augmenter/réduire numerau_essaye, tu peux utiliser hl directement:
ld hl,numerau_essaye
inc (hl)

Si tu places "ld hl,numerau_essaye" avant tes sauts comme ci:
	ld hl,numerau_essaye
	cp	3 
	jp	z,haut 
	cp	4 
	jp	z,bas 

Dans tes labels haut/bas, il ne faudra qu'un inc (hl)/dec (hl) smile

Je ne sais pas si je m'explique bien, en tout cas ton programme marche très bien !

Ah ! Une dernière chose, pour savoir si on a gagné ou non, je crois que tu utilises mal p/m. Quand j'ai compilé ton programme, j'ai utilisé le carry flag wink

	ld hl,numerau_essaye
	ld a,(nombrecherche)
	cp (hl)


	jp	z,victoire 
	jp	p,moins 
	jp	m,plus	;ce n'est pas un victoire, pas moins, alors...
Ici, le dernier saut est en plus. Pourquoi ne pas placer le code du label plus directement après jp X,moins ?

Félicitations, ton premier jeu ASM ! grin

tromb Fichier joint : ROBR (numerau.gif)
Posté le 12/07/2011 à 15:44 Membre depuis le 25/03/2011, 207 messages
Merci beaucoup,par contre, je bloque maintenant sur un autre point : lorsque le nombre essayé est inférieur au nombre cherché, le jeu s'arrête sans que je comprène pourquoi.

Voici le code actuel:
	.nolist 
#include "ion.inc" 

#define	nombrecherche	saferam1
#define	n_essais	nombrecherche+1
#define	numerau_essaye	n_essais+1


	.list 
#ifdef TI83P 
	.org progstart-2 
	.db $BB,$6D 
#else 
	.org progstart 
#endif 
	ret 
	jr nc,start 
	.db "PLUSMOIN",0 
 
start: 


	;;;ld	b,255
	ld	a,r
	ld	(nombrecherche),a;		a:réponse corecte
	ld	a,0
	ld	(numerau_essaye),a;		b:compteur du nombre essayé
	ld	a,0
	ld	(n_essais),a;		d:comptenr des tentatives


debut:
	ld	hl,$0000
	ld	(pencol),hl
	ld	hl,interval
	bcall _vputs

boucle:
	ld	hl,$0001
	ld	(currow),hl
	ld	hl,(numerau_essaye)
	ld	h,0
	bcall _disphl
	bcall _getkey


	ld	hl,numerau_essaye

	cp	3
	jp	z,haut
	cp	4
	jp	z,bas
	cp	5
	jp	z,entrer


	cp	9
	jp	nz,boucle
	ret	

haut:

	inc	(hl)
	jp	boucle

bas:
	dec	(hl)
	jp	boucle
entrer:
	bcall _clrlcdf
	ld	a,(n_essais)
	inc	a
	ld	(n_essais),a
	ld	hl,$EE07
	ld	(currow),hl
	ld	l,a
	ld	h,0
	bcall _disphl

	ld	hl,numerau_essaye
	ld	a,(nombrecherche)
	cp	(hl)
	jp	z,victoire
	jp	p,plu

	ld	hl,$0F00
	ld	(pencol),hl
	ld	hl,moin
	bcall _vputs
	jp	boucle

plus:
	bcall _getkey
	ld	hl,$0F00
	ld	(pencol),hl
	ld	hl,plu
	bcall _vputs
	jp	boucle

victoire:
	ld	hl,$0302
	ld	(pencol),hl
	ld	hl,vict
	bcall _vputs
	bcall _getkey
	ret




interval:
	.db"C'est entre 0 et 255",0
vict:
	.db"Victoire !!!",0
moin:
	.db"C'est moins!",0
plu:
	.db"C'est plus! ",0
.end


Merci d'avance
Sandro
Posté le 12/07/2011 à 16:13 Membre depuis le 15/03/2005, 3470 messages
Ça quitte comment ? En buggant la calc non ? Parce que théoriquement ça retombe dans tous les cas dans la boucle principale...
Posté le 12/07/2011 à 16:14 Membre depuis le 25/03/2011, 207 messages
Eh bien, j'optient un retour à ION.

Sandro

EDIT : en fait il y à quand même le nombre d'essis qui apparait avant.
Posté le 12/07/2011 à 20:19 Membre depuis le 25/03/2011, 207 messages
J'ai trouvé l'erreur, elle vient de l'oublie de "s" à la fin de "plus" à la ligne "jp p,plu"

Merci quand-même

Sandro
Posté le 15/07/2011 à 18:23 Membre depuis le 02/02/2009, 672 messages
Bravo sandro smile

Posté le 15/07/2011 à 19:40 Membre depuis le 25/03/2011, 207 messages
Bonjour,bonsoir
juste comme info, j'essaye de faire une version où on peut aller jusqu'à 10 000, mais je bloque pour vérifier si hl est compris dans l'interval [9 980;10 000].

Merci d'avance
Sandro
Posté le 16/07/2011 à 11:51 Membre depuis le 25/03/2011, 207 messages
Bonjours,bonsoir,
j'ai résolut ce problème mais je bloque sur un autre :
gauche:
	ld	hl,(numerau_essaye)
	ld	de,20
	sbc	hl,de
	jp	p,gauche_suite
	ld	de,10000
	add	hl,de
gauche_suite:
	ld	(numerau_essaye),hl
	ret

Pourquoi, avec ce code si (numérau_essaye) vaut 20 au début, il ne vaut pas 10 000 à la fin mais 0. Pourriez vous s'il vous plaît m'expliquer comment faire?

Merci d'avance
Sandro
Posté le 16/07/2011 à 12:52 Membre depuis le 15/03/2005, 3470 messages
"sbc" soustrait aussi le carry flag donc déjà je te conseil de faire un "or a" juste avant.

Sinon j'ai pas trop compris ce que ton code doit faire... Tu veux soustraire 20 au numéro essayé et si le résultat est négatif tu ajoutes 10000 ? Parce que si le sign flag est égal à 0 (dernier bit) alors le nombre est considéré comme positif.

Du coup 0 est considéré comme positif et ça te sautes bien l'ajout du 10000.

Perso je te conseil de faire un truc du genre :
gauche:
	ld hl,(numero_essaye)
	ld de,20
	or a
	sbc hl,de
	call z,gauche_test
	call m,gauche_test
	ld (numero_essaye),hl
	bcall _disphl
	bcall _getkey
	ret

gauche_test:
	ld de,10000
	add hl,de
	ret

numero_essaye:
	.dw 20


Enfin c'est optimisable...
Posté le 16/07/2011 à 13:30 Membre depuis le 25/03/2011, 207 messages
Merci beaucoup, ça marche.