I have finally managed to get my code working. I found completely by accident just by putting an extra port state check in that the problems were eliminated. I pressume that the TI was putting out some noise when it was transmitting at faster speeds. Anyway for all those interested here are the rough and ready routines. It`s 1 at night and I can`t be bothered to optimize them. In the routines there is provision for two calcs to communicate. They are connected like so. CALC1 - Red - RE0 - White - RE1 CALC2 - Red - RE2 - White - RE3 There are no external components just direct connections. However if you are going to interface to a homemade parrallel link put a couple of 10k pullups on the pins. Also you have to make sure your ground the calc cables or the link won`t work. PORTE=0; tris_e=11111111b; void output_white_high(char calc) { if (calc == 1) { set_bit(tris_e, 0); set_tris_e(tris_e); } if (calc == 2) { set_bit(tris_e, 2); set_tris_e(tris_e); } } void output_white_low(char calc) { if (calc == 1) { clear_bit(tris_e, 0); set_tris_e(tris_e); } if (calc == 2) { clear_bit(tris_e, 2); set_tris_e(tris_e); } } void output_red_high(char calc) { if (calc == 1) { set_bit(tris_e, 1); set_tris_e(tris_e); } if (calc == 2) { set_bit(tris_e, 3); set_tris_e(tris_e); } } void output_red_low(char calc) { if (calc == 1) { clear_bit(tris_e, 1); set_tris_e(tris_e); } if (calc == 2) { clear_bit(tris_e, 3); set_tris_e(tris_e); } } char input_white(char calc) { if(calc == 1) { asm{ mov w, re and w, #%00000001 bank _inputtemp mov _inputtemp, w } if(inputtemp==0) return 0; else return 1; } if(calc == 2) { asm{ mov w, re and w, #%00000100 bank _inputtemp mov _inputtemp, w } if(inputtemp==0) return 0; else return 1; } } char input_red(char calc) { if(calc == 1) { asm{ mov w, re and w, #%00000010 bank _inputtemp mov _inputtemp, w } if(inputtemp==0) return 0; else return 1; } if(calc == 2) { asm{ mov w, re and w, #%00001000 bank _inputtemp mov _inputtemp, w } if(inputtemp==0) return 0; else return 1; } } char get_byte(char calc) { bitcount=0; tempbit=0; while(bitcount < 8) { while ((input_red(calc) == 1) && (input_white(calc) == 1)){nop();} if (input_red(calc)==0) { output_white_low(calc); while(input_red(calc)==0){delay_ms(1);} bitcount=bitcount + 1; output_white_high(calc); while( (input_red(calc)==0) || (input_white(calc)==0) ){nop();}; } if (input_white(calc)==0) { output_red_low(calc); while(input_white(calc)==0){delay_ms(1);} if (bitcount == 0) set_bit(tempbit, 0); if (bitcount == 1) set_bit(tempbit, 1); if (bitcount == 2) set_bit(tempbit, 2); if (bitcount == 3) set_bit(tempbit, 3); if (bitcount == 4) set_bit(tempbit, 4); if (bitcount == 5) set_bit(tempbit, 5); if (bitcount == 6) set_bit(tempbit, 6); if (bitcount == 7) set_bit(tempbit, 7); bitcount=bitcount+1; output_red_high(calc); while( (input_red(calc)==0) || (input_white(calc)==0) ){nop();}; } } return tempbit; } void transmit_low(char calc) { output_red_low(calc); while( (input_red(calc)!=0) || (input_white(calc)!=0) ){nop();}; output_red_high(calc); output_white_high(calc); while( (input_red(calc)==0) || (input_white(calc)==0) ){nop();}; } void transmit_high(char calc) { output_white_low(calc); while( (input_red(calc)!=0) || (input_white(calc)!=0) ){nop();}; output_red_high(calc); output_white_high(calc); while( (input_red(calc)==0) || (input_white(calc)==0) ){nop();}; } void send_byte(char byte, char calc) { bytetemp=byte; asm{ bank _bytetemp mov w, _bytetemp and w, #%00000001 bank _bytetemp1 mov _bytetemp1, w } if(bytetemp1==0) transmit_low(calc); else transmit_high(calc); asm{ bank _bytetemp mov w, _bytetemp and w, #%00000010 bank _bytetemp1 mov _bytetemp1, w } if(bytetemp1==0) transmit_low(calc); else transmit_high(calc); asm{ bank _bytetemp mov w, _bytetemp and w, #%00000100 bank _bytetemp1 mov _bytetemp1, w } if(bytetemp1==0) transmit_low(calc); else transmit_high(calc); asm{ bank _bytetemp mov w, _bytetemp and w, #%00001000 bank _bytetemp1 mov _bytetemp1, w } if(bytetemp1==0) transmit_low(calc); else transmit_high(calc); asm{ bank _bytetemp mov w, _bytetemp and w, #%00010000 bank _bytetemp1 mov _bytetemp1, w } if(bytetemp1==0) transmit_low(calc); else transmit_high(calc); asm{ bank _bytetemp mov w, _bytetemp and w, #%00100000 bank _bytetemp1 mov _bytetemp1, w } if(bytetemp1==0) transmit_low(calc); else transmit_high(calc); asm{ bank _bytetemp mov w, _bytetemp and w, #%01000000 bank _bytetemp1 mov _bytetemp1, w } if(bytetemp1==0) transmit_low(calc); else transmit_high(calc); asm{ bank _bytetemp mov w, _bytetemp and w, #%10000000 bank _bytetemp1 mov _bytetemp1, w } if(bytetemp1==0) transmit_low(calc); else transmit_high(calc); } ________________________________________________________________________ Get Your Private, Free E-mail from MSN Hotmail at http://www.hotmail.com