MKE CD-ROM: Fix disc change detection, move model selection to CD-ROM type, and properly implement support for the up to 4 drives supported by the controller.
This commit is contained in:
@@ -29,8 +29,8 @@
|
||||
SettingsBusTracking::SettingsBusTracking()
|
||||
{
|
||||
mitsumi_tracking = false;
|
||||
mke_tracking = false;
|
||||
|
||||
mke_tracking = 0x0000000000000000ULL;
|
||||
mfm_tracking = 0x0000000000000000ULL;
|
||||
esdi_tracking = 0x0000000000000000ULL;
|
||||
xta_tracking = 0x0000000000000000ULL;
|
||||
@@ -42,40 +42,76 @@ SettingsBusTracking::SettingsBusTracking()
|
||||
scsi_tracking[i] = 0x0000000000000000ULL;
|
||||
}
|
||||
|
||||
uint8_t
|
||||
SettingsBusTracking::next_free_mke_channel()
|
||||
{
|
||||
uint64_t mask;
|
||||
uint8_t ret = CHANNEL_NONE;
|
||||
|
||||
for (uint8_t i = 0; i < 4; i++) {
|
||||
mask = 0xffULL << ((uint64_t) ((i << 3) & 0x3f));
|
||||
|
||||
if (!(mke_tracking & mask)) {
|
||||
ret = (uint8_t) i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
uint8_t
|
||||
SettingsBusTracking::next_free_mfm_channel()
|
||||
{
|
||||
if ((mfm_tracking & 0xff00ULL) && !(mfm_tracking & 0x00ffULL))
|
||||
return 1;
|
||||
uint64_t mask;
|
||||
uint8_t ret = CHANNEL_NONE;
|
||||
|
||||
if (!(mfm_tracking & 0xff00ULL) && (mfm_tracking & 0x00ffULL))
|
||||
return 0;
|
||||
for (uint8_t i = 0; i < 2; i++) {
|
||||
mask = 0xffULL << ((uint64_t) ((i << 3) & 0x3f));
|
||||
|
||||
return CHANNEL_NONE;
|
||||
if (!(mfm_tracking & mask)) {
|
||||
ret = (uint8_t) i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
uint8_t
|
||||
SettingsBusTracking::next_free_esdi_channel()
|
||||
{
|
||||
if ((esdi_tracking & 0xff00ULL) && !(esdi_tracking & 0x00ffULL))
|
||||
return 1;
|
||||
uint64_t mask;
|
||||
uint8_t ret = CHANNEL_NONE;
|
||||
|
||||
if (!(esdi_tracking & 0xff00ULL) && (esdi_tracking & 0x00ffULL))
|
||||
return 0;
|
||||
for (uint8_t i = 0; i < 2; i++) {
|
||||
mask = 0xffULL << ((uint64_t) ((i << 3) & 0x3f));
|
||||
|
||||
return CHANNEL_NONE;
|
||||
if (!(esdi_tracking & mask)) {
|
||||
ret = (uint8_t) i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
uint8_t
|
||||
SettingsBusTracking::next_free_xta_channel()
|
||||
{
|
||||
if ((xta_tracking & 0xff00ULL) && !(xta_tracking & 0x00ffULL))
|
||||
return 1;
|
||||
uint64_t mask;
|
||||
uint8_t ret = CHANNEL_NONE;
|
||||
|
||||
if (!(xta_tracking & 0xff00ULL) && (xta_tracking & 0x00ffULL))
|
||||
return 0;
|
||||
for (uint8_t i = 0; i < 2; i++) {
|
||||
mask = 0xffULL << ((uint64_t) ((i << 3) & 0x3f));
|
||||
|
||||
return CHANNEL_NONE;
|
||||
if (!(xta_tracking & mask)) {
|
||||
ret = (uint8_t) i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
uint8_t
|
||||
@@ -209,29 +245,32 @@ QList<int> SettingsBusTracking::busChannelsInUse(const int bus) {
|
||||
uint64_t mask;
|
||||
switch (bus) {
|
||||
case CDROM_BUS_MKE:
|
||||
if (mke_tracking)
|
||||
channelsInUse.append(0);
|
||||
for (uint8_t i = 0; i < 4; i++) {
|
||||
mask = 0xffULL << ((uint64_t) ((i << 3) & 0x3f));
|
||||
if (mke_tracking & mask)
|
||||
channelsInUse.append(i);
|
||||
}
|
||||
break;
|
||||
case CDROM_BUS_MITSUMI:
|
||||
if (mitsumi_tracking)
|
||||
channelsInUse.append(0);
|
||||
break;
|
||||
case HDD_BUS_MFM:
|
||||
for (uint8_t i = 0; i < 32; i++) {
|
||||
for (uint8_t i = 0; i < 2; i++) {
|
||||
mask = 0xffULL << ((uint64_t) ((i << 3) & 0x3f));
|
||||
if (mfm_tracking & mask)
|
||||
channelsInUse.append(i);
|
||||
}
|
||||
break;
|
||||
case HDD_BUS_ESDI:
|
||||
for (uint8_t i = 0; i < 32; i++) {
|
||||
for (uint8_t i = 0; i < 2; i++) {
|
||||
mask = 0xffULL << ((uint64_t) ((i << 3) & 0x3f));
|
||||
if (esdi_tracking & mask)
|
||||
channelsInUse.append(i);
|
||||
}
|
||||
break;
|
||||
case HDD_BUS_XTA:
|
||||
for (uint8_t i = 0; i < 32; i++) {
|
||||
for (uint8_t i = 0; i < 2; i++) {
|
||||
mask = 0xffULL << ((uint64_t) ((i << 3) & 0x3f));
|
||||
if (xta_tracking & mask)
|
||||
channelsInUse.append(i);
|
||||
@@ -276,7 +315,12 @@ SettingsBusTracking::device_track(int set, uint8_t dev_type, int bus, int channe
|
||||
|
||||
switch (bus) {
|
||||
case CDROM_BUS_MKE:
|
||||
mke_tracking = set;
|
||||
mask = ((uint64_t) dev_type) << ((uint64_t) ((channel << 3) & 0x3f));
|
||||
|
||||
if (set)
|
||||
mke_tracking |= mask;
|
||||
else
|
||||
mke_tracking &= ~mask;
|
||||
break;
|
||||
case CDROM_BUS_MITSUMI:
|
||||
mitsumi_tracking = set;
|
||||
|
||||
Reference in New Issue
Block a user