Programmation Z80 CP et JP ???

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

Modérateurs : Carl, Papy.G, fneck

Répondre
Avatar du membre
6502man
Messages : 9099
Enregistré le : 12 avr. 2007 22:46
Localisation : VAR
Contact :

Programmation Z80 CP et JP ???

Message par 6502man » 01 avr. 2014 18:02

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 : 400
Enregistré le : 14 sept. 2013 12:17

Re: Programmation Z80 CP et JP ???

Message par joaopa » 01 avr. 2014 18:15

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
Enregistré le : 10 juil. 2011 19:34

Re: Programmation Z80 CP et JP ???

Message par jameson » 01 avr. 2014 21:49

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 du membre
Dominique
Messages : 482
Enregistré le : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: Programmation Z80 CP et JP ???

Message par Dominique » 01 avr. 2014 22:42

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 : 10792
Enregistré le : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: Programmation Z80 CP et JP ???

Message par Daniel » 02 avr. 2014 08:27

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 du membre
6502man
Messages : 9099
Enregistré le : 12 avr. 2007 22:46
Localisation : VAR
Contact :

Re: Programmation Z80 CP et JP ???

Message par 6502man » 02 avr. 2014 17:58

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 : 4161
Enregistré le : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: Programmation Z80 CP et JP ???

Message par __sam__ » 02 avr. 2014 20:04

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+, A1200(030@50mhz/fpu/64mb/cf 8go),
GVP530 (MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8. New Teo 1.8.4 8)

Avatar du membre
Dominique
Messages : 482
Enregistré le : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: Programmation Z80 CP et JP ???

Message par Dominique » 02 avr. 2014 21:31

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 du membre
6502man
Messages : 9099
Enregistré le : 12 avr. 2007 22:46
Localisation : VAR
Contact :

Re: Programmation Z80 CP et JP ???

Message par 6502man » 02 avr. 2014 23:16

@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 du membre
6502man
Messages : 9099
Enregistré le : 12 avr. 2007 22:46
Localisation : VAR
Contact :

Re: Programmation Z80 CP et JP ???

Message par 6502man » 04 avr. 2014 12:07

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
Enregistré le : 10 juil. 2011 19:34

Re: Programmation Z80 CP et JP ???

Message par jameson » 04 avr. 2014 15:40

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 : 1350
Enregistré le : 31 oct. 2011 19:21
Localisation : Orléans
Contact :

Re: Programmation Z80 CP et JP ???

Message par Markerror » 04 avr. 2014 17:32

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.
Modifié en dernier par Markerror le 04 avr. 2014 19:43, modifié 1 fois.

Avatar du membre
Dominique
Messages : 482
Enregistré le : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: Programmation Z80 CP et JP ???

Message par Dominique » 04 avr. 2014 18:42

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 du membre
6502man
Messages : 9099
Enregistré le : 12 avr. 2007 22:46
Localisation : VAR
Contact :

Re: Programmation Z80 CP et JP ???

Message par 6502man » 07 avr. 2014 22:44

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