Fixed SCSI hard disk allocation (MT #04595). [Curt Coder]

This commit is contained in:
Curt Coder 2012-01-16 12:55:29 +00:00
parent d7e654e978
commit 52316975ca
2 changed files with 42 additions and 24 deletions

View File

@ -76,7 +76,9 @@ const device_type HARDDISK = &device_creator<harddisk_image_device>;
harddisk_image_device::harddisk_image_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) harddisk_image_device::harddisk_image_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: device_t(mconfig, HARDDISK, "Harddisk", tag, owner, clock), : device_t(mconfig, HARDDISK, "Harddisk", tag, owner, clock),
device_image_interface(mconfig, *this) device_image_interface(mconfig, *this),
m_chd(NULL),
m_hard_disk_handle(NULL)
{ {
} }

View File

@ -15,8 +15,9 @@ typedef struct
UINT32 lba; UINT32 lba;
UINT32 blocks; UINT32 blocks;
int sectorbytes; int sectorbytes;
chd_file *handle;
hard_disk_file *disk; hard_disk_file *disk;
bool is_file; bool is_image_device;
} SCSIHd; } SCSIHd;
@ -253,43 +254,58 @@ static void scsihd_alloc_instance( SCSIInstance *scsiInstance, const char *diskr
our_this->blocks = 0; our_this->blocks = 0;
our_this->sectorbytes = 512; our_this->sectorbytes = 512;
// Attempt to register save state entry after state registration is closed!
state_save_register_item( machine, "scsihd", diskregion, 0, our_this->lba ); state_save_register_item( machine, "scsihd", diskregion, 0, our_this->lba );
state_save_register_item( machine, "scsihd", diskregion, 0, our_this->blocks ); state_save_register_item( machine, "scsihd", diskregion, 0, our_this->blocks );
if (machine.device( diskregion )) { // try to locate the CHD from a DISK_REGION
our_this->is_file = TRUE; our_this->handle = get_disk_handle(machine, diskregion);
our_this->disk = machine.device<harddisk_image_device>(diskregion)->get_hard_disk_file(); our_this->disk = hard_disk_open(our_this->handle);
} else { our_this->is_image_device = false;
for (device_t *device = machine.devicelist().first(); device != NULL; device = device->next())
if (our_this->disk == NULL)
{
// try to locate the CHD from an image device
harddisk_image_device *image_device = machine.device<harddisk_image_device>(diskregion);
if (image_device != NULL)
{ {
if (device->subdevice(diskregion)) { our_this->handle = image_device->get_chd_file();
our_this->is_file = TRUE; our_this->disk = hard_disk_open(our_this->handle);
our_this->disk = device->subdevice<harddisk_image_device>(diskregion)->get_hard_disk_file(); our_this->is_image_device = true;
}
}
if (!our_this->disk)
{
our_this->is_file = FALSE;
our_this->disk = hard_disk_open(get_disk_handle( machine, diskregion ));
} }
} }
if (!our_this->disk) if (our_this->disk == NULL)
{ {
logerror("SCSIHD: no HD found!\n"); // try to locate the CHD from an image subdevice
for (device_t *device = machine.devicelist().first(); device != NULL; device = device->next())
{
if (device->subdevice(diskregion) != NULL)
{
our_this->handle = device->subdevice<harddisk_image_device>(diskregion)->get_chd_file();
our_this->disk = hard_disk_open(our_this->handle);
our_this->is_image_device = true;
}
}
}
if (our_this->disk != NULL)
{
// get hard disk sector size from CHD metadata
const hard_disk_info *hdinfo = hard_disk_get_info(our_this->disk);
our_this->sectorbytes = hdinfo->sectorbytes;
} }
else else
{ {
const hard_disk_info *hdinfo = hard_disk_get_info(our_this->disk); logerror("SCSIHD: no HD found!\n");
our_this->sectorbytes = hdinfo->sectorbytes;
} }
} }
static void scsihd_delete_instance( SCSIInstance *scsiInstance ) static void scsihd_delete_instance( SCSIInstance *scsiInstance )
{ {
SCSIHd *our_this = (SCSIHd *)SCSIThis( &SCSIClassHARDDISK, scsiInstance ); SCSIHd *our_this = (SCSIHd *)SCSIThis( &SCSIClassHARDDISK, scsiInstance );
if (!our_this->is_file) { if (!our_this->is_image_device) {
if( our_this->disk ) if( our_this->disk )
{ {
hard_disk_close( our_this->disk ); hard_disk_close( our_this->disk );