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:
@@ -32,6 +32,7 @@ Harddrives::populateBuses(QAbstractItemModel *model)
|
||||
{
|
||||
model->removeRows(0, model->rowCount());
|
||||
model->insertRows(0, 6);
|
||||
|
||||
model->setData(model->index(0, 0), "MFM/RLL");
|
||||
model->setData(model->index(1, 0), "XTA");
|
||||
model->setData(model->index(2, 0), "ESDI");
|
||||
@@ -48,7 +49,7 @@ Harddrives::populateBuses(QAbstractItemModel *model)
|
||||
}
|
||||
|
||||
void
|
||||
Harddrives::populateRemovableBuses(QAbstractItemModel *model)
|
||||
Harddrives::populateCDROMBuses(QAbstractItemModel *model)
|
||||
{
|
||||
model->removeRows(0, model->rowCount());
|
||||
#ifdef USE_CDROM_MITSUMI
|
||||
@@ -56,6 +57,7 @@ Harddrives::populateRemovableBuses(QAbstractItemModel *model)
|
||||
#else
|
||||
model->insertRows(0, 4);
|
||||
#endif
|
||||
|
||||
model->setData(model->index(0, 0), QObject::tr("Disabled"));
|
||||
model->setData(model->index(1, 0), QObject::tr("ATAPI"));
|
||||
model->setData(model->index(2, 0), QObject::tr("SCSI"));
|
||||
@@ -77,6 +79,21 @@ Harddrives::populateRemovableBuses(QAbstractItemModel *model)
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
Harddrives::populateRemovableBuses(QAbstractItemModel *model)
|
||||
{
|
||||
model->removeRows(0, model->rowCount());
|
||||
model->insertRows(0, 3);
|
||||
|
||||
model->setData(model->index(0, 0), QObject::tr("Disabled"));
|
||||
model->setData(model->index(1, 0), QObject::tr("ATAPI"));
|
||||
model->setData(model->index(2, 0), QObject::tr("SCSI"));
|
||||
|
||||
model->setData(model->index(0, 0), HDD_BUS_DISABLED, Qt::UserRole);
|
||||
model->setData(model->index(1, 0), HDD_BUS_ATAPI, Qt::UserRole);
|
||||
model->setData(model->index(2, 0), HDD_BUS_SCSI, Qt::UserRole);
|
||||
}
|
||||
|
||||
void
|
||||
Harddrives::populateSpeeds(QAbstractItemModel *model, int bus)
|
||||
{
|
||||
@@ -144,6 +161,12 @@ Harddrives::populateBusChannels(QAbstractItemModel *model, int bus, SettingsBusT
|
||||
subChannelWidth = 2;
|
||||
busesToCheck.append(HDD_BUS_SCSI);
|
||||
break;
|
||||
case CDROM_BUS_MKE:
|
||||
shifter = 2;
|
||||
orer = 3;
|
||||
busRows = 4;
|
||||
busesToCheck.append(CDROM_BUS_MKE);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -192,11 +215,11 @@ Harddrives::BusChannelName(uint8_t bus, uint8_t channel)
|
||||
case HDD_BUS_SCSI:
|
||||
busName = QString("SCSI (%1:%2)").arg(channel >> 4).arg(channel & 15, 2, 10, QChar('0'));
|
||||
break;
|
||||
case CDROM_BUS_MITSUMI:
|
||||
busName = QString("Mitsumi");
|
||||
break;
|
||||
case CDROM_BUS_MITSUMI:
|
||||
busName = QString("Mitsumi");
|
||||
break;
|
||||
case CDROM_BUS_MKE:
|
||||
busName = QString("Panasonic/MKE");
|
||||
busName = QString("Panasonic/MKE (%1:%2)").arg(channel >> 2).arg(channel & 3);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
@@ -9,6 +9,7 @@ class SettingsBusTracking;
|
||||
|
||||
namespace Harddrives {
|
||||
void populateBuses(QAbstractItemModel *model);
|
||||
void populateCDROMBuses(QAbstractItemModel *model);
|
||||
void populateRemovableBuses(QAbstractItemModel *model);
|
||||
void populateBusChannels(QAbstractItemModel *model, int bus, SettingsBusTracking *sbt = nullptr);
|
||||
void populateSpeeds(QAbstractItemModel *model, int bus);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -31,12 +31,14 @@ public:
|
||||
QList<int> busChannelsInUse(int bus);
|
||||
|
||||
/* These return 0xff is none is free. */
|
||||
uint8_t next_free_mke_channel();
|
||||
uint8_t next_free_mfm_channel();
|
||||
uint8_t next_free_esdi_channel();
|
||||
uint8_t next_free_xta_channel();
|
||||
uint8_t next_free_ide_channel();
|
||||
uint8_t next_free_scsi_id();
|
||||
|
||||
int mke_bus_full();
|
||||
int mfm_bus_full();
|
||||
int esdi_bus_full();
|
||||
int xta_bus_full();
|
||||
@@ -49,6 +51,8 @@ public:
|
||||
void device_track(int set, uint8_t dev_type, int bus, int channel);
|
||||
|
||||
private:
|
||||
/* 1 channel, 2 devices per channel, 8 bits per device = 16 bits. */
|
||||
uint64_t mke_tracking { 0 };
|
||||
/* 1 channel, 2 devices per channel, 8 bits per device = 16 bits. */
|
||||
uint64_t mfm_tracking { 0 };
|
||||
/* 1 channel, 2 devices per channel, 8 bits per device = 16 bits. */
|
||||
@@ -63,7 +67,6 @@ private:
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
|
||||
|
||||
bool mitsumi_tracking;
|
||||
bool mke_tracking;
|
||||
};
|
||||
|
||||
#endif // QT_SETTINGS_BUS_TRACKING_HPP
|
||||
|
||||
@@ -105,8 +105,7 @@ setCDROMType(QAbstractItemModel *model, const QModelIndex &idx, int type)
|
||||
auto i = idx.siblingAtColumn(2);
|
||||
if (idx.siblingAtColumn(0).data(Qt::UserRole).toUInt() == CDROM_BUS_DISABLED)
|
||||
model->setData(i, QCoreApplication::translate("", "None"));
|
||||
else if (idx.siblingAtColumn(0).data(Qt::UserRole).toUInt() != CDROM_BUS_MITSUMI &&
|
||||
idx.siblingAtColumn(0).data(Qt::UserRole).toUInt() != CDROM_BUS_MKE)
|
||||
else if (idx.siblingAtColumn(0).data(Qt::UserRole).toUInt() != CDROM_BUS_MITSUMI)
|
||||
model->setData(i, CDROMName(type));
|
||||
model->setData(i, type, Qt::UserRole);
|
||||
}
|
||||
@@ -151,7 +150,7 @@ SettingsFloppyCDROM::SettingsFloppyCDROM(QWidget *parent)
|
||||
this, &SettingsFloppyCDROM::onFloppyRowChanged);
|
||||
ui->tableViewFloppy->setCurrentIndex(model->index(0, 0));
|
||||
|
||||
Harddrives::populateRemovableBuses(ui->comboBoxBus->model());
|
||||
Harddrives::populateCDROMBuses(ui->comboBoxBus->model());
|
||||
model = ui->comboBoxSpeed->model();
|
||||
for (int i = 0; i < 72; i++)
|
||||
Models::AddEntry(model, QString("%1x").arg(i + 1), i + 1);
|
||||
@@ -172,12 +171,13 @@ SettingsFloppyCDROM::SettingsFloppyCDROM(QWidget *parent)
|
||||
setCDROMSpeed(model, idx.siblingAtColumn(1), cdrom[i].speed);
|
||||
else
|
||||
setCDROMSpeed(model, idx.siblingAtColumn(1), speed);
|
||||
if (cdrom[i].bus_type == CDROM_BUS_ATAPI)
|
||||
if (cdrom[i].bus_type == CDROM_BUS_MKE)
|
||||
Harddrives::busTrackClass->device_track(1, DEV_CDROM, cdrom[i].bus_type, cdrom[i].mke_channel);
|
||||
else if (cdrom[i].bus_type == CDROM_BUS_ATAPI)
|
||||
Harddrives::busTrackClass->device_track(1, DEV_CDROM, cdrom[i].bus_type, cdrom[i].ide_channel);
|
||||
else if (cdrom[i].bus_type == CDROM_BUS_SCSI)
|
||||
Harddrives::busTrackClass->device_track(1, DEV_CDROM, cdrom[i].bus_type,
|
||||
cdrom[i].scsi_device_id);
|
||||
else if (cdrom[i].bus_type == CDROM_BUS_MITSUMI || cdrom[i].bus_type == CDROM_BUS_MKE)
|
||||
Harddrives::busTrackClass->device_track(1, DEV_CDROM, cdrom[i].bus_type, cdrom[i].scsi_device_id);
|
||||
else if (cdrom[i].bus_type == CDROM_BUS_MITSUMI)
|
||||
Harddrives::busTrackClass->device_track(1, DEV_CDROM, cdrom[i].bus_type, 0);
|
||||
}
|
||||
ui->tableViewCDROM->resizeColumnsToContents();
|
||||
@@ -197,9 +197,10 @@ SettingsFloppyCDROM::SettingsFloppyCDROM(QWidget *parent)
|
||||
int selectedTypeRow = 0;
|
||||
int eligibleRows = 0;
|
||||
while (cdrom_drive_types[j].bus_type != BUS_TYPE_NONE) {
|
||||
if (((bus_type == CDROM_BUS_ATAPI) || (bus_type == CDROM_BUS_SCSI)) &&
|
||||
if (((bus_type == CDROM_BUS_MKE) || (bus_type == CDROM_BUS_ATAPI) ||
|
||||
(bus_type == CDROM_BUS_SCSI)) &&
|
||||
((cdrom_drive_types[j].bus_type == bus_type) ||
|
||||
(cdrom_drive_types[j].bus_type == BUS_TYPE_BOTH))) {
|
||||
((cdrom_drive_types[j].bus_type == BUS_TYPE_BOTH) && (bus_type != BUS_TYPE_MKE)))) {
|
||||
QString name = CDROMName(j);
|
||||
Models::AddEntry(modelType, name, j);
|
||||
if (cdrom[cdromIdx].type == j)
|
||||
@@ -288,9 +289,10 @@ SettingsFloppyCDROM::onCDROMRowChanged(const QModelIndex ¤t)
|
||||
int selectedTypeRow = 0;
|
||||
int eligibleRows = 0;
|
||||
while (cdrom_drive_types[j].bus_type != BUS_TYPE_NONE) {
|
||||
if (((bus == CDROM_BUS_ATAPI) || (bus == CDROM_BUS_SCSI)) &&
|
||||
if (((bus == CDROM_BUS_MKE) || (bus == CDROM_BUS_ATAPI) ||
|
||||
(bus == CDROM_BUS_SCSI)) &&
|
||||
((cdrom_drive_types[j].bus_type == bus) ||
|
||||
(cdrom_drive_types[j].bus_type == BUS_TYPE_BOTH))) {
|
||||
((cdrom_drive_types[j].bus_type == BUS_TYPE_BOTH) && (bus != BUS_TYPE_MKE)))) {
|
||||
QString name = CDROMName(j);
|
||||
Models::AddEntry(modelType, name, j);
|
||||
if (type == j)
|
||||
@@ -343,9 +345,9 @@ SettingsFloppyCDROM::on_comboBoxBus_currentIndexChanged(int index)
|
||||
if (index >= 0) {
|
||||
int bus = ui->comboBoxBus->currentData().toInt();
|
||||
bool enabled = (bus != CDROM_BUS_DISABLED);
|
||||
ui->comboBoxChannel->setEnabled((bus == CDROM_BUS_MITSUMI || bus == CDROM_BUS_MKE) ? 0 : enabled);
|
||||
ui->comboBoxSpeed->setEnabled((bus == CDROM_BUS_MITSUMI || bus == CDROM_BUS_MKE) ? 0 : enabled);
|
||||
ui->comboBoxCDROMType->setEnabled((bus == CDROM_BUS_MITSUMI || bus == CDROM_BUS_MKE) ? 0 : enabled);
|
||||
ui->comboBoxChannel->setEnabled((bus == CDROM_BUS_MITSUMI) ? 0 : enabled);
|
||||
ui->comboBoxSpeed->setEnabled((bus == CDROM_BUS_MITSUMI) ? 0 : enabled);
|
||||
ui->comboBoxCDROMType->setEnabled((bus == CDROM_BUS_MITSUMI) ? 0 : enabled);
|
||||
|
||||
Harddrives::populateBusChannels(ui->comboBoxChannel->model(), bus, Harddrives::busTrackClass);
|
||||
}
|
||||
@@ -368,11 +370,13 @@ SettingsFloppyCDROM::on_comboBoxBus_activated(int)
|
||||
Harddrives::busTrackClass->device_track(0, DEV_CDROM, ui->tableViewCDROM->model()->data(i,
|
||||
Qt::UserRole).toInt(), ui->tableViewCDROM->model()->data(i,
|
||||
Qt::UserRole + 1).toInt());
|
||||
if (bus_type == CDROM_BUS_ATAPI)
|
||||
if (bus_type == CDROM_BUS_MKE)
|
||||
ui->comboBoxChannel->setCurrentIndex(Harddrives::busTrackClass->next_free_mke_channel());
|
||||
else if (bus_type == CDROM_BUS_ATAPI)
|
||||
ui->comboBoxChannel->setCurrentIndex(Harddrives::busTrackClass->next_free_ide_channel());
|
||||
else if (bus_type == CDROM_BUS_SCSI)
|
||||
ui->comboBoxChannel->setCurrentIndex(Harddrives::busTrackClass->next_free_scsi_id());
|
||||
else if (bus_type == CDROM_BUS_MITSUMI || bus_type == CDROM_BUS_MKE)
|
||||
else if (bus_type == CDROM_BUS_MITSUMI)
|
||||
ui->comboBoxChannel->setCurrentIndex(0);
|
||||
|
||||
setCDROMBus(ui->tableViewCDROM->model(),
|
||||
@@ -390,9 +394,10 @@ SettingsFloppyCDROM::on_comboBoxBus_activated(int)
|
||||
int selectedTypeRow = 0;
|
||||
int eligibleRows = 0;
|
||||
while (cdrom_drive_types[j].bus_type != BUS_TYPE_NONE) {
|
||||
if (((bus_type == CDROM_BUS_ATAPI) || (bus_type == CDROM_BUS_SCSI)) &&
|
||||
if (((bus_type == CDROM_BUS_MKE) || (bus_type == CDROM_BUS_ATAPI) ||
|
||||
(bus_type == CDROM_BUS_SCSI)) &&
|
||||
((cdrom_drive_types[j].bus_type == bus_type) ||
|
||||
(cdrom_drive_types[j].bus_type == BUS_TYPE_BOTH))) {
|
||||
((cdrom_drive_types[j].bus_type == BUS_TYPE_BOTH) && (bus_type != BUS_TYPE_MKE)))) {
|
||||
QString name = CDROMName(j);
|
||||
Models::AddEntry(modelType, name, j);
|
||||
if (cdrom[cdromIdx].type == j)
|
||||
|
||||
@@ -140,14 +140,13 @@ SettingsInput::onCurrentMachineChanged(int machineId)
|
||||
c++;
|
||||
}
|
||||
keyboardModel->removeRows(0, removeRows);
|
||||
ui->comboBoxKeyboard->setCurrentIndex(selectedRow);
|
||||
|
||||
if ((c == 1) || has_int_kbd)
|
||||
ui->comboBoxKeyboard->setEnabled(false);
|
||||
else
|
||||
ui->comboBoxKeyboard->setEnabled(true);
|
||||
|
||||
ui->comboBoxKeyboard->setCurrentIndex(selectedRow);
|
||||
|
||||
auto *mouseModel = ui->comboBoxMouse->model();
|
||||
removeRows = mouseModel->rowCount();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user