PCem

changeset 97:6ddadbcbcfe0

Slowed down serial transfer - fixes mouse on OS/2.
author TomW
date Wed Apr 09 20:32:54 2014 +0100
parents 30de9361da9a
children 4c95696c27d6
files src/serial.c src/serial.h
diffstat 2 files changed, 21 insertions(+), 5 deletions(-) [+]
line diff
     1.1 --- a/src/serial.c	Wed Apr 09 19:55:14 2014 +0100
     1.2 +++ b/src/serial.c	Wed Apr 09 20:32:54 2014 +0100
     1.3 @@ -182,11 +182,7 @@
     1.4                  serial_update_ints(serial);
     1.5                  temp = serial_read_fifo(serial);
     1.6                  if (serial->fifo_read != serial->fifo_write)
     1.7 -                {
     1.8 -                        serial->lsr |= 1;
     1.9 -                        serial->int_status |= SERIAL_INT_RECEIVE;
    1.10 -                        serial_update_ints(serial);
    1.11 -                }
    1.12 +                        serial->recieve_delay = 1000 * TIMER_USEC;
    1.13                  break;
    1.14                  case 1:
    1.15                  if (serial->lcr & 0x80 && !AMSTRADIO)
    1.16 @@ -230,12 +226,28 @@
    1.17          return temp;
    1.18  }
    1.19  
    1.20 +void serial_recieve_callback(void *p)
    1.21 +{
    1.22 +        SERIAL *serial = (SERIAL *)p;
    1.23 +        
    1.24 +        serial->recieve_delay = 0;
    1.25 +        
    1.26 +        if (serial->fifo_read != serial->fifo_write)
    1.27 +        {
    1.28 +                serial->lsr |= 1;
    1.29 +                serial->int_status |= SERIAL_INT_RECEIVE;
    1.30 +                serial_update_ints(serial);
    1.31 +        }
    1.32 +}
    1.33 +
    1.34  /*Tandy might need COM1 at 2f8*/
    1.35  void serial1_init(uint16_t addr, int irq)
    1.36  {
    1.37 +        memset(&serial1, 0, sizeof(serial1));
    1.38          io_sethandler(addr, 0x0008, serial_read,  NULL, NULL, serial_write,  NULL, NULL, &serial1);
    1.39          serial1.irq = irq;
    1.40          serial1.rcr_callback = NULL;
    1.41 +        timer_add(serial_recieve_callback, &serial1.recieve_delay, &serial1.recieve_delay, &serial1);
    1.42  }
    1.43  void serial1_remove()
    1.44  {
    1.45 @@ -247,9 +259,11 @@
    1.46  
    1.47  void serial2_init(uint16_t addr, int irq)
    1.48  {
    1.49 +        memset(&serial2, 0, sizeof(serial2));
    1.50          io_sethandler(addr, 0x0008, serial_read, NULL, NULL, serial_write, NULL, NULL, &serial2);
    1.51          serial2.irq = irq;
    1.52          serial2.rcr_callback = NULL;
    1.53 +        timer_add(serial_recieve_callback, &serial2.recieve_delay, &serial2.recieve_delay, &serial2);
    1.54  }
    1.55  void serial2_remove()
    1.56  {
     2.1 --- a/src/serial.h	Wed Apr 09 19:55:14 2014 +0100
     2.2 +++ b/src/serial.h	Wed Apr 09 20:32:54 2014 +0100
     2.3 @@ -18,6 +18,8 @@
     2.4          void (*rcr_callback)(void *p);
     2.5          uint8_t fifo[256];
     2.6          int fifo_read, fifo_write;
     2.7 +        
     2.8 +        int recieve_delay;
     2.9  } SERIAL;
    2.10  
    2.11  extern SERIAL serial1, serial2;