22Fermer24
vinceLe 07/03/2017 à 15:52
(bon, c'est un "brouillon", j'ai pas de quoi tester sous la main donc c'est pour commencer à réfléchir au truc...)

const waitsync 1 const start 2 const receiving 3 const escape 4 const done 5 unsigned char state; unsigned char buf[255]; unsigned char position; void SER(){ unsigned char input; DisableIRQ(4); POKE(0x10,0xFD80); input=serdat; EnableIRQ(4); if (state==waitsync){ if(input==0x7e){ state=start; }else{ return(); } } if (state==start){ if(input!=0x7e){ state=receiving; }else{ return(); } } if (state==receiving){ if(input==0x7d) { state=escape; } if(input==0x7e) { state=done; return(); }else{ if(position<255){ buf[position++]=input; } } } if (state==escape){ state=receiving; if(input==0x5E || input==0x5D){ input=input xor 0x20; } if(position<255){ buf[position++]=input; } } }
Derrière, je vois bien le tableau "buf" coupé en lignes, une par device

Ainsi, n'importe quel device peut "parler" pour dire le contenu de sa ligne par un envoi de 7E, ID, DATA, 7E (avec désactivation temporaire de l'IRQ réception)

Un "timer" dit à chaque console d'envoyer sa ligne toutes les X ms (si le canal est libre) ainsi tlm dispose du tableau à jour.

Avec le jeu de interruptions, la mise à jour du tableau tourne toute seule, le jeu peu donc taper dedans quand il veut, le même code fonctionne donc pour tout le monde.

Il reste le problème de l'annonce et l'attribution des numéros de device : je vois bien un envoi toutes les X ms d'un numéro. au début on écoute pendant X+1ms, si on entend rien, on prend le numéro 1, sinon on prend le numéro N+1 et on se met à donner son numéro en boucle toutes les X ms. Si une console envoie 0xFF alors c'est que la synchro est finie (qqn a appuyé sur start).