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.
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...
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...
Merci Kenneth, sauf que ... je n'arrive pas à sortir de cette prise en compte lors du calcul
@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.
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
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
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.
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)
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.
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.