A mon tour, pour le coup ça risque de faire moins consensus. C'est extrait de ce topic
topics/72-187553-protocole-reseau-lynx-de-type-onewire-idees-de-conception#post-25 et c'était un premier jet d'implémentation de la RFC 1662 sur la Lynx. Le code des checksum reste à finaliser.
C(K&R) Protocole réseau sur Lynx
#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);
}