207 lines
6 KiB
C
207 lines
6 KiB
C
#include "ibm.h"
|
|
#include "device.h"
|
|
#include "hdd.h"
|
|
|
|
#include "esdi_at.h"
|
|
#include "hdd_esdi.h"
|
|
#include "ide.h"
|
|
#include "mfm_at.h"
|
|
#include "mfm_xebec.h"
|
|
#include "scsi_53c400.h"
|
|
#include "scsi_aha1540.h"
|
|
#include "xtide.h"
|
|
|
|
char hdd_controller_name[16];
|
|
|
|
static device_t null_hdd_device;
|
|
|
|
static int hdd_controller_current;
|
|
|
|
static struct
|
|
{
|
|
char name[50];
|
|
char internal_name[16];
|
|
device_t *device;
|
|
int is_mfm;
|
|
int is_ide;
|
|
int is_scsi;
|
|
} hdd_controllers[] =
|
|
{
|
|
{"None", "none", &null_hdd_device, 0, 0, 0},
|
|
{"[MFM] AT Fixed Disk Adapter", "mfm_at", &mfm_at_device, 1, 0, 0},
|
|
{"[MFM] DTC 5150X", "dtc5150x", &dtc_5150x_device, 1, 0, 0},
|
|
{"[MFM] Fixed Disk Adapter (Xebec)", "mfm_xebec", &mfm_xebec_device, 1, 0, 0},
|
|
{"[ESDI] IBM ESDI Fixed Disk Controller", "esdi_mca", &hdd_esdi_device, 1, 0, 0},
|
|
{"[ESDI] Western Digital WD1007V-SE1", "wd1007vse1", &wd1007vse1_device, 0, 0, 0},
|
|
{"[IDE] Standard IDE", "ide", &ide_device, 0, 1, 0},
|
|
{"[IDE] XTIDE", "xtide", &xtide_device, 0, 1, 0},
|
|
{"[IDE] XTIDE (AT)", "xtide_at", &xtide_at_device, 0, 1, 0},
|
|
{"[IDE] XTIDE (PS/1)", "xtide_ps1", &xtide_ps1_device, 0, 1, 0},
|
|
{"[SCSI] Adaptec AHA-1542C", "aha1542c", &scsi_aha1542c_device, 0, 0, 1},
|
|
{"[SCSI] BusLogic BT-545S", "bt545s", &scsi_bt545s_device, 0, 0, 1},
|
|
{"[SCSI] Longshine LCS-6821N", "lcs6821n", &scsi_lcs6821n_device, 0, 0, 1},
|
|
{"[SCSI] Rancho RT1000B", "rt1000b", &scsi_rt1000b_device, 0, 0, 1},
|
|
{"[SCSI] Trantor T130B", "t130b", &scsi_t130b_device, 0, 0, 1},
|
|
{"", "", NULL, 0, 0}
|
|
};
|
|
|
|
char *hdd_controller_get_name(int hdd)
|
|
{
|
|
return hdd_controllers[hdd].name;
|
|
}
|
|
|
|
char *hdd_controller_get_internal_name(int hdd)
|
|
{
|
|
return hdd_controllers[hdd].internal_name;
|
|
}
|
|
|
|
int hdd_controller_get_flags(int hdd)
|
|
{
|
|
return hdd_controllers[hdd].device->flags;
|
|
}
|
|
|
|
int hdd_controller_available(int hdd)
|
|
{
|
|
return device_available(hdd_controllers[hdd].device);
|
|
}
|
|
|
|
int hdd_controller_is_mfm(char *internal_name)
|
|
{
|
|
int c = 0;
|
|
|
|
while (hdd_controllers[c].device)
|
|
{
|
|
if (!strcmp(internal_name, hdd_controllers[c].internal_name))
|
|
{
|
|
hdd_controller_current = c;
|
|
if (strcmp(internal_name, "none"))
|
|
return hdd_controllers[c].is_mfm;
|
|
}
|
|
c++;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
int hdd_controller_is_ide(char *internal_name)
|
|
{
|
|
int c = 0;
|
|
|
|
while (hdd_controllers[c].device)
|
|
{
|
|
if (!strcmp(internal_name, hdd_controllers[c].internal_name))
|
|
{
|
|
hdd_controller_current = c;
|
|
if (strcmp(internal_name, "none"))
|
|
return hdd_controllers[c].is_ide;
|
|
}
|
|
c++;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
int hdd_controller_is_scsi(char *internal_name)
|
|
{
|
|
int c = 0;
|
|
|
|
while (hdd_controllers[c].device)
|
|
{
|
|
if (!strcmp(internal_name, hdd_controllers[c].internal_name))
|
|
{
|
|
hdd_controller_current = c;
|
|
if (strcmp(internal_name, "none"))
|
|
return hdd_controllers[c].is_scsi;
|
|
}
|
|
c++;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
int hdd_controller_has_config(char *internal_name)
|
|
{
|
|
int c = 0;
|
|
|
|
while (hdd_controllers[c].device)
|
|
{
|
|
if (!strcmp(internal_name, hdd_controllers[c].internal_name))
|
|
{
|
|
hdd_controller_current = c;
|
|
if (strcmp(internal_name, "none"))
|
|
return hdd_controllers[c].device->config ? 1 : 0;
|
|
}
|
|
c++;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
device_t *hdd_controller_get_device(char *internal_name)
|
|
{
|
|
int c = 0;
|
|
|
|
while (hdd_controllers[c].device)
|
|
{
|
|
if (!strcmp(internal_name, hdd_controllers[c].internal_name))
|
|
{
|
|
hdd_controller_current = c;
|
|
if (strcmp(internal_name, "none"))
|
|
return hdd_controllers[c].device;
|
|
}
|
|
c++;
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
int hdd_controller_current_is_mfm()
|
|
{
|
|
return hdd_controller_is_mfm(hdd_controller_name);
|
|
}
|
|
int hdd_controller_current_is_ide()
|
|
{
|
|
return hdd_controller_is_ide(hdd_controller_name);
|
|
}
|
|
int hdd_controller_current_is_scsi()
|
|
{
|
|
return hdd_controller_is_scsi(hdd_controller_name);
|
|
}
|
|
|
|
void hdd_controller_init(char *internal_name)
|
|
{
|
|
int c = 0;
|
|
|
|
while (hdd_controllers[c].device)
|
|
{
|
|
if (!strcmp(internal_name, hdd_controllers[c].internal_name))
|
|
{
|
|
hdd_controller_current = c;
|
|
if (strcmp(internal_name, "none"))
|
|
device_add(hdd_controllers[c].device);
|
|
return;
|
|
}
|
|
c++;
|
|
}
|
|
/* fatal("Could not find hdd_controller %s\n", internal_name);*/
|
|
}
|
|
|
|
|
|
static void *null_hdd_init()
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
static void null_hdd_close(void *p)
|
|
{
|
|
}
|
|
|
|
static device_t null_hdd_device =
|
|
{
|
|
"Null HDD controller",
|
|
0,
|
|
null_hdd_init,
|
|
null_hdd_close,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL
|
|
};
|