const byte serial_idle = 0 const byte serial_send_start = 1 const byte serial_send_data = 2 const byte serial_send_stop1 = 3 const byte serial_send_stop2 = 4 var byte serial_status = serial_idle var byte serial_data var byte serial_data_count procedure do_serial is -- with the clock at 10 MHz, timer0 is incremented at 2.5 MHz, -- which means that it overflows at 9765.625 Hz, which is close -- enough to 9600 baud for my liking. if serial_status == serial_idle then return end if if serial_status == serial_send_start then serial_pin = high serial_status = serial_send_data queue_get serial_data = q_param serial_data_count = 8 return end if if serial_status == serial_send_data then var bit b at serial_data : 0 serial_pin = ! b serial_data = serial_data >> 1 serial_data_count = serial_data_count - 1 if serial_data_count == 0 then serial_status = serial_send_stop1 end if return end if if serial_status == serial_send_stop1 then serial_pin = low serial_status = serial_send_stop2 return end if if serial_status == serial_send_stop2 then if queue_len > 0 then serial_status = serial_send_start else serial_status = serial_idle end if return end if end procedure procedure serial_send is if serial_status == serial_idle then serial_status = serial_send_start end if end procedure