Page 1 sur 1

Programmation Z80 CP et JP ???

Publié : 01 avr. 2014 18:02
par 6502man
En faisant un programme en Z80 pour Hector je bute sur le couple d'instructions CP et JP en voulant tester une valeur je n'arrive pas à trouver comment réaliser le test de manière à faire un saut si la valeur dépasse un certain seuil ???
J'ai essayé toutes les conditions avec JP mais rien n'y fait :(

Exemple :

Code : Tout sélectionner

 LD B,$03
 ADD A,B
 CP $20  
 JP ?,SAUT  (si plus grand)

J'ai bien compris que CP compare toujours avec A.

Peut être que JP ne fonctionne pas comme ca, mais dans ce cas quel instruction utilisé en Z80 ???

Merci d'avance pour votre aide dans mon apprentissage du Z80 :D :oops:

Re: Programmation Z80 CP et JP ???

Publié : 01 avr. 2014 18:15
par joaopa
L'equivalent de
if(a>valeur) goto saut est
cp valeur
jp p, saut

Il faut faire attention. C'est une inégalité stricte.

Re: Programmation Z80 CP et JP ???

Publié : 01 avr. 2014 21:49
par jameson
bonjour je viens de regarder un de mes vieux listing
bon si tu veux tester une valeur tu met cette valeur dans A
ensuite si tu veux tester si cette valeur est superieur a 128 (par ex)
tu fait un truc du genre
ld a,valeur
cp 80 ---> 128 en hexa
jp nc add -----> saute a l'adresse add si a>= 128 (80 en hexa)

si tu veux tester si ta valeur (que tu a mis dans A) est superieur ou egal a 128 tu fait jp nc
si tu veut tester si ta valeur (que tu a mis dans A) est inferieur a 128 tu fais jp c
si tu veux simplement tester si ta valeur est egale a 128 tu fait jp z
tu a aussi la fonction cp (hl) qui te permet de tester directement une valeur contenue dans une adresse memoire

dans la mesure du possible utilise plutot jr au lieu de jp cela te permet de faire des routines relogable

Re: Programmation Z80 CP et JP ???

Publié : 01 avr. 2014 22:42
par Dominique
Je ne peux pas vérifier maintenant mais dans l'exemple dessus il me semble que:

Code : Tout sélectionner

jp nc add -----> le saut se fait si a> 128
Pour a>=128 il faut comparer à 129 ($81)

soit en règle générale


Si tu veux ton saut pour :

Code : Tout sélectionner

a=N
ld a, valeur
cp N
JR Z add

a>N
ld a, valeur
cp N
JR NC add

a>= N
ld a, valeur
cp N+1
JR NC add

Re: Programmation Z80 CP et JP ???

Publié : 02 avr. 2014 08:27
par Daniel
Pour les développements Z80, j'utilise le Z80 Family CPU User Manual disponible à http://dchector.free.fr/doc.html
Il donne, en particulier, toutes les valeurs du Code Condition après modification du registre A, et tous les codes possibles pour les branchements conditionnels. Ce manuel de référence donne une réponse juste et sans équivoque à toutes les questions possibles.
Dans le cas précis, voir CP s page 158 et JP cc,nn page 239.

Re: Programmation Z80 CP et JP ???

Publié : 02 avr. 2014 17:58
par 6502man
Merci pour votre aide :)

J'avais pas pensez a vérifier sur ton site Daniel :oops: je pense toujours que tu n'a pas beaucoup de docs pour le Hector et du coup j'ai pas pensé a la doc Z80 ;)

Sinon Dominique à mis le doigt sur le problème pour tester une valeur supérieur ou égale :(

Tant pis je réfléchirais comment contourner ce problème plus tard ...

Re: Programmation Z80 CP et JP ???

Publié : 02 avr. 2014 20:04
par __sam__
6502man a écrit :Merci pour votre aide :) Sinon Dominique à mis le doigt sur le problème pour tester une valeur supérieur ou égale :(
Là comme ca si tu dois comparer si c'est >= à une valeur en mémoire pointé par hl et que tu n'as pas la (valeur+1) stockée quelque part, tu peux peut être décrémenter l'accu d'une unité juste avant la comparaison (et incrémenter par la suite si la valeur du registre est utilisée plus loin).

Tu dois pouvoir aussi faire deux jp l'un après l'autre. Tout dépend si les flags sont préservés après un saut (je suppose que oui). C'est un "ou" codé en dur:

Code : Tout sélectionner

A>=(hl):
--------
cp (hl)
jr nc,label ! a>(hl)
jr z,label  ! a==(hl)
L'ordre entre "jr z" et "jr nc" peut être optimisé en plaçant la condition la plus probablement vraie en 1er.

Re: Programmation Z80 CP et JP ???

Publié : 02 avr. 2014 21:31
par Dominique
A moins que l'on n'explore la proposition contraire :

La proposition contraire de >=
donne <

Tu n'as qu'à faire un saut si <

Code : Tout sélectionner

    
          ld a, valeur
          cp N
          JR C add                ; add= si <
           ....                   ; continue si >=
Obs : A vérifier aussi si JR C n'est pas le contraire de JR NC ..... :?

Re: Programmation Z80 CP et JP ???

Publié : 02 avr. 2014 23:16
par 6502man
@sam: c'est ce que je pensai aussi puisqu'il n'y a pas une condition directement utilisable je passerai par 2 conditions ;)

@Dominique: ca peut aussi être une solution il faut que je teste ...

Merci :)

Re: Programmation Z80 CP et JP ???

Publié : 04 avr. 2014 12:07
par 6502man
Bon et bien je n'arrive absolument pas à travailler avec CP, j'ai comme une impression qu'il travaille avec des nombres signés :roll:

Depuis le début j'ai raisonné en nombres absolus (0 à 255) mais je suis complétement dans le faux, je pense qu'il fallait raisonné en nombres signés (-127 à +128) :oops:

Donc il faut que je reprenne tout pour faire mes tests de valeurs avec un seuil de $BA qui fait $3A en hexadécimal signé :roll:

existe t'il une autre instruction de comparaison en Z80 ?

Ou alors j'arrête de coder sur Z80 :wink:

Re: Programmation Z80 CP et JP ???

Publié : 04 avr. 2014 15:40
par jameson
je t'envoi un extrait du livre programmer en assembleur (avec le z80) d'alain pinaud edition P.S.I
http://www.mediafire.com/view/myfiles/#la2qb8evbd4g6v8
sinon attention si tu utilise l'instruction JP il faut utiliser l'adresse reel ex: jp 4080 hex

si tu utlise jr c'est un saut relatif ex: jr 32 hex = saut a 60 octet en avant jr d7 hex = saut 40 octet en arriere et la oui comme argument de jr il te faut un nombre signe mais bon si ton prg d'assemblage gere les etiquettes il calcul tous ca comme un grand

excuse moi pour le lien mais je n'arrive pas a afficher l'image

Re: Programmation Z80 CP et JP ???

Publié : 04 avr. 2014 17:32
par Markerror
Bonjour,

J'arrive un peu tard sur ce topic. Si je reprend ton exemple :

LD B,$03
ADD A,B
CP $20
JP ?,SAUT (si plus grand)

JP Z,saut ; A = $20
JP NC,saut ; A>$20
JP C,saut ; A<$20

Pour vérifier l'état des flags "pour de vrai", j'utilise l'émulateur WINAPE qui a un mode debugger sympa.

Re: Programmation Z80 CP et JP ???

Publié : 04 avr. 2014 18:42
par Dominique
6502man a écrit :..
Ou alors j'arrête de coder sur Z80 :wink:
Comme on se voit demain chez Daniel on en parle ?
J'ai aussi un Visual Basic de transformation BMP vers MO5 à moitié fini que j'aimerai que tu termines pour moi...

Re: Programmation Z80 CP et JP ???

Publié : 07 avr. 2014 22:44
par 6502man
Merci les gars pour les compléments d'informations, je vais me remettre sur ce problème, mais ca seras pour la semaine prochaine ;)