Timers are now 64-bit.

This commit is contained in:
OBattler
2017-10-09 01:48:36 +02:00
parent 08bf9109d7
commit 02bbfb26eb
67 changed files with 508 additions and 499 deletions

View File

@@ -37,7 +37,7 @@
#include "hdd.h"
#define HDC_TIME (TIMER_USEC*10)
#define HDC_TIME (TIMER_USEC*10LL)
#define BIOS_FILE L"roms/hdd/esdi_at/62-000279-061.bin"
#define STAT_ERR 0x01
@@ -95,7 +95,7 @@ typedef struct {
uint16_t buffer[256];
int irqstat;
int callback;
int64_t callback;
drive_t drives[2];
@@ -201,7 +201,7 @@ esdi_writew(uint16_t port, uint16_t val, void *priv)
esdi->pos = 0;
esdi->status = STAT_BUSY;
timer_process();
esdi->callback = 6*HDC_TIME;
esdi->callback = 6LL*HDC_TIME;
timer_update_outstanding();
}
}
@@ -256,7 +256,7 @@ esdi_write(uint16_t port, uint8_t val, void *priv)
esdi->command &= ~0x0f; /*Mask off step rate*/
esdi->status = STAT_BUSY;
timer_process();
esdi->callback = 200*HDC_TIME;
esdi->callback = 200LL*HDC_TIME;
timer_update_outstanding();
break;
@@ -264,7 +264,7 @@ esdi_write(uint16_t port, uint8_t val, void *priv)
esdi->command &= ~0x0f; /*Mask off step rate*/
esdi->status = STAT_BUSY;
timer_process();
esdi->callback = 200*HDC_TIME;
esdi->callback = 200LL*HDC_TIME;
timer_update_outstanding();
break;
@@ -273,7 +273,7 @@ esdi_write(uint16_t port, uint8_t val, void *priv)
case CMD_NOP:
esdi->status = STAT_BUSY;
timer_process();
esdi->callback = 200*HDC_TIME;
esdi->callback = 200LL*HDC_TIME;
timer_update_outstanding();
break;
@@ -288,7 +288,7 @@ esdi_write(uint16_t port, uint8_t val, void *priv)
case 0xa0:
esdi->status = STAT_BUSY;
timer_process();
esdi->callback = 200*HDC_TIME;
esdi->callback = 200LL*HDC_TIME;
timer_update_outstanding();
break;
@@ -308,7 +308,7 @@ esdi_write(uint16_t port, uint8_t val, void *priv)
esdi->command &= ~1;
esdi->status = STAT_BUSY;
timer_process();
esdi->callback = 200*HDC_TIME;
esdi->callback = 200LL*HDC_TIME;
timer_update_outstanding();
break;
@@ -320,14 +320,14 @@ esdi_write(uint16_t port, uint8_t val, void *priv)
case CMD_SET_PARAMETERS: /* Initialize Drive Parameters */
esdi->status = STAT_BUSY;
timer_process();
esdi->callback = 30*HDC_TIME;
esdi->callback = 30LL*HDC_TIME;
timer_update_outstanding();
break;
case CMD_DIAGNOSE: /* Execute Drive Diagnostics */
esdi->status = STAT_BUSY;
timer_process();
esdi->callback = 200*HDC_TIME;
esdi->callback = 200LL*HDC_TIME;
timer_update_outstanding();
break;
@@ -335,7 +335,7 @@ esdi_write(uint16_t port, uint8_t val, void *priv)
case CMD_READ_PARAMETERS:
esdi->status = STAT_BUSY;
timer_process();
esdi->callback = 200*HDC_TIME;
esdi->callback = 200LL*HDC_TIME;
timer_update_outstanding();
break;
@@ -344,7 +344,7 @@ esdi_write(uint16_t port, uint8_t val, void *priv)
case 0xe8: /*???*/
esdi->status = STAT_BUSY;
timer_process();
esdi->callback = 200*HDC_TIME;
esdi->callback = 200LL*HDC_TIME;
timer_update_outstanding();
break;
}
@@ -354,7 +354,7 @@ esdi_write(uint16_t port, uint8_t val, void *priv)
case 0x3F6: /* Device control */
if ((esdi->fdisk & 4) && !(val & 4)) {
timer_process();
esdi->callback = 500*HDC_TIME;
esdi->callback = 500LL*HDC_TIME;
timer_update_outstanding();
esdi->reset = 1;
esdi->status = STAT_BUSY;
@@ -363,7 +363,7 @@ esdi_write(uint16_t port, uint8_t val, void *priv)
if (val & 4) {
/*Drive held in reset*/
timer_process();
esdi->callback = 0;
esdi->callback = 0LL;
timer_update_outstanding();
esdi->status = STAT_BUSY;
}
@@ -391,7 +391,7 @@ esdi_readw(uint16_t port, void *priv)
next_sector(esdi);
esdi->status = STAT_BUSY;
timer_process();
esdi->callback = 6*HDC_TIME;
esdi->callback = 6LL*HDC_TIME;
timer_update_outstanding();
}
}
@@ -579,7 +579,7 @@ esdi_callback(void *priv)
next_sector(esdi);
esdi->secount = (esdi->secount - 1) & 0xff;
if (esdi->secount)
esdi->callback = 6*HDC_TIME;
esdi->callback = 6LL*HDC_TIME;
else {
esdi->pos = 0;
esdi->status = STAT_READY | STAT_DSC;

View File

@@ -87,7 +87,7 @@
#define BIOS_FILE_H L"roms/hdd/esdi/90x8970.bin"
#define ESDI_TIME (200*TIMER_USEC)
#define ESDI_TIME (200LL*TIMER_USEC)
#define CMD_ADAPTER 0
@@ -133,7 +133,7 @@ typedef struct esdi {
int cmd_state;
int in_reset;
int callback;
int64_t callback;
uint32_t rba;
@@ -278,7 +278,7 @@ esdi_callback(void *priv)
drive_t *drive;
int val;
dev->callback = 0;
dev->callback = 0LL;
/* If we are returning from a RESET, handle this first. */
if (dev->in_reset) {
@@ -679,7 +679,7 @@ esdi_write(uint16_t port, uint8_t val, void *priv)
case 2: /*Basic control register*/
if ((dev->basic_ctrl & CTRL_RESET) && !(val & CTRL_RESET)) {
dev->in_reset = 1;
dev->callback = ESDI_TIME * 50;
dev->callback = ESDI_TIME * 50LL;
dev->status = STATUS_BUSY;
}
dev->basic_ctrl = val;
@@ -709,7 +709,7 @@ esdi_write(uint16_t port, uint8_t val, void *priv)
case ATTN_RESET:
dev->in_reset = 1;
dev->callback = ESDI_TIME * 50;
dev->callback = ESDI_TIME * 50LL;
dev->status = STATUS_BUSY;
break;
@@ -1029,7 +1029,7 @@ esdi_init(device_t *info)
/* Mark for a reset. */
dev->in_reset = 1;
dev->callback = ESDI_TIME * 50;
dev->callback = ESDI_TIME * 50LL;
dev->status = STATUS_BUSY;
/* Set the reply timer. */

View File

@@ -92,7 +92,7 @@ IDE *ext_ide;
int (*ide_bus_master_read)(int channel, uint8_t *data, int transfer_length);
int (*ide_bus_master_write)(int channel, uint8_t *data, int transfer_length);
void (*ide_bus_master_set_irq)(int channel);
int idecallback[5] = {0, 0, 0, 0, 0};
int64_t idecallback[5] = {0LL, 0LL, 0LL, 0LL, 0LL};
int cur_ide[5];
@@ -629,9 +629,9 @@ void ide_reset(void)
ide_drives[d].board = d >> 1;
}
idecallback[0]=idecallback[1]=0;
idecallback[2]=idecallback[3]=0;
idecallback[4]=0;
idecallback[0]=idecallback[1]=0LL;
idecallback[2]=idecallback[3]=0LL;
idecallback[4]=0LL;
pclog("IDE: loading disks...\n");
c = 0;
@@ -748,7 +748,7 @@ void ide_write_data(int ide_board, uint32_t val, int length)
}
else
{
idecallback[ide_board]=6*IDE_TIME;
idecallback[ide_board]=6LL*IDE_TIME;
}
timer_update_outstanding();
}
@@ -878,7 +878,7 @@ void writeide(int ide_board, uint16_t addr, uint8_t val)
cdrom[atapi_cdrom_drives[ide->channel]].error = 1;
cdrom[atapi_cdrom_drives[ide->channel]].phase = 1;
cdrom[atapi_cdrom_drives[ide->channel]].request_length = 0xEB14;
cdrom[atapi_cdrom_drives[ide->channel]].callback = 0;
cdrom[atapi_cdrom_drives[ide->channel]].callback = 0LL;
ide->cylinder = 0xEB14;
}
if (ide_drive_is_cdrom(ide_other))
@@ -887,11 +887,11 @@ void writeide(int ide_board, uint16_t addr, uint8_t val)
cdrom[atapi_cdrom_drives[ide_other->channel]].error = 1;
cdrom[atapi_cdrom_drives[ide_other->channel]].phase = 1;
cdrom[atapi_cdrom_drives[ide_other->channel]].request_length = 0xEB14;
cdrom[atapi_cdrom_drives[ide_other->channel]].callback = 0;
cdrom[atapi_cdrom_drives[ide_other->channel]].callback = 0LL;
ide->cylinder = 0xEB14;
}
idecallback[ide_board] = 0;
idecallback[ide_board] = 0LL;
timer_update_outstanding();
return;
}
@@ -938,9 +938,9 @@ void writeide(int ide_board, uint16_t addr, uint8_t val)
timer_process();
if (ide_drive_is_cdrom(ide))
{
cdrom[atapi_cdrom_drives[ide->channel]].callback = 100*IDE_TIME;
cdrom[atapi_cdrom_drives[ide->channel]].callback = 100LL*IDE_TIME;
}
idecallback[ide_board]=100*IDE_TIME;
idecallback[ide_board]=100LL*IDE_TIME;
timer_update_outstanding();
return;
@@ -957,9 +957,9 @@ void writeide(int ide_board, uint16_t addr, uint8_t val)
timer_process();
if (ide_drive_is_cdrom(ide))
{
cdrom[atapi_cdrom_drives[ide->channel]].callback = 100*IDE_TIME;
cdrom[atapi_cdrom_drives[ide->channel]].callback = 100LL*IDE_TIME;
}
idecallback[ide_board]=100*IDE_TIME;
idecallback[ide_board]=100LL*IDE_TIME;
timer_update_outstanding();
return;
@@ -985,9 +985,9 @@ void writeide(int ide_board, uint16_t addr, uint8_t val)
timer_process();
if (ide_drive_is_cdrom(ide))
{
cdrom[atapi_cdrom_drives[ide->channel]].callback = 200*IDE_TIME;
cdrom[atapi_cdrom_drives[ide->channel]].callback = 200LL*IDE_TIME;
}
idecallback[ide_board]=200*IDE_TIME;
idecallback[ide_board]=200LL*IDE_TIME;
timer_update_outstanding();
ide->do_initial_read = 1;
return;
@@ -1025,9 +1025,9 @@ void writeide(int ide_board, uint16_t addr, uint8_t val)
timer_process();
if (ide_drive_is_cdrom(ide))
{
cdrom[atapi_cdrom_drives[ide->channel]].callback = 200*IDE_TIME;
cdrom[atapi_cdrom_drives[ide->channel]].callback = 200LL*IDE_TIME;
}
idecallback[ide_board]=200*IDE_TIME;
idecallback[ide_board]=200LL*IDE_TIME;
timer_update_outstanding();
return;
@@ -1044,9 +1044,9 @@ void writeide(int ide_board, uint16_t addr, uint8_t val)
timer_process();
if (ide_drive_is_cdrom(ide))
{
cdrom[atapi_cdrom_drives[ide->channel]].callback = 200*IDE_TIME;
cdrom[atapi_cdrom_drives[ide->channel]].callback = 200LL*IDE_TIME;
}
idecallback[ide_board]=200*IDE_TIME;
idecallback[ide_board]=200LL*IDE_TIME;
timer_update_outstanding();
return;
@@ -1074,9 +1074,9 @@ void writeide(int ide_board, uint16_t addr, uint8_t val)
timer_process();
if (ide_drive_is_cdrom(ide))
{
cdrom[atapi_cdrom_drives[ide->channel]].callback = 30*IDE_TIME;
cdrom[atapi_cdrom_drives[ide->channel]].callback = 30LL*IDE_TIME;
}
idecallback[ide_board]=30*IDE_TIME;
idecallback[ide_board]=30LL*IDE_TIME;
timer_update_outstanding();
return;
@@ -1105,9 +1105,9 @@ void writeide(int ide_board, uint16_t addr, uint8_t val)
/* callbackide(ide_board); */
if (ide_drive_is_cdrom(ide))
{
cdrom[atapi_cdrom_drives[ide->channel]].callback = 200 * IDE_TIME;
cdrom[atapi_cdrom_drives[ide->channel]].callback = 200LL * IDE_TIME;
}
idecallback[ide_board] = 200 * IDE_TIME;
idecallback[ide_board] = 200LL * IDE_TIME;
timer_update_outstanding();
}
else
@@ -1123,9 +1123,9 @@ void writeide(int ide_board, uint16_t addr, uint8_t val)
timer_process();
if (ide_drive_is_cdrom(ide))
{
cdrom[atapi_cdrom_drives[ide->channel]].callback = 30 * IDE_TIME;
cdrom[atapi_cdrom_drives[ide->channel]].callback = 30LL * IDE_TIME;
}
idecallback[ide_board] = 30 * IDE_TIME;
idecallback[ide_board] = 30LL * IDE_TIME;
timer_update_outstanding();
}
return;
@@ -1143,9 +1143,9 @@ void writeide(int ide_board, uint16_t addr, uint8_t val)
timer_process();
if (ide_drive_is_cdrom(ide))
{
cdrom[atapi_cdrom_drives[ide->channel]].callback = 200*IDE_TIME;
cdrom[atapi_cdrom_drives[ide->channel]].callback = 200LL*IDE_TIME;
}
idecallback[ide_board]=200*IDE_TIME;
idecallback[ide_board]=200LL*IDE_TIME;
timer_update_outstanding();
return;
@@ -1162,7 +1162,7 @@ void writeide(int ide_board, uint16_t addr, uint8_t val)
{
ide->atastat = BUSY_STAT;
timer_process();
idecallback[ide_board]=1;
idecallback[ide_board]=1LL;
timer_update_outstanding();
ide->pos=0;
}
@@ -1192,9 +1192,9 @@ ide_bad_command:
timer_process();
if (ide_drive_is_cdrom(ide))
{
cdrom[atapi_cdrom_drives[ide->channel]].callback = 0;
cdrom[atapi_cdrom_drives[ide->channel]].callback = 0LL;
}
idecallback[ide_board]=500*IDE_TIME;
idecallback[ide_board]=500LL*IDE_TIME;
timer_update_outstanding();
if (ide->type != IDE_NONE)
@@ -1215,7 +1215,7 @@ ide_bad_command:
{
/*Drive held in reset*/
timer_process();
idecallback[ide_board] = 0;
idecallback[ide_board] = 0LL;
timer_update_outstanding();
ide->atastat = ide_other->atastat = BUSY_STAT;
}
@@ -1291,7 +1291,7 @@ uint32_t ide_read_data(int ide_board, int length)
}
else
{
idecallback[ide_board]=6*IDE_TIME;
idecallback[ide_board]=6LL*IDE_TIME;
}
timer_update_outstanding();
}
@@ -1497,7 +1497,7 @@ void callbackide(int ide_board)
if (ide_drive_is_cdrom(ide))
{
cdrom[atapi_cdrom_drives[cur_ide[ide_board]]].callback = 0;
cdrom[atapi_cdrom_drives[cur_ide[ide_board]]].callback = 0LL;
}
if (ide->command==0x30) times30++;
@@ -1678,7 +1678,7 @@ void callbackide(int ide_board)
{
if (ide_bus_master_read(ide_board, &ide->sector_buffer[ide->sector_pos*512], 512))
{
idecallback[ide_board]=6*IDE_TIME; /*DMA not performed, try again later*/
idecallback[ide_board]=6LL*IDE_TIME; /*DMA not performed, try again later*/
}
else
{
@@ -1691,7 +1691,7 @@ void callbackide(int ide_board)
{
ide_next_sector(ide);
ide->atastat = BUSY_STAT;
idecallback[ide_board]=6*IDE_TIME;
idecallback[ide_board]=6LL*IDE_TIME;
StatusBarUpdateIcon(SB_HDD | hdd[ide->hdd_num].bus, 1);
}
else
@@ -1795,7 +1795,7 @@ void callbackide(int ide_board)
{
if (ide_bus_master_write(ide_board, (uint8_t *)ide->buffer, 512))
{
idecallback[ide_board]=6*IDE_TIME; /*DMA not performed, try again later*/
idecallback[ide_board]=6LL*IDE_TIME; /*DMA not performed, try again later*/
}
else
{
@@ -1809,7 +1809,7 @@ void callbackide(int ide_board)
{
ide_next_sector(ide);
ide->atastat = BUSY_STAT;
idecallback[ide_board]=6*IDE_TIME;
idecallback[ide_board]=6LL*IDE_TIME;
StatusBarUpdateIcon(SB_HDD | hdd[ide->hdd_num].bus, 1);
}
else
@@ -2053,31 +2053,31 @@ id_not_found:
void ide_callback_pri()
{
idecallback[0] = 0;
idecallback[0] = 0LL;
callbackide(0);
}
void ide_callback_sec()
{
idecallback[1] = 0;
idecallback[1] = 0LL;
callbackide(1);
}
void ide_callback_ter()
{
idecallback[2] = 0;
idecallback[2] = 0LL;
callbackide(2);
}
void ide_callback_qua()
{
idecallback[3] = 0;
idecallback[3] = 0LL;
callbackide(3);
}
void ide_callback_xtide()
{
idecallback[4] = 0;
idecallback[4] = 0LL;
callbackide(4);
}

View File

@@ -60,7 +60,7 @@ extern int ide_enable[5];
extern int ide_irq[5];
extern IDE ide_drives[IDE_NUM + XTIDE_NUM];
extern int idecallback[5];
extern int64_t idecallback[5];
extern void ide_irq_raise(IDE *ide);

View File

@@ -34,7 +34,7 @@
#include "hdd.h"
#define MFM_TIME (TIMER_USEC*10)
#define MFM_TIME (TIMER_USEC*10LL)
#define MFM_DEBUG 0
#define STAT_ERR 0x01
@@ -96,7 +96,7 @@ typedef struct {
pad;
int pos; /* offset within data buffer */
int callback; /* callback delay timer */
int64_t callback; /* callback delay timer */
uint16_t buffer[256]; /* data buffer (16b wide) */
@@ -220,7 +220,7 @@ mfm_cmd(mfm_t *mfm, uint8_t val)
mfm->command = 0xff;
mfm->status = STAT_BUSY;
timer_process();
mfm->callback = 200*MFM_TIME;
mfm->callback = 200LL*MFM_TIME;
timer_update_outstanding();
return;
@@ -247,7 +247,7 @@ mfm_cmd(mfm_t *mfm, uint8_t val)
mfm->command = (val & 0xf0);
mfm->status = STAT_BUSY;
timer_process();
mfm->callback = 200*MFM_TIME;
mfm->callback = 200LL*MFM_TIME;
timer_update_outstanding();
break;
@@ -266,7 +266,7 @@ mfm_cmd(mfm_t *mfm, uint8_t val)
fatal("WD1003: READ with ECC\n");
mfm->status = STAT_BUSY;
timer_process();
mfm->callback = 200*MFM_TIME;
mfm->callback = 200LL*MFM_TIME;
timer_update_outstanding();
break;
@@ -290,7 +290,7 @@ mfm_cmd(mfm_t *mfm, uint8_t val)
mfm->command = (val & 0xfe);
mfm->status = STAT_BUSY;
timer_process();
mfm->callback = 200*MFM_TIME;
mfm->callback = 200LL*MFM_TIME;
timer_update_outstanding();
break;
@@ -304,7 +304,7 @@ mfm_cmd(mfm_t *mfm, uint8_t val)
mfm->command = val;
mfm->status = STAT_BUSY;
timer_process();
mfm->callback = 200*MFM_TIME;
mfm->callback = 200LL*MFM_TIME;
timer_update_outstanding();
break;
@@ -347,7 +347,7 @@ mfm_cmd(mfm_t *mfm, uint8_t val)
pclog("WD1003: bad command %02X\n", val);
mfm->status = STAT_BUSY;
timer_process();
mfm->callback = 200*MFM_TIME;
mfm->callback = 200LL*MFM_TIME;
timer_update_outstanding();
break;
}
@@ -367,7 +367,7 @@ mfm_writew(uint16_t port, uint16_t val, void *priv)
mfm->pos = 0;
mfm->status = STAT_BUSY;
timer_process();
mfm->callback = 6*MFM_TIME;
mfm->callback = 6LL*MFM_TIME;
timer_update_outstanding();
}
}
@@ -425,14 +425,14 @@ mfm_write(uint16_t port, uint8_t val, void *priv)
mfm->status = STAT_BUSY;
mfm->reset = 1;
timer_process();
mfm->callback = 500*MFM_TIME;
mfm->callback = 500LL*MFM_TIME;
timer_update_outstanding();
}
if (val & 0x04) {
/* Drive held in reset. */
mfm->status = STAT_BUSY;
mfm->callback = 0;
mfm->callback = 0LL;
timer_process();
timer_update_outstanding();
}
@@ -459,7 +459,7 @@ mfm_readw(uint16_t port, void *priv)
next_sector(mfm);
mfm->status = STAT_BUSY;
timer_process();
mfm->callback = 6*MFM_TIME;
mfm->callback = 6LL*MFM_TIME;
timer_update_outstanding();
} else {
StatusBarUpdateIcon(SB_HDD|HDD_BUS_MFM, 0);
@@ -545,7 +545,7 @@ do_callback(void *priv)
drive_t *drive = &mfm->drives[mfm->drvsel];
off64_t addr;
mfm->callback = 0;
mfm->callback = 0LL;
if (mfm->reset) {
#if MFM_DEBUG
pclog("WD1003(%d) reset\n", mfm->drvsel);

View File

@@ -66,7 +66,7 @@
#include "hdd.h"
#define MFM_TIME (2000*TIMER_USEC)
#define MFM_TIME (2000LL*TIMER_USEC)
#define XEBEC_BIOS_FILE L"roms/hdd/mfm_xebec/ibm_xebec_62x0822_1985.bin"
#define DTC_BIOS_FILE L"roms/hdd/mfm_xebec/dtc_cxd21a.bin"
@@ -97,7 +97,7 @@ typedef struct {
typedef struct {
rom_t bios_rom;
int callback;
int64_t callback;
int state;
uint8_t status;
uint8_t command[6];
@@ -338,7 +338,7 @@ mfm_callback(void *priv)
drive_t *drive;
off64_t addr;
mfm->callback = 0;
mfm->callback = 0LL;
mfm->drive_sel = (mfm->command[1] & 0x20) ? 1 : 0;
mfm->completion_byte = mfm->drive_sel & 0x20;