+ UCSR0B = BIT(RXEN0) | BIT(TXEN0) | INTERRUPTS;
+}
+
+uint8_t serial_read()
+{
+#ifdef SERIAL_ASYNC
+ return ringbuffer_blocking_pop(rx);
+#else
+ while(!(UCSR0A&BIT(RXC0))) ;
+ return UDR0;
+#endif
+}
+
+uint8_t serial_read_available()
+{
+#ifdef SERIAL_ASYNC
+ return ringbuffer_fill(rx);
+#else
+ return (UCSR0A&BIT(RXC0))!=0;
+#endif
+}
+
+uint8_t serial_read_overrun()
+{
+#ifdef SERIAL_ASYNC
+ uint8_t o = rx_overrun;
+ rx_overrun = 0;
+ return o;
+#else
+ return (UCSR0A&BIT(DOR0))!=0;
+#endif