Programmation Z80 CP et JP ???

Cette catégorie traite de développements récents destinés à nos vieilles machines, applications, jeux ou démos... Amis programmeurs, c'est ici que vous pourrez enfin devenir célèbres!

Modérateurs : Papy.G, fneck, Carl

Répondre
Avatar de l’utilisateur
6502man
Messages : 12312
Inscription : 12 avr. 2007 22:46
Localisation : VAR
Contact :

Programmation Z80 CP et JP ???

Message 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:
Phil.

www.6502man.com

To bit or not to bit.
1 or 0.
joaopa
Messages : 512
Inscription : 14 sept. 2013 12:17

Re: Programmation Z80 CP et JP ???

Message 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.
jameson
Messages : 17
Inscription : 10 juil. 2011 19:34

Re: Programmation Z80 CP et JP ???

Message 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
Avatar de l’utilisateur
Dominique
Messages : 829
Inscription : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: Programmation Z80 CP et JP ???

Message 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
Daniel
Messages : 17395
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: Programmation Z80 CP et JP ???

Message 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.
Daniel
L'obstacle augmente mon ardeur.
Avatar de l’utilisateur
6502man
Messages : 12312
Inscription : 12 avr. 2007 22:46
Localisation : VAR
Contact :

Re: Programmation Z80 CP et JP ???

Message 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 ...
Phil.

www.6502man.com

To bit or not to bit.
1 or 0.
__sam__
Messages : 7961
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: Programmation Z80 CP et JP ???

Message 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.
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
Avatar de l’utilisateur
Dominique
Messages : 829
Inscription : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: Programmation Z80 CP et JP ???

Message 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 ..... :?
Avatar de l’utilisateur
6502man
Messages : 12312
Inscription : 12 avr. 2007 22:46
Localisation : VAR
Contact :

Re: Programmation Z80 CP et JP ???

Message 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 :)
Phil.

www.6502man.com

To bit or not to bit.
1 or 0.
Avatar de l’utilisateur
6502man
Messages : 12312
Inscription : 12 avr. 2007 22:46
Localisation : VAR
Contact :

Re: Programmation Z80 CP et JP ???

Message 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:
Phil.

www.6502man.com

To bit or not to bit.
1 or 0.
jameson
Messages : 17
Inscription : 10 juil. 2011 19:34

Re: Programmation Z80 CP et JP ???

Message 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
Markerror
Messages : 2123
Inscription : 31 oct. 2011 19:21
Localisation : Orléans
Contact :

Re: Programmation Z80 CP et JP ???

Message 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.
Dernière modification par Markerror le 04 avr. 2014 19:43, modifié 1 fois.
Avatar de l’utilisateur
Dominique
Messages : 829
Inscription : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: Programmation Z80 CP et JP ???

Message 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...
Avatar de l’utilisateur
6502man
Messages : 12312
Inscription : 12 avr. 2007 22:46
Localisation : VAR
Contact :

Re: Programmation Z80 CP et JP ???

Message 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 ;)
Phil.

www.6502man.com

To bit or not to bit.
1 or 0.
Répondre