Retooled ZIP emulation into more expansible Removable Disk emulation, ZIP 100 and 250 types remain selectable, alongside the new 86Box (ie. generic) option.

This commit is contained in:
OBattler
2025-07-25 16:30:40 +02:00
parent 733e0e3dca
commit 64e85fdfbc
38 changed files with 1254 additions and 1051 deletions

View File

Before

Width:  |  Height:  |  Size: 9.4 KiB

After

Width:  |  Height:  |  Size: 9.4 KiB

View File

Before

Width:  |  Height:  |  Size: 9.4 KiB

After

Width:  |  Height:  |  Size: 9.4 KiB

View File

Before

Width:  |  Height:  |  Size: 9.4 KiB

After

Width:  |  Height:  |  Size: 9.4 KiB

View File

@@ -31,7 +31,7 @@ extern "C" {
#include <86box/hdc.h>
#include <86box/scsi.h>
#include <86box/scsi_device.h>
#include <86box/zip.h>
#include <86box/rdisk.h>
#include <86box/mo.h>
#include <86box/plat.h>
#include <86box/machine.h>
@@ -102,7 +102,7 @@ struct Pixmaps {
PixmapSetEmptyActive floppy_525;
PixmapSetEmptyActive floppy_35;
PixmapSetEmptyActive cdrom;
PixmapSetEmptyActive zip;
PixmapSetEmptyActive rdisk;
PixmapSetEmptyActive mo;
PixmapSetActive hd;
PixmapSetEmptyActive net;
@@ -283,7 +283,7 @@ struct MachineStatus::States {
pixmaps.floppy_525.load(QIcon(":/settings/qt/icons/floppy_525.ico"));
pixmaps.floppy_35.load(QIcon(":/settings/qt/icons/floppy_35.ico"));
pixmaps.cdrom.load(QIcon(":/settings/qt/icons/cdrom.ico"));
pixmaps.zip.load(QIcon(":/settings/qt/icons/zip.ico"));
pixmaps.rdisk.load(QIcon(":/settings/qt/icons/rdisk.ico"));
pixmaps.mo.load(QIcon(":/settings/qt/icons/mo.ico"));
pixmaps.hd.load(QIcon(":/settings/qt/icons/hard_disk.ico"));
pixmaps.net.load(QIcon(":/settings/qt/icons/network.ico"));
@@ -298,8 +298,8 @@ struct MachineStatus::States {
for (auto &c : cdrom) {
c.pixmaps = &pixmaps.cdrom;
}
for (auto &z : zip) {
z.pixmaps = &pixmaps.zip;
for (auto &z : rdisk) {
z.pixmaps = &pixmaps.rdisk;
}
for (auto &m : mo) {
m.pixmaps = &pixmaps.mo;
@@ -316,7 +316,7 @@ struct MachineStatus::States {
StateEmptyActive cassette;
std::array<StateEmptyActive, FDD_NUM> fdd;
std::array<StateEmptyActive, CDROM_NUM> cdrom;
std::array<StateEmptyActive, ZIP_NUM> zip;
std::array<StateEmptyActive, RDISK_NUM> rdisk;
std::array<StateEmptyActive, MO_NUM> mo;
std::array<StateActive, HDD_BUS_USB> hdds;
std::array<StateEmptyActive, NET_CARD_MAX> net;
@@ -397,21 +397,21 @@ MachineStatus::iterateCDROM(const std::function<void(int)> &cb)
}
void
MachineStatus::iterateZIP(const std::function<void(int)> &cb)
MachineStatus::iterateRDisk(const std::function<void(int)> &cb)
{
auto hdc_name = QString(hdc_get_internal_name(hdc_current[0]));
for (size_t i = 0; i < ZIP_NUM; i++) {
for (size_t i = 0; i < RDISK_NUM; i++) {
/* Could be Internal or External IDE.. */
if ((zip_drives[i].bus_type == ZIP_BUS_ATAPI) && !hasIDE() &&
if ((rdisk_drives[i].bus_type == RDISK_BUS_ATAPI) && !hasIDE() &&
(hdc_name.left(3) != QStringLiteral("ide")) &&
(hdc_name.left(5) != QStringLiteral("xtide")) &&
(hdc_name.left(5) != QStringLiteral("mcide")))
continue;
if ((zip_drives[i].bus_type == ZIP_BUS_SCSI) && !hasSCSI() &&
if ((rdisk_drives[i].bus_type == RDISK_BUS_SCSI) && !hasSCSI() &&
(scsi_card_current[0] == 0) && (scsi_card_current[1] == 0) &&
(scsi_card_current[2] == 0) && (scsi_card_current[3] == 0))
continue;
if (zip_drives[i].bus_type != 0) {
if (rdisk_drives[i].bus_type != 0) {
cb(i);
}
}
@@ -475,9 +475,9 @@ MachineStatus::refreshEmptyIcons()
}
for (size_t i = 0; i < CDROM_NUM; ++i)
d->cdrom[i].setEmpty(machine_status.cdrom[i].empty);
for (size_t i = 0; i < ZIP_NUM; i++) {
d->zip[i].setEmpty(machine_status.zip[i].empty);
d->zip[i].setWriteProtected(machine_status.zip[i].write_prot);
for (size_t i = 0; i < RDISK_NUM; i++) {
d->rdisk[i].setEmpty(machine_status.rdisk[i].empty);
d->rdisk[i].setWriteProtected(machine_status.rdisk[i].write_prot);
}
for (size_t i = 0; i < MO_NUM; i++) {
d->mo[i].setEmpty(machine_status.mo[i].empty);
@@ -515,13 +515,13 @@ MachineStatus::refreshIcons()
ui_sb_update_icon_write(SB_CDROM | i, 0);
}
}
for (size_t i = 0; i < ZIP_NUM; i++) {
d->zip[i].setActive(machine_status.zip[i].active);
d->zip[i].setWriteActive(machine_status.zip[i].write_active);
if (machine_status.zip[i].active)
ui_sb_update_icon(SB_ZIP | i, 0);
if (machine_status.zip[i].write_active)
ui_sb_update_icon_write(SB_ZIP | i, 0);
for (size_t i = 0; i < RDISK_NUM; i++) {
d->rdisk[i].setActive(machine_status.rdisk[i].active);
d->rdisk[i].setWriteActive(machine_status.rdisk[i].write_active);
if (machine_status.rdisk[i].active)
ui_sb_update_icon(SB_RDISK | i, 0);
if (machine_status.rdisk[i].write_active)
ui_sb_update_icon_write(SB_RDISK | i, 0);
}
for (size_t i = 0; i < MO_NUM; i++) {
d->mo[i].setActive(machine_status.mo[i].active);
@@ -558,9 +558,9 @@ MachineStatus::clearActivity()
cdrom.setActive(false);
cdrom.setWriteActive(false);
}
for (auto &zip : d->zip) {
zip.setActive(false);
zip.setWriteActive(false);
for (auto &rdisk : d->rdisk) {
rdisk.setActive(false);
rdisk.setWriteActive(false);
}
for (auto &mo : d->mo) {
mo.setActive(false);
@@ -600,8 +600,8 @@ MachineStatus::refresh(QStatusBar *sbar)
for (size_t i = 0; i < CDROM_NUM; i++) {
sbar->removeWidget(d->cdrom[i].label.get());
}
for (size_t i = 0; i < ZIP_NUM; i++) {
sbar->removeWidget(d->zip[i].label.get());
for (size_t i = 0; i < RDISK_NUM; i++) {
sbar->removeWidget(d->rdisk[i].label.get());
}
for (size_t i = 0; i < MO_NUM; i++) {
sbar->removeWidget(d->mo[i].label.get());
@@ -700,38 +700,38 @@ MachineStatus::refresh(QStatusBar *sbar)
sbar->addWidget(d->cdrom[i].label.get());
});
iterateZIP([this, sbar](int i) {
d->zip[i].label = std::make_unique<ClickableLabel>();
d->zip[i].setEmpty(QString(zip_drives[i].image_path).isEmpty());
if (QString(zip_drives[i].image_path).isEmpty())
d->zip[i].setWriteProtected(false);
else if (QString(zip_drives[i].image_path).left(5) == "wp://")
d->zip[i].setWriteProtected(true);
iterateRDisk([this, sbar](int i) {
d->rdisk[i].label = std::make_unique<ClickableLabel>();
d->rdisk[i].setEmpty(QString(rdisk_drives[i].image_path).isEmpty());
if (QString(rdisk_drives[i].image_path).isEmpty())
d->rdisk[i].setWriteProtected(false);
else if (QString(rdisk_drives[i].image_path).left(5) == "wp://")
d->rdisk[i].setWriteProtected(true);
else
d->zip[i].setWriteProtected(zip_drives[i].read_only);
d->zip[i].setActive(false);
d->zip[i].setWriteActive(false);
d->zip[i].refresh();
connect((ClickableLabel *) d->zip[i].label.get(), &ClickableLabel::clicked, [i](QPoint pos) {
MediaMenu::ptr->zipMenus[i]->popup(pos - QPoint(0, MediaMenu::ptr->zipMenus[i]->sizeHint().height()));
d->rdisk[i].setWriteProtected(rdisk_drives[i].read_only);
d->rdisk[i].setActive(false);
d->rdisk[i].setWriteActive(false);
d->rdisk[i].refresh();
connect((ClickableLabel *) d->rdisk[i].label.get(), &ClickableLabel::clicked, [i](QPoint pos) {
MediaMenu::ptr->rdiskMenus[i]->popup(pos - QPoint(0, MediaMenu::ptr->rdiskMenus[i]->sizeHint().height()));
});
connect((ClickableLabel *) d->zip[i].label.get(), &ClickableLabel::dropped, [i](QString str) {
MediaMenu::ptr->zipMount(i, str, false);
connect((ClickableLabel *) d->rdisk[i].label.get(), &ClickableLabel::dropped, [i](QString str) {
MediaMenu::ptr->rdiskMount(i, str, false);
});
d->zip[i].label->setToolTip(MediaMenu::ptr->zipMenus[i]->title());
d->zip[i].label->setAcceptDrops(true);
sbar->addWidget(d->zip[i].label.get());
d->rdisk[i].label->setToolTip(MediaMenu::ptr->rdiskMenus[i]->title());
d->rdisk[i].label->setAcceptDrops(true);
sbar->addWidget(d->rdisk[i].label.get());
});
iterateMO([this, sbar](int i) {
d->mo[i].label = std::make_unique<ClickableLabel>();
d->mo[i].setEmpty(QString(mo_drives[i].image_path).isEmpty());
if (QString(zip_drives[i].image_path).isEmpty())
if (QString(rdisk_drives[i].image_path).isEmpty())
d->mo[i].setWriteProtected(false);
else if (QString(zip_drives[i].image_path).left(5) == "wp://")
else if (QString(rdisk_drives[i].image_path).left(5) == "wp://")
d->mo[i].setWriteProtected(true);
else
d->mo[i].setWriteProtected(zip_drives[i].read_only);
d->mo[i].setWriteProtected(rdisk_drives[i].read_only);
d->mo[i].setActive(false);
d->mo[i].setWriteActive(false);
d->mo[i].refresh();
@@ -924,9 +924,9 @@ MachineStatus::updateTip(int tag)
if (d->cdrom[item].label && MediaMenu::ptr->cdromMenus[item])
d->cdrom[item].label->setToolTip(MediaMenu::ptr->cdromMenus[item]->title());
break;
case SB_ZIP:
if (d->zip[item].label && MediaMenu::ptr->zipMenus[item])
d->zip[item].label->setToolTip(MediaMenu::ptr->zipMenus[item]->title());
case SB_RDISK:
if (d->rdisk[item].label && MediaMenu::ptr->rdiskMenus[item])
d->rdisk[item].label->setToolTip(MediaMenu::ptr->rdiskMenus[item]->title());
break;
case SB_MO:
if (d->mo[item].label && MediaMenu::ptr->moMenus[item])

View File

@@ -67,7 +67,7 @@ public:
static bool hasSCSI();
static void iterateFDD(const std::function<void(int i)> &cb);
static void iterateCDROM(const std::function<void(int i)> &cb);
static void iterateZIP(const std::function<void(int i)> &cb);
static void iterateRDisk(const std::function<void(int i)> &cb);
static void iterateMO(const std::function<void(int i)> &cb);
static void iterateNIC(const std::function<void(int i)> &cb);

View File

@@ -33,7 +33,7 @@ extern "C" {
#include <86box/fdd.h>
#include <86box/cdrom.h>
#include <86box/scsi_device.h>
#include <86box/zip.h>
#include <86box/rdisk.h>
#include <86box/mo.h>
#include <86box/path.h>
}
@@ -114,8 +114,8 @@ MediaHistoryManager::maxDevicesSupported(ui::MediaType type)
return CDROM_NUM;
case ui::MediaType::Floppy:
return FDD_NUM;
case ui::MediaType::Zip:
return ZIP_NUM;
case ui::MediaType::RDisk:
return RDISK_NUM;
case ui::MediaType::Mo:
return MO_NUM;
case ui::MediaType::Cassette:
@@ -200,8 +200,8 @@ MediaHistoryManager::initialDeduplication()
case ui::MediaType::Optical:
current_image = cdrom[device_index].image_path;
break;
case ui::MediaType::Zip:
current_image = zip_drives[device_index].image_path;
case ui::MediaType::RDisk:
current_image = rdisk_drives[device_index].image_path;
break;
case ui::MediaType::Mo:
current_image = mo_drives[device_index].image_path;
@@ -237,8 +237,8 @@ MediaHistoryManager::getEmuHistoryVarForType(ui::MediaType type, int index)
return &fdd_image_history[index][0];
case ui::MediaType::Optical:
return &cdrom[index].image_history[0];
case ui::MediaType::Zip:
return &zip_drives[index].image_history[0];
case ui::MediaType::RDisk:
return &rdisk_drives[index].image_history[0];
case ui::MediaType::Mo:
return &mo_drives[index].image_history[0];
}

View File

@@ -45,7 +45,7 @@ Q_NAMESPACE
enum class MediaType {
Floppy,
Optical,
Zip,
RDisk,
Mo,
Cassette,
Cartridge
@@ -62,7 +62,7 @@ typedef QHash<ui::MediaType, device_media_history_t> master_list_t;
static const MediaType AllSupportedMediaHistoryTypes[] = {
MediaType::Optical,
MediaType::Floppy,
MediaType::Zip,
MediaType::RDisk,
MediaType::Mo,
MediaType::Cassette,
MediaType::Cartridge

View File

@@ -56,7 +56,7 @@ extern "C" {
#include <86box/fdd_86f.h>
#include <86box/cdrom.h>
#include <86box/scsi_device.h>
#include <86box/zip.h>
#include <86box/rdisk.h>
#include <86box/mo.h>
#include <86box/sound.h>
#include <86box/ui.h>
@@ -187,24 +187,24 @@ MediaMenu::refresh(QMenu *parentMenu)
cdromUpdateMenu(i);
});
zipMenus.clear();
MachineStatus::iterateZIP([this, parentMenu](int i) {
rdiskMenus.clear();
MachineStatus::iterateRDisk([this, parentMenu](int i) {
auto *menu = parentMenu->addMenu("");
QIcon img_icon = QIcon(":/settings/qt/icons/zip_image.ico");
menu->addAction(getIconWithIndicator(img_icon, pixmap_size, QIcon::Normal, New), tr("&New image..."), [this, i]() { zipNewImage(i); });
QIcon img_icon = QIcon(":/settings/qt/icons/rdisk_image.ico");
menu->addAction(getIconWithIndicator(img_icon, pixmap_size, QIcon::Normal, New), tr("&New image..."), [this, i]() { rdiskNewImage(i); });
menu->addSeparator();
menu->addAction(getIconWithIndicator(img_icon, pixmap_size, QIcon::Normal, Browse), tr("&Existing image..."), [this, i]() { zipSelectImage(i, false); });
menu->addAction(getIconWithIndicator(img_icon, pixmap_size, QIcon::Normal, WriteProtectedBrowse), tr("Existing image (&Write-protected)..."), [this, i]() { zipSelectImage(i, true); });
menu->addAction(getIconWithIndicator(img_icon, pixmap_size, QIcon::Normal, Browse), tr("&Existing image..."), [this, i]() { rdiskSelectImage(i, false); });
menu->addAction(getIconWithIndicator(img_icon, pixmap_size, QIcon::Normal, WriteProtectedBrowse), tr("Existing image (&Write-protected)..."), [this, i]() { rdiskSelectImage(i, true); });
menu->addSeparator();
for (int slot = 0; slot < MAX_PREV_IMAGES; slot++) {
zipImageHistoryPos[slot] = menu->children().count();
menu->addAction(img_icon, tr("Image %1").arg(slot), [this, i, slot]() { zipReload(i, slot); })->setCheckable(false);
rdiskImageHistoryPos[slot] = menu->children().count();
menu->addAction(img_icon, tr("Image %1").arg(slot), [this, i, slot]() { rdiskReload(i, slot); })->setCheckable(false);
}
menu->addSeparator();
zipEjectPos = menu->children().count();
menu->addAction(getIconWithIndicator(img_icon, pixmap_size, QIcon::Normal, Eject), tr("E&ject"), [this, i]() { zipEject(i); });
zipMenus[i] = menu;
zipUpdateMenu(i);
rdiskEjectPos = menu->children().count();
menu->addAction(getIconWithIndicator(img_icon, pixmap_size, QIcon::Normal, Eject), tr("E&ject"), [this, i]() { rdiskEject(i); });
rdiskMenus[i] = menu;
rdiskUpdateMenu(i);
});
moMenus.clear();
@@ -725,12 +725,12 @@ MediaMenu::updateImageHistory(int index, int slot, ui::MediaType type)
}
imageHistoryUpdatePos->setIcon(menu_icon);
break;
case ui::MediaType::Zip:
if (!zipMenus.contains(index))
case ui::MediaType::RDisk:
if (!rdiskMenus.contains(index))
return;
menu = zipMenus[index];
menu = rdiskMenus[index];
children = menu->children();
imageHistoryUpdatePos = dynamic_cast<QAction *>(children[zipImageHistoryPos[slot]]);
imageHistoryUpdatePos = dynamic_cast<QAction *>(children[rdiskImageHistoryPos[slot]]);
menu_icon = QIcon(":/settings/qt/icons/mo_image.ico");
if (fn.left(5) == "wp://")
fi.setFile(fn.right(fn.length() - 5));
@@ -842,145 +842,178 @@ MediaMenu::cdromUpdateMenu(int i)
}
void
MediaMenu::zipNewImage(int i)
MediaMenu::rdiskNewImage(int i)
{
NewFloppyDialog dialog(NewFloppyDialog::MediaType::Zip, parentWidget);
NewFloppyDialog dialog(NewFloppyDialog::MediaType::RDisk, parentWidget);
switch (dialog.exec()) {
default:
break;
case QDialog::Accepted:
QByteArray filename = dialog.fileName().toUtf8();
zipMount(i, filename, false);
rdiskMount(i, filename, false);
break;
}
}
void
MediaMenu::zipSelectImage(int i, bool wp)
MediaMenu::rdiskSelectImage(int i, bool wp)
{
const auto filename = QFileDialog::getOpenFileName(
parentWidget,
QString(),
QString(),
tr("ZIP images") % util::DlgFilter({ "im?", "zdi" }) % tr("All files") % util::DlgFilter({ "*" }, true));
tr("Removable disk images") % util::DlgFilter({ "im?", "rdi", "zdi" }) % tr("All files") % util::DlgFilter({ "*" }, true));
if (!filename.isEmpty())
zipMount(i, filename, wp);
rdiskMount(i, filename, wp);
}
void
MediaMenu::zipMount(int i, const QString &filename, bool wp)
MediaMenu::rdiskMount(int i, const QString &filename, bool wp)
{
const auto dev = static_cast<zip_t *>(zip_drives[i].priv);
int was_empty = zip_is_empty(i);
const auto dev = static_cast<rdisk_t *>(rdisk_drives[i].priv);
int was_empty = rdisk_is_empty(i);
zip_disk_close(dev);
zip_drives[i].read_only = wp;
rdisk_disk_close(dev);
rdisk_drives[i].read_only = wp;
if (!filename.isEmpty()) {
QByteArray filenameBytes = filename.toUtf8();
if (filename.left(5) == "wp://")
zip_drives[i].read_only = 1;
else if (zip_drives[i].read_only)
rdisk_drives[i].read_only = 1;
else if (rdisk_drives[i].read_only)
filenameBytes = QString::asprintf(R"(wp://%s)", filename.toUtf8().data()).toUtf8();
zip_load(dev, filenameBytes.data(), 1);
rdisk_load(dev, filenameBytes.data(), 1);
/* Signal media change to the emulated machine. */
zip_insert(dev);
rdisk_insert(dev);
/* The drive was previously empty, transition directly to UNIT ATTENTION. */
if (was_empty)
zip_insert(dev);
rdisk_insert(dev);
}
mhm.addImageToHistory(i, ui::MediaType::Zip, zip_drives[i].prev_image_path, zip_drives[i].image_path);
mhm.addImageToHistory(i, ui::MediaType::RDisk, rdisk_drives[i].prev_image_path, rdisk_drives[i].image_path);
ui_sb_update_icon_state(SB_ZIP | i, filename.isEmpty() ? 1 : 0);
ui_sb_update_icon_wp(SB_ZIP | i, wp);
zipUpdateMenu(i);
ui_sb_update_tip(SB_ZIP | i);
ui_sb_update_icon_state(SB_RDISK | i, filename.isEmpty() ? 1 : 0);
ui_sb_update_icon_wp(SB_RDISK | i, wp);
rdiskUpdateMenu(i);
ui_sb_update_tip(SB_RDISK | i);
config_save();
}
void
MediaMenu::zipEject(int i)
MediaMenu::rdiskEject(int i)
{
const auto dev = static_cast<zip_t *>(zip_drives[i].priv);
const auto dev = static_cast<rdisk_t *>(rdisk_drives[i].priv);
mhm.addImageToHistory(i, ui::MediaType::Zip, zip_drives[i].image_path, QString());
zip_disk_close(dev);
zip_drives[i].image_path[0] = 0;
if (zip_drives[i].bus_type) {
mhm.addImageToHistory(i, ui::MediaType::RDisk, rdisk_drives[i].image_path, QString());
rdisk_disk_close(dev);
rdisk_drives[i].image_path[0] = 0;
if (rdisk_drives[i].bus_type) {
/* Signal disk change to the emulated machine. */
zip_insert(dev);
rdisk_insert(dev);
}
ui_sb_update_icon_state(SB_ZIP | i, 1);
zipUpdateMenu(i);
ui_sb_update_tip(SB_ZIP | i);
ui_sb_update_icon_state(SB_RDISK | i, 1);
rdiskUpdateMenu(i);
ui_sb_update_tip(SB_RDISK | i);
config_save();
}
void
MediaMenu::zipReloadPrev(int i)
MediaMenu::rdiskReloadPrev(int i)
{
const auto dev = static_cast<zip_t *>(zip_drives[i].priv);
const auto dev = static_cast<rdisk_t *>(rdisk_drives[i].priv);
zip_disk_reload(dev);
if (strlen(zip_drives[i].image_path) == 0) {
ui_sb_update_icon_state(SB_ZIP | i, 1);
rdisk_disk_reload(dev);
if (strlen(rdisk_drives[i].image_path) == 0) {
ui_sb_update_icon_state(SB_RDISK | i, 1);
} else {
ui_sb_update_icon_state(SB_ZIP | i, 0);
ui_sb_update_icon_state(SB_RDISK | i, 0);
}
ui_sb_update_icon_wp(SB_ZIP | i, zip_drives[i].read_only);
ui_sb_update_icon_wp(SB_RDISK | i, rdisk_drives[i].read_only);
zipUpdateMenu(i);
ui_sb_update_tip(SB_ZIP | i);
rdiskUpdateMenu(i);
ui_sb_update_tip(SB_RDISK | i);
config_save();
}
void
MediaMenu::zipReload(int index, int slot)
MediaMenu::rdiskReload(int index, int slot)
{
const QString filename = mhm.getImageForSlot(index, slot, ui::MediaType::Zip);
zipMount(index, filename, zip_drives[index].read_only);
zipUpdateMenu(index);
ui_sb_update_tip(SB_ZIP | index);
const QString filename = mhm.getImageForSlot(index, slot, ui::MediaType::RDisk);
rdiskMount(index, filename, rdisk_drives[index].read_only);
rdiskUpdateMenu(index);
ui_sb_update_tip(SB_RDISK | index);
}
void
MediaMenu::zipUpdateMenu(int i)
MediaMenu::moUpdateMenu(int i)
{
const QString name = zip_drives[i].image_path;
const QString prev_name = zip_drives[i].prev_image_path;
QFileInfo fi(zip_drives[i].image_path);
if (!zipMenus.contains(i))
QString name = mo_drives[i].image_path;
QString prev_name = mo_drives[i].prev_image_path;
QFileInfo fi(mo_drives[i].image_path);
if (!moMenus.contains(i))
return;
auto *menu = zipMenus[i];
auto *menu = moMenus[i];
auto childs = menu->children();
auto *ejectMenu = dynamic_cast<QAction *>(childs[zipEjectPos]);
auto *ejectMenu = dynamic_cast<QAction *>(childs[moEjectPos]);
ejectMenu->setEnabled(!name.isEmpty());
ejectMenu->setText(name.isEmpty() ? tr("E&ject") : tr("E&ject %1").arg(fi.fileName()));
QString busName = tr("Unknown Bus");
switch (zip_drives[i].bus_type) {
switch (mo_drives[i].bus_type) {
default:
break;
case ZIP_BUS_ATAPI:
case MO_BUS_ATAPI:
busName = "ATAPI";
break;
case ZIP_BUS_SCSI:
case MO_BUS_SCSI:
busName = "SCSI";
break;
}
menu->setTitle(tr("ZIP %1 %2 (%3): %4").arg((zip_drives[i].is_250 > 0) ? QString("250") : QString("100"), QString::number(i + 1), busName, name.isEmpty() ? tr("(empty)") : name));
menu->setTitle(tr("MO %1 (%2): %3").arg(QString::number(i + 1), busName, name.isEmpty() ? tr("(empty)") : name));
for (int slot = 0; slot < MAX_PREV_IMAGES; slot++)
updateImageHistory(i, slot, ui::MediaType::Zip);
updateImageHistory(i, slot, ui::MediaType::Mo);
}
void
MediaMenu::rdiskUpdateMenu(int i)
{
const QString name = rdisk_drives[i].image_path;
const QString prev_name = rdisk_drives[i].prev_image_path;
QFileInfo fi(rdisk_drives[i].image_path);
if (!rdiskMenus.contains(i))
return;
auto *menu = rdiskMenus[i];
auto childs = menu->children();
auto *ejectMenu = dynamic_cast<QAction *>(childs[rdiskEjectPos]);
ejectMenu->setEnabled(!name.isEmpty());
ejectMenu->setText(name.isEmpty() ? tr("E&ject") : tr("E&ject %1").arg(fi.fileName()));
QString busName = tr("Unknown Bus");
switch (rdisk_drives[i].bus_type) {
default:
break;
case RDISK_BUS_ATAPI:
busName = "ATAPI";
break;
case RDISK_BUS_SCSI:
busName = "SCSI";
break;
}
menu->setTitle(tr("Removable disk %1 (%2): %3").arg(QString::number(i + 1), busName, name.isEmpty() ? tr("(empty)") : name));
for (int slot = 0; slot < MAX_PREV_IMAGES; slot++)
updateImageHistory(i, slot, ui::MediaType::RDisk);
}
void
@@ -1094,39 +1127,6 @@ MediaMenu::moReload(int index, int slot)
ui_sb_update_tip(SB_MO | index);
}
void
MediaMenu::moUpdateMenu(int i)
{
QString name = mo_drives[i].image_path;
QString prev_name = mo_drives[i].prev_image_path;
QFileInfo fi(mo_drives[i].image_path);
if (!moMenus.contains(i))
return;
auto *menu = moMenus[i];
auto childs = menu->children();
auto *ejectMenu = dynamic_cast<QAction *>(childs[moEjectPos]);
ejectMenu->setEnabled(!name.isEmpty());
ejectMenu->setText(name.isEmpty() ? tr("E&ject") : tr("E&ject %1").arg(fi.fileName()));
QString busName = tr("Unknown Bus");
switch (mo_drives[i].bus_type) {
default:
break;
case MO_BUS_ATAPI:
busName = "ATAPI";
break;
case MO_BUS_SCSI:
busName = "SCSI";
break;
}
menu->setTitle(tr("MO %1 (%2): %3").arg(QString::number(i + 1), busName, name.isEmpty() ? tr("(empty)") : name));
for (int slot = 0; slot < MAX_PREV_IMAGES; slot++)
updateImageHistory(i, slot, ui::MediaType::Mo);
}
void
MediaMenu::nicConnect(int i)
{
@@ -1241,21 +1241,21 @@ plat_cdrom_ui_update(uint8_t id, uint8_t reload)
}
void
zip_eject(uint8_t id)
rdisk_eject(uint8_t id)
{
MediaMenu::ptr->zipEject(id);
MediaMenu::ptr->rdiskEject(id);
}
void
zip_mount(uint8_t id, char *fn, uint8_t wp)
rdisk_mount(uint8_t id, char *fn, uint8_t wp)
{
MediaMenu::ptr->zipMount(id, QString(fn), wp);
MediaMenu::ptr->rdiskMount(id, QString(fn), wp);
}
void
zip_reload(uint8_t id)
rdisk_reload(uint8_t id)
{
MediaMenu::ptr->zipReloadPrev(id);
MediaMenu::ptr->rdiskReloadPrev(id);
}
void

View File

@@ -17,7 +17,7 @@ public:
void refresh(QMenu *parentMenu);
// because some 86box C-only code needs to call zip and
// because some 86box C-only code needs to call rdisk and
// mo eject directly
static std::shared_ptr<MediaMenu> ptr;
@@ -51,13 +51,13 @@ public:
void clearImageHistory();
void cdromUpdateMenu(int i);
void zipNewImage(int i);
void zipSelectImage(int i, bool wp);
void zipMount(int i, const QString &filename, bool wp);
void zipEject(int i);
void zipReloadPrev(int i);
void zipReload(int index, int slot);
void zipUpdateMenu(int i);
void rdiskNewImage(int i);
void rdiskSelectImage(int i, bool wp);
void rdiskMount(int i, const QString &filename, bool wp);
void rdiskEject(int i);
void rdiskReloadPrev(int i);
void rdiskReload(int index, int slot);
void rdiskUpdateMenu(int i);
void moNewImage(int i);
void moSelectImage(int i, bool wp);
@@ -84,7 +84,7 @@ private:
QMap<int, QMenu *> cartridgeMenus;
QMap<int, QMenu *> floppyMenus;
QMap<int, QMenu *> cdromMenus;
QMap<int, QMenu *> zipMenus;
QMap<int, QMenu *> rdiskMenus;
QMap<int, QMenu *> moMenus;
QMap<int, QMenu *> netMenus;
@@ -111,8 +111,8 @@ private:
int cdromEjectPos;
int cdromImageHistoryPos[MAX_PREV_IMAGES];
int zipEjectPos;
int zipImageHistoryPos[MAX_PREV_IMAGES];
int rdiskEjectPos;
int rdiskImageHistoryPos[MAX_PREV_IMAGES];
int moEjectPos;
int moImageHistoryPos[MAX_PREV_IMAGES];

View File

@@ -29,7 +29,7 @@ extern "C" {
#include <86box/plat.h>
#include <86box/random.h>
#include <86box/scsi_device.h>
#include <86box/zip.h>
#include <86box/rdisk.h>
#include <86box/mo.h>
}
@@ -110,7 +110,7 @@ static const QStringList floppyTypes = {
"2.88 MB",
};
static const QStringList zipTypes = {
static const QStringList rdiskTypes = {
"ZIP 100",
"ZIP 250",
};
@@ -146,11 +146,11 @@ NewFloppyDialog::NewFloppyDialog(MediaType type, QWidget *parent)
tr("All images") % util::DlgFilter({ "86f", "dsk", "flp", "im?", "img", "*fd?" }) % tr("Basic sector images") % util::DlgFilter({ "dsk", "flp", "im?", "img", "*fd?" }) % tr("Surface images") % util::DlgFilter({ "86f" }, true));
break;
case MediaType::Zip:
for (int i = 0; i < zipTypes.size(); ++i) {
Models::AddEntry(model, tr(zipTypes[i].toUtf8().data()), i);
case MediaType::RDisk:
for (int i = 0; i < rdiskTypes.size(); ++i) {
Models::AddEntry(model, tr(rdiskTypes[i].toUtf8().data()), i);
}
ui->fileField->setFilter(tr("ZIP images") % util::DlgFilter({ "im?", "img", "zdi" }, true));
ui->fileField->setFilter(tr("Removable disk images") % util::DlgFilter({ "im?", "img", "rdi", "zdi" }, true));
break;
case MediaType::Mo:
for (int i = 0; i < moTypes.size(); ++i) {
@@ -218,13 +218,13 @@ NewFloppyDialog::onCreate()
}
}
break;
case MediaType::Zip:
case MediaType::RDisk:
{
fileType = fi.suffix().toLower() == QStringLiteral("zdi") ? FileType::Zdi : FileType::Img;
std::atomic_bool res;
std::thread t([this, &res, filename, fileType, &progress] {
res = createZipSectorImage(filename, disk_sizes[ui->comboBoxSize->currentIndex() + 12], fileType, progress);
res = createRDiskSectorImage(filename, disk_sizes[ui->comboBoxSize->currentIndex() + 12], fileType, progress);
});
progress.exec();
t.join();
@@ -463,7 +463,7 @@ NewFloppyDialog::createSectorImage(const QString &filename, const disk_size_t &d
}
bool
NewFloppyDialog::createZipSectorImage(const QString &filename, const disk_size_t &disk_size, FileType type, QProgressDialog &pbar)
NewFloppyDialog::createRDiskSectorImage(const QString &filename, const disk_size_t &disk_size, FileType type, QProgressDialog &pbar)
{
uint64_t total_size = 0;
uint32_t total_sectors = 0;

View File

@@ -16,7 +16,7 @@ class NewFloppyDialog : public QDialog {
public:
enum class MediaType {
Floppy,
Zip,
RDisk,
Mo,
};
enum class FileType {
@@ -42,7 +42,7 @@ private:
bool create86f(const QString &filename, const disk_size_t &disk_size, uint8_t rpm_mode);
bool createSectorImage(const QString &filename, const disk_size_t &disk_size, FileType type);
bool createZipSectorImage(const QString &filename, const disk_size_t &disk_size, FileType type, QProgressDialog &pbar);
bool createRDiskSectorImage(const QString &filename, const disk_size_t &disk_size, FileType type, QProgressDialog &pbar);
bool createMoSectorImage(const QString &filename, int8_t disk_size, FileType type, QProgressDialog &pbar);
};

View File

@@ -164,24 +164,24 @@ Settings::Settings(QWidget *parent)
connect(floppyCdrom, &SettingsFloppyCDROM::cdromChannelChanged, otherRemovable,
&SettingsOtherRemovable::reloadBusChannels_MO);
connect(floppyCdrom, &SettingsFloppyCDROM::cdromChannelChanged, otherRemovable,
&SettingsOtherRemovable::reloadBusChannels_ZIP);
&SettingsOtherRemovable::reloadBusChannels_RDisk);
connect(harddisks, &SettingsHarddisks::driveChannelChanged, floppyCdrom,
&SettingsFloppyCDROM::reloadBusChannels);
connect(harddisks, &SettingsHarddisks::driveChannelChanged, otherRemovable,
&SettingsOtherRemovable::reloadBusChannels_MO);
connect(harddisks, &SettingsHarddisks::driveChannelChanged, otherRemovable,
&SettingsOtherRemovable::reloadBusChannels_ZIP);
&SettingsOtherRemovable::reloadBusChannels_RDisk);
connect(otherRemovable, &SettingsOtherRemovable::moChannelChanged, harddisks,
&SettingsHarddisks::reloadBusChannels);
connect(otherRemovable, &SettingsOtherRemovable::moChannelChanged, floppyCdrom,
&SettingsFloppyCDROM::reloadBusChannels);
connect(otherRemovable, &SettingsOtherRemovable::moChannelChanged, otherRemovable,
&SettingsOtherRemovable::reloadBusChannels_ZIP);
connect(otherRemovable, &SettingsOtherRemovable::zipChannelChanged, harddisks,
&SettingsOtherRemovable::reloadBusChannels_RDisk);
connect(otherRemovable, &SettingsOtherRemovable::rdiskChannelChanged, harddisks,
&SettingsHarddisks::reloadBusChannels);
connect(otherRemovable, &SettingsOtherRemovable::zipChannelChanged, floppyCdrom,
connect(otherRemovable, &SettingsOtherRemovable::rdiskChannelChanged, floppyCdrom,
&SettingsFloppyCDROM::reloadBusChannels);
connect(otherRemovable, &SettingsOtherRemovable::zipChannelChanged, otherRemovable,
connect(otherRemovable, &SettingsOtherRemovable::rdiskChannelChanged, otherRemovable,
&SettingsOtherRemovable::reloadBusChannels_MO);
connect(ui->listView->selectionModel(), &QItemSelectionModel::currentChanged, this,

View File

@@ -8,7 +8,7 @@
#define DEV_HDD 0x01
#define DEV_CDROM 0x02
#define DEV_ZIP 0x04
#define DEV_RDISK 0x04
#define DEV_MO 0x08
#define BUS_MFM 0
@@ -44,7 +44,7 @@ public:
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.
Device type: 1 = Hard Disk, 2 = CD-ROM, 4 = Removable disk, 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);

View File

@@ -23,7 +23,7 @@ extern "C" {
#include <86box/timer.h>
#include <86box/scsi_device.h>
#include <86box/mo.h>
#include <86box/zip.h>
#include <86box/rdisk.h>
}
#include <QStandardItemModel>
@@ -40,6 +40,13 @@ moDriveTypeName(int i)
mo_drive_types[i].revision);
}
static QString
rdiskDriveTypeName(int i)
{
return QString("%1 %2 %3").arg(rdisk_drive_types[i].vendor, rdisk_drive_types[i].model,
rdisk_drive_types[i].revision);
}
static void
setMOBus(QAbstractItemModel *model, const QModelIndex &idx, uint8_t bus, uint8_t channel)
{
@@ -65,27 +72,16 @@ setMOBus(QAbstractItemModel *model, const QModelIndex &idx, uint8_t bus, uint8_t
}
static void
setMOType(QAbstractItemModel *model, const QModelIndex &idx, uint32_t type)
{
auto i = idx.siblingAtColumn(1);
if (idx.siblingAtColumn(0).data(Qt::UserRole).toUInt() == MO_BUS_DISABLED)
model->setData(i, QCoreApplication::translate("", "None"));
else
model->setData(i, moDriveTypeName(type));
model->setData(i, type, Qt::UserRole);
}
static void
setZIPBus(QAbstractItemModel *model, const QModelIndex &idx, uint8_t bus, uint8_t channel)
setRDiskBus(QAbstractItemModel *model, const QModelIndex &idx, uint8_t bus, uint8_t channel)
{
QIcon icon;
switch (bus) {
case ZIP_BUS_DISABLED:
icon = QIcon(":/settings/qt/icons/zip_disabled.ico");
case RDISK_BUS_DISABLED:
icon = QIcon(":/settings/qt/icons/rdisk_disabled.ico");
break;
case ZIP_BUS_ATAPI:
case ZIP_BUS_SCSI:
icon = QIcon(":/settings/qt/icons/zip.ico");
case RDISK_BUS_ATAPI:
case RDISK_BUS_SCSI:
icon = QIcon(":/settings/qt/icons/rdisk.ico");
break;
default:
@@ -100,11 +96,25 @@ setZIPBus(QAbstractItemModel *model, const QModelIndex &idx, uint8_t bus, uint8_
}
static void
setZIPType(QAbstractItemModel *model, const QModelIndex &idx, bool is250)
setMOType(QAbstractItemModel *model, const QModelIndex &idx, uint32_t type)
{
auto i = idx.siblingAtColumn(1);
model->setData(i, is250 ? "ZIP 250" : "ZIP 100");
model->setData(i, is250, Qt::UserRole);
if (idx.siblingAtColumn(0).data(Qt::UserRole).toUInt() == MO_BUS_DISABLED)
model->setData(i, QCoreApplication::translate("", "None"));
else
model->setData(i, moDriveTypeName(type));
model->setData(i, type, Qt::UserRole);
}
static void
setRDiskType(QAbstractItemModel *model, const QModelIndex &idx, uint32_t type)
{
auto i = idx.siblingAtColumn(1);
if (idx.siblingAtColumn(0).data(Qt::UserRole).toUInt() == RDISK_BUS_DISABLED)
model->setData(i, QCoreApplication::translate("", "None"));
else
model->setData(i, rdiskDriveTypeName(type));
model->setData(i, type, Qt::UserRole);
}
SettingsOtherRemovable::SettingsOtherRemovable(QWidget *parent)
@@ -136,24 +146,28 @@ SettingsOtherRemovable::SettingsOtherRemovable(QWidget *parent)
connect(ui->tableViewMO->selectionModel(), &QItemSelectionModel::currentRowChanged, this, &SettingsOtherRemovable::onMORowChanged);
ui->tableViewMO->setCurrentIndex(model->index(0, 0));
Harddrives::populateRemovableBuses(ui->comboBoxZIPBus->model());
Harddrives::populateRemovableBuses(ui->comboBoxRDiskBus->model());
model = ui->comboBoxRDiskType->model();
for (uint32_t i = 0; i < KNOWN_RDISK_DRIVE_TYPES; i++) {
Models::AddEntry(model, rdiskDriveTypeName(i), i);
}
model = new QStandardItemModel(0, 2, this);
ui->tableViewZIP->setModel(model);
ui->tableViewRDisk->setModel(model);
model->setHeaderData(0, Qt::Horizontal, tr("Bus"));
model->setHeaderData(1, Qt::Horizontal, tr("Type"));
model->insertRows(0, ZIP_NUM);
for (int i = 0; i < ZIP_NUM; i++) {
model->insertRows(0, RDISK_NUM);
for (int i = 0; i < RDISK_NUM; i++) {
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);
setRDiskBus(model, idx, rdisk_drives[i].bus_type, rdisk_drives[i].res);
setRDiskType(model, idx.siblingAtColumn(1), rdisk_drives[i].type);
Harddrives::busTrackClass->device_track(1, DEV_MO, rdisk_drives[i].bus_type, rdisk_drives[i].bus_type == RDISK_BUS_ATAPI ? rdisk_drives[i].ide_channel : rdisk_drives[i].scsi_device_id);
}
ui->tableViewZIP->resizeColumnsToContents();
ui->tableViewZIP->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch);
ui->tableViewRDisk->resizeColumnsToContents();
ui->tableViewRDisk->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch);
connect(ui->tableViewZIP->selectionModel(), &QItemSelectionModel::currentRowChanged, this, &SettingsOtherRemovable::onZIPRowChanged);
ui->tableViewZIP->setCurrentIndex(model->index(0, 0));
connect(ui->tableViewRDisk->selectionModel(), &QItemSelectionModel::currentRowChanged, this, &SettingsOtherRemovable::onRDiskRowChanged);
ui->tableViewRDisk->setCurrentIndex(model->index(0, 0));
}
SettingsOtherRemovable::~SettingsOtherRemovable()
@@ -173,13 +187,13 @@ SettingsOtherRemovable::save()
mo_drives[i].type = model->index(i, 1).data(Qt::UserRole).toUInt();
}
model = ui->tableViewZIP->model();
for (uint8_t i = 0; i < ZIP_NUM; i++) {
zip_drives[i].fp = NULL;
zip_drives[i].priv = NULL;
zip_drives[i].bus_type = model->index(i, 0).data(Qt::UserRole).toUInt();
zip_drives[i].res = model->index(i, 0).data(Qt::UserRole + 1).toUInt();
zip_drives[i].is_250 = model->index(i, 1).data(Qt::UserRole).toBool() ? 1 : 0;
model = ui->tableViewRDisk->model();
for (uint8_t i = 0; i < RDISK_NUM; i++) {
rdisk_drives[i].fp = NULL;
rdisk_drives[i].priv = NULL;
rdisk_drives[i].bus_type = model->index(i, 0).data(Qt::UserRole).toUInt();
rdisk_drives[i].res = model->index(i, 0).data(Qt::UserRole + 1).toUInt();
rdisk_drives[i].type = model->index(i, 1).data(Qt::UserRole).toUInt();
}
}
@@ -205,24 +219,24 @@ SettingsOtherRemovable::onMORowChanged(const QModelIndex &current)
}
void
SettingsOtherRemovable::onZIPRowChanged(const QModelIndex &current)
SettingsOtherRemovable::onRDiskRowChanged(const QModelIndex &current)
{
uint8_t bus = current.siblingAtColumn(0).data(Qt::UserRole).toUInt();
uint8_t channel = current.siblingAtColumn(0).data(Qt::UserRole + 1).toUInt();
bool is250 = current.siblingAtColumn(1).data(Qt::UserRole).toBool();
uint8_t type = current.siblingAtColumn(1).data(Qt::UserRole).toUInt();
ui->comboBoxZIPBus->setCurrentIndex(-1);
const auto *model = ui->comboBoxZIPBus->model();
ui->comboBoxRDiskBus->setCurrentIndex(-1);
const auto *model = ui->comboBoxRDiskBus->model();
auto match = model->match(model->index(0, 0), Qt::UserRole, bus);
if (!match.isEmpty())
ui->comboBoxZIPBus->setCurrentIndex(match.first().row());
ui->comboBoxRDiskBus->setCurrentIndex(match.first().row());
model = ui->comboBoxZIPChannel->model();
model = ui->comboBoxRDiskChannel->model();
match = model->match(model->index(0, 0), Qt::UserRole, channel);
if (!match.isEmpty())
ui->comboBoxZIPChannel->setCurrentIndex(match.first().row());
ui->checkBoxZIP250->setChecked(is250);
enableCurrentlySelectedChannel_ZIP();
ui->comboBoxRDiskChannel->setCurrentIndex(match.first().row());
ui->comboBoxRDiskType->setCurrentIndex(type);
enableCurrentlySelectedChannel_RDisk();
}
void
@@ -234,6 +248,15 @@ SettingsOtherRemovable::reloadBusChannels_MO() {
enableCurrentlySelectedChannel_MO();
}
void
SettingsOtherRemovable::reloadBusChannels_RDisk() {
auto selected = ui->comboBoxRDiskChannel->currentIndex();
Harddrives::populateBusChannels(ui->comboBoxRDiskChannel->model(),
ui->comboBoxRDiskBus->currentData().toInt(), Harddrives::busTrackClass);
ui->comboBoxRDiskChannel->setCurrentIndex(selected);
enableCurrentlySelectedChannel_RDisk();
}
void
SettingsOtherRemovable::on_comboBoxMOBus_currentIndexChanged(int index)
{
@@ -246,6 +269,18 @@ SettingsOtherRemovable::on_comboBoxMOBus_currentIndexChanged(int index)
}
}
void
SettingsOtherRemovable::on_comboBoxRDiskBus_currentIndexChanged(int index)
{
if (index >= 0) {
int bus = ui->comboBoxRDiskBus->currentData().toInt();
bool enabled = (bus != RDISK_BUS_DISABLED);
ui->comboBoxRDiskChannel->setEnabled(enabled);
ui->comboBoxRDiskType->setEnabled(enabled);
Harddrives::populateBusChannels(ui->comboBoxRDiskChannel->model(), bus, Harddrives::busTrackClass);
}
}
void
SettingsOtherRemovable::on_comboBoxMOBus_activated(int)
{
@@ -253,9 +288,9 @@ SettingsOtherRemovable::on_comboBoxMOBus_activated(int)
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->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(),
@@ -272,6 +307,32 @@ SettingsOtherRemovable::on_comboBoxMOBus_activated(int)
emit moChannelChanged();
}
void
SettingsOtherRemovable::on_comboBoxRDiskBus_activated(int)
{
auto i = ui->tableViewRDisk->selectionModel()->currentIndex().siblingAtColumn(0);
Harddrives::busTrackClass->device_track(0, DEV_RDISK, ui->tableViewRDisk->model()->data(i,
Qt::UserRole).toInt(), ui->tableViewRDisk->model()->data(i,
Qt::UserRole + 1).toInt());
ui->comboBoxRDiskChannel->setCurrentIndex(ui->comboBoxRDiskBus->currentData().toUInt() == RDISK_BUS_ATAPI ?
Harddrives::busTrackClass->next_free_ide_channel() :
Harddrives::busTrackClass->next_free_scsi_id());
ui->tableViewRDisk->model()->data(i, Qt::UserRole + 1);
setRDiskBus(ui->tableViewRDisk->model(),
ui->tableViewRDisk->selectionModel()->currentIndex(),
ui->comboBoxRDiskBus->currentData().toUInt(),
ui->comboBoxRDiskChannel->currentData().toUInt());
setRDiskType(ui->tableViewRDisk->model(),
ui->tableViewRDisk->selectionModel()->currentIndex(),
ui->comboBoxRDiskType->currentData().toUInt());
ui->tableViewRDisk->resizeColumnsToContents();
ui->tableViewRDisk->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch);
Harddrives::busTrackClass->device_track(1, DEV_RDISK, ui->tableViewRDisk->model()->data(i,
Qt::UserRole).toInt(), ui->tableViewRDisk->model()->data(i,
Qt::UserRole + 1).toInt());
emit rdiskChannelChanged();
}
void
SettingsOtherRemovable::enableCurrentlySelectedChannel_MO()
{
@@ -282,6 +343,15 @@ SettingsOtherRemovable::enableCurrentlySelectedChannel_MO()
item->setEnabled(true);
}
void
SettingsOtherRemovable::enableCurrentlySelectedChannel_RDisk()
{
const auto *item_model = qobject_cast<QStandardItemModel*>(ui->comboBoxRDiskChannel->model());
const auto index = ui->comboBoxRDiskChannel->currentIndex();
auto *item = item_model->item(index);
if (item)
item->setEnabled(true);
}
void
SettingsOtherRemovable::on_comboBoxMOChannel_activated(int)
{
@@ -299,6 +369,23 @@ SettingsOtherRemovable::on_comboBoxMOChannel_activated(int)
emit moChannelChanged();
}
void
SettingsOtherRemovable::on_comboBoxRDiskChannel_activated(int)
{
auto i = ui->tableViewRDisk->selectionModel()->currentIndex().siblingAtColumn(0);
Harddrives::busTrackClass->device_track(0, DEV_RDISK, ui->tableViewRDisk->model()->data(i,
Qt::UserRole).toInt(), ui->tableViewRDisk->model()->data(i,
Qt::UserRole + 1).toInt());
setRDiskBus(ui->tableViewRDisk->model(),
ui->tableViewRDisk->selectionModel()->currentIndex(),
ui->comboBoxRDiskBus->currentData().toUInt(),
ui->comboBoxRDiskChannel->currentData().toUInt());
Harddrives::busTrackClass->device_track(1, DEV_RDISK, ui->tableViewRDisk->model()->data(i,
Qt::UserRole).toInt(),
ui->tableViewRDisk->model()->data(i, Qt::UserRole + 1).toInt());
emit rdiskChannelChanged();
}
void
SettingsOtherRemovable::on_comboBoxMOType_activated(int)
{
@@ -310,77 +397,11 @@ SettingsOtherRemovable::on_comboBoxMOType_activated(int)
}
void
SettingsOtherRemovable::reloadBusChannels_ZIP() {
auto selected = ui->comboBoxZIPChannel->currentIndex();
Harddrives::populateBusChannels(ui->comboBoxZIPChannel->model(),
ui->comboBoxZIPBus->currentData().toInt(), Harddrives::busTrackClass);
ui->comboBoxZIPChannel->setCurrentIndex(selected);
enableCurrentlySelectedChannel_ZIP();
}
void
SettingsOtherRemovable::on_comboBoxZIPBus_currentIndexChanged(int index)
SettingsOtherRemovable::on_comboBoxRDiskType_activated(int)
{
if (index >= 0) {
int bus = ui->comboBoxZIPBus->currentData().toInt();
bool enabled = (bus != ZIP_BUS_DISABLED);
ui->comboBoxZIPChannel->setEnabled(enabled);
ui->checkBoxZIP250->setEnabled(enabled);
Harddrives::populateBusChannels(ui->comboBoxZIPChannel->model(), bus, Harddrives::busTrackClass);
}
}
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());
emit zipChannelChanged();
}
void
SettingsOtherRemovable::enableCurrentlySelectedChannel_ZIP()
{
const auto *item_model = qobject_cast<QStandardItemModel*>(ui->comboBoxZIPChannel->model());
const auto index = ui->comboBoxZIPChannel->currentIndex();
auto *item = item_model->item(index);
if (item)
item->setEnabled(true);
}
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());
emit zipChannelChanged();
}
void
SettingsOtherRemovable::on_checkBoxZIP250_stateChanged(int state)
{
setZIPType(ui->tableViewZIP->model(),
ui->tableViewZIP->selectionModel()->currentIndex(),
state == Qt::Checked);
setRDiskType(ui->tableViewRDisk->model(),
ui->tableViewRDisk->selectionModel()->currentIndex(),
ui->comboBoxRDiskType->currentData().toUInt());
ui->tableViewRDisk->resizeColumnsToContents();
ui->tableViewRDisk->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch);
}

View File

@@ -14,13 +14,13 @@ public:
explicit SettingsOtherRemovable(QWidget *parent = nullptr);
~SettingsOtherRemovable();
void reloadBusChannels_MO();
void reloadBusChannels_ZIP();
void reloadBusChannels_RDisk();
void save();
signals:
void moChannelChanged();
void zipChannelChanged();
void rdiskChannelChanged();
private slots:
void onMORowChanged(const QModelIndex &current);
@@ -29,16 +29,16 @@ private slots:
void on_comboBoxMOChannel_activated(int index);
void on_comboBoxMOType_activated(int index);
void onZIPRowChanged(const QModelIndex &current);
void on_comboBoxZIPBus_currentIndexChanged(int index);
void on_comboBoxZIPBus_activated(int index);
void on_comboBoxZIPChannel_activated(int index);
void on_checkBoxZIP250_stateChanged(int arg1);
void onRDiskRowChanged(const QModelIndex &current);
void on_comboBoxRDiskBus_currentIndexChanged(int index);
void on_comboBoxRDiskBus_activated(int index);
void on_comboBoxRDiskChannel_activated(int index);
void on_comboBoxRDiskType_activated(int index);
private:
Ui::SettingsOtherRemovable *ui;
void enableCurrentlySelectedChannel_MO();
void enableCurrentlySelectedChannel_ZIP();
void enableCurrentlySelectedChannel_RDisk();
};
#endif // QT_SETTINGSOTHERREMOVABLE_HPP

View File

@@ -113,14 +113,14 @@
</widget>
</item>
<item>
<widget class="QLabel" name="labelZIP">
<widget class="QLabel" name="labelRDisk">
<property name="text">
<string>ZIP drives:</string>
<string>Removable disk drives:</string>
</property>
</widget>
</item>
<item>
<widget class="QTableView" name="tableViewZIP">
<widget class="QTableView" name="tableViewRDisk">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
@@ -151,40 +151,47 @@
</widget>
</item>
<item>
<widget class="QWidget" name="zipControls" native="true">
<widget class="QWidget" name="rdiskControls" native="true">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLabel" name="labelZIPBus">
<widget class="QLabel" name="labelRDiskBus">
<property name="text">
<string>Bus:</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="comboBoxZIPBus">
<widget class="QComboBox" name="comboBoxRDiskBus">
<property name="maxVisibleItems">
<number>30</number>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="labelZIPChannel">
<widget class="QLabel" name="labelRDiskChannel">
<property name="text">
<string>Channel:</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="comboBoxZIPChannel">
<widget class="QComboBox" name="comboBoxRDiskChannel">
<property name="maxVisibleItems">
<number>30</number>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="checkBoxZIP250">
<item row="1" column="0">
<widget class="QLabel" name="labelRDiskType">
<property name="text">
<string>ZIP 250</string>
<string>Type:</string>
</property>
</widget>
</item>
<item row="1" column="1" colspan="3">
<widget class="QComboBox" name="comboBoxRDiskType">
<property name="maxVisibleItems">
<number>30</number>
</property>
</widget>
</item>

View File

@@ -50,7 +50,7 @@ extern "C" {
#include <86box/cartridge.h>
#include <86box/cassette.h>
#include <86box/cdrom.h>
#include <86box/zip.h>
#include <86box/rdisk.h>
#include <86box/mo.h>
#include <86box/hdd.h>
#include <86box/thread.h>
@@ -278,8 +278,8 @@ ui_sb_update_icon_wp(int tag, int state)
case SB_FLOPPY:
machine_status.fdd[item].write_prot = state > 0 ? true : false;
break;
case SB_ZIP:
machine_status.zip[item].write_prot = state > 0 ? true : false;
case SB_RDISK:
machine_status.rdisk[item].write_prot = state > 0 ? true : false;
break;
case SB_MO:
machine_status.mo[item].write_prot = state > 0 ? true : false;
@@ -312,8 +312,8 @@ ui_sb_update_icon_state(int tag, int state)
case SB_CDROM:
machine_status.cdrom[item].empty = state > 0 ? true : false;
break;
case SB_ZIP:
machine_status.zip[item].empty = state > 0 ? true : false;
case SB_RDISK:
machine_status.rdisk[item].empty = state > 0 ? true : false;
break;
case SB_MO:
machine_status.mo[item].empty = state > 0 ? true : false;
@@ -350,8 +350,8 @@ ui_sb_update_icon(int tag, int active)
case SB_CDROM:
machine_status.cdrom[item].active = active > 0 ? true : false;
break;
case SB_ZIP:
machine_status.zip[item].active = active > 0 ? true : false;
case SB_RDISK:
machine_status.rdisk[item].active = active > 0 ? true : false;
break;
case SB_MO:
machine_status.mo[item].active = active > 0 ? true : false;
@@ -386,8 +386,8 @@ ui_sb_update_icon_write(int tag, int write)
case SB_CDROM:
machine_status.cdrom[item].write_active = write > 0 ? true : false;
break;
case SB_ZIP:
machine_status.zip[item].write_active = write > 0 ? true : false;
case SB_RDISK:
machine_status.rdisk[item].write_active = write > 0 ? true : false;
break;
case SB_MO:
machine_status.mo[item].write_active = write > 0 ? true : false;