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

@@ -88,7 +88,7 @@
#include <86box/scsi_device.h> #include <86box/scsi_device.h>
#include <86box/cdrom.h> #include <86box/cdrom.h>
#include <86box/cdrom_interface.h> #include <86box/cdrom_interface.h>
#include <86box/zip.h> #include <86box/rdisk.h>
#include <86box/mo.h> #include <86box/mo.h>
#include <86box/scsi_disk.h> #include <86box/scsi_disk.h>
#include <86box/cdrom_image.h> #include <86box/cdrom_image.h>
@@ -1066,7 +1066,7 @@ usage:
network_init(); network_init();
mouse_init(); mouse_init();
cdrom_global_init(); cdrom_global_init();
zip_global_init(); rdisk_global_init();
mo_global_init(); mo_global_init();
/* Initialize the keyboard accelerator list with default values */ /* Initialize the keyboard accelerator list with default values */
@@ -1395,7 +1395,7 @@ pc_reset_hard_close(void)
cdrom_close(); cdrom_close();
zip_close(); rdisk_close();
mo_close(); mo_close();
@@ -1501,7 +1501,7 @@ pc_reset_hard_init(void)
mo_hard_reset(); mo_hard_reset();
zip_hard_reset(); rdisk_hard_reset();
/* Reset any ISA ROM cards. */ /* Reset any ISA ROM cards. */
@@ -1664,7 +1664,7 @@ pc_close(UNUSED(thread_t *ptr))
cdrom_close(); cdrom_close();
zip_close(); rdisk_close();
mo_close(); mo_close();

View File

@@ -99,7 +99,7 @@ if(INSTRUMENT)
add_compile_definitions(USE_INSTRUMENT) add_compile_definitions(USE_INSTRUMENT)
endif() endif()
target_link_libraries(86Box cpu chipset mch dev mem fdd game cdrom zip mo hdd target_link_libraries(86Box cpu chipset mch dev mem fdd game cdrom rdisk mo hdd
net print scsi sio snd utils vid voodoo plat ui) net print scsi sio snd utils vid voodoo plat ui)
if(HAIKU) if(HAIKU)

View File

@@ -65,7 +65,7 @@
#include <86box/scsi_device.h> #include <86box/scsi_device.h>
#include <86box/cdrom.h> #include <86box/cdrom.h>
#include <86box/cdrom_interface.h> #include <86box/cdrom_interface.h>
#include <86box/zip.h> #include <86box/rdisk.h>
#include <86box/mo.h> #include <86box/mo.h>
#include <86box/sound.h> #include <86box/sound.h>
#include <86box/midi.h> #include <86box/midi.h>
@@ -1458,32 +1458,35 @@ load_other_removable_devices(void)
unsigned int board = 0; unsigned int board = 0;
unsigned int dev = 0; unsigned int dev = 0;
int c; int c;
int legacy_zip_drives = 0;
memset(temp, 0x00, sizeof(temp)); memset(temp, 0x00, sizeof(temp));
for (c = 0; c < ZIP_NUM; c++) { for (c = 0; c < RDISK_NUM; c++) {
sprintf(temp, "zip_%02i_parameters", c + 1); sprintf(temp, "zip_%02i_parameters", c + 1);
p = ini_section_get_string(cat, temp, NULL); p = ini_section_get_string(cat, temp, NULL);
if (p != NULL) if (p != NULL) {
sscanf(p, "%01u, %s", &zip_drives[c].is_250, s); sscanf(p, "%01u, %s", &rdisk_drives[c].type, s);
else legacy_zip_drives++;
sscanf("0, none", "%01u, %s", &zip_drives[c].is_250, s); } else
zip_drives[c].bus_type = hdd_string_to_bus(s, 1); sscanf("0, none", "%01u, %s", &rdisk_drives[c].type, s);
rdisk_drives[c].type++;
rdisk_drives[c].bus_type = hdd_string_to_bus(s, 1);
/* Default values, needed for proper operation of the Settings dialog. */ /* Default values, needed for proper operation of the Settings dialog. */
zip_drives[c].ide_channel = zip_drives[c].scsi_device_id = c + 2; rdisk_drives[c].ide_channel = rdisk_drives[c].scsi_device_id = c + 2;
if (zip_drives[c].bus_type == ZIP_BUS_ATAPI) { if (rdisk_drives[c].bus_type == RDISK_BUS_ATAPI) {
sprintf(temp, "zip_%02i_ide_channel", c + 1); sprintf(temp, "zip_%02i_ide_channel", c + 1);
sprintf(tmp2, "%01u:%01u", (c + 2) >> 1, (c + 2) & 1); sprintf(tmp2, "%01u:%01u", (c + 2) >> 1, (c + 2) & 1);
p = ini_section_get_string(cat, temp, tmp2); p = ini_section_get_string(cat, temp, tmp2);
sscanf(p, "%01u:%01u", &board, &dev); sscanf(p, "%01u:%01u", &board, &dev);
board &= 3; board &= 3;
dev &= 1; dev &= 1;
zip_drives[c].ide_channel = (board << 1) + dev; rdisk_drives[c].ide_channel = (board << 1) + dev;
if (zip_drives[c].ide_channel > 7) if (rdisk_drives[c].ide_channel > 7)
zip_drives[c].ide_channel = 7; rdisk_drives[c].ide_channel = 7;
} else if (zip_drives[c].bus_type == ZIP_BUS_SCSI) { } else if (rdisk_drives[c].bus_type == RDISK_BUS_SCSI) {
sprintf(temp, "zip_%02i_scsi_location", c + 1); sprintf(temp, "zip_%02i_scsi_location", c + 1);
sprintf(tmp2, "%01u:%02u", SCSI_BUS_MAX, c + 2); sprintf(tmp2, "%01u:%02u", SCSI_BUS_MAX, c + 2);
p = ini_section_get_string(cat, temp, tmp2); p = ini_section_get_string(cat, temp, tmp2);
@@ -1491,23 +1494,23 @@ load_other_removable_devices(void)
if (board >= SCSI_BUS_MAX) { if (board >= SCSI_BUS_MAX) {
/* Invalid bus - check legacy ID */ /* Invalid bus - check legacy ID */
sprintf(temp, "zip_%02i_scsi_id", c + 1); sprintf(temp, "zip_%02i_scsi_id", c + 1);
zip_drives[c].scsi_device_id = ini_section_get_int(cat, temp, c + 2); rdisk_drives[c].scsi_device_id = ini_section_get_int(cat, temp, c + 2);
if (zip_drives[c].scsi_device_id > 15) if (rdisk_drives[c].scsi_device_id > 15)
zip_drives[c].scsi_device_id = 15; rdisk_drives[c].scsi_device_id = 15;
} else { } else {
board %= SCSI_BUS_MAX; board %= SCSI_BUS_MAX;
dev &= 15; dev &= 15;
zip_drives[c].scsi_device_id = (board << 4) + dev; rdisk_drives[c].scsi_device_id = (board << 4) + dev;
} }
} }
if (zip_drives[c].bus_type != ZIP_BUS_ATAPI) { if (rdisk_drives[c].bus_type != RDISK_BUS_ATAPI) {
sprintf(temp, "zip_%02i_ide_channel", c + 1); sprintf(temp, "zip_%02i_ide_channel", c + 1);
ini_section_delete_var(cat, temp); ini_section_delete_var(cat, temp);
} }
if (zip_drives[c].bus_type != ZIP_BUS_SCSI) { if (rdisk_drives[c].bus_type != RDISK_BUS_SCSI) {
sprintf(temp, "zip_%02i_scsi_location", c + 1); sprintf(temp, "zip_%02i_scsi_location", c + 1);
ini_section_delete_var(cat, temp); ini_section_delete_var(cat, temp);
} }
@@ -1519,30 +1522,28 @@ load_other_removable_devices(void)
p = ini_section_get_string(cat, temp, ""); p = ini_section_get_string(cat, temp, "");
sprintf(temp, "zip_%02i_writeprot", c + 1); sprintf(temp, "zip_%02i_writeprot", c + 1);
zip_drives[c].read_only = ini_section_get_int(cat, temp, 0); rdisk_drives[c].read_only = ini_section_get_int(cat, temp, 0);
ini_section_delete_var(cat, temp); ini_section_delete_var(cat, temp);
if (!strcmp(p, usr_path)) if (!strcmp(p, usr_path))
p[0] = 0x00; p[0] = 0x00;
if (p[0] != 0x00) { if (p[0] != 0x00) {
if (load_image_file(zip_drives[c].image_path, p, &(zip_drives[c].read_only))) if (load_image_file(rdisk_drives[c].image_path, p, &(rdisk_drives[c].read_only)))
fatal("Configuration: Length of zip_%02i_image_path is more than 511\n", c + 1); fatal("Configuration: Length of zip_%02i_image_path is more than 511\n", c + 1);
} }
for (int i = 0; i < MAX_PREV_IMAGES; i++) { for (int i = 0; i < MAX_PREV_IMAGES; i++) {
zip_drives[c].image_history[i] = (char *) calloc((MAX_IMAGE_PATH_LEN + 1) << 1, sizeof(char)); rdisk_drives[c].image_history[i] = (char *) calloc((MAX_IMAGE_PATH_LEN + 1) << 1, sizeof(char));
sprintf(temp, "zip_%02i_image_history_%02i", c + 1, i + 1); sprintf(temp, "zip_%02i_image_history_%02i", c + 1, i + 1);
p = ini_section_get_string(cat, temp, NULL); p = ini_section_get_string(cat, temp, NULL);
if (p) { if (p) {
if (load_image_file(zip_drives[c].image_history[i], p, NULL)) if (load_image_file(rdisk_drives[c].image_history[i], p, NULL))
fatal("Configuration: Length of zip_%02i_image_history_%02i is more than %i\n", fatal("Configuration: Length of zip_%02i_image_history_%02i is more than %i\n",
c + 1, i + 1, MAX_IMAGE_PATH_LEN - 1); c + 1, i + 1, MAX_IMAGE_PATH_LEN - 1);
} }
} }
/* If the ZIP drive is disabled, delete all its variables. */
if (zip_drives[c].bus_type == ZIP_BUS_DISABLED) {
sprintf(temp, "zip_%02i_parameters", c + 1); sprintf(temp, "zip_%02i_parameters", c + 1);
ini_section_delete_var(cat, temp); ini_section_delete_var(cat, temp);
@@ -1560,8 +1561,115 @@ load_other_removable_devices(void)
ini_section_delete_var(cat, temp); ini_section_delete_var(cat, temp);
} }
} }
if (legacy_zip_drives > 0)
goto go_to_mo;
memset(temp, 0x00, sizeof(temp));
for (c = 0; c < RDISK_NUM; c++) {
sprintf(temp, "rdisk_%02i_parameters", c + 1);
p = ini_section_get_string(cat, temp, NULL);
if (p != NULL) {
sscanf(p, "%01u, %s", &rdisk_drives[c].type, s);
legacy_zip_drives++;
} else
sscanf("0, none", "%01u, %s", &rdisk_drives[c].type, s);
rdisk_drives[c].bus_type = hdd_string_to_bus(s, 1);
/* Default values, needed for proper operation of the Settings dialog. */
rdisk_drives[c].ide_channel = rdisk_drives[c].scsi_device_id = c + 2;
if (rdisk_drives[c].bus_type == RDISK_BUS_ATAPI) {
sprintf(temp, "rdisk_%02i_ide_channel", c + 1);
sprintf(tmp2, "%01u:%01u", (c + 2) >> 1, (c + 2) & 1);
p = ini_section_get_string(cat, temp, tmp2);
sscanf(p, "%01u:%01u", &board, &dev);
board &= 3;
dev &= 1;
rdisk_drives[c].ide_channel = (board << 1) + dev;
if (rdisk_drives[c].ide_channel > 7)
rdisk_drives[c].ide_channel = 7;
} else if (rdisk_drives[c].bus_type == RDISK_BUS_SCSI) {
sprintf(temp, "rdisk_%02i_scsi_location", c + 1);
sprintf(tmp2, "%01u:%02u", SCSI_BUS_MAX, c + 2);
p = ini_section_get_string(cat, temp, tmp2);
sscanf(p, "%01u:%02u", &board, &dev);
if (board >= SCSI_BUS_MAX) {
/* Invalid bus - check legacy ID */
sprintf(temp, "rdisk_%02i_scsi_id", c + 1);
rdisk_drives[c].scsi_device_id = ini_section_get_int(cat, temp, c + 2);
if (rdisk_drives[c].scsi_device_id > 15)
rdisk_drives[c].scsi_device_id = 15;
} else {
board %= SCSI_BUS_MAX;
dev &= 15;
rdisk_drives[c].scsi_device_id = (board << 4) + dev;
}
} }
if (rdisk_drives[c].bus_type != RDISK_BUS_ATAPI) {
sprintf(temp, "rdisk_%02i_ide_channel", c + 1);
ini_section_delete_var(cat, temp);
}
if (rdisk_drives[c].bus_type != RDISK_BUS_SCSI) {
sprintf(temp, "rdisk_%02i_scsi_location", c + 1);
ini_section_delete_var(cat, temp);
}
sprintf(temp, "rdisk_%02i_scsi_id", c + 1);
ini_section_delete_var(cat, temp);
sprintf(temp, "rdisk_%02i_image_path", c + 1);
p = ini_section_get_string(cat, temp, "");
sprintf(temp, "rdisk_%02i_writeprot", c + 1);
rdisk_drives[c].read_only = ini_section_get_int(cat, temp, 0);
ini_section_delete_var(cat, temp);
if (!strcmp(p, usr_path))
p[0] = 0x00;
if (p[0] != 0x00) {
if (load_image_file(rdisk_drives[c].image_path, p, &(rdisk_drives[c].read_only)))
fatal("Configuration: Length of rdisk_%02i_image_path is more than 511\n", c + 1);
}
for (int i = 0; i < MAX_PREV_IMAGES; i++) {
rdisk_drives[c].image_history[i] = (char *) calloc((MAX_IMAGE_PATH_LEN + 1) << 1, sizeof(char));
sprintf(temp, "rdisk_%02i_image_history_%02i", c + 1, i + 1);
p = ini_section_get_string(cat, temp, NULL);
if (p) {
if (load_image_file(rdisk_drives[c].image_history[i], p, NULL))
fatal("Configuration: Length of rdisk_%02i_image_history_%02i is more than %i\n",
c + 1, i + 1, MAX_IMAGE_PATH_LEN - 1);
}
}
/* If the removable disk drive is disabled, delete all its variables. */
if (rdisk_drives[c].bus_type == RDISK_BUS_DISABLED) {
sprintf(temp, "rdisk_%02i_parameters", c + 1);
ini_section_delete_var(cat, temp);
sprintf(temp, "rdisk_%02i_ide_channel", c + 1);
ini_section_delete_var(cat, temp);
sprintf(temp, "rdisk_%02i_scsi_location", c + 1);
ini_section_delete_var(cat, temp);
sprintf(temp, "rdisk_%02i_image_path", c + 1);
ini_section_delete_var(cat, temp);
for (int i = 0; i < MAX_PREV_IMAGES; i++) {
sprintf(temp, "rdisk_%02i_image_history_%02i", c + 1, i + 1);
ini_section_delete_var(cat, temp);
}
}
}
go_to_mo:
memset(temp, 0x00, sizeof(temp)); memset(temp, 0x00, sizeof(temp));
for (c = 0; c < MO_NUM; c++) { for (c = 0; c < MO_NUM; c++) {
sprintf(temp, "mo_%02i_parameters", c + 1); sprintf(temp, "mo_%02i_parameters", c + 1);
@@ -1820,7 +1928,7 @@ config_load(void)
#ifdef USE_IOCTL #ifdef USE_IOCTL
memset(cdrom_ioctl, 0, sizeof(cdrom_ioctl_t) * CDROM_NUM); memset(cdrom_ioctl, 0, sizeof(cdrom_ioctl_t) * CDROM_NUM);
#endif #endif
memset(zip_drives, 0, sizeof(zip_drive_t)); memset(rdisk_drives, 0, sizeof(rdisk_drive_t));
config = ini_read(cfg_path); config = ini_read(cfg_path);
@@ -3045,52 +3153,52 @@ save_other_removable_devices(void)
char tmp2[512]; char tmp2[512];
int c; int c;
for (c = 0; c < ZIP_NUM; c++) { for (c = 0; c < RDISK_NUM; c++) {
sprintf(temp, "zip_%02i_parameters", c + 1); sprintf(temp, "rdisk_%02i_parameters", c + 1);
if (zip_drives[c].bus_type == 0) { if (rdisk_drives[c].bus_type == 0) {
ini_section_delete_var(cat, temp); ini_section_delete_var(cat, temp);
} else { } else {
sprintf(tmp2, "%u, %s", zip_drives[c].is_250, sprintf(tmp2, "%u, %s", rdisk_drives[c].type,
hdd_bus_to_string(zip_drives[c].bus_type, 1)); hdd_bus_to_string(rdisk_drives[c].bus_type, 1));
ini_section_set_string(cat, temp, tmp2); ini_section_set_string(cat, temp, tmp2);
} }
sprintf(temp, "zip_%02i_ide_channel", c + 1); sprintf(temp, "rdisk_%02i_ide_channel", c + 1);
if (zip_drives[c].bus_type != ZIP_BUS_ATAPI) if (rdisk_drives[c].bus_type != RDISK_BUS_ATAPI)
ini_section_delete_var(cat, temp); ini_section_delete_var(cat, temp);
else { else {
sprintf(tmp2, "%01u:%01u", zip_drives[c].ide_channel >> 1, sprintf(tmp2, "%01u:%01u", rdisk_drives[c].ide_channel >> 1,
zip_drives[c].ide_channel & 1); rdisk_drives[c].ide_channel & 1);
ini_section_set_string(cat, temp, tmp2); ini_section_set_string(cat, temp, tmp2);
} }
sprintf(temp, "zip_%02i_scsi_id", c + 1); sprintf(temp, "rdisk_%02i_scsi_id", c + 1);
ini_section_delete_var(cat, temp); ini_section_delete_var(cat, temp);
sprintf(temp, "zip_%02i_writeprot", c + 1); sprintf(temp, "rdisk_%02i_writeprot", c + 1);
ini_section_delete_var(cat, temp); ini_section_delete_var(cat, temp);
sprintf(temp, "zip_%02i_scsi_location", c + 1); sprintf(temp, "rdisk_%02i_scsi_location", c + 1);
if (zip_drives[c].bus_type != ZIP_BUS_SCSI) if (rdisk_drives[c].bus_type != RDISK_BUS_SCSI)
ini_section_delete_var(cat, temp); ini_section_delete_var(cat, temp);
else { else {
sprintf(tmp2, "%01u:%02u", zip_drives[c].scsi_device_id >> 4, sprintf(tmp2, "%01u:%02u", rdisk_drives[c].scsi_device_id >> 4,
zip_drives[c].scsi_device_id & 15); rdisk_drives[c].scsi_device_id & 15);
ini_section_set_string(cat, temp, tmp2); ini_section_set_string(cat, temp, tmp2);
} }
sprintf(temp, "zip_%02i_image_path", c + 1); sprintf(temp, "rdisk_%02i_image_path", c + 1);
if ((zip_drives[c].bus_type == 0) || (strlen(zip_drives[c].image_path) == 0)) if ((rdisk_drives[c].bus_type == 0) || (strlen(rdisk_drives[c].image_path) == 0))
ini_section_delete_var(cat, temp); ini_section_delete_var(cat, temp);
else else
save_image_file(cat, temp, zip_drives[c].image_path); save_image_file(cat, temp, rdisk_drives[c].image_path);
for (int i = 0; i < MAX_PREV_IMAGES; i++) { for (int i = 0; i < MAX_PREV_IMAGES; i++) {
sprintf(temp, "zip_%02i_image_history_%02i", c + 1, i + 1); sprintf(temp, "rdisk_%02i_image_history_%02i", c + 1, i + 1);
if ((zip_drives[c].image_history[i] == 0) || strlen(zip_drives[c].image_history[i]) == 0) if ((rdisk_drives[c].image_history[i] == 0) || strlen(rdisk_drives[c].image_history[i]) == 0)
ini_section_delete_var(cat, temp); ini_section_delete_var(cat, temp);
else else
save_image_file(cat, temp, zip_drives[c].image_history[i]); save_image_file(cat, temp, rdisk_drives[c].image_history[i]);
} }
} }

View File

@@ -37,7 +37,7 @@ add_library(hdd OBJECT
hdc_ide_w83769f.c hdc_ide_w83769f.c
) )
add_library(zip OBJECT zip.c) add_library(rdisk OBJECT rdisk.c)
add_library(mo OBJECT mo.c) add_library(mo OBJECT mo.c)

View File

@@ -46,7 +46,7 @@
#include <86box/hdc.h> #include <86box/hdc.h>
#include <86box/hdc_ide.h> #include <86box/hdc_ide.h>
#include <86box/hdd.h> #include <86box/hdd.h>
#include <86box/zip.h> #include <86box/rdisk.h>
#include <86box/version.h> #include <86box/version.h>
/* Bits of 'atastat' */ /* Bits of 'atastat' */

View File

@@ -34,7 +34,7 @@
#include <86box/hdc.h> #include <86box/hdc.h>
#include <86box/hdc_ide.h> #include <86box/hdc_ide.h>
#include <86box/hdc_ide_sff8038i.h> #include <86box/hdc_ide_sff8038i.h>
#include <86box/zip.h> #include <86box/rdisk.h>
#include <86box/mo.h> #include <86box/mo.h>
typedef struct cmd640_t { typedef struct cmd640_t {
@@ -417,10 +417,10 @@ cmd640_reset(void *priv)
(cdrom[i].ide_channel <= max_channel) && cdrom[i].priv) (cdrom[i].ide_channel <= max_channel) && cdrom[i].priv)
scsi_cdrom_reset((scsi_common_t *) cdrom[i].priv); scsi_cdrom_reset((scsi_common_t *) cdrom[i].priv);
} }
for (i = 0; i < ZIP_NUM; i++) { for (i = 0; i < RDISK_NUM; i++) {
if ((zip_drives[i].bus_type == ZIP_BUS_ATAPI) && (zip_drives[i].ide_channel >= min_channel) && if ((rdisk_drives[i].bus_type == RDISK_BUS_ATAPI) && (rdisk_drives[i].ide_channel >= min_channel) &&
(zip_drives[i].ide_channel <= max_channel) && zip_drives[i].priv) (rdisk_drives[i].ide_channel <= max_channel) && rdisk_drives[i].priv)
zip_reset((scsi_common_t *) zip_drives[i].priv); rdisk_reset((scsi_common_t *) rdisk_drives[i].priv);
} }
for (i = 0; i < MO_NUM; i++) { for (i = 0; i < MO_NUM; i++) {
if ((mo_drives[i].bus_type == MO_BUS_ATAPI) && (mo_drives[i].ide_channel >= min_channel) && if ((mo_drives[i].bus_type == MO_BUS_ATAPI) && (mo_drives[i].ide_channel >= min_channel) &&

View File

@@ -34,7 +34,7 @@
#include <86box/hdc.h> #include <86box/hdc.h>
#include <86box/hdc_ide.h> #include <86box/hdc_ide.h>
#include <86box/hdc_ide_sff8038i.h> #include <86box/hdc_ide_sff8038i.h>
#include <86box/zip.h> #include <86box/rdisk.h>
#include <86box/mo.h> #include <86box/mo.h>
typedef struct cmd646_t { typedef struct cmd646_t {
@@ -320,9 +320,9 @@ cmd646_reset(void *priv)
if ((cdrom[i].bus_type == CDROM_BUS_ATAPI) && (cdrom[i].ide_channel < 4) && cdrom[i].priv) if ((cdrom[i].bus_type == CDROM_BUS_ATAPI) && (cdrom[i].ide_channel < 4) && cdrom[i].priv)
scsi_cdrom_reset((scsi_common_t *) cdrom[i].priv); scsi_cdrom_reset((scsi_common_t *) cdrom[i].priv);
} }
for (i = 0; i < ZIP_NUM; i++) { for (i = 0; i < RDISK_NUM; i++) {
if ((zip_drives[i].bus_type == ZIP_BUS_ATAPI) && (zip_drives[i].ide_channel < 4) && zip_drives[i].priv) if ((rdisk_drives[i].bus_type == RDISK_BUS_ATAPI) && (rdisk_drives[i].ide_channel < 4) && rdisk_drives[i].priv)
zip_reset((scsi_common_t *) zip_drives[i].priv); rdisk_reset((scsi_common_t *) rdisk_drives[i].priv);
} }
for (i = 0; i < MO_NUM; i++) { for (i = 0; i < MO_NUM; i++) {
if ((mo_drives[i].bus_type == MO_BUS_ATAPI) && (mo_drives[i].ide_channel < 4) && mo_drives[i].priv) if ((mo_drives[i].bus_type == MO_BUS_ATAPI) && (mo_drives[i].ide_channel < 4) && mo_drives[i].priv)

View File

@@ -34,7 +34,7 @@
#include <86box/hdc.h> #include <86box/hdc.h>
#include <86box/hdc_ide.h> #include <86box/hdc_ide.h>
#include <86box/hdc_ide_sff8038i.h> #include <86box/hdc_ide_sff8038i.h>
#include <86box/zip.h> #include <86box/rdisk.h>
#include <86box/mo.h> #include <86box/mo.h>
typedef struct rz1000_t { typedef struct rz1000_t {
@@ -182,10 +182,10 @@ rz1000_reset(void *priv)
(cdrom[i].ide_channel <= max_channel) && cdrom[i].priv) (cdrom[i].ide_channel <= max_channel) && cdrom[i].priv)
scsi_cdrom_reset((scsi_common_t *) cdrom[i].priv); scsi_cdrom_reset((scsi_common_t *) cdrom[i].priv);
} }
for (i = 0; i < ZIP_NUM; i++) { for (i = 0; i < RDISK_NUM; i++) {
if ((zip_drives[i].bus_type == ZIP_BUS_ATAPI) && (zip_drives[i].ide_channel >= min_channel) && if ((rdisk_drives[i].bus_type == RDISK_BUS_ATAPI) && (rdisk_drives[i].ide_channel >= min_channel) &&
(zip_drives[i].ide_channel <= max_channel) && zip_drives[i].priv) (rdisk_drives[i].ide_channel <= max_channel) && rdisk_drives[i].priv)
zip_reset((scsi_common_t *) zip_drives[i].priv); rdisk_reset((scsi_common_t *) rdisk_drives[i].priv);
} }
for (i = 0; i < MO_NUM; i++) { for (i = 0; i < MO_NUM; i++) {
if ((mo_drives[i].bus_type == MO_BUS_ATAPI) && (mo_drives[i].ide_channel >= min_channel) && if ((mo_drives[i].bus_type == MO_BUS_ATAPI) && (mo_drives[i].ide_channel >= min_channel) &&

View File

@@ -42,7 +42,7 @@
#include <86box/hdc.h> #include <86box/hdc.h>
#include <86box/hdc_ide.h> #include <86box/hdc_ide.h>
#include <86box/hdc_ide_sff8038i.h> #include <86box/hdc_ide_sff8038i.h>
#include <86box/zip.h> #include <86box/rdisk.h>
#include <86box/mo.h> #include <86box/mo.h>
#include <86box/plat_unused.h> #include <86box/plat_unused.h>
@@ -489,10 +489,10 @@ sff_reset(void *priv)
cdrom[i].priv) cdrom[i].priv)
scsi_cdrom_reset((scsi_common_t *) cdrom[i].priv); scsi_cdrom_reset((scsi_common_t *) cdrom[i].priv);
} }
for (uint8_t i = 0; i < ZIP_NUM; i++) { for (uint8_t i = 0; i < RDISK_NUM; i++) {
if ((zip_drives[i].bus_type == ZIP_BUS_ATAPI) && (zip_drives[i].ide_channel < 4) && if ((rdisk_drives[i].bus_type == RDISK_BUS_ATAPI) && (rdisk_drives[i].ide_channel < 4) &&
zip_drives[i].priv) rdisk_drives[i].priv)
zip_reset((scsi_common_t *) zip_drives[i].priv); rdisk_reset((scsi_common_t *) rdisk_drives[i].priv);
} }
for (uint8_t i = 0; i < MO_NUM; i++) { for (uint8_t i = 0; i < MO_NUM; i++) {
if ((mo_drives[i].bus_type == MO_BUS_ATAPI) && (mo_drives[i].ide_channel < 4) && if ((mo_drives[i].bus_type == MO_BUS_ATAPI) && (mo_drives[i].ide_channel < 4) &&

View File

@@ -34,7 +34,7 @@
#include <86box/hdc.h> #include <86box/hdc.h>
#include <86box/hdc_ide.h> #include <86box/hdc_ide.h>
#include <86box/hdc_ide_sff8038i.h> #include <86box/hdc_ide_sff8038i.h>
#include <86box/zip.h> #include <86box/rdisk.h>
#include <86box/mo.h> #include <86box/mo.h>
typedef struct w83769f_t { typedef struct w83769f_t {
@@ -297,10 +297,10 @@ w83769f_reset(void *priv)
(cdrom[i].ide_channel <= max_channel) && cdrom[i].priv) (cdrom[i].ide_channel <= max_channel) && cdrom[i].priv)
scsi_cdrom_reset((scsi_common_t *) cdrom[i].priv); scsi_cdrom_reset((scsi_common_t *) cdrom[i].priv);
} }
for (i = 0; i < ZIP_NUM; i++) { for (i = 0; i < RDISK_NUM; i++) {
if ((zip_drives[i].bus_type == ZIP_BUS_ATAPI) && (zip_drives[i].ide_channel >= min_channel) && if ((rdisk_drives[i].bus_type == RDISK_BUS_ATAPI) && (rdisk_drives[i].ide_channel >= min_channel) &&
(zip_drives[i].ide_channel <= max_channel) && zip_drives[i].priv) (rdisk_drives[i].ide_channel <= max_channel) && rdisk_drives[i].priv)
zip_reset((scsi_common_t *) zip_drives[i].priv); rdisk_reset((scsi_common_t *) rdisk_drives[i].priv);
} }
for (i = 0; i < MO_NUM; i++) { for (i = 0; i < MO_NUM; i++) {
if ((mo_drives[i].bus_type == MO_BUS_ATAPI) && (mo_drives[i].ide_channel >= min_channel) && if ((mo_drives[i].bus_type == MO_BUS_ATAPI) && (mo_drives[i].ide_channel >= min_channel) &&

File diff suppressed because it is too large Load Diff

View File

@@ -133,7 +133,7 @@ typedef struct config_t {
/* Other removable devices category */ /* Other removable devices category */
storage_cfg_t cdrom[CDROM_NUM]; /* CD-ROM drives */ storage_cfg_t cdrom[CDROM_NUM]; /* CD-ROM drives */
storage_cfg_t rdisk[ZIP_NUM]; /* Removable disk drives */ storage_cfg_t rdisk[RDISK_NUM]; /* Removable disk drives */
} config_t; } config_t;
#endif #endif

View File

@@ -20,7 +20,7 @@ typedef struct dev_status_empty_t {
typedef struct machine_status_t { typedef struct machine_status_t {
dev_status_empty_active_t fdd[FDD_NUM]; dev_status_empty_active_t fdd[FDD_NUM];
dev_status_empty_active_t cdrom[CDROM_NUM]; dev_status_empty_active_t cdrom[CDROM_NUM];
dev_status_empty_active_t zip[ZIP_NUM]; dev_status_empty_active_t rdisk[RDISK_NUM];
dev_status_empty_active_t mo[MO_NUM]; dev_status_empty_active_t mo[MO_NUM];
dev_status_empty_active_t cassette; dev_status_empty_active_t cassette;
dev_status_active_t hdd[HDD_BUS_USB]; dev_status_active_t hdd[HDD_BUS_USB];

View File

@@ -185,9 +185,9 @@ extern void floppy_mount(uint8_t id, char *fn, uint8_t wp);
extern void floppy_eject(uint8_t id); extern void floppy_eject(uint8_t id);
extern void cdrom_mount(uint8_t id, char *fn); extern void cdrom_mount(uint8_t id, char *fn);
extern void plat_cdrom_ui_update(uint8_t id, uint8_t reload); extern void plat_cdrom_ui_update(uint8_t id, uint8_t reload);
extern void zip_eject(uint8_t id); extern void rdisk_eject(uint8_t id);
extern void zip_mount(uint8_t id, char *fn, uint8_t wp); extern void rdisk_mount(uint8_t id, char *fn, uint8_t wp);
extern void zip_reload(uint8_t id); extern void rdisk_reload(uint8_t id);
extern void mo_eject(uint8_t id); extern void mo_eject(uint8_t id);
extern void mo_mount(uint8_t id, char *fn, uint8_t wp); extern void mo_mount(uint8_t id, char *fn, uint8_t wp);
extern void mo_reload(uint8_t id); extern void mo_reload(uint8_t id);

View File

@@ -16,29 +16,60 @@
* Copyright 2018-2025 Miran Grca. * Copyright 2018-2025 Miran Grca.
*/ */
#ifndef EMU_ZIP_H #ifndef EMU_RDISK_H
#define EMU_ZIP_H #define EMU_RDISK_H
#define ZIP_NUM 4 #define RDISK_NUM 4
#define BUF_SIZE 32768 #define BUF_SIZE 32768
#define ZIP_TIME 10.0 #define RDISK_TIME 10.0
#define ZIP_SECTORS (96 * 2048) #define ZIP_SECTORS (96 * 2048)
#define ZIP_250_SECTORS (489532) #define ZIP_250_SECTORS (489532)
#define ZIP_IMAGE_HISTORY 10 #define RDISK_IMAGE_HISTORY 10
enum { enum {
ZIP_BUS_DISABLED = 0, RDISK_TYPE_GENERIC = 0,
ZIP_BUS_ATAPI = 5, RDISK_TYPE_ZIP_100,
ZIP_BUS_SCSI = 6, RDISK_TYPE_ZIP_250
ZIP_BUS_USB = 7
}; };
typedef struct zip_drive_t { typedef struct rdisk_type_t {
uint32_t sectors;
uint16_t bytes_per_sector;
} rdisk_type_t;
#define KNOWN_RDISK_TYPES 2
static const rdisk_type_t rdisk_types[KNOWN_RDISK_TYPES] = {
{ ZIP_SECTORS, 512 },
{ ZIP_250_SECTORS, 512 },
};
typedef struct rdisk_drive_type_t {
const char *vendor;
const char *model;
const char *revision;
int8_t supported_media[KNOWN_RDISK_TYPES];
} rdisk_drive_type_t;
#define KNOWN_RDISK_DRIVE_TYPES 3
static const rdisk_drive_type_t rdisk_drive_types[KNOWN_RDISK_DRIVE_TYPES] = {
{ "86BOX", "REMOVABLE DISK", "1.00", { 1, 1 }},
{ "IOMEGA", "ZIP 100", "E.08", { 1, 0 }},
{ "IOMEGA", "ZIP 250", "42.S", { 1, 1 }}
};
enum {
RDISK_BUS_DISABLED = 0,
RDISK_BUS_ATAPI = 5,
RDISK_BUS_SCSI = 6,
RDISK_BUS_USB = 7
};
typedef struct rdisk_drive_t {
uint8_t id; uint8_t id;
union { union {
@@ -64,17 +95,17 @@ typedef struct zip_drive_t {
char image_path[1024]; char image_path[1024];
char prev_image_path[1024]; char prev_image_path[1024];
char *image_history[ZIP_IMAGE_HISTORY]; char *image_history[RDISK_IMAGE_HISTORY];
uint32_t is_250; uint32_t type;
uint32_t medium_size; uint32_t medium_size;
uint32_t base; uint32_t base;
} zip_drive_t; } rdisk_drive_t;
typedef struct zip_t { typedef struct rdisk_t {
mode_sense_pages_t ms_pages_saved; mode_sense_pages_t ms_pages_saved;
zip_drive_t *drv; rdisk_drive_t *drv;
#ifdef EMU_IDE_H #ifdef EMU_IDE_H
ide_tf_t *tf; ide_tf_t *tf;
#else #else
@@ -113,37 +144,37 @@ typedef struct zip_t {
double callback; double callback;
uint8_t (*ven_cmd)(void *sc, uint8_t *cdb, int32_t *BufLen); uint8_t (*ven_cmd)(void *sc, uint8_t *cdb, int32_t *BufLen);
} zip_t; } rdisk_t;
extern zip_t *zip[ZIP_NUM]; extern rdisk_t *rdisk[RDISK_NUM];
extern zip_drive_t zip_drives[ZIP_NUM]; extern rdisk_drive_t rdisk_drives[RDISK_NUM];
extern uint8_t atapi_zip_drives[8]; extern uint8_t atapi_rdisk_drives[8];
extern uint8_t scsi_zip_drives[16]; extern uint8_t scsi_rdisk_drives[16];
#define zip_sense_error dev->sense[0] #define rdisk_sense_error dev->sense[0]
#define zip_sense_key dev->sense[2] #define rdisk_sense_key dev->sense[2]
#define zip_info *(uint32_t *) &(dev->sense[3]) #define rdisk_info *(uint32_t *) &(dev->sense[3])
#define zip_asc dev->sense[12] #define rdisk_asc dev->sense[12]
#define zip_ascq dev->sense[13] #define rdisk_ascq dev->sense[13]
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
extern void zip_disk_close(const zip_t *dev); extern void rdisk_disk_close(const rdisk_t *dev);
extern void zip_disk_reload(const zip_t *dev); extern void rdisk_disk_reload(const rdisk_t *dev);
extern void zip_insert(zip_t *dev); extern void rdisk_insert(rdisk_t *dev);
extern void zip_global_init(void); extern void rdisk_global_init(void);
extern void zip_hard_reset(void); extern void rdisk_hard_reset(void);
extern void zip_reset(scsi_common_t *sc); extern void rdisk_reset(scsi_common_t *sc);
extern int zip_is_empty(const uint8_t id); extern int rdisk_is_empty(const uint8_t id);
extern void zip_load(const zip_t *dev, const char *fn, const int skip_insert); extern void rdisk_load(const rdisk_t *dev, const char *fn, const int skip_insert);
extern void zip_close(void); extern void rdisk_close(void);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
#endif /*EMU_ZIP_H*/ #endif /*EMU_RDISK_H*/

View File

@@ -49,7 +49,7 @@ extern int ui_msgbox_header(int flags, void *header, void *message);
#define SB_CARTRIDGE 0x10 #define SB_CARTRIDGE 0x10
#define SB_FLOPPY 0x20 #define SB_FLOPPY 0x20
#define SB_CDROM 0x30 #define SB_CDROM 0x30
#define SB_ZIP 0x40 #define SB_RDISK 0x40
#define SB_MO 0x50 #define SB_MO 0x50
#define SB_HDD 0x60 #define SB_HDD 0x60
#define SB_NETWORK 0x70 #define SB_NETWORK 0x70

View File

@@ -16,7 +16,7 @@
#include <86box/cartridge.h> #include <86box/cartridge.h>
#include <86box/cassette.h> #include <86box/cassette.h>
#include <86box/cdrom.h> #include <86box/cdrom.h>
#include <86box/zip.h> #include <86box/rdisk.h>
#include <86box/mo.h> #include <86box/mo.h>
#include <86box/hdd.h> #include <86box/hdd.h>
#include <86box/thread.h> #include <86box/thread.h>
@@ -36,9 +36,9 @@ machine_status_init(void)
machine_status.cdrom[i].empty = (strlen(cdrom[i].image_path) == 0); machine_status.cdrom[i].empty = (strlen(cdrom[i].image_path) == 0);
machine_status.cdrom[i].active = false; machine_status.cdrom[i].active = false;
} }
for (size_t i = 0; i < ZIP_NUM; i++) { for (size_t i = 0; i < RDISK_NUM; i++) {
machine_status.zip[i].empty = (strlen(zip_drives[i].image_path) == 0); machine_status.rdisk[i].empty = (strlen(rdisk_drives[i].image_path) == 0);
machine_status.zip[i].active = false; machine_status.rdisk[i].active = false;
} }
for (size_t i = 0; i < MO_NUM; i++) { for (size_t i = 0; i < MO_NUM; i++) {
machine_status.mo[i].empty = (strlen(mo_drives[i].image_path) == 0); machine_status.mo[i].empty = (strlen(mo_drives[i].image_path) == 0);

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

View File

@@ -67,7 +67,7 @@ public:
static bool hasSCSI(); static bool hasSCSI();
static void iterateFDD(const std::function<void(int i)> &cb); static void iterateFDD(const std::function<void(int i)> &cb);
static void iterateCDROM(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 iterateMO(const std::function<void(int i)> &cb);
static void iterateNIC(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/fdd.h>
#include <86box/cdrom.h> #include <86box/cdrom.h>
#include <86box/scsi_device.h> #include <86box/scsi_device.h>
#include <86box/zip.h> #include <86box/rdisk.h>
#include <86box/mo.h> #include <86box/mo.h>
#include <86box/path.h> #include <86box/path.h>
} }
@@ -114,8 +114,8 @@ MediaHistoryManager::maxDevicesSupported(ui::MediaType type)
return CDROM_NUM; return CDROM_NUM;
case ui::MediaType::Floppy: case ui::MediaType::Floppy:
return FDD_NUM; return FDD_NUM;
case ui::MediaType::Zip: case ui::MediaType::RDisk:
return ZIP_NUM; return RDISK_NUM;
case ui::MediaType::Mo: case ui::MediaType::Mo:
return MO_NUM; return MO_NUM;
case ui::MediaType::Cassette: case ui::MediaType::Cassette:
@@ -200,8 +200,8 @@ MediaHistoryManager::initialDeduplication()
case ui::MediaType::Optical: case ui::MediaType::Optical:
current_image = cdrom[device_index].image_path; current_image = cdrom[device_index].image_path;
break; break;
case ui::MediaType::Zip: case ui::MediaType::RDisk:
current_image = zip_drives[device_index].image_path; current_image = rdisk_drives[device_index].image_path;
break; break;
case ui::MediaType::Mo: case ui::MediaType::Mo:
current_image = mo_drives[device_index].image_path; 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]; return &fdd_image_history[index][0];
case ui::MediaType::Optical: case ui::MediaType::Optical:
return &cdrom[index].image_history[0]; return &cdrom[index].image_history[0];
case ui::MediaType::Zip: case ui::MediaType::RDisk:
return &zip_drives[index].image_history[0]; return &rdisk_drives[index].image_history[0];
case ui::MediaType::Mo: case ui::MediaType::Mo:
return &mo_drives[index].image_history[0]; return &mo_drives[index].image_history[0];
} }

View File

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

View File

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

View File

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

View File

@@ -29,7 +29,7 @@ extern "C" {
#include <86box/plat.h> #include <86box/plat.h>
#include <86box/random.h> #include <86box/random.h>
#include <86box/scsi_device.h> #include <86box/scsi_device.h>
#include <86box/zip.h> #include <86box/rdisk.h>
#include <86box/mo.h> #include <86box/mo.h>
} }
@@ -110,7 +110,7 @@ static const QStringList floppyTypes = {
"2.88 MB", "2.88 MB",
}; };
static const QStringList zipTypes = { static const QStringList rdiskTypes = {
"ZIP 100", "ZIP 100",
"ZIP 250", "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)); 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; break;
case MediaType::Zip: case MediaType::RDisk:
for (int i = 0; i < zipTypes.size(); ++i) { for (int i = 0; i < rdiskTypes.size(); ++i) {
Models::AddEntry(model, tr(zipTypes[i].toUtf8().data()), 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; break;
case MediaType::Mo: case MediaType::Mo:
for (int i = 0; i < moTypes.size(); ++i) { for (int i = 0; i < moTypes.size(); ++i) {
@@ -218,13 +218,13 @@ NewFloppyDialog::onCreate()
} }
} }
break; break;
case MediaType::Zip: case MediaType::RDisk:
{ {
fileType = fi.suffix().toLower() == QStringLiteral("zdi") ? FileType::Zdi : FileType::Img; fileType = fi.suffix().toLower() == QStringLiteral("zdi") ? FileType::Zdi : FileType::Img;
std::atomic_bool res; std::atomic_bool res;
std::thread t([this, &res, filename, fileType, &progress] { 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(); progress.exec();
t.join(); t.join();
@@ -463,7 +463,7 @@ NewFloppyDialog::createSectorImage(const QString &filename, const disk_size_t &d
} }
bool 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; uint64_t total_size = 0;
uint32_t total_sectors = 0; uint32_t total_sectors = 0;

View File

@@ -16,7 +16,7 @@ class NewFloppyDialog : public QDialog {
public: public:
enum class MediaType { enum class MediaType {
Floppy, Floppy,
Zip, RDisk,
Mo, Mo,
}; };
enum class FileType { enum class FileType {
@@ -42,7 +42,7 @@ private:
bool create86f(const QString &filename, const disk_size_t &disk_size, uint8_t rpm_mode); 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 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); 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, connect(floppyCdrom, &SettingsFloppyCDROM::cdromChannelChanged, otherRemovable,
&SettingsOtherRemovable::reloadBusChannels_MO); &SettingsOtherRemovable::reloadBusChannels_MO);
connect(floppyCdrom, &SettingsFloppyCDROM::cdromChannelChanged, otherRemovable, connect(floppyCdrom, &SettingsFloppyCDROM::cdromChannelChanged, otherRemovable,
&SettingsOtherRemovable::reloadBusChannels_ZIP); &SettingsOtherRemovable::reloadBusChannels_RDisk);
connect(harddisks, &SettingsHarddisks::driveChannelChanged, floppyCdrom, connect(harddisks, &SettingsHarddisks::driveChannelChanged, floppyCdrom,
&SettingsFloppyCDROM::reloadBusChannels); &SettingsFloppyCDROM::reloadBusChannels);
connect(harddisks, &SettingsHarddisks::driveChannelChanged, otherRemovable, connect(harddisks, &SettingsHarddisks::driveChannelChanged, otherRemovable,
&SettingsOtherRemovable::reloadBusChannels_MO); &SettingsOtherRemovable::reloadBusChannels_MO);
connect(harddisks, &SettingsHarddisks::driveChannelChanged, otherRemovable, connect(harddisks, &SettingsHarddisks::driveChannelChanged, otherRemovable,
&SettingsOtherRemovable::reloadBusChannels_ZIP); &SettingsOtherRemovable::reloadBusChannels_RDisk);
connect(otherRemovable, &SettingsOtherRemovable::moChannelChanged, harddisks, connect(otherRemovable, &SettingsOtherRemovable::moChannelChanged, harddisks,
&SettingsHarddisks::reloadBusChannels); &SettingsHarddisks::reloadBusChannels);
connect(otherRemovable, &SettingsOtherRemovable::moChannelChanged, floppyCdrom, connect(otherRemovable, &SettingsOtherRemovable::moChannelChanged, floppyCdrom,
&SettingsFloppyCDROM::reloadBusChannels); &SettingsFloppyCDROM::reloadBusChannels);
connect(otherRemovable, &SettingsOtherRemovable::moChannelChanged, otherRemovable, connect(otherRemovable, &SettingsOtherRemovable::moChannelChanged, otherRemovable,
&SettingsOtherRemovable::reloadBusChannels_ZIP); &SettingsOtherRemovable::reloadBusChannels_RDisk);
connect(otherRemovable, &SettingsOtherRemovable::zipChannelChanged, harddisks, connect(otherRemovable, &SettingsOtherRemovable::rdiskChannelChanged, harddisks,
&SettingsHarddisks::reloadBusChannels); &SettingsHarddisks::reloadBusChannels);
connect(otherRemovable, &SettingsOtherRemovable::zipChannelChanged, floppyCdrom, connect(otherRemovable, &SettingsOtherRemovable::rdiskChannelChanged, floppyCdrom,
&SettingsFloppyCDROM::reloadBusChannels); &SettingsFloppyCDROM::reloadBusChannels);
connect(otherRemovable, &SettingsOtherRemovable::zipChannelChanged, otherRemovable, connect(otherRemovable, &SettingsOtherRemovable::rdiskChannelChanged, otherRemovable,
&SettingsOtherRemovable::reloadBusChannels_MO); &SettingsOtherRemovable::reloadBusChannels_MO);
connect(ui->listView->selectionModel(), &QItemSelectionModel::currentChanged, this, connect(ui->listView->selectionModel(), &QItemSelectionModel::currentChanged, this,

View File

@@ -8,7 +8,7 @@
#define DEV_HDD 0x01 #define DEV_HDD 0x01
#define DEV_CDROM 0x02 #define DEV_CDROM 0x02
#define DEV_ZIP 0x04 #define DEV_RDISK 0x04
#define DEV_MO 0x08 #define DEV_MO 0x08
#define BUS_MFM 0 #define BUS_MFM 0
@@ -44,7 +44,7 @@ public:
int scsi_bus_full(); int scsi_bus_full();
/* Set: 0 = Clear the device from the tracking, 1 = Set the device on the tracking. /* 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. */ Bus: 0 = MFM, 1 = ESDI, 2 = XTA, 3 = IDE, 4 = SCSI. */
void device_track(int set, uint8_t dev_type, int bus, int channel); 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/timer.h>
#include <86box/scsi_device.h> #include <86box/scsi_device.h>
#include <86box/mo.h> #include <86box/mo.h>
#include <86box/zip.h> #include <86box/rdisk.h>
} }
#include <QStandardItemModel> #include <QStandardItemModel>
@@ -40,6 +40,13 @@ moDriveTypeName(int i)
mo_drive_types[i].revision); 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 static void
setMOBus(QAbstractItemModel *model, const QModelIndex &idx, uint8_t bus, uint8_t channel) 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 static void
setMOType(QAbstractItemModel *model, const QModelIndex &idx, uint32_t type) setRDiskBus(QAbstractItemModel *model, const QModelIndex &idx, uint8_t bus, uint8_t channel)
{
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)
{ {
QIcon icon; QIcon icon;
switch (bus) { switch (bus) {
case ZIP_BUS_DISABLED: case RDISK_BUS_DISABLED:
icon = QIcon(":/settings/qt/icons/zip_disabled.ico"); icon = QIcon(":/settings/qt/icons/rdisk_disabled.ico");
break; break;
case ZIP_BUS_ATAPI: case RDISK_BUS_ATAPI:
case ZIP_BUS_SCSI: case RDISK_BUS_SCSI:
icon = QIcon(":/settings/qt/icons/zip.ico"); icon = QIcon(":/settings/qt/icons/rdisk.ico");
break; break;
default: default:
@@ -100,11 +96,25 @@ setZIPBus(QAbstractItemModel *model, const QModelIndex &idx, uint8_t bus, uint8_
} }
static void static void
setZIPType(QAbstractItemModel *model, const QModelIndex &idx, bool is250) setMOType(QAbstractItemModel *model, const QModelIndex &idx, uint32_t type)
{ {
auto i = idx.siblingAtColumn(1); auto i = idx.siblingAtColumn(1);
model->setData(i, is250 ? "ZIP 250" : "ZIP 100"); if (idx.siblingAtColumn(0).data(Qt::UserRole).toUInt() == MO_BUS_DISABLED)
model->setData(i, is250, Qt::UserRole); 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) SettingsOtherRemovable::SettingsOtherRemovable(QWidget *parent)
@@ -136,24 +146,28 @@ SettingsOtherRemovable::SettingsOtherRemovable(QWidget *parent)
connect(ui->tableViewMO->selectionModel(), &QItemSelectionModel::currentRowChanged, this, &SettingsOtherRemovable::onMORowChanged); connect(ui->tableViewMO->selectionModel(), &QItemSelectionModel::currentRowChanged, this, &SettingsOtherRemovable::onMORowChanged);
ui->tableViewMO->setCurrentIndex(model->index(0, 0)); 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); model = new QStandardItemModel(0, 2, this);
ui->tableViewZIP->setModel(model); ui->tableViewRDisk->setModel(model);
model->setHeaderData(0, Qt::Horizontal, tr("Bus")); model->setHeaderData(0, Qt::Horizontal, tr("Bus"));
model->setHeaderData(1, Qt::Horizontal, tr("Type")); model->setHeaderData(1, Qt::Horizontal, tr("Type"));
model->insertRows(0, ZIP_NUM); model->insertRows(0, RDISK_NUM);
for (int i = 0; i < ZIP_NUM; i++) { for (int i = 0; i < RDISK_NUM; i++) {
auto idx = model->index(i, 0); auto idx = model->index(i, 0);
setZIPBus(model, idx, zip_drives[i].bus_type, zip_drives[i].res); setRDiskBus(model, idx, rdisk_drives[i].bus_type, rdisk_drives[i].res);
setZIPType(model, idx, zip_drives[i].is_250 > 0); setRDiskType(model, idx.siblingAtColumn(1), rdisk_drives[i].type);
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); 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->tableViewRDisk->resizeColumnsToContents();
ui->tableViewZIP->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch); ui->tableViewRDisk->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch);
connect(ui->tableViewZIP->selectionModel(), &QItemSelectionModel::currentRowChanged, this, &SettingsOtherRemovable::onZIPRowChanged); connect(ui->tableViewRDisk->selectionModel(), &QItemSelectionModel::currentRowChanged, this, &SettingsOtherRemovable::onRDiskRowChanged);
ui->tableViewZIP->setCurrentIndex(model->index(0, 0)); ui->tableViewRDisk->setCurrentIndex(model->index(0, 0));
} }
SettingsOtherRemovable::~SettingsOtherRemovable() SettingsOtherRemovable::~SettingsOtherRemovable()
@@ -173,13 +187,13 @@ SettingsOtherRemovable::save()
mo_drives[i].type = model->index(i, 1).data(Qt::UserRole).toUInt(); mo_drives[i].type = model->index(i, 1).data(Qt::UserRole).toUInt();
} }
model = ui->tableViewZIP->model(); model = ui->tableViewRDisk->model();
for (uint8_t i = 0; i < ZIP_NUM; i++) { for (uint8_t i = 0; i < RDISK_NUM; i++) {
zip_drives[i].fp = NULL; rdisk_drives[i].fp = NULL;
zip_drives[i].priv = NULL; rdisk_drives[i].priv = NULL;
zip_drives[i].bus_type = model->index(i, 0).data(Qt::UserRole).toUInt(); rdisk_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(); rdisk_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; rdisk_drives[i].type = model->index(i, 1).data(Qt::UserRole).toUInt();
} }
} }
@@ -205,24 +219,24 @@ SettingsOtherRemovable::onMORowChanged(const QModelIndex &current)
} }
void void
SettingsOtherRemovable::onZIPRowChanged(const QModelIndex &current) SettingsOtherRemovable::onRDiskRowChanged(const QModelIndex &current)
{ {
uint8_t bus = current.siblingAtColumn(0).data(Qt::UserRole).toUInt(); uint8_t bus = current.siblingAtColumn(0).data(Qt::UserRole).toUInt();
uint8_t channel = current.siblingAtColumn(0).data(Qt::UserRole + 1).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); ui->comboBoxRDiskBus->setCurrentIndex(-1);
const auto *model = ui->comboBoxZIPBus->model(); const auto *model = ui->comboBoxRDiskBus->model();
auto match = model->match(model->index(0, 0), Qt::UserRole, bus); auto match = model->match(model->index(0, 0), Qt::UserRole, bus);
if (!match.isEmpty()) 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); match = model->match(model->index(0, 0), Qt::UserRole, channel);
if (!match.isEmpty()) if (!match.isEmpty())
ui->comboBoxZIPChannel->setCurrentIndex(match.first().row()); ui->comboBoxRDiskChannel->setCurrentIndex(match.first().row());
ui->checkBoxZIP250->setChecked(is250); ui->comboBoxRDiskType->setCurrentIndex(type);
enableCurrentlySelectedChannel_ZIP(); enableCurrentlySelectedChannel_RDisk();
} }
void void
@@ -234,6 +248,15 @@ SettingsOtherRemovable::reloadBusChannels_MO() {
enableCurrentlySelectedChannel_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 void
SettingsOtherRemovable::on_comboBoxMOBus_currentIndexChanged(int index) 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 void
SettingsOtherRemovable::on_comboBoxMOBus_activated(int) SettingsOtherRemovable::on_comboBoxMOBus_activated(int)
{ {
@@ -253,8 +288,8 @@ SettingsOtherRemovable::on_comboBoxMOBus_activated(int)
Harddrives::busTrackClass->device_track(0, DEV_MO, ui->tableViewMO->model()->data(i, Harddrives::busTrackClass->device_track(0, DEV_MO, ui->tableViewMO->model()->data(i,
Qt::UserRole).toInt(), ui->tableViewMO->model()->data(i, Qt::UserRole).toInt(), ui->tableViewMO->model()->data(i,
Qt::UserRole + 1).toInt()); Qt::UserRole + 1).toInt());
ui->comboBoxMOChannel->setCurrentIndex(ui->comboBoxMOBus->currentData().toUInt() == ui->comboBoxMOChannel->setCurrentIndex(ui->comboBoxMOBus->currentData().toUInt() == MO_BUS_ATAPI ?
MO_BUS_ATAPI ? Harddrives::busTrackClass->next_free_ide_channel() : Harddrives::busTrackClass->next_free_ide_channel() :
Harddrives::busTrackClass->next_free_scsi_id()); Harddrives::busTrackClass->next_free_scsi_id());
ui->tableViewMO->model()->data(i, Qt::UserRole + 1); ui->tableViewMO->model()->data(i, Qt::UserRole + 1);
setMOBus(ui->tableViewMO->model(), setMOBus(ui->tableViewMO->model(),
@@ -272,6 +307,32 @@ SettingsOtherRemovable::on_comboBoxMOBus_activated(int)
emit moChannelChanged(); 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 void
SettingsOtherRemovable::enableCurrentlySelectedChannel_MO() SettingsOtherRemovable::enableCurrentlySelectedChannel_MO()
{ {
@@ -282,6 +343,15 @@ SettingsOtherRemovable::enableCurrentlySelectedChannel_MO()
item->setEnabled(true); 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 void
SettingsOtherRemovable::on_comboBoxMOChannel_activated(int) SettingsOtherRemovable::on_comboBoxMOChannel_activated(int)
{ {
@@ -299,6 +369,23 @@ SettingsOtherRemovable::on_comboBoxMOChannel_activated(int)
emit moChannelChanged(); 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 void
SettingsOtherRemovable::on_comboBoxMOType_activated(int) SettingsOtherRemovable::on_comboBoxMOType_activated(int)
{ {
@@ -310,77 +397,11 @@ SettingsOtherRemovable::on_comboBoxMOType_activated(int)
} }
void void
SettingsOtherRemovable::reloadBusChannels_ZIP() { SettingsOtherRemovable::on_comboBoxRDiskType_activated(int)
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)
{ {
if (index >= 0) { setRDiskType(ui->tableViewRDisk->model(),
int bus = ui->comboBoxZIPBus->currentData().toInt(); ui->tableViewRDisk->selectionModel()->currentIndex(),
bool enabled = (bus != ZIP_BUS_DISABLED); ui->comboBoxRDiskType->currentData().toUInt());
ui->comboBoxZIPChannel->setEnabled(enabled); ui->tableViewRDisk->resizeColumnsToContents();
ui->checkBoxZIP250->setEnabled(enabled); ui->tableViewRDisk->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch);
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);
} }

View File

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

View File

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

View File

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

View File

@@ -1,6 +1,5 @@
<RCC> <RCC>
<qresource prefix="/settings"> <qresource prefix="/settings">
<file>qt/icons/browse.ico</file>
<file>qt/icons/cartridge.ico</file> <file>qt/icons/cartridge.ico</file>
<file>qt/icons/cartridge_image.ico</file> <file>qt/icons/cartridge_image.ico</file>
<file>qt/icons/cassette_image.ico</file> <file>qt/icons/cassette_image.ico</file>
@@ -13,8 +12,6 @@
<file>qt/icons/cdrom_folder.ico</file> <file>qt/icons/cdrom_folder.ico</file>
<file>qt/icons/cdrom_host.ico</file> <file>qt/icons/cdrom_host.ico</file>
<file>qt/icons/display.ico</file> <file>qt/icons/display.ico</file>
<file>qt/icons/eject.ico</file>
<file>qt/icons/export.ico</file>
<file>qt/icons/fast_forward.ico</file> <file>qt/icons/fast_forward.ico</file>
<file>qt/icons/floppy_35.ico</file> <file>qt/icons/floppy_35.ico</file>
<file>qt/icons/floppy_35_image.ico</file> <file>qt/icons/floppy_35_image.ico</file>
@@ -29,10 +26,12 @@
<file>qt/icons/mo_image.ico</file> <file>qt/icons/mo_image.ico</file>
<file>qt/icons/mo_disabled.ico</file> <file>qt/icons/mo_disabled.ico</file>
<file>qt/icons/network.ico</file> <file>qt/icons/network.ico</file>
<file>qt/icons/new.ico</file>
<file>qt/icons/other_peripherals.ico</file> <file>qt/icons/other_peripherals.ico</file>
<file>qt/icons/other_removable_devices.ico</file> <file>qt/icons/other_removable_devices.ico</file>
<file>qt/icons/ports.ico</file> <file>qt/icons/ports.ico</file>
<file>qt/icons/rdisk.ico</file>
<file>qt/icons/rdisk_image.ico</file>
<file>qt/icons/rdisk_disabled.ico</file>
<file>qt/icons/record.ico</file> <file>qt/icons/record.ico</file>
<file>qt/icons/rewind.ico</file> <file>qt/icons/rewind.ico</file>
<file>qt/icons/sound.ico</file> <file>qt/icons/sound.ico</file>
@@ -40,10 +39,11 @@
<file>qt/icons/superdisk.ico</file> <file>qt/icons/superdisk.ico</file>
<file>qt/icons/superdisk_image.ico</file> <file>qt/icons/superdisk_image.ico</file>
<file>qt/icons/superdisk_disabled.ico</file> <file>qt/icons/superdisk_disabled.ico</file>
<file>qt/icons/zip.ico</file>
<file>qt/icons/zip_image.ico</file>
<file>qt/icons/zip_disabled.ico</file>
<file>qt/icons/active.ico</file> <file>qt/icons/active.ico</file>
<file>qt/icons/browse.ico</file>
<file>qt/icons/eject.ico</file>
<file>qt/icons/export.ico</file>
<file>qt/icons/new.ico</file>
<file>qt/icons/write_protected.ico</file> <file>qt/icons/write_protected.ico</file>
<file>qt/icons/write_active.ico</file> <file>qt/icons/write_active.ico</file>
<file>qt/icons/disabled.ico</file> <file>qt/icons/disabled.ico</file>

View File

@@ -33,7 +33,7 @@
#include <86box/scsi.h> #include <86box/scsi.h>
#include <86box/scsi_device.h> #include <86box/scsi_device.h>
#include <86box/cdrom.h> #include <86box/cdrom.h>
#include <86box/zip.h> #include <86box/rdisk.h>
#include <86box/scsi_disk.h> #include <86box/scsi_disk.h>
#include <86box/scsi_aha154x.h> #include <86box/scsi_aha154x.h>
#include <86box/scsi_buslogic.h> #include <86box/scsi_buslogic.h>

View File

@@ -1006,12 +1006,12 @@ monitor_thread(UNUSED(void *param))
printf( printf(
"fddload <id> <filename> <wp> - Load floppy disk image into drive <id>.\n" "fddload <id> <filename> <wp> - Load floppy disk image into drive <id>.\n"
"cdload <id> <filename> - Load CD-ROM image into drive <id>.\n" "cdload <id> <filename> - Load CD-ROM image into drive <id>.\n"
"zipload <id> <filename> <wp> - Load ZIP image into ZIP drive <id>.\n" "rdiskload <id> <filename> <wp> - Load removable disk image into removable disk drive <id>.\n"
"cartload <id> <filename> <wp> - Load cartridge image into cartridge drive <id>.\n" "cartload <id> <filename> <wp> - Load cartridge image into cartridge drive <id>.\n"
"moload <id> <filename> <wp> - Load MO image into MO drive <id>.\n\n" "moload <id> <filename> <wp> - Load MO image into MO drive <id>.\n\n"
"fddeject <id> - eject disk from floppy drive <id>.\n" "fddeject <id> - eject disk from floppy drive <id>.\n"
"cdeject <id> - eject disc from CD-ROM drive <id>.\n" "cdeject <id> - eject disc from CD-ROM drive <id>.\n"
"zipeject <id> - eject ZIP image from ZIP drive <id>.\n" "rdiskeject <id> - eject removable disk image from removable disk drive <id>.\n"
"carteject <id> - eject cartridge from drive <id>.\n" "carteject <id> - eject cartridge from drive <id>.\n"
"moeject <id> - eject image from MO drive <id>.\n\n" "moeject <id> - eject image from MO drive <id>.\n\n"
"hardreset - hard reset the emulated system.\n" "hardreset - hard reset the emulated system.\n"
@@ -1116,8 +1116,8 @@ monitor_thread(UNUSED(void *param))
mo_eject(atoi(xargv[1])); mo_eject(atoi(xargv[1]));
} else if (strncasecmp(xargv[0], "carteject", 8) == 0 && cmdargc >= 2) { } else if (strncasecmp(xargv[0], "carteject", 8) == 0 && cmdargc >= 2) {
cartridge_eject(atoi(xargv[1])); cartridge_eject(atoi(xargv[1]));
} else if (strncasecmp(xargv[0], "zipeject", 8) == 0 && cmdargc >= 2) { } else if (strncasecmp(xargv[0], "rdiskeject", 8) == 0 && cmdargc >= 2) {
zip_eject(atoi(xargv[1])); rdisk_eject(atoi(xargv[1]));
} else if (strncasecmp(xargv[0], "fddload", 7) == 0 && cmdargc >= 4) { } else if (strncasecmp(xargv[0], "fddload", 7) == 0 && cmdargc >= 4) {
uint8_t id; uint8_t id;
uint8_t wp; uint8_t wp;
@@ -1184,7 +1184,7 @@ monitor_thread(UNUSED(void *param))
printf("Inserting tape into cartridge holder %hhu: %s\n", id, fn); printf("Inserting tape into cartridge holder %hhu: %s\n", id, fn);
cartridge_mount(id, fn, wp); cartridge_mount(id, fn, wp);
} }
} else if (strncasecmp(xargv[0], "zipload", 7) == 0 && cmdargc >= 4) { } else if (strncasecmp(xargv[0], "rdiskload", 7) == 0 && cmdargc >= 4) {
uint8_t id; uint8_t id;
uint8_t wp; uint8_t wp;
bool err = false; bool err = false;
@@ -1203,8 +1203,8 @@ monitor_thread(UNUSED(void *param))
if (fn[strlen(fn) - 1] == '\'' if (fn[strlen(fn) - 1] == '\''
|| fn[strlen(fn) - 1] == '"') || fn[strlen(fn) - 1] == '"')
fn[strlen(fn) - 1] = '\0'; fn[strlen(fn) - 1] = '\0';
printf("Inserting disk into ZIP drive %c: %s\n", id + 'A', fn); printf("Inserting disk into removable disk drive %c: %s\n", id + 'A', fn);
zip_mount(id, fn, wp); rdisk_mount(id, fn, wp);
} }
} }
free(line); free(line);

View File

@@ -6,7 +6,7 @@
* *
* This file is part of the 86Box distribution. * This file is part of the 86Box distribution.
* *
* Handle the platform-side of CDROM/ZIP/MO drives. * Handle the platform-side of CDROM/RDisk/MO drives.
* *
* *
* *
@@ -34,7 +34,7 @@
#include <86box/cdrom.h> #include <86box/cdrom.h>
#include <86box/cdrom_image.h> #include <86box/cdrom_image.h>
#include <86box/mo.h> #include <86box/mo.h>
#include <86box/zip.h> #include <86box/rdisk.h>
#include <86box/scsi_disk.h> #include <86box/scsi_disk.h>
#include <86box/plat.h> #include <86box/plat.h>
#include <86box/ui.h> #include <86box/ui.h>
@@ -220,58 +220,58 @@ mo_reload(uint8_t id)
} }
void void
zip_eject(uint8_t id) rdisk_eject(uint8_t id)
{ {
zip_t *dev = (zip_t *) zip_drives[id].priv; rdisk_t *dev = (rdisk_t *) rdisk_drives[id].priv;
zip_disk_close(dev); rdisk_disk_close(dev);
if (zip_drives[id].bus_type) { if (rdisk_drives[id].bus_type) {
/* Signal disk change to the emulated machine. */ /* Signal disk change to the emulated machine. */
zip_insert(dev); rdisk_insert(dev);
} }
ui_sb_update_icon_state(SB_ZIP | id, 1); ui_sb_update_icon_state(SB_RDISK | id, 1);
#if 0 #if 0
media_menu_update_zip(id); media_menu_update_rdisk(id);
#endif #endif
ui_sb_update_tip(SB_ZIP | id); ui_sb_update_tip(SB_RDISK | id);
config_save(); config_save();
} }
void void
zip_mount(uint8_t id, char *fn, uint8_t wp) rdisk_mount(uint8_t id, char *fn, uint8_t wp)
{ {
zip_t *dev = (zip_t *) zip_drives[id].priv; rdisk_t *dev = (rdisk_t *) rdisk_drives[id].priv;
zip_disk_close(dev); rdisk_disk_close(dev);
zip_drives[id].read_only = wp; rdisk_drives[id].read_only = wp;
zip_load(dev, fn, 0); rdisk_load(dev, fn, 0);
ui_sb_update_icon_state(SB_ZIP | id, strlen(zip_drives[id].image_path) ? 0 : 1); ui_sb_update_icon_state(SB_RDISK | id, strlen(rdisk_drives[id].image_path) ? 0 : 1);
#if 0 #if 0
media_menu_update_zip(id); media_menu_update_rdisk(id);
#endif #endif
ui_sb_update_tip(SB_ZIP | id); ui_sb_update_tip(SB_RDISK | id);
config_save(); config_save();
} }
void void
zip_reload(uint8_t id) rdisk_reload(uint8_t id)
{ {
zip_t *dev = (zip_t *) zip_drives[id].priv; rdisk_t *dev = (rdisk_t *) rdisk_drives[id].priv;
zip_disk_reload(dev); rdisk_disk_reload(dev);
if (strlen(zip_drives[id].image_path) == 0) { if (strlen(rdisk_drives[id].image_path) == 0) {
ui_sb_update_icon_state(SB_ZIP | id, 1); ui_sb_update_icon_state(SB_RDISK | id, 1);
} else { } else {
ui_sb_update_icon_state(SB_ZIP | id, 0); ui_sb_update_icon_state(SB_RDISK | id, 0);
} }
#if 0 #if 0
media_menu_update_zip(id); media_menu_update_rdisk(id);
#endif #endif
ui_sb_update_tip(SB_ZIP | id); ui_sb_update_tip(SB_RDISK | id);
config_save(); config_save();
} }