vinceOn the 2017-03-12 at 03:08pm
Bon, c'est "crade" mais ça marche :
#define waitsync 1
#define start 2
#define receiving 3
#define escape 4
#define done 5
#define init_value 0
#define packet_pending 9
#define packet_done 10
unsigned char state;
unsigned char buf[255];
unsigned char position;
unsigned char checksum;
SER(){
unsigned char input;
DisableIRQ(4);
POKE(0x10,0xFD80);
input=serdat;
if (state==waitsync){
if(input==0x7e){
state=start;
}else{
return 0;
}
}
if (state==start){
if(input!=0x7e){
state=receiving;
position=0;
//checksum=init_value;
//goto rx ?
}else{
//return 0;//packet waiting
}
}
//rx: ?
if (state==receiving){
if(input==0x7d) {
state=escape;
return 0;
}
if(input==0x7e) {
/*if (checksum==0){
return();//packet done
}else{
return();//cheksum error
}*/
//state=done;
state=start;
return 0;
}else{
if(position<255){
buf[position++]=input;
//update checksum
}else{
return 0;//overflow
}
}
}
if (state==escape){
state=receiving;
if(input==0x5E || input==0x5D){
input=input^0x20;
}
if(position<255){
buf[position++]=input;
}else{
return 0;//overflow
}
}
EnableIRQ(4);
}
Conctrètement, j'ai fait un programme test :
un boucle while qui fait y++
on met buf[0] dans x
un carré est affiché à x, y
si on appuie une touche, on envoie 0x7e, y, 0x7e
quand les deux consoles démarrent, le carré reste collé à gauche, dès que l'une appuie sur une touche, le carré de la console réceptrice s'aligne en x avec la position y de la console émettrice
et pour tester les collisions : si on maintient appuyé les deux consoles, on a bien les deux carrés qui se déplacent en diagonale.
il n'y a pas de checksum pour le moment et je ne suis pas sûr que pour un truc à 2 consoles ça serve à qqch...
par contre j'ai trouvé un soucis : mes prises microjack ne font pas toujours contact avec la console :/