From a4a93ba37b4f1a85cd33d99e0e70e02ec0845a06 Mon Sep 17 00:00:00 2001 From: waltje Date: Wed, 28 Mar 2018 00:37:24 -0400 Subject: [PATCH] Fixed some fixes in the IDE driver. --- src/disk/hdc_ide.c | 62 ++++++++++++++++++++++++++++++++++------------ src/disk/hdc_ide.h | 6 ++--- 2 files changed, 49 insertions(+), 19 deletions(-) diff --git a/src/disk/hdc_ide.c b/src/disk/hdc_ide.c index e7c0273..20c0c27 100644 --- a/src/disk/hdc_ide.c +++ b/src/disk/hdc_ide.c @@ -8,7 +8,7 @@ * * Emulation of hard disk, CD-ROM and ZIP IDE/ATAPI devices. * - * Version: @(#)hdc_ide.c 1.0.13 2018/03/27 + * Version: @(#)hdc_ide.c 1.0.15 2018/03/27 * * Authors: Miran Grca, * Sarah Walker, @@ -642,7 +642,7 @@ static void loadhd(IDE *ide, int d, const wchar_t *fn) ide->spt = (uint8_t)hdd[d].spt; ide->hpc = (uint8_t)hdd[d].hpc; - ide->tracks = hdd[d].tracks; + ide->tracks = (uint8_t)hdd[d].tracks; ide->type = IDE_HDD; ide->hdd_num = d; ide->hdi = hdd_image_get_type(d); @@ -731,7 +731,7 @@ static int ide_set_features(IDE *ide) { return 0; } - ide->mdma_mode = (1 << submode) | 0x400; + ide->mdma_mode = -1; ide_log("IDE %02X: Setting DPIO mode: %02X, %08X\n", ide->channel, submode, ide->mdma_mode); break; @@ -740,7 +740,7 @@ static int ide_set_features(IDE *ide) { return 0; } - ide->mdma_mode = -1; + ide->mdma_mode = (1 << submode) | 0x400; ide_log("IDE %02X: Setting PIO mode: %02X, %08X\n", ide->channel, submode, ide->mdma_mode); break; @@ -795,19 +795,19 @@ static int ide_set_features(IDE *ide) return 1; } -void ide_set_sector(IDE *ide, int sector_num) +void ide_set_sector(IDE *ide, int64_t sector_num) { - uint64_t cyl, r; + uint32_t cyl, r; if (ide->lba) { - ide->head = (sector_num >> 24); - ide->cylinder = (sector_num >> 8); - ide->sector = (sector_num); + ide->head = (int)(sector_num >> 24); + ide->cylinder = (int)(sector_num >> 8); + ide->sector = (int)(sector_num); } else { - cyl = sector_num / (hdd[ide->hdd_num].hpc * hdd[ide->hdd_num].spt); - r = sector_num % (hdd[ide->hdd_num].hpc * hdd[ide->hdd_num].spt); + cyl = (uint32_t) (sector_num / (hdd[ide->hdd_num].hpc * hdd[ide->hdd_num].spt)); + r = (uint32_t) (sector_num % (hdd[ide->hdd_num].hpc * hdd[ide->hdd_num].spt)); ide->cylinder = (int)cyl; ide->head = ((r / hdd[ide->hdd_num].spt) & 0x0f); ide->sector = (int)(r % hdd[ide->hdd_num].spt) + 1; @@ -2599,6 +2599,36 @@ void ide_callback(void *priv) callbackide(drivenum); } +void ide_callback_pri(void *priv) +{ + idecallback[0] = 0LL; + callbackide(0); +} + +void ide_callback_sec(void *priv) +{ + idecallback[1] = 0LL; + callbackide(1); +} + +void ide_callback_ter(void *priv) +{ + idecallback[2] = 0LL; + callbackide(2); +} + +void ide_callback_qua(void *priv) +{ + idecallback[3] = 0LL; + callbackide(3); +} + +void ide_callback_xtide(void *priv) +{ + idecallback[4] = 0LL; + callbackide(4); +} + void ide_write_pri(uint16_t addr, uint8_t val, void *priv) { writeide(0, addr, val); @@ -2792,7 +2822,7 @@ void ide_ter_init(void) { ide_ter_enable(); - timer_add(ide_callback, &idecallback[2], &idecallback[2], (void *)2); + timer_add(ide_callback_ter, &idecallback[2], &idecallback[2], NULL); } void ide_qua_enable(void) @@ -2819,7 +2849,7 @@ void ide_qua_init(void) { ide_qua_enable(); - timer_add(ide_callback, &idecallback[3], &idecallback[3], (void *)3); + timer_add(ide_callback_qua, &idecallback[3], &idecallback[3], NULL); } @@ -2845,7 +2875,7 @@ void ide_xtide_init(void) { ide_bus_master_read = ide_bus_master_write = NULL; - timer_add(ide_callback, &idecallback[4], &idecallback[4], (void *)4); + timer_add(ide_callback_xtide, &idecallback[4], &idecallback[4], NULL); } void ide_set_bus_master(int (*read)(int channel, uint8_t *data, int transfer_length), int (*write)(int channel, uint8_t *data, int transfer_length), void (*set_irq)(int channel)) @@ -2897,13 +2927,13 @@ ide_sainit(const device_t *info) case 10: /* PCI, dual-channel */ if (!ide_init_ch[0]) { ide_pri_enable(); - timer_add(ide_callback, &idecallback[0], &idecallback[0], 0); + timer_add(ide_callback_pri, &idecallback[0], &idecallback[0], NULL); ide_init_ch[0] = 1; } if ((info->local & 2) && !ide_init_ch[1]) { ide_sec_enable(); - timer_add(ide_callback, &idecallback[1], &idecallback[1], (void *)1); + timer_add(ide_callback_sec, &idecallback[1], &idecallback[1], NULL); ide_init_ch[1] = 1; if (info->local & 1) diff --git a/src/disk/hdc_ide.h b/src/disk/hdc_ide.h index f5d0dae..3a0618d 100644 --- a/src/disk/hdc_ide.h +++ b/src/disk/hdc_ide.h @@ -8,7 +8,7 @@ * * Definitions for the IDE module. * - * Version: @(#)hdc_ide.h 1.0.4 2018/03/27 + * Version: @(#)hdc_ide.h 1.0.5 2018/03/27 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -57,9 +57,9 @@ typedef struct { int packlen; uint8_t spt, hpc; - uint64_t t_spt, + int t_spt, t_hpc; - uint64_t tracks; + int tracks; int packetstatus; uint8_t asc; int reset;