Slowed down serial transfer - fixes mouse on OS/2.
This commit is contained in:
parent
1493306d5e
commit
491a885ab2
2 changed files with 21 additions and 5 deletions
24
src/serial.c
24
src/serial.c
|
|
@ -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()
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue