[EXL100 DcExel] Assembleur TASM 7020 error : Range of relative branch exceeded

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
kibifred
Messages : 30
Inscription : 27 févr. 2022 10:55

[EXL100 DcExel] Assembleur TASM 7020 error : Range of relative branch exceeded

Message par kibifred »

Bonjour

Je m'amuse avec l'assembleur TASM 7020 Exelvision Assembler. Version 3.2 September, 2001.
qui fait partie du SDK de Jester et j'ai l'erreur : line 0149: Range of relative branch exceeded.

Un Exelvisioniste saurait me dire quoi faire ?

Code : Tout sélectionner

...
120			rets
121	
122		; function main
123		main
124			push	R17
125			push	R18
126			push	R17
127			push	R18
128			push	R19
129			mov 	%$00, A
130			push	A
131			mov 	%$00, A
132			push	A
133			mov 	%$00, A
134			push	A
135			pop 	A
136			mov 	A, R17
137			pop 	A
138			mov 	A, R18
139			pop 	A
140			mov 	A, R19
141			call	@cls
142			pop 	R19
143			pop 	R18
144			pop 	R17
145		_while_0
146			mov 	%$01, A
147			mov 	%$00, B
148			cmp 	A, B
149			jeq 	_end_while_0
150			movd	%$0000, B
151			movd	B, R18
152		_while_1
153			movd	%$0081, B
154			push	A
155			push	B
156			movd	R18, B
157			pop 	R14
158			pop 	R13
159			sub 	R14, B
160			sbb 	R13, A
161			jgt 	_end_while_1
162			cmp 	%$00, B
163			jge 	_end_while_1
164			push	R17
...
/code]

Merci

Fred
Zebulon
Messages : 2806
Inscription : 02 nov. 2020 14:03

Re: [EXL100 DcExel] Assembleur TASM 7020 error : Range of relative branch exceeded

Message par Zebulon »

Le saut relatif est trop long, l'instruction pointée à l'étiquette _end_while_0 est trop "éloignée" de ta ligne 149.

En schématisant, un saut relatif sur un octet permet de sauter de +/-127 octets donc il faut qu'il n'y ait pas trop d'instructions entre l'instruction de saut et l'instruction cible.

Soit tu dois réorganiser ton code différemment, soit tu dois utiliser un saut vers une adresse codée sur 2 octets, par exemple en inversant ta condition et en faisant un saut relatif par dessus le branchement vers l'adresse _end_while_0 pour continuer la boucle au lieu de la quitter.

Désolé si je ne suis pas très clair. :(
Dernière modification par Zebulon le 13 mai 2023 23:46, modifié 1 fois.
kibifred
Messages : 30
Inscription : 27 févr. 2022 10:55

Re: [EXL100 DcExel] Assembleur TASM 7020 error : Range of relative branch exceeded

Message par kibifred »

et comment on fait pour "utiliser un saut vers une adresse codée sur 2 octets"
c'est quel genre d'instructions ? ca reste un br mais avec un adressage diffèrent ?

Merci
kibifred
Messages : 30
Inscription : 27 févr. 2022 10:55

Re: [EXL100 DcExel] Assembleur TASM 7020 error : Range of relative branch exceeded

Message par kibifred »

OK j'ai compris le truc
en fait les instructions jxx ne peuvent que faire des sauts de -128 à +127 octets.

Merci
Zebulon
Messages : 2806
Inscription : 02 nov. 2020 14:03

Re: [EXL100 DcExel] Assembleur TASM 7020 error : Range of relative branch exceeded

Message par Zebulon »

EDIT oui c'est ça. :D

J'avais commencé à écrire ce qui suit...


Alors là par contre je ne connais pas du tout cet assembleur donc il va falloir attendre un peu qu'un expert se manifeste. Ce problème existe quel que soit le processeur car la logique est souvent la même, je connais l'assembleur Z80.

Après avoir regardé un peu la doc du TMS7020 oui BR semble être la bonne instruction, en mode d'adressage direct vers ton étiquette _end_while_0.

On peut imaginer de modifier le code en inversant la condition soit JEQ en JNE pour sauter par dessus le BR et continuer la boucle si A<>B sinon on sort avec le BR.

Code : Tout sélectionner

145		_while_0
146			mov 	%$01, A
147			mov 	%$00, B
148			cmp 	A, B
149			jne 	_cont_while_0
150			br _end_while_0
151		_cont_while_0
152			movd	%$0000, B
153			movd	B, R18
154		_while_1
155			movd	%$0081, B
156			push	A
C'est peut-être un peu crade comme technique, un spécialiste pourra te proposer mieux, mais il faudrait donner tout le code jusqu'au _end_while_0.
kibifred
Messages : 30
Inscription : 27 févr. 2022 10:55

Re: [EXL100 DcExel] Assembleur TASM 7020 error : Range of relative branch exceeded

Message par kibifred »

super merci pour l'exemple.
J'ai commencé à appliquer les modifications, ca a l'air de le faire pour les comparaisons d'entiers 8 bits.
Je merdouillle un peu sur les comparaisons d'entier 16 bits mais ca devrait le faire

Merci encore.
Avatar de l’utilisateur
6502man
Messages : 12336
Inscription : 12 avr. 2007 22:46
Localisation : VAR
Contact :

Re: [EXL100 DcExel] Assembleur TASM 7020 error : Range of relative branch exceeded

Message par 6502man »

J'avais fait une initiation sur la programmation Assembleur sur le forum, sur ce post, il faut parcourir toutes les pages
c'est en plusieurs parties :
http://forum.system-cfg.com/viewtopic.php?f=25&t=7782

Au cas ou ca peut servir :roll:
Phil.

www.6502man.com

To bit or not to bit.
1 or 0.
Avatar de l’utilisateur
Leraptor06
Messages : 691
Inscription : 15 févr. 2022 10:34
Localisation : Mandelieu

Re: [EXL100 DcExel] Assembleur TASM 7020 error : Range of relative branch exceeded

Message par Leraptor06 »

Merci beaucoup Phil, c'est extrêmement intéressant. Il y en a un pour le Z80 ou une machine bien precise aussi a tout hasard ?
Jp
Avatar de l’utilisateur
6502man
Messages : 12336
Inscription : 12 avr. 2007 22:46
Localisation : VAR
Contact :

Re: [EXL100 DcExel] Assembleur TASM 7020 error : Range of relative branch exceeded

Message par 6502man »

Pour le Z80 tu devrais trouver largement ton bonheur sur le net, c'est un CPU très répandu ;)
Idem pour le 6502 ou 6809 .

Si j'avais du temps j'aimerais bien faire pour différent CPU / Plateforme,
sous la forme de afficher un texte, afficher un bitmap, jouer une musique, détecter le clavier ou joystick ....
C'est en gros ce que je fait sur chaque machine ou je fait une cartouche ou extension, mais cela demande
beaucoup de temps pour présenter tous ca ...
Phil.

www.6502man.com

To bit or not to bit.
1 or 0.
kibifred
Messages : 30
Inscription : 27 févr. 2022 10:55

Re: [EXL100 DcExel] Assembleur TASM 7020 error : Range of relative branch exceeded

Message par kibifred »

Maintenant je galère un peu sur les comparaisons d'entiers non signés 16 bits (unsigned short).
ca serait quoi l'équivalent de ce pseudo code C en assembleur 7020 ?

Code : Tout sélectionner

unsigned short a = 0xFFF0;
unsigned short b = 0xFFF1;
if (a < b)
{
a = 0;
}
Merci
kibifred
Messages : 30
Inscription : 27 févr. 2022 10:55

Re: [EXL100 DcExel] Assembleur TASM 7020 error : Range of relative branch exceeded

Message par kibifred »

Finalement c'est ok.
J'ai enfin fait la différences entre les instructions de comparaisons signées et non signées

Merci de votre aide
Répondre