Slowed down serial transfer - fixes mouse on OS/2.

This commit is contained in:
TomW 2014-04-09 20:32:54 +01:00
commit 491a885ab2
2 changed files with 21 additions and 5 deletions

View file

@ -182,11 +182,7 @@ uint8_t serial_read(uint16_t addr, void *p)
serial_update_ints(serial); serial_update_ints(serial);
temp = serial_read_fifo(serial); temp = serial_read_fifo(serial);
if (serial->fifo_read != serial->fifo_write) if (serial->fifo_read != serial->fifo_write)
{ serial->recieve_delay = 1000 * TIMER_USEC;
serial->lsr |= 1;
serial->int_status |= SERIAL_INT_RECEIVE;
serial_update_ints(serial);
}
break; break;
case 1: case 1:
if (serial->lcr & 0x80 && !AMSTRADIO) if (serial->lcr & 0x80 && !AMSTRADIO)
@ -230,12 +226,28 @@ uint8_t serial_read(uint16_t addr, void *p)
return temp; return temp;
} }
void serial_recieve_callback(void *p)
{
SERIAL *serial = (SERIAL *)p;
serial->recieve_delay = 0;
if (serial->fifo_read != serial->fifo_write)
{
serial->lsr |= 1;
serial->int_status |= SERIAL_INT_RECEIVE;
serial_update_ints(serial);
}
}
/*Tandy might need COM1 at 2f8*/ /*Tandy might need COM1 at 2f8*/
void serial1_init(uint16_t addr, int irq) void serial1_init(uint16_t addr, int irq)
{ {
memset(&serial1, 0, sizeof(serial1));
io_sethandler(addr, 0x0008, serial_read, NULL, NULL, serial_write, NULL, NULL, &serial1); io_sethandler(addr, 0x0008, serial_read, NULL, NULL, serial_write, NULL, NULL, &serial1);
serial1.irq = irq; serial1.irq = irq;
serial1.rcr_callback = NULL; serial1.rcr_callback = NULL;
timer_add(serial_recieve_callback, &serial1.recieve_delay, &serial1.recieve_delay, &serial1);
} }
void serial1_remove() void serial1_remove()
{ {
@ -247,9 +259,11 @@ void serial1_remove()
void serial2_init(uint16_t addr, int irq) void serial2_init(uint16_t addr, int irq)
{ {
memset(&serial2, 0, sizeof(serial2));
io_sethandler(addr, 0x0008, serial_read, NULL, NULL, serial_write, NULL, NULL, &serial2); io_sethandler(addr, 0x0008, serial_read, NULL, NULL, serial_write, NULL, NULL, &serial2);
serial2.irq = irq; serial2.irq = irq;
serial2.rcr_callback = NULL; serial2.rcr_callback = NULL;
timer_add(serial_recieve_callback, &serial2.recieve_delay, &serial2.recieve_delay, &serial2);
} }
void serial2_remove() void serial2_remove()
{ {

View file

@ -18,6 +18,8 @@ typedef struct
void (*rcr_callback)(void *p); void (*rcr_callback)(void *p);
uint8_t fifo[256]; uint8_t fifo[256];
int fifo_read, fifo_write; int fifo_read, fifo_write;
int recieve_delay;
} SERIAL; } SERIAL;
extern SERIAL serial1, serial2; extern SERIAL serial1, serial2;