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:
parent
ab359ca9c5
commit
a7d006b637
79 changed files with 1050 additions and 1033 deletions
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue