Je remonte ce sujet car, sous la "pression populaire" (de AA en particulier), me voilà à essayer d'implémenter un petit protocole pour mettre BomberCats en réseau.
Comme j'utilise le vieux combo BLL/newcc65, ma seule source d'information est ce forum et les quelques sujets qui traitent de comlynx (mode "last hope" là
).
J'ai donc regardé les suggestions et le code de Vince (si tu me lis... MERCI!!!) et j'ai pu envoyer et recevoir quelques octets en testant mon code sur la version modifiée de Handy (par nop90 de AA).
Le comportement de mon code me semble un peu erratique néanmoins.
- soit j'envoies un octect à la fois et celui ci est bien recu...
- mais seulement si je l'envoie après une pression sur un bouton, si j'envoie ce même message par exemple à chaque raffraichissement, rien n'est recu...!?
- si j'envoies x octect à la suite, seul le premier est recu
- etc etc... j'ai testé pas mal de scénarios différents et j'ai eu autant de comportements bizarres
Ce qui me porte à conclure que j'ai du manquer une info... Et pourtant je suis le guide...
1) paramétrer le lien avec serctl et les timers (attention, le contrôle de parité a un comportement "atypique" qui fait qu'il est inclus dans le calcul de parité)
POKE(0xFD10,12);
POKE(0xFD11,0x18);
serctl = 0x5D; /* Parité paire, mode collecteur ouvert, interruptions désactivées, reset des erreurs, break désactivé */
/* Effacement du buffer de réception */
while (serctl & 0x40)
{
unsigned char c;
c = serdat;
}
2) activer l'interruption en réception (à l'envoi on s'en fout peu à vrai dire)
InstallIRQ(4,SER);
EnableIRQ(4);
3) en première ligne de la fonction d'interruption rabaisser le flag (cf bug hardware connu, c'est le workaround officiel proposé dans la doc) pour pas qu'elle se déclenche en continu
4) ensuite, prévoir la lecture du buffer serdat de 1 octet dans l'interruption de réception
SER() interrupt
{
DisableIRQ(4);
POKE(0x10,0xFD80);
receptionData = serdat;
EnableIRQ(4);
}
- pour l'envoi il faut s'assurer qu'on n'a rien à lire (et c'est limite du zèle vu que si y'avait qqch, on serait dans l'interruption), que le précédent envoi est parti et ensuite écrire dans serdat
void ComLynx_EnvoiOctet(octet)
unsigned char octet;
{
while (!(serctl & 0x80)); /* Attend que l'émetteur soit prêt */
serdat = octet; /* Envoie l'octet */
ComLynx_ReceptionOctet(); /* Comme Tx et Rx sont communs, chaque octet envoyé est reçu, on l'efface donc du buffer de réception */
}
C'est le code qui est présenté en page 4, qui doti ou a du fonctionner j'imagine
Or si j'appelle dans mon code ComLynx_EnvoiOctet la plupart des messages sont perdus... (seul le premier est recu)
Il y a aussi une fonction ComLynx_ReceptionOctet, qui est utilisé dans le code de vince pour "effacer" l octet envoyé... mais si je l utilise pour essayer de recevoir à la place de l interruption, le jeu reste bloqué sur le while.
Voila j'ai conscience que je pars un peu dans tous les sens la, mais avoir le support comlynx dans mon jeu ne m'a jamais semblé aussi proche, et pourtant toujours si loin