+ char c;
+ int count;
+
+ if ( (serial->device[serial_reg].status & SIO_STAT_RRDY) == 0 )
+ {
+ SIM_DESC sd = hw_system (me);
+ int status;
+
+ /* FIFO is empty */
+ /* Kill current poll event */
+ if ( NULL != serial->device[serial_reg].event )
+ {
+ hw_event_queue_deschedule (me, serial->device[serial_reg].event);
+ serial->device[serial_reg].event = NULL;
+ }
+
+ status = dv_sockser_status (sd);
+ if (!(status & DV_SOCKSER_DISCONNECTED))
+ {
+ int rd;
+ rd = dv_sockser_read (sd);
+ if(rd != -1)
+ {
+ c = (char) rd;
+ count = 1;
+ }
+ else
+ {
+ count = HW_IO_NOT_READY;
+ }
+ }
+ else
+ {
+ count = do_hw_poll_read (me, serial->reader,
+ 0/*STDIN*/, &c, sizeof(c));
+ }
+
+ switch (count)
+ {
+ case HW_IO_NOT_READY:
+ case HW_IO_EOF:
+ serial->device[serial_reg].rxb = 0;
+ serial->device[serial_reg].status &= ~SIO_STAT_RRDY;
+ break;
+ default:
+ serial->device[serial_reg].rxb = c;
+ serial->device[serial_reg].status |= SIO_STAT_RRDY;
+ hw_port_event (me, serial_reg+SERIAL0_RECEIVE, 1);
+ }
+
+ /* schedule polling event */
+ serial->device[serial_reg].event
+ = hw_event_queue_schedule (me, 1000,
+ do_polling_event,
+ (void *) (long) serial_reg);
+ }
+
+ if ( nr_bytes == 1 )
+ {
+ *(unsigned8 *)dest = (unsigned8)serial->device[serial_reg].status;
+ }
+ else if ( nr_bytes == 2 && serial_reg != SC2STR )
+ {
+ *(unsigned16 *)dest = H2LE_2 (serial->device[serial_reg].status);
+ }
+ else
+ {
+ hw_abort (me, "bad read size of %d bytes from SC%dSTR.", nr_bytes,
+ serial_reg);
+ }
+}
+
+
+static void
+read_serial2_timer_reg (struct hw *me,
+ struct mn103ser *serial,
+ void *dest,
+ unsigned nr_bytes)
+{
+ if ( nr_bytes == 1 )
+ {
+ * (unsigned8 *) dest = (unsigned8) serial->serial2_timer_reg;
+ }
+ else
+ {
+ hw_abort (me, "bad read size of %d bytes to SC2TIM.", nr_bytes);
+ }