it regularly difficult to spot, aside from maybe by a genuine Rolex replica history specialist, in light of the fact that the best phony Rolex are 95% made by Rolex. If you want to know how often you should optimally be winding your rolex replica watch, Click Here.

Notifications
Retirer tout

Probleme avec des calculs d'adresse dans CC65

11 Posts
5 Utilisateurs
1 Reactions
520 Vu
didier_v
(@didier_v)
Membre Admin
Inscription: Il y a 6 ans
Posts: 467
Début du sujet  

Bonjour à tous, 

J'ai eu beau faire plusieurs tentatives, rechercher dans d'autres codes sources et dans la doc cc65 mais j'ai un simple calcul d'adresse qui ne fonctionne pas et ne vois pas pourquoi !

Je suis sur que je suis passé à coté d'une grosse erreur (que je n'avais pas d'osdk). L'objet de la boucle est de remettre au propre les 2 premieres colonnes de l'écran TEXT/LORES

	unsigned int c;
	unsigned int addrpoke,i;
...
	for (i = 0; i < 28; i++)
    {
	addrpoke=48000+i*40;
	poke (addrpoke,9);
        addrpoke++;
        poke (addrpoke,16);
     }

Le calcul de l'adresse du poke est fausse (un printf l'affiche en -17xxx ce qui correspond à 48000-65536), et je ne vois pas ce que peux faire. Que j'ai mis addrpoke en int, int unsigned ou long ... c'est le meme effet.

Merci de votre aide.

Ce message a été modifié Il y a 2 ans par didier_v

   
Citation
Kenneth
(@kenneth)
Reputable Member Adhérent
Inscription: Il y a 5 ans
Posts: 315
 

Apparemment la quantité 48000 est considérée comme signée, comme si le systeme de calcul ne dépassait pas la fourchette -32768 à +32767...


   
RépondreCitation
Kenneth
(@kenneth)
Reputable Member Adhérent
Inscription: Il y a 5 ans
Posts: 315
 

Apparemment la quantité 48000 est considérée comme signée "de force" au 16e bit comme si le systeme de calcul ne dépassait pas la fourchette -32768 à +32767...


   
RépondreCitation
didier_v
(@didier_v)
Membre Admin
Inscription: Il y a 6 ans
Posts: 467
Début du sujet  

Merci Kenneth, sauf que ... je n'arrive pas à sortir de cette prise en compte lors du calcul


   
RépondreCitation
assinie
(@assinie)
Membre
Inscription: Il y a 5 ans
Posts: 59
 

@didier_v  qu'elle est la définition de poke()?

Pour l'affichage de addrpoke en non siigné il fauit utiliser %u et non %d

printf("addrpoke = %u\n", addrpoke);

Le code suivant devrait fonctionner:

#include <stdio.h>

#define poke(a,b) *a = b

void main()
{
	// unsigned int addrpoke,i;
	unsigned int i;
	unsigned char *addrpoke;

	for (i = 0; i < 28; i++)
	{
		addrpoke=(unsigned char *)(48000L+i*40);
		poke (addrpoke,9);
		addrpoke++;
		poke (addrpoke,16);
		// printf("addrpoke: %u\n", addrpoke);
	}
}

Il faut déclarer addrpoke comme un pointeur vers un caractère et non comme une simple variable.

La ligne:

addrpoke=(unsigned char *)(48000L+i*40);

permet de transformer le résultat de l'opération en pointeur de même type que addrpoke, sinon tu auras un warning.

Le L après 48000 permet d'éviter d'avoir un warning Const is long.


   
didier_v reacted
RépondreCitation
jede
 jede
(@jede)
Membre Admin
Inscription: Il y a 5 ans
Posts: 473
 

Salut, 

Pour moi poke est en majuscule dans cc65 en incluant le header peekpoke.h un truc du genre.

Donc si poke est en minuscule c'est une fonction qui est déclarée et il faudrait la voir.

Mais en mettant POKE cela devrait marcher 


   
RépondreCitation
jede
 jede
(@jede)
Membre Admin
Inscription: Il y a 5 ans
Posts: 473
 

C'est pas la dernière doc mais voici :

https://www.cc65.org/doc/funcref-28.html

Entre xa65 et ca65 il y a des différences dans le parseur aussi donc il faut se méfier aussi en conversion xa vers ca65


   
RépondreCitation
assinie
(@assinie)
Membre
Inscription: Il y a 5 ans
Posts: 59
 

Effectivement, j'ai trouvé POKE dans peekpoke.h et dans ce cas le code d'origine fonctionne correctement.

Le seul soucis restant est le printf pour lequel il faut utiliser %u et non %d.


   
RépondreCitation
didier_v
(@didier_v)
Membre Admin
Inscription: Il y a 6 ans
Posts: 467
Début du sujet  

J'avais essayé avec le POKE de peekpoke.h et le poke ajouté à la main avec le meme résultat. Je ferais encore des essais. Et je mettrais ma variable en unsigned addr comme dans la doc.

Merci d'avance (je croise les doigts)


   
RépondreCitation
arzooooo
(@arzooooo)
Estimable Member
Inscription: Il y a 4 ans
Posts: 80
 

Bonjour.

En lisant vos échanges, je me souviens pourquoi je trouvais le C bordélique et inadapté à un usage occasionnel.

En matière de langage de programmation non orienté objet, je lui préférais, de loin, le Modula 2.

De mémoire, ce langage a été inventé par Niklaus Wirth, l'inventeur du Pascal. Le Modula 2 corrigeait les défauts du Pascal (erreurs de compilation tardives, travail en groupe difficile, etc) tout en en gardant la lisibilité. En particulier, il gérait les entiers, signés ou non, sur 8, 16 ou 32 bits, ce qui permettait d'éviter les soucis à l'origine du post.


   
RépondreCitation
didier_v
(@didier_v)
Membre Admin
Inscription: Il y a 6 ans
Posts: 467
Début du sujet  

Hello, et bonne nouvelle. 

Gràce à vos retours, j'ai pu corriger et comprendre certaines erreurs...

  • pour poke, je n'étais pas assez strict sur l'utilisation des parenthèses (que je soit dans le peekpoke ou dans le poke redéfini mode assinie ou iss, le résultat était le même)
  • pour les utilisations d'addrpoke, effectivement la définition de variable d'assinie fonctionne. Il y a juste addrpoke++; qui ne fonctionnait plus (warning) et remplacé par *addrpoke++;

En conclusion, il faut vraiment que je relise des trucs sur le c ou je vais beaucoup galérer ; plus la notice de cc65 (par exemple, j'ai défini des datas de texte et byt en assembleur et je n'accède pas aux tables de la même façon en c).

Maintenant, j'ai mon écran LORES chargé, je peux passer aux essais de scroll ou autre. Comme ce sera en assembleur, cela devrait être plus facile.

 

Ce message a été modifié Il y a 2 ans pardidier_v

   
RépondreCitation
Share: