IDE buffers are now allocated on IDE reset, only for attached devices (and sector buffers only for hard disks).

This commit is contained in:
OBattler
2018-03-15 23:32:07 +01:00
parent 3759cbaad0
commit 1f11f9f9a1
3 changed files with 49 additions and 12 deletions

View File

@@ -9,7 +9,7 @@
* Implementation of the IDE emulation for hard disks and ATAPI * Implementation of the IDE emulation for hard disks and ATAPI
* CD-ROM devices. * CD-ROM devices.
* *
* Version: @(#)hdc_ide.c 1.0.33 2018/03/15 * Version: @(#)hdc_ide.c 1.0.34 2018/03/15
* *
* Authors: Sarah Walker, <http://pcem-emulator.co.uk/> * Authors: Sarah Walker, <http://pcem-emulator.co.uk/>
* Miran Grca, <mgrca8@gmail.com> * Miran Grca, <mgrca8@gmail.com>
@@ -20,10 +20,11 @@
#define __USE_LARGEFILE64 #define __USE_LARGEFILE64
#define _LARGEFILE_SOURCE #define _LARGEFILE_SOURCE
#define _LARGEFILE64_SOURCE #define _LARGEFILE64_SOURCE
#include <stdarg.h>
#include <stdio.h> #include <stdio.h>
#include <stdint.h> #include <stdint.h>
#include <stdlib.h>
#include <string.h> #include <string.h>
#include <stdarg.h>
#include <inttypes.h> #include <inttypes.h>
#include <wchar.h> #include <wchar.h>
#define HAVE_STDARG_H #define HAVE_STDARG_H
@@ -793,6 +794,24 @@ void ide_ter_disable_cond();
void ide_qua_disable_cond(); void ide_qua_disable_cond();
void ide_destroy_buffers(void)
{
int d;
for (d = 0; d < (IDE_NUM+XTIDE_NUM); d++)
{
if (ide_drives[d].buffer) {
free(ide_drives[d].buffer);
ide_drives[d].buffer = NULL;
}
if (ide_drives[d].sector_buffer) {
free(ide_drives[d].sector_buffer);
ide_drives[d].sector_buffer = NULL;
}
}
}
void ide_reset(void) void ide_reset(void)
{ {
int c, d; int c, d;
@@ -818,8 +837,18 @@ void ide_reset(void)
ide_drives[d].atastat = READY_STAT | DSC_STAT; ide_drives[d].atastat = READY_STAT | DSC_STAT;
ide_drives[d].service = 0; ide_drives[d].service = 0;
ide_drives[d].board = d >> 1; ide_drives[d].board = d >> 1;
if (ide_drives[d].buffer) {
free(ide_drives[d].buffer);
ide_drives[d].buffer = NULL;
}
if (ide_drives[d].sector_buffer) {
free(ide_drives[d].sector_buffer);
ide_drives[d].sector_buffer = NULL;
}
} }
idecallback[0]=idecallback[1]=0LL; idecallback[0]=idecallback[1]=0LL;
idecallback[2]=idecallback[3]=0LL; idecallback[2]=idecallback[3]=0LL;
idecallback[4]=0LL; idecallback[4]=0LL;
@@ -832,12 +861,16 @@ void ide_reset(void)
{ {
ide_log("Found IDE hard disk on channel %i\n", hdd[d].ide_channel); ide_log("Found IDE hard disk on channel %i\n", hdd[d].ide_channel);
loadhd(&ide_drives[hdd[d].ide_channel], d, hdd[d].fn); loadhd(&ide_drives[hdd[d].ide_channel], d, hdd[d].fn);
ide_drives[hdd[d].ide_channel].sector_buffer = NULL; /* Important, makes sure malloc does not reuse an existing pointer from elsewhere. */
ide_drives[hdd[d].ide_channel].sector_buffer = (uint8_t *) malloc(256*512);
if (++c >= (IDE_NUM+XTIDE_NUM)) break; if (++c >= (IDE_NUM+XTIDE_NUM)) break;
} }
if ((hdd[d].bus==HDD_BUS_XTIDE) && (hdd[d].xtide_channel < XTIDE_NUM)) if ((hdd[d].bus==HDD_BUS_XTIDE) && (hdd[d].xtide_channel < XTIDE_NUM))
{ {
ide_log("Found XT IDE hard disk on channel %i\n", hdd[d].xtide_channel); ide_log("Found XT IDE hard disk on channel %i\n", hdd[d].xtide_channel);
loadhd(&ide_drives[hdd[d].xtide_channel | 8], d, hdd[d].fn); loadhd(&ide_drives[hdd[d].xtide_channel | 8], d, hdd[d].fn);
ide_drives[hdd[d].xtide_channel | 8].sector_buffer = NULL; /* Important, makes sure malloc does not reuse an existing pointer from elsewhere. */
ide_drives[hdd[d].xtide_channel | 8].sector_buffer = (uint8_t *) malloc(256*512);
if (++c >= (IDE_NUM+XTIDE_NUM)) break; if (++c >= (IDE_NUM+XTIDE_NUM)) break;
} }
} }
@@ -845,13 +878,14 @@ void ide_reset(void)
for (d = 0; d < IDE_NUM; d++) for (d = 0; d < IDE_NUM; d++)
{ {
if (ide_drive_is_zip(&ide_drives[d]) && (ide_drives[d].type != IDE_HDD)) if (ide_drive_is_zip(&ide_drives[d]) && (ide_drives[d].type == IDE_NONE))
{
ide_drives[d].type = IDE_ZIP; ide_drives[d].type = IDE_ZIP;
} else if (ide_drive_is_cdrom(&ide_drives[d]) && (ide_drives[d].type == IDE_NONE))
else if (ide_drive_is_cdrom(&ide_drives[d]) && (ide_drives[d].type != IDE_HDD))
{
ide_drives[d].type = IDE_CDROM; ide_drives[d].type = IDE_CDROM;
if (ide_drives[d].type != IDE_NONE) {
ide_drives[d].buffer = NULL; /* Important, makes sure malloc does not reuse an existing pointer from elsewhere. */
ide_drives[d].buffer = (uint16_t *) malloc(65536);
} }
ide_set_signature(&ide_drives[d]); ide_set_signature(&ide_drives[d]);

View File

@@ -9,7 +9,7 @@
* Implementation of the IDE emulation for hard disks and ATAPI * Implementation of the IDE emulation for hard disks and ATAPI
* CD-ROM devices. * CD-ROM devices.
* *
* Version: @(#)hdd_ide.h 1.0.6 2018/02/14 * Version: @(#)hdd_ide.h 1.0.7 2018/03/15
* *
* Authors: Sarah Walker, <http://pcem-emulator.co.uk/> * Authors: Sarah Walker, <http://pcem-emulator.co.uk/>
* Miran Grca, <mgrca8@gmail.com> * Miran Grca, <mgrca8@gmail.com>
@@ -36,7 +36,7 @@ typedef struct {
int packetstatus; int packetstatus;
uint8_t asc; uint8_t asc;
int reset; int reset;
uint16_t buffer[65536]; uint16_t *buffer;
int irqstat; int irqstat;
int service; int service;
int lba; int lba;
@@ -49,7 +49,7 @@ typedef struct {
int hdd_num; int hdd_num;
uint8_t specify_success; uint8_t specify_success;
int mdma_mode; int mdma_mode;
uint8_t sector_buffer[256*512]; uint8_t *sector_buffer;
int do_initial_read; int do_initial_read;
int sector_pos; int sector_pos;
} IDE; } IDE;
@@ -104,6 +104,7 @@ extern void ide_set_callback(uint8_t channel, int64_t callback);
extern void secondary_ide_check(void); extern void secondary_ide_check(void);
extern void ide_padstr8(uint8_t *buf, int buf_size, const char *src); extern void ide_padstr8(uint8_t *buf, int buf_size, const char *src);
extern void ide_destroy_buffers(void);
extern int (*ide_bus_master_read)(int channel, uint8_t *data, int transfer_length); extern int (*ide_bus_master_read)(int channel, uint8_t *data, int transfer_length);
extern int (*ide_bus_master_write)(int channel, uint8_t *data, int transfer_length); extern int (*ide_bus_master_write)(int channel, uint8_t *data, int transfer_length);

View File

@@ -8,7 +8,7 @@
* *
* Main emulator module where most things are controlled. * Main emulator module where most things are controlled.
* *
* Version: @(#)pc.c 1.0.63 2018/03/13 * Version: @(#)pc.c 1.0.64 2018/03/15
* *
* Authors: Sarah Walker, <http://pcem-emulator.co.uk/> * Authors: Sarah Walker, <http://pcem-emulator.co.uk/>
* Miran Grca, <mgrca8@gmail.com> * Miran Grca, <mgrca8@gmail.com>
@@ -968,6 +968,8 @@ pc_close(thread_t *ptr)
sound_cd_thread_end(); sound_cd_thread_end();
mem_destroy_pages(); mem_destroy_pages();
ide_destroy_buffers();
} }