Rewrote timer code.

The new code is based on timestamps, rather than delays. This eliminates the
need to update every timer in timer_process(), which cost a non-trivial amount
of CPU time on low-end machines.

This involved changes to every user of the timer code, so this change almost
certainly introduces bugs.
This commit is contained in:
SarahW 2018-08-02 22:06:10 +01:00
commit a7d006b637
79 changed files with 1050 additions and 1033 deletions

View file

@ -51,7 +51,7 @@ typedef struct xebec_t
{
rom_t bios_rom;
int callback;
pc_timer_t callback_timer;
int state;
@ -143,7 +143,7 @@ static uint8_t xebec_read(uint16_t port, void *p)
// pclog("Read all data\n");
xebec->status = STAT_BSY;
xebec->state = STATE_SENT_DATA;
xebec->callback = XEBEC_TIME;
timer_set_delay_u64(&xebec->callback_timer, XEBEC_TIME);
}
break;
@ -190,7 +190,7 @@ static void xebec_write(uint16_t port, uint8_t val, void *p)
{
xebec->status = STAT_BSY;
xebec->state = STATE_START_COMMAND;
xebec->callback = XEBEC_TIME;
timer_set_delay_u64(&xebec->callback_timer, XEBEC_TIME);
// pclog("Command %02x\n", xebec->command[0]);
}
break;
@ -207,7 +207,7 @@ static void xebec_write(uint16_t port, uint8_t val, void *p)
// pclog("Got data\n");
xebec->status = STAT_BSY;
xebec->state = STATE_RECEIVED_DATA;
xebec->callback = XEBEC_TIME;
timer_set_delay_u64(&xebec->callback_timer, XEBEC_TIME);
}
break;
@ -314,13 +314,11 @@ static void xebec_callback(void *p)
xebec_t *xebec = (xebec_t *)p;
mfm_drive_t *drive;
xebec->callback = 0;
xebec->drive_sel = (xebec->command[1] & 0x20) ? 1 : 0;
xebec->completion_byte = xebec->drive_sel & 0x20;
drive = &xebec->drives[xebec->drive_sel];
switch (xebec->command[0])
{
case CMD_TEST_DRIVE_READY:
@ -448,7 +446,7 @@ static void xebec_callback(void *p)
readflash_set(READFLASH_HDC, xebec->drive_sel);
}
if (xebec->irq_dma_mask & DMA_ENA)
xebec->callback = XEBEC_TIME;
timer_set_delay_u64(&xebec->callback_timer, XEBEC_TIME);
else
{
xebec->status = STAT_BSY | STAT_IO | STAT_REQ;
@ -468,12 +466,12 @@ static void xebec_callback(void *p)
{
pclog("CMD_READ_SECTORS out of data!\n");
xebec->status = STAT_BSY | STAT_CD | STAT_IO | STAT_REQ;
xebec->callback = XEBEC_TIME;
timer_set_delay_u64(&xebec->callback_timer, XEBEC_TIME);
return;
}
}
xebec->state = STATE_SENT_DATA;
xebec->callback = XEBEC_TIME;
timer_set_delay_u64(&xebec->callback_timer, XEBEC_TIME);
}
else
fatal("Read sectors no DMA! - shouldn't get here\n");
@ -505,7 +503,7 @@ static void xebec_callback(void *p)
xebec->state = STATE_SEND_DATA;
if (xebec->irq_dma_mask & DMA_ENA)
xebec->callback = XEBEC_TIME;
timer_set_delay_u64(&xebec->callback_timer, XEBEC_TIME);
else
{
xebec->status = STAT_BSY | STAT_IO | STAT_REQ;
@ -535,7 +533,7 @@ static void xebec_callback(void *p)
xebec->data_pos = 0;
xebec->data_len = 512;
if (xebec->irq_dma_mask & DMA_ENA)
xebec->callback = XEBEC_TIME;
timer_set_delay_u64(&xebec->callback_timer, XEBEC_TIME);
else
xebec->status = STAT_BSY | STAT_REQ;
break;
@ -552,7 +550,7 @@ static void xebec_callback(void *p)
{
pclog("CMD_WRITE_SECTORS out of data!\n");
xebec->status = STAT_BSY | STAT_CD | STAT_IO | STAT_REQ;
xebec->callback = XEBEC_TIME;
timer_set_delay_u64(&xebec->callback_timer, XEBEC_TIME);
return;
}
@ -560,7 +558,7 @@ static void xebec_callback(void *p)
}
xebec->state = STATE_RECEIVED_DATA;
xebec->callback = XEBEC_TIME;
timer_set_delay_u64(&xebec->callback_timer, XEBEC_TIME);
}
else
fatal("Write sectors no DMA! - should never get here\n");
@ -595,7 +593,7 @@ static void xebec_callback(void *p)
{
xebec->state = STATE_RECEIVE_DATA;
if (xebec->irq_dma_mask & DMA_ENA)
xebec->callback = XEBEC_TIME;
timer_set_delay_u64(&xebec->callback_timer, XEBEC_TIME);
else
xebec->status = STAT_BSY | STAT_REQ;
}
@ -653,7 +651,7 @@ static void xebec_callback(void *p)
xebec->data_pos = 0;
xebec->data_len = 512;
if (xebec->irq_dma_mask & DMA_ENA)
xebec->callback = XEBEC_TIME;
timer_set_delay_u64(&xebec->callback_timer, XEBEC_TIME);
else
xebec->status = STAT_BSY | STAT_REQ;
break;
@ -671,7 +669,7 @@ static void xebec_callback(void *p)
{
pclog("CMD_WRITE_SECTOR_BUFFER out of data!\n");
xebec->status = STAT_BSY | STAT_CD | STAT_IO | STAT_REQ;
xebec->callback = XEBEC_TIME;
timer_set_delay_u64(&xebec->callback_timer, XEBEC_TIME);
return;
}
@ -679,7 +677,7 @@ static void xebec_callback(void *p)
}
xebec->state = STATE_RECEIVED_DATA;
xebec->callback = XEBEC_TIME;
timer_set_delay_u64(&xebec->callback_timer, XEBEC_TIME);
}
else
fatal("CMD_WRITE_SECTOR_BUFFER - should never get here!\n");
@ -829,7 +827,7 @@ static void *xebec_init()
io_sethandler(0x0320, 0x0004, xebec_read, NULL, NULL, xebec_write, NULL, NULL, xebec);
timer_add(xebec_callback, &xebec->callback, &xebec->callback, xebec);
timer_add(&xebec->callback_timer, xebec_callback, xebec, 0);
return xebec;
}
@ -880,7 +878,7 @@ static void *dtc_5150x_init()
io_sethandler(0x0320, 0x0004, xebec_read, NULL, NULL, xebec_write, NULL, NULL, xebec);
timer_add(xebec_callback, &xebec->callback, &xebec->callback, xebec);
timer_add(&xebec->callback_timer, xebec_callback, xebec, 0);
return xebec;
}