From dabed16bbfd9103889705acfd394d36bf145ac6a Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Sun, 9 Jan 2022 16:41:03 +0600 Subject: [PATCH 1/5] Add OBattler's hard disk tracking code and make use of it for HDD settings --- src/qt/CMakeLists.txt | 2 + src/qt/qt_harddrive_common.hpp | 2 + src/qt/qt_settings.cpp | 5 + src/qt/qt_settings_bus_tracking.cpp | 257 ++++++++++++++++++++++++++++ src/qt/qt_settings_bus_tracking.hpp | 63 +++++++ src/qt/qt_settingsharddisks.cpp | 41 +++++ src/qt/qt_settingsharddisks.hpp | 1 + 7 files changed, 371 insertions(+) create mode 100644 src/qt/qt_settings_bus_tracking.cpp create mode 100644 src/qt/qt_settings_bus_tracking.hpp diff --git a/src/qt/CMakeLists.txt b/src/qt/CMakeLists.txt index b1f37c4dc..f87a76fcc 100644 --- a/src/qt/CMakeLists.txt +++ b/src/qt/CMakeLists.txt @@ -71,6 +71,8 @@ add_library(ui STATIC qt_settingsotherperipherals.cpp qt_settingsotherperipherals.hpp qt_settingsotherperipherals.ui + qt_settings_bus_tracking.cpp + qt_settings_bus_tracking.hpp qt_deviceconfig.cpp qt_deviceconfig.hpp diff --git a/src/qt/qt_harddrive_common.hpp b/src/qt/qt_harddrive_common.hpp index 0e0164d54..5d4bbc9e0 100644 --- a/src/qt/qt_harddrive_common.hpp +++ b/src/qt/qt_harddrive_common.hpp @@ -4,10 +4,12 @@ class QString; class QAbstractItemModel; +class SettingsBusTracking; namespace Harddrives { void populateBuses(QAbstractItemModel* model); void populateRemovableBuses(QAbstractItemModel* model); void populateBusChannels(QAbstractItemModel* model, int bus); QString BusChannelName(uint8_t bus, uint8_t channel); + inline SettingsBusTracking* busTrackClass = nullptr; }; diff --git a/src/qt/qt_settings.cpp b/src/qt/qt_settings.cpp index 388a843b8..3c8a074db 100644 --- a/src/qt/qt_settings.cpp +++ b/src/qt/qt_settings.cpp @@ -14,6 +14,8 @@ #include "qt_settingsotherperipherals.hpp" #include "qt_progsettings.hpp" +#include "qt_harddrive_common.hpp" +#include "qt_settings_bus_tracking.hpp" extern "C" { @@ -85,6 +87,7 @@ Settings::Settings(QWidget *parent) : ui->listView->setModel(new SettingsModel(this)); + Harddrives::busTrackClass = new SettingsBusTracking; machine = new SettingsMachine(this); display = new SettingsDisplay(this); input = new SettingsInput(this); @@ -124,6 +127,8 @@ Settings::Settings(QWidget *parent) : Settings::~Settings() { delete ui; + delete Harddrives::busTrackClass; + Harddrives::busTrackClass = nullptr; } void Settings::save() { diff --git a/src/qt/qt_settings_bus_tracking.cpp b/src/qt/qt_settings_bus_tracking.cpp new file mode 100644 index 000000000..f6a1c184e --- /dev/null +++ b/src/qt/qt_settings_bus_tracking.cpp @@ -0,0 +1,257 @@ +#include +#include +#include +#include + +#include "86box/hdd.h" +#include "qt_settings_bus_tracking.hpp" + + +SettingsBusTracking::SettingsBusTracking() +{ + int i; + + mfm_tracking = 0x0000000000000000ULL; + esdi_tracking = 0x0000000000000000ULL; + xta_tracking = 0x0000000000000000ULL; + + for (i = 0; i < 8; i++) { + if (i < 4) + ide_tracking[i] = 0x0000000000000000ULL; + + scsi_tracking[i] = 0x0000000000000000ULL; + } +} + + +uint8_t +SettingsBusTracking::next_free_mfm_channel() +{ + if ((mfm_tracking & 0xff00ULL) && !(mfm_tracking & 0x00ffULL)) + return 0; + + if (!(mfm_tracking & 0xff00ULL) && (mfm_tracking & 0x00ffULL)) + return 1; + + return CHANNEL_NONE; +} + + +uint8_t +SettingsBusTracking::next_free_esdi_channel() +{ + if ((esdi_tracking & 0xff00ULL) && !(esdi_tracking & 0x00ffULL)) + return 0; + + if (!(esdi_tracking & 0xff00ULL) && (esdi_tracking & 0x00ffULL)) + return 1; + + return CHANNEL_NONE; +} + + +uint8_t +SettingsBusTracking::next_free_xta_channel() +{ + if ((xta_tracking & 0xff00ULL) && !(xta_tracking & 0x00ffULL)) + return 0; + + if (!(xta_tracking & 0xff00ULL) && (xta_tracking & 0x00ffULL)) + return 1; + + return CHANNEL_NONE; +} + + +uint8_t +SettingsBusTracking::next_free_ide_channel() +{ + int i, element; + uint64_t mask; + uint8_t ret = CHANNEL_NONE; + + for (i = 0; i < 32; i++) { + element = ((i << 3) >> 6); + mask = 0xffULL << ((uint64_t) ((i << 3) & 0x3f)); + + if (ide_tracking[element] & mask) { + ret = (uint8_t) i; + break; + } + } + + return ret; +} + + +uint8_t +SettingsBusTracking::next_free_scsi_id() +{ + int i, element; + uint64_t mask; + uint8_t ret = CHANNEL_NONE; + + for (i = 0; i < 64; i++) { + element = ((i << 3) >> 6); + mask = 0xffULL << ((uint64_t) ((i << 3) & 0x3f)); + + if (scsi_tracking[element] & mask) { + ret = (uint8_t) i; + break; + } + } + + return ret; +} + + +int +SettingsBusTracking::mfm_bus_full() +{ + int i; + uint64_t mask; + uint8_t count = 0; + + for (i = 0; i < 2; i++) { + mask = 0xffULL << ((uint64_t) ((i << 3) & 0x3f)); + + if (mfm_tracking & mask) + count++; + } + + return (count == 2); +} + + +int +SettingsBusTracking::esdi_bus_full() +{ + int i; + uint64_t mask; + uint8_t count = 0; + + for (i = 0; i < 2; i++) { + mask = 0xffULL << ((uint64_t) ((i << 3) & 0x3f)); + + if (esdi_tracking & mask) + count++; + } + + return (count == 2); +} + + +int +SettingsBusTracking::xta_bus_full() +{ + int i; + uint64_t mask; + uint8_t count = 0; + + for (i = 0; i < 2; i++) { + mask = 0xffULL << ((uint64_t) ((i << 3) & 0x3f)); + + if (xta_tracking & mask) + count++; + } + + return (count == 2); +} + + +int +SettingsBusTracking::ide_bus_full() +{ + int i, element; + uint64_t mask; + uint8_t count = 0; + + for (i = 0; i < 32; i++) { + element = ((i << 3) >> 6); + mask = 0xffULL << ((uint64_t) ((i << 3) & 0x3f)); + + if (ide_tracking[element] & mask) + count++; + } + + return (count == 32); +} + + +int +SettingsBusTracking::scsi_bus_full() +{ + int i, element; + uint64_t mask; + uint8_t count = 0; + + for (i = 0; i < 64; i++) { + element = ((i << 3) >> 6); + mask = 0xffULL << ((uint64_t) ((i << 3) & 0x3f)); + + if (scsi_tracking[element] & mask) + count++; + } + + return (count == 64); +} + + +void +SettingsBusTracking::device_track(int set, uint8_t dev_type, int bus, int channel) +{ + int i, element; + uint64_t mask; + uint8_t count = 0; + fprintf(stderr, "set: %d, dev_type: %hd, bus: %d, channel: %d\n", set, dev_type, bus, channel); + + switch (bus) { + case HDD_BUS_MFM: + mask = ((uint64_t) dev_type) << ((uint64_t) ((channel << 3) & 0x3f)); + + if (set) + mfm_tracking |= mask; + else + mfm_tracking &= ~mask; + break; + + case HDD_BUS_ESDI: + mask = ((uint64_t) dev_type) << ((uint64_t) ((channel << 3) & 0x3f)); + + if (set) + esdi_tracking |= mask; + else + esdi_tracking &= ~mask; + break; + + case HDD_BUS_XTA: + mask = ((uint64_t) dev_type) << ((uint64_t) ((channel << 3) & 0x3f)); + + if (set) + xta_tracking |= mask; + else + xta_tracking &= ~mask; + break; + + case HDD_BUS_IDE: + case HDD_BUS_ATAPI: + element = ((channel << 3) >> 6); + mask = ((uint64_t) dev_type) << ((uint64_t) ((channel << 3) & 0x3f)); + + if (set) + ide_tracking[element] |= mask; + else + ide_tracking[element] &= ~mask; + break; + + case HDD_BUS_SCSI: + element = ((channel << 3) >> 6); + mask = ((uint64_t) dev_type) << ((uint64_t) ((channel << 3) & 0x3f)); + + if (set) + scsi_tracking[element] |= mask; + else + scsi_tracking[element] &= ~mask; + break; + } +} diff --git a/src/qt/qt_settings_bus_tracking.hpp b/src/qt/qt_settings_bus_tracking.hpp new file mode 100644 index 000000000..614e18d8d --- /dev/null +++ b/src/qt/qt_settings_bus_tracking.hpp @@ -0,0 +1,63 @@ +#ifndef QT_SETTINGS_BUS_TRACKING_HPP +#define QT_SETTINGS_BUS_TRACKING_HPP + +#include + +#define TRACK_CLEAR 0 +#define TRACK_SET 1 + +#define DEV_HDD 0x01 +#define DEV_CDROM 0x02 +#define DEV_ZIP 0x04 +#define DEV_MO 0x08 + +#define BUS_MFM 0 +#define BUS_ESDI 1 +#define BUS_XTA 2 +#define BUS_IDE 3 +#define BUS_SCSI 4 + +#define CHANNEL_NONE 0xff + +namespace Ui { +class SettingsBusTracking; +} + +class SettingsBusTracking +{ +public: + explicit SettingsBusTracking(); + ~SettingsBusTracking() = default; + + /* These return 0xff is none is free. */ + 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 mfm_bus_full(); + int esdi_bus_full(); + int xta_bus_full(); + int ide_bus_full(); + int scsi_bus_full(); + + /* Set: 0 = Clear the device from the tracking, 1 = Set the device on the tracking. + Device type: 1 = Hard Disk, 2 = CD-ROM, 4 = ZIP, 8 = Magneto-Optical. + Bus: 0 = MFM, 1 = ESDI, 2 = XTA, 3 = IDE, 4 = SCSI. */ + 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 mfm_tracking; + /* 1 channel, 2 devices per channel, 8 bits per device = 16 bits. */ + uint64_t esdi_tracking; + /* 1 channel, 2 devices per channel, 8 bits per device = 16 bits. */ + uint64_t xta_tracking; + /* 16 channels (prepatation for that weird IDE card), 2 devices per channel, 8 bits per device = 256 bits. */ + uint64_t ide_tracking[4]; + /* 4 buses, 16 devices per bus, 8 bits per device (future-proofing) = 512 bits. */ + uint64_t scsi_tracking[8]; +}; + +#endif // QT_SETTINGS_BUS_TRACKING_HPP diff --git a/src/qt/qt_settingsharddisks.cpp b/src/qt/qt_settingsharddisks.cpp index 1e9d11350..9c9afaf14 100644 --- a/src/qt/qt_settingsharddisks.cpp +++ b/src/qt/qt_settingsharddisks.cpp @@ -10,6 +10,7 @@ extern "C" { #include "qt_harddiskdialog.hpp" #include "qt_harddrive_common.hpp" +#include "qt_settings_bus_tracking.hpp" #include "qt_progsettings.hpp" const int ColumnBus = 0; @@ -21,6 +22,8 @@ const int ColumnSize = 5; const int DataBus = Qt::UserRole; const int DataBusChannel = Qt::UserRole + 1; +const int DataBusPrevious = Qt::UserRole + 2; +const int DataBusChannelPrevious = Qt::UserRole + 3; /* static void @@ -57,7 +60,10 @@ static void addRow(QAbstractItemModel* model, hard_disk_t* hd) { model->setData(model->index(row, ColumnBus), busName); model->setData(model->index(row, ColumnBus), ProgSettings::loadIcon( "/hard_disk.ico"), Qt::DecorationRole); model->setData(model->index(row, ColumnBus), hd->bus, DataBus); + model->setData(model->index(row, ColumnBus), hd->bus, DataBusPrevious); model->setData(model->index(row, ColumnBus), hd->channel, DataBusChannel); + model->setData(model->index(row, ColumnBus), hd->channel, DataBusChannelPrevious); + Harddrives::busTrackClass->device_track(1, DEV_HDD, hd->bus, hd->channel); QString fileName = hd->fn; if (fileName.startsWith(userPath, Qt::CaseInsensitive)) { model->setData(model->index(row, ColumnFilename), fileName.mid(userPath.size())); @@ -132,15 +138,47 @@ void SettingsHarddisks::on_comboBoxBus_currentIndexChanged(int index) { return; } + buschangeinprogress = true; auto idx = ui->tableView->selectionModel()->currentIndex(); if (idx.isValid()) { auto* model = ui->tableView->model(); auto col = idx.siblingAtColumn(ColumnBus); model->setData(col, ui->comboBoxBus->currentData(Qt::UserRole), DataBus); model->setData(col, busChannelName(col), Qt::DisplayRole); + Harddrives::busTrackClass->device_track(0, DEV_HDD, model->data(col, DataBusPrevious).toInt(), model->data(col, DataBusChannelPrevious).toInt()); + model->setData(col, ui->comboBoxBus->currentData(Qt::UserRole), DataBusPrevious); } Harddrives::populateBusChannels(ui->comboBoxChannel->model(), ui->comboBoxBus->currentData().toInt()); + int chanIdx = 0; + + switch (ui->comboBoxBus->currentData().toInt()) + { + case HDD_BUS_MFM: + chanIdx = (Harddrives::busTrackClass->next_free_mfm_channel()); + break; + case HDD_BUS_XTA: + chanIdx = (Harddrives::busTrackClass->next_free_xta_channel()); + break; + case HDD_BUS_ESDI: + chanIdx = (Harddrives::busTrackClass->next_free_esdi_channel()); + break; + case HDD_BUS_ATAPI: + case HDD_BUS_IDE: + chanIdx = (Harddrives::busTrackClass->next_free_ide_channel()); + break; + case HDD_BUS_SCSI: + chanIdx = (Harddrives::busTrackClass->next_free_scsi_id()); + break; + } + + if (idx.isValid()) { + auto* model = ui->tableView->model(); + auto col = idx.siblingAtColumn(ColumnBus); + model->setData(col, chanIdx, DataBusChannelPrevious); + } + ui->comboBoxChannel->setCurrentIndex(chanIdx); + buschangeinprogress = false; } void SettingsHarddisks::on_comboBoxChannel_currentIndexChanged(int index) { @@ -154,6 +192,9 @@ void SettingsHarddisks::on_comboBoxChannel_currentIndexChanged(int index) { auto col = idx.siblingAtColumn(ColumnBus); model->setData(col, ui->comboBoxChannel->currentData(Qt::UserRole), DataBusChannel); model->setData(col, busChannelName(col), Qt::DisplayRole); + if (!buschangeinprogress) Harddrives::busTrackClass->device_track(0, DEV_HDD, model->data(col, DataBus).toInt(), model->data(col, DataBusChannelPrevious).toUInt()); + Harddrives::busTrackClass->device_track(1, DEV_HDD, model->data(col, DataBus).toInt(), model->data(col, DataBusChannel).toUInt()); + model->setData(col, ui->comboBoxChannel->currentData(Qt::UserRole), DataBusChannelPrevious); } } diff --git a/src/qt/qt_settingsharddisks.hpp b/src/qt/qt_settingsharddisks.hpp index 0289d2ccb..b10e79029 100644 --- a/src/qt/qt_settingsharddisks.hpp +++ b/src/qt/qt_settingsharddisks.hpp @@ -30,6 +30,7 @@ private slots: private: Ui::SettingsHarddisks *ui; + bool buschangeinprogress = false; }; #endif // QT_SETTINGSHARDDISKS_HPP From 78f96ee6ba4ecaeb814d9e161a22d0eb8e4a5a4b Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Sun, 9 Jan 2022 16:48:23 +0600 Subject: [PATCH 2/5] Disable add/existing buttons if hard disk is full --- src/qt/qt_settingsharddisks.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/qt/qt_settingsharddisks.cpp b/src/qt/qt_settingsharddisks.cpp index 9c9afaf14..ac3ec67ca 100644 --- a/src/qt/qt_settingsharddisks.cpp +++ b/src/qt/qt_settingsharddisks.cpp @@ -98,6 +98,11 @@ SettingsHarddisks::SettingsHarddisks(QWidget *parent) : addRow(model, &hdd[i]); } } + if (model->rowCount() == HDD_NUM) + { + ui->pushButtonNew->setEnabled(false); + ui->pushButtonExisting->setEnabled(false); + } ui->tableView->resizeColumnsToContents(); ui->tableView->horizontalHeader()->setSectionResizeMode(ColumnFilename, QHeaderView::Stretch); @@ -234,6 +239,11 @@ static void addDriveFromDialog(Ui::SettingsHarddisks* ui, const HarddiskDialog& addRow(ui->tableView->model(), &hd); ui->tableView->resizeColumnsToContents(); ui->tableView->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Stretch); + if (ui->tableView->model()->rowCount() == HDD_NUM) + { + ui->pushButtonNew->setEnabled(false); + ui->pushButtonExisting->setEnabled(false); + } } void SettingsHarddisks::on_pushButtonNew_clicked() { @@ -263,5 +273,7 @@ void SettingsHarddisks::on_pushButtonRemove_clicked() { auto* model = ui->tableView->model(); model->removeRow(idx.row()); + ui->pushButtonNew->setEnabled(true); + ui->pushButtonExisting->setEnabled(true); } From 42b3b5623a590c797bebbfbe3649ca12777c92c6 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Sun, 9 Jan 2022 16:48:41 +0600 Subject: [PATCH 3/5] Default to 8x for CD-ROM speeds --- src/qt/qt_settingsfloppycdrom.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/qt/qt_settingsfloppycdrom.cpp b/src/qt/qt_settingsfloppycdrom.cpp index b2c2df83f..e61156d0e 100644 --- a/src/qt/qt_settingsfloppycdrom.cpp +++ b/src/qt/qt_settingsfloppycdrom.cpp @@ -171,6 +171,7 @@ void SettingsFloppyCDROM::onCDROMRowChanged(const QModelIndex ¤t) { if (! match.isEmpty()) { ui->comboBoxChannel->setCurrentIndex(match.first().row()); } + else ui->comboBoxChannel->setCurrentIndex(8); ui->comboBoxSpeed->setCurrentIndex(speed); } From df3a11b11bbc3ea748c04b3ea28ebe57bd6090c7 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Mon, 10 Jan 2022 01:12:23 +0600 Subject: [PATCH 4/5] Complete the bus tracking implementation with fixes --- src/qt/qt_settings_bus_tracking.cpp | 4 ++-- src/qt/qt_settings_bus_tracking.hpp | 10 +++++----- src/qt/qt_settingsfloppycdrom.cpp | 9 +++++++++ src/qt/qt_settingsotherremovable.cpp | 18 ++++++++++++++++++ 4 files changed, 34 insertions(+), 7 deletions(-) diff --git a/src/qt/qt_settings_bus_tracking.cpp b/src/qt/qt_settings_bus_tracking.cpp index f6a1c184e..c367b6389 100644 --- a/src/qt/qt_settings_bus_tracking.cpp +++ b/src/qt/qt_settings_bus_tracking.cpp @@ -74,7 +74,7 @@ SettingsBusTracking::next_free_ide_channel() element = ((i << 3) >> 6); mask = 0xffULL << ((uint64_t) ((i << 3) & 0x3f)); - if (ide_tracking[element] & mask) { + if (!(ide_tracking[element] & mask)) { ret = (uint8_t) i; break; } @@ -95,7 +95,7 @@ SettingsBusTracking::next_free_scsi_id() element = ((i << 3) >> 6); mask = 0xffULL << ((uint64_t) ((i << 3) & 0x3f)); - if (scsi_tracking[element] & mask) { + if (!(scsi_tracking[element] & mask)) { ret = (uint8_t) i; break; } diff --git a/src/qt/qt_settings_bus_tracking.hpp b/src/qt/qt_settings_bus_tracking.hpp index 614e18d8d..0272b4359 100644 --- a/src/qt/qt_settings_bus_tracking.hpp +++ b/src/qt/qt_settings_bus_tracking.hpp @@ -49,15 +49,15 @@ public: private: /* 1 channel, 2 devices per channel, 8 bits per device = 16 bits. */ - uint64_t mfm_tracking; + uint64_t mfm_tracking{0}; /* 1 channel, 2 devices per channel, 8 bits per device = 16 bits. */ - uint64_t esdi_tracking; + uint64_t esdi_tracking{0}; /* 1 channel, 2 devices per channel, 8 bits per device = 16 bits. */ - uint64_t xta_tracking; + uint64_t xta_tracking{0}; /* 16 channels (prepatation for that weird IDE card), 2 devices per channel, 8 bits per device = 256 bits. */ - uint64_t ide_tracking[4]; + uint64_t ide_tracking[4]{0, 0, 0, 0}; /* 4 buses, 16 devices per bus, 8 bits per device (future-proofing) = 512 bits. */ - uint64_t scsi_tracking[8]; + uint64_t scsi_tracking[8]{0, 0, 0, 0, 0, 0, 0, 0}; }; #endif // QT_SETTINGS_BUS_TRACKING_HPP diff --git a/src/qt/qt_settingsfloppycdrom.cpp b/src/qt/qt_settingsfloppycdrom.cpp index e61156d0e..6253cb739 100644 --- a/src/qt/qt_settingsfloppycdrom.cpp +++ b/src/qt/qt_settingsfloppycdrom.cpp @@ -11,6 +11,7 @@ extern "C" { #include "qt_models_common.hpp" #include "qt_harddrive_common.hpp" +#include "qt_settings_bus_tracking.hpp" #include "qt_progsettings.hpp" static void setFloppyType(QAbstractItemModel* model, const QModelIndex& idx, int type) { @@ -109,6 +110,7 @@ SettingsFloppyCDROM::SettingsFloppyCDROM(QWidget *parent) : auto idx = model->index(i, 0); setCDROMBus(model, idx, cdrom[i].bus_type, cdrom[i].res); setCDROMSpeed(model, idx.siblingAtColumn(1), cdrom[i].speed); + Harddrives::busTrackClass->device_track(1, DEV_CDROM, cdrom[i].bus_type, cdrom[i].bus_type == CDROM_BUS_ATAPI ? cdrom[i].ide_channel : cdrom[i].scsi_device_id); } ui->tableViewCDROM->resizeColumnsToContents(); ui->tableViewCDROM->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch); @@ -208,19 +210,26 @@ void SettingsFloppyCDROM::on_comboBoxSpeed_activated(int index) { void SettingsFloppyCDROM::on_comboBoxBus_activated(int) { + auto i = ui->tableViewCDROM->selectionModel()->currentIndex().siblingAtColumn(0); + Harddrives::busTrackClass->device_track(0, DEV_CDROM, ui->tableViewCDROM->model()->data(i, Qt::UserRole).toInt(), ui->tableViewCDROM->model()->data(i, Qt::UserRole + 1).toInt()); + ui->comboBoxChannel->setCurrentIndex(ui->comboBoxBus->currentData().toUInt() == CDROM_BUS_ATAPI ? Harddrives::busTrackClass->next_free_ide_channel() : Harddrives::busTrackClass->next_free_scsi_id()); setCDROMBus( ui->tableViewCDROM->model(), ui->tableViewCDROM->selectionModel()->currentIndex(), ui->comboBoxBus->currentData().toUInt(), ui->comboBoxChannel->currentData().toUInt()); + Harddrives::busTrackClass->device_track(1, DEV_CDROM, ui->tableViewCDROM->model()->data(i, Qt::UserRole).toInt(), ui->tableViewCDROM->model()->data(i, Qt::UserRole + 1).toInt()); } void SettingsFloppyCDROM::on_comboBoxChannel_activated(int) { + auto i = ui->tableViewCDROM->selectionModel()->currentIndex().siblingAtColumn(0); + Harddrives::busTrackClass->device_track(0, DEV_CDROM, ui->tableViewCDROM->model()->data(i, Qt::UserRole).toInt(), ui->tableViewCDROM->model()->data(i, Qt::UserRole + 1).toInt()); setCDROMBus( ui->tableViewCDROM->model(), ui->tableViewCDROM->selectionModel()->currentIndex(), ui->comboBoxBus->currentData().toUInt(), ui->comboBoxChannel->currentData().toUInt()); + Harddrives::busTrackClass->device_track(1, DEV_CDROM, ui->tableViewCDROM->model()->data(i, Qt::UserRole).toInt(), ui->tableViewCDROM->model()->data(i, Qt::UserRole + 1).toInt()); } diff --git a/src/qt/qt_settingsotherremovable.cpp b/src/qt/qt_settingsotherremovable.cpp index 3fa7b0351..c6f089f80 100644 --- a/src/qt/qt_settingsotherremovable.cpp +++ b/src/qt/qt_settingsotherremovable.cpp @@ -12,6 +12,7 @@ extern "C" { #include "qt_models_common.hpp" #include "qt_harddrive_common.hpp" +#include "qt_settings_bus_tracking.hpp" #include "qt_progsettings.hpp" static QString moDriveTypeName(int i) { @@ -93,6 +94,7 @@ SettingsOtherRemovable::SettingsOtherRemovable(QWidget *parent) : auto idx = model->index(i, 0); setMOBus(model, idx, mo_drives[i].bus_type, mo_drives[i].res); setMOType(model, idx.siblingAtColumn(1), mo_drives[i].type); + Harddrives::busTrackClass->device_track(1, DEV_MO, mo_drives[i].bus_type, mo_drives[i].bus_type == MO_BUS_ATAPI ? mo_drives[i].ide_channel : mo_drives[i].scsi_device_id); } ui->tableViewMO->resizeColumnsToContents(); ui->tableViewMO->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch); @@ -114,6 +116,7 @@ SettingsOtherRemovable::SettingsOtherRemovable(QWidget *parent) : auto idx = model->index(i, 0); setZIPBus(model, idx, zip_drives[i].bus_type, zip_drives[i].res); setZIPType(model, idx, zip_drives[i].is_250 > 0); + Harddrives::busTrackClass->device_track(1, DEV_ZIP, zip_drives[i].bus_type, zip_drives[i].bus_type == ZIP_BUS_ATAPI ? zip_drives[i].ide_channel : zip_drives[i].scsi_device_id); } ui->tableViewZIP->resizeColumnsToContents(); ui->tableViewZIP->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch); @@ -200,6 +203,10 @@ void SettingsOtherRemovable::on_comboBoxMOBus_currentIndexChanged(int index) { } void SettingsOtherRemovable::on_comboBoxMOBus_activated(int) { + auto i = ui->tableViewMO->selectionModel()->currentIndex().siblingAtColumn(0); + Harddrives::busTrackClass->device_track(0, DEV_MO, ui->tableViewMO->model()->data(i, Qt::UserRole).toInt(), ui->tableViewMO->model()->data(i, Qt::UserRole + 1).toInt()); + ui->comboBoxMOChannel->setCurrentIndex(ui->comboBoxMOBus->currentData().toUInt() == MO_BUS_ATAPI ? Harddrives::busTrackClass->next_free_ide_channel() : Harddrives::busTrackClass->next_free_scsi_id()); + ui->tableViewMO->model()->data(i, Qt::UserRole + 1); setMOBus( ui->tableViewMO->model(), ui->tableViewMO->selectionModel()->currentIndex(), @@ -211,14 +218,18 @@ void SettingsOtherRemovable::on_comboBoxMOBus_activated(int) { ui->comboBoxMOType->currentData().toUInt()); ui->tableViewMO->resizeColumnsToContents(); ui->tableViewMO->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch); + Harddrives::busTrackClass->device_track(1, DEV_MO, ui->tableViewMO->model()->data(i, Qt::UserRole).toInt(), ui->tableViewMO->model()->data(i, Qt::UserRole + 1).toInt()); } void SettingsOtherRemovable::on_comboBoxMOChannel_activated(int) { + auto i = ui->tableViewMO->selectionModel()->currentIndex().siblingAtColumn(0); + Harddrives::busTrackClass->device_track(0, DEV_MO, ui->tableViewMO->model()->data(i, Qt::UserRole).toInt(), ui->tableViewMO->model()->data(i, Qt::UserRole + 1).toInt()); setMOBus( ui->tableViewMO->model(), ui->tableViewMO->selectionModel()->currentIndex(), ui->comboBoxMOBus->currentData().toUInt(), ui->comboBoxMOChannel->currentData().toUInt()); + Harddrives::busTrackClass->device_track(1, DEV_MO, ui->tableViewMO->model()->data(i, Qt::UserRole).toInt(), ui->tableViewMO->model()->data(i, Qt::UserRole + 1).toInt()); } void SettingsOtherRemovable::on_comboBoxMOType_activated(int) { @@ -243,19 +254,26 @@ void SettingsOtherRemovable::on_comboBoxZIPBus_currentIndexChanged(int index) { } void SettingsOtherRemovable::on_comboBoxZIPBus_activated(int) { + auto i = ui->tableViewZIP->selectionModel()->currentIndex().siblingAtColumn(0); + Harddrives::busTrackClass->device_track(0, DEV_ZIP, ui->tableViewZIP->model()->data(i, Qt::UserRole).toInt(), ui->tableViewZIP->model()->data(i, Qt::UserRole + 1).toInt()); + ui->comboBoxZIPChannel->setCurrentIndex(ui->comboBoxZIPBus->currentData().toUInt() == ZIP_BUS_ATAPI ? Harddrives::busTrackClass->next_free_ide_channel() : Harddrives::busTrackClass->next_free_scsi_id()); setZIPBus( ui->tableViewZIP->model(), ui->tableViewZIP->selectionModel()->currentIndex(), ui->comboBoxZIPBus->currentData().toUInt(), ui->comboBoxZIPChannel->currentData().toUInt()); + Harddrives::busTrackClass->device_track(1, DEV_ZIP, ui->tableViewZIP->model()->data(i, Qt::UserRole).toInt(), ui->tableViewZIP->model()->data(i, Qt::UserRole + 1).toInt()); } void SettingsOtherRemovable::on_comboBoxZIPChannel_activated(int) { + auto i = ui->tableViewZIP->selectionModel()->currentIndex().siblingAtColumn(0); + Harddrives::busTrackClass->device_track(0, DEV_ZIP, ui->tableViewZIP->model()->data(i, Qt::UserRole).toInt(), ui->tableViewZIP->model()->data(i, Qt::UserRole + 1).toInt()); setZIPBus( ui->tableViewZIP->model(), ui->tableViewZIP->selectionModel()->currentIndex(), ui->comboBoxZIPBus->currentData().toUInt(), ui->comboBoxZIPChannel->currentData().toUInt()); + Harddrives::busTrackClass->device_track(1, DEV_ZIP, ui->tableViewZIP->model()->data(i, Qt::UserRole).toInt(), ui->tableViewZIP->model()->data(i, Qt::UserRole + 1).toInt()); } void SettingsOtherRemovable::on_checkBoxZIP250_stateChanged(int state) { From c5a69dea4569826a2dea6220e8f5be6e9c5399e4 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Mon, 10 Jan 2022 01:15:49 +0600 Subject: [PATCH 5/5] Fix free ID return value for MFM/RLL/XTA --- src/qt/qt_settings_bus_tracking.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/qt/qt_settings_bus_tracking.cpp b/src/qt/qt_settings_bus_tracking.cpp index c367b6389..e7e3c7a36 100644 --- a/src/qt/qt_settings_bus_tracking.cpp +++ b/src/qt/qt_settings_bus_tracking.cpp @@ -28,10 +28,10 @@ uint8_t SettingsBusTracking::next_free_mfm_channel() { if ((mfm_tracking & 0xff00ULL) && !(mfm_tracking & 0x00ffULL)) - return 0; + return 1; if (!(mfm_tracking & 0xff00ULL) && (mfm_tracking & 0x00ffULL)) - return 1; + return 0; return CHANNEL_NONE; } @@ -41,10 +41,10 @@ uint8_t SettingsBusTracking::next_free_esdi_channel() { if ((esdi_tracking & 0xff00ULL) && !(esdi_tracking & 0x00ffULL)) - return 0; + return 1; if (!(esdi_tracking & 0xff00ULL) && (esdi_tracking & 0x00ffULL)) - return 1; + return 0; return CHANNEL_NONE; } @@ -54,10 +54,10 @@ uint8_t SettingsBusTracking::next_free_xta_channel() { if ((xta_tracking & 0xff00ULL) && !(xta_tracking & 0x00ffULL)) - return 0; + return 1; if (!(xta_tracking & 0xff00ULL) && (xta_tracking & 0x00ffULL)) - return 1; + return 0; return CHANNEL_NONE; }