Merge branch 'master' into mke

This commit is contained in:
Cacodemon345
2025-07-26 01:13:59 +06:00
committed by GitHub
40 changed files with 1358 additions and 1148 deletions

View File

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

View File

@@ -99,7 +99,7 @@ if(INSTRUMENT)
add_compile_definitions(USE_INSTRUMENT)
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)
if(HAIKU)

View File

@@ -65,7 +65,7 @@
#include <86box/scsi_device.h>
#include <86box/cdrom.h>
#include <86box/cdrom_interface.h>
#include <86box/zip.h>
#include <86box/rdisk.h>
#include <86box/mo.h>
#include <86box/sound.h>
#include <86box/midi.h>
@@ -1459,32 +1459,35 @@ load_other_removable_devices(void)
unsigned int board = 0;
unsigned int dev = 0;
int c;
int legacy_zip_drives = 0;
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);
p = ini_section_get_string(cat, temp, NULL);
if (p != NULL)
sscanf(p, "%01u, %s", &zip_drives[c].is_250, s);
else
sscanf("0, none", "%01u, %s", &zip_drives[c].is_250, s);
zip_drives[c].bus_type = hdd_string_to_bus(s, 1);
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].type++;
rdisk_drives[c].bus_type = hdd_string_to_bus(s, 1);
/* 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(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;
zip_drives[c].ide_channel = (board << 1) + dev;
rdisk_drives[c].ide_channel = (board << 1) + dev;
if (zip_drives[c].ide_channel > 7)
zip_drives[c].ide_channel = 7;
} else if (zip_drives[c].bus_type == ZIP_BUS_SCSI) {
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, "zip_%02i_scsi_location", c + 1);
sprintf(tmp2, "%01u:%02u", SCSI_BUS_MAX, c + 2);
p = ini_section_get_string(cat, temp, tmp2);
@@ -1492,23 +1495,23 @@ load_other_removable_devices(void)
if (board >= SCSI_BUS_MAX) {
/* Invalid bus - check legacy ID */
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)
zip_drives[c].scsi_device_id = 15;
if (rdisk_drives[c].scsi_device_id > 15)
rdisk_drives[c].scsi_device_id = 15;
} else {
board %= SCSI_BUS_MAX;
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);
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);
ini_section_delete_var(cat, temp);
}
@@ -1520,49 +1523,154 @@ load_other_removable_devices(void)
p = ini_section_get_string(cat, temp, "");
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);
if (!strcmp(p, usr_path))
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);
}
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);
p = ini_section_get_string(cat, temp, NULL);
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",
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);
sprintf(temp, "zip_%02i_ide_channel", c + 1);
ini_section_delete_var(cat, temp);
sprintf(temp, "zip_%02i_scsi_location", c + 1);
ini_section_delete_var(cat, temp);
sprintf(temp, "zip_%02i_image_path", c + 1);
ini_section_delete_var(cat, temp);
for (int i = 0; i < MAX_PREV_IMAGES; i++) {
sprintf(temp, "zip_%02i_image_history_%02i", c + 1, i + 1);
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, "zip_%02i_ide_channel", c + 1);
sprintf(temp, "rdisk_%02i_ide_channel", c + 1);
ini_section_delete_var(cat, temp);
sprintf(temp, "zip_%02i_scsi_location", c + 1);
sprintf(temp, "rdisk_%02i_scsi_location", c + 1);
ini_section_delete_var(cat, temp);
sprintf(temp, "zip_%02i_image_path", c + 1);
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, "zip_%02i_image_history_%02i", c + 1, i + 1);
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));
for (c = 0; c < MO_NUM; c++) {
sprintf(temp, "mo_%02i_parameters", c + 1);
@@ -1821,7 +1929,7 @@ config_load(void)
#ifdef USE_IOCTL
memset(cdrom_ioctl, 0, sizeof(cdrom_ioctl_t) * CDROM_NUM);
#endif
memset(zip_drives, 0, sizeof(zip_drive_t));
memset(rdisk_drives, 0, sizeof(rdisk_drive_t));
config = ini_read(cfg_path);
@@ -3046,52 +3154,52 @@ save_other_removable_devices(void)
char tmp2[512];
int c;
for (c = 0; c < ZIP_NUM; c++) {
sprintf(temp, "zip_%02i_parameters", c + 1);
if (zip_drives[c].bus_type == 0) {
for (c = 0; c < RDISK_NUM; c++) {
sprintf(temp, "rdisk_%02i_parameters", c + 1);
if (rdisk_drives[c].bus_type == 0) {
ini_section_delete_var(cat, temp);
} else {
sprintf(tmp2, "%u, %s", zip_drives[c].is_250,
hdd_bus_to_string(zip_drives[c].bus_type, 1));
sprintf(tmp2, "%u, %s", rdisk_drives[c].type,
hdd_bus_to_string(rdisk_drives[c].bus_type, 1));
ini_section_set_string(cat, temp, tmp2);
}
sprintf(temp, "zip_%02i_ide_channel", c + 1);
if (zip_drives[c].bus_type != ZIP_BUS_ATAPI)
sprintf(temp, "rdisk_%02i_ide_channel", c + 1);
if (rdisk_drives[c].bus_type != RDISK_BUS_ATAPI)
ini_section_delete_var(cat, temp);
else {
sprintf(tmp2, "%01u:%01u", zip_drives[c].ide_channel >> 1,
zip_drives[c].ide_channel & 1);
sprintf(tmp2, "%01u:%01u", rdisk_drives[c].ide_channel >> 1,
rdisk_drives[c].ide_channel & 1);
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);
sprintf(temp, "zip_%02i_writeprot", c + 1);
sprintf(temp, "rdisk_%02i_writeprot", c + 1);
ini_section_delete_var(cat, temp);
sprintf(temp, "zip_%02i_scsi_location", c + 1);
if (zip_drives[c].bus_type != ZIP_BUS_SCSI)
sprintf(temp, "rdisk_%02i_scsi_location", c + 1);
if (rdisk_drives[c].bus_type != RDISK_BUS_SCSI)
ini_section_delete_var(cat, temp);
else {
sprintf(tmp2, "%01u:%02u", zip_drives[c].scsi_device_id >> 4,
zip_drives[c].scsi_device_id & 15);
sprintf(tmp2, "%01u:%02u", rdisk_drives[c].scsi_device_id >> 4,
rdisk_drives[c].scsi_device_id & 15);
ini_section_set_string(cat, temp, tmp2);
}
sprintf(temp, "zip_%02i_image_path", c + 1);
if ((zip_drives[c].bus_type == 0) || (strlen(zip_drives[c].image_path) == 0))
sprintf(temp, "rdisk_%02i_image_path", c + 1);
if ((rdisk_drives[c].bus_type == 0) || (strlen(rdisk_drives[c].image_path) == 0))
ini_section_delete_var(cat, temp);
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++) {
sprintf(temp, "zip_%02i_image_history_%02i", c + 1, i + 1);
if ((zip_drives[c].image_history[i] == 0) || strlen(zip_drives[c].image_history[i]) == 0)
sprintf(temp, "rdisk_%02i_image_history_%02i", c + 1, i + 1);
if ((rdisk_drives[c].image_history[i] == 0) || strlen(rdisk_drives[c].image_history[i]) == 0)
ini_section_delete_var(cat, temp);
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
)
add_library(zip OBJECT zip.c)
add_library(rdisk OBJECT rdisk.c)
add_library(mo OBJECT mo.c)

View File

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

View File

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

View File

@@ -34,7 +34,7 @@
#include <86box/hdc.h>
#include <86box/hdc_ide.h>
#include <86box/hdc_ide_sff8038i.h>
#include <86box/zip.h>
#include <86box/rdisk.h>
#include <86box/mo.h>
typedef struct rz1000_t {
@@ -182,10 +182,10 @@ rz1000_reset(void *priv)
(cdrom[i].ide_channel <= max_channel) && cdrom[i].priv)
scsi_cdrom_reset((scsi_common_t *) cdrom[i].priv);
}
for (i = 0; i < ZIP_NUM; i++) {
if ((zip_drives[i].bus_type == ZIP_BUS_ATAPI) && (zip_drives[i].ide_channel >= min_channel) &&
(zip_drives[i].ide_channel <= max_channel) && zip_drives[i].priv)
zip_reset((scsi_common_t *) zip_drives[i].priv);
for (i = 0; i < RDISK_NUM; i++) {
if ((rdisk_drives[i].bus_type == RDISK_BUS_ATAPI) && (rdisk_drives[i].ide_channel >= min_channel) &&
(rdisk_drives[i].ide_channel <= max_channel) && rdisk_drives[i].priv)
rdisk_reset((scsi_common_t *) rdisk_drives[i].priv);
}
for (i = 0; i < MO_NUM; i++) {
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_ide.h>
#include <86box/hdc_ide_sff8038i.h>
#include <86box/zip.h>
#include <86box/rdisk.h>
#include <86box/mo.h>
#include <86box/plat_unused.h>
@@ -489,10 +489,10 @@ sff_reset(void *priv)
cdrom[i].priv)
scsi_cdrom_reset((scsi_common_t *) cdrom[i].priv);
}
for (uint8_t i = 0; i < ZIP_NUM; i++) {
if ((zip_drives[i].bus_type == ZIP_BUS_ATAPI) && (zip_drives[i].ide_channel < 4) &&
zip_drives[i].priv)
zip_reset((scsi_common_t *) zip_drives[i].priv);
for (uint8_t i = 0; i < RDISK_NUM; i++) {
if ((rdisk_drives[i].bus_type == RDISK_BUS_ATAPI) && (rdisk_drives[i].ide_channel < 4) &&
rdisk_drives[i].priv)
rdisk_reset((scsi_common_t *) rdisk_drives[i].priv);
}
for (uint8_t i = 0; i < MO_NUM; i++) {
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_ide.h>
#include <86box/hdc_ide_sff8038i.h>
#include <86box/zip.h>
#include <86box/rdisk.h>
#include <86box/mo.h>
typedef struct w83769f_t {
@@ -297,10 +297,10 @@ w83769f_reset(void *priv)
(cdrom[i].ide_channel <= max_channel) && cdrom[i].priv)
scsi_cdrom_reset((scsi_common_t *) cdrom[i].priv);
}
for (i = 0; i < ZIP_NUM; i++) {
if ((zip_drives[i].bus_type == ZIP_BUS_ATAPI) && (zip_drives[i].ide_channel >= min_channel) &&
(zip_drives[i].ide_channel <= max_channel) && zip_drives[i].priv)
zip_reset((scsi_common_t *) zip_drives[i].priv);
for (i = 0; i < RDISK_NUM; i++) {
if ((rdisk_drives[i].bus_type == RDISK_BUS_ATAPI) && (rdisk_drives[i].ide_channel >= min_channel) &&
(rdisk_drives[i].ide_channel <= max_channel) && rdisk_drives[i].priv)
rdisk_reset((scsi_common_t *) rdisk_drives[i].priv);
}
for (i = 0; i < MO_NUM; i++) {
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 */
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;
#endif

View File

@@ -20,7 +20,7 @@ typedef struct dev_status_empty_t {
typedef struct machine_status_t {
dev_status_empty_active_t fdd[FDD_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 cassette;
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 cdrom_mount(uint8_t id, char *fn);
extern void plat_cdrom_ui_update(uint8_t id, uint8_t reload);
extern void zip_eject(uint8_t id);
extern void zip_mount(uint8_t id, char *fn, uint8_t wp);
extern void zip_reload(uint8_t id);
extern void rdisk_eject(uint8_t id);
extern void rdisk_mount(uint8_t id, char *fn, uint8_t wp);
extern void rdisk_reload(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_reload(uint8_t id);

View File

@@ -16,29 +16,60 @@
* Copyright 2018-2025 Miran Grca.
*/
#ifndef EMU_ZIP_H
#define EMU_ZIP_H
#ifndef EMU_RDISK_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 {
ZIP_BUS_DISABLED = 0,
ZIP_BUS_ATAPI = 5,
ZIP_BUS_SCSI = 6,
ZIP_BUS_USB = 7
RDISK_TYPE_GENERIC = 0,
RDISK_TYPE_ZIP_100,
RDISK_TYPE_ZIP_250
};
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;
union {
@@ -64,17 +95,17 @@ typedef struct zip_drive_t {
char 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 base;
} zip_drive_t;
} rdisk_drive_t;
typedef struct zip_t {
typedef struct rdisk_t {
mode_sense_pages_t ms_pages_saved;
zip_drive_t *drv;
rdisk_drive_t *drv;
#ifdef EMU_IDE_H
ide_tf_t *tf;
#else
@@ -113,37 +144,37 @@ typedef struct zip_t {
double callback;
uint8_t (*ven_cmd)(void *sc, uint8_t *cdb, int32_t *BufLen);
} zip_t;
} rdisk_t;
extern zip_t *zip[ZIP_NUM];
extern zip_drive_t zip_drives[ZIP_NUM];
extern uint8_t atapi_zip_drives[8];
extern uint8_t scsi_zip_drives[16];
extern rdisk_t *rdisk[RDISK_NUM];
extern rdisk_drive_t rdisk_drives[RDISK_NUM];
extern uint8_t atapi_rdisk_drives[8];
extern uint8_t scsi_rdisk_drives[16];
#define zip_sense_error dev->sense[0]
#define zip_sense_key dev->sense[2]
#define zip_info *(uint32_t *) &(dev->sense[3])
#define zip_asc dev->sense[12]
#define zip_ascq dev->sense[13]
#define rdisk_sense_error dev->sense[0]
#define rdisk_sense_key dev->sense[2]
#define rdisk_info *(uint32_t *) &(dev->sense[3])
#define rdisk_asc dev->sense[12]
#define rdisk_ascq dev->sense[13]
#ifdef __cplusplus
extern "C" {
#endif
extern void zip_disk_close(const zip_t *dev);
extern void zip_disk_reload(const zip_t *dev);
extern void zip_insert(zip_t *dev);
extern void rdisk_disk_close(const rdisk_t *dev);
extern void rdisk_disk_reload(const rdisk_t *dev);
extern void rdisk_insert(rdisk_t *dev);
extern void zip_global_init(void);
extern void zip_hard_reset(void);
extern void rdisk_global_init(void);
extern void rdisk_hard_reset(void);
extern void zip_reset(scsi_common_t *sc);
extern int zip_is_empty(const uint8_t id);
extern void zip_load(const zip_t *dev, const char *fn, const int skip_insert);
extern void zip_close(void);
extern void rdisk_reset(scsi_common_t *sc);
extern int rdisk_is_empty(const uint8_t id);
extern void rdisk_load(const rdisk_t *dev, const char *fn, const int skip_insert);
extern void rdisk_close(void);
#ifdef __cplusplus
}
#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_FLOPPY 0x20
#define SB_CDROM 0x30
#define SB_ZIP 0x40
#define SB_RDISK 0x40
#define SB_MO 0x50
#define SB_HDD 0x60
#define SB_NETWORK 0x70

View File

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

@@ -40,7 +40,7 @@ msgid "Hide &toolbar"
msgstr "Masquer la &barre d'outils"
msgid "&Resizeable window"
msgstr "Fenêtre &Redimensionnable"
msgstr "Fenêtre &redimensionnable"
msgid "R&emember size && position"
msgstr "S&auvegarder taille && position"
@@ -64,10 +64,10 @@ msgid "Specify dimensions..."
msgstr "Spécifier dimensions..."
msgid "F&orce 4:3 display ratio"
msgstr "F&orcer 4:3"
msgstr "F&orcer le ratio 4:3"
msgid "&Window scale factor"
msgstr "&Echelle facteur"
msgstr "&Echelle de facteur"
msgid "&0.5x"
msgstr "&0.5x"
@@ -100,7 +100,7 @@ msgid "&8x"
msgstr "&8x"
msgid "Filter method"
msgstr "Méthode Filtre"
msgstr "Méthode de Filtre"
msgid "&Nearest"
msgstr "&Plus proche"
@@ -112,10 +112,10 @@ msgid "Hi&DPI scaling"
msgstr "Mise à l'échelle Hi&DPI"
msgid "&Fullscreen"
msgstr "&Plein Ecran"
msgstr "&Plein écran"
msgid "Fullscreen &stretch mode"
msgstr "Mode &Elargi plein écran"
msgstr "Mode plein écran &étiré"
msgid "&Full screen stretch"
msgstr "&Plein écran étiré"
@@ -124,13 +124,13 @@ msgid "&4:3"
msgstr "&4:3"
msgid "&Square pixels (Keep ratio)"
msgstr "Pixels &carrés (Keep ratio)"
msgstr "Pixels &carrés (Conserver le ratio)"
msgid "&Integer scale"
msgstr "Echelle &Entière"
msgstr "&Echelle entière"
msgid "4:&3 Integer scale"
msgstr "Echelle Entière 4:&3"
msgstr "Echelle entière 4:&3"
msgid "E&GA/(S)VGA settings"
msgstr "Réglages E&GA/(S)VGA"
@@ -139,13 +139,13 @@ msgid "&Inverted VGA monitor"
msgstr "Moniteur VGA &Inversé"
msgid "VGA screen &type"
msgstr "&Type Ecran VGA"
msgstr "&Type d'écran VGA"
msgid "RGB &Color"
msgstr "RGB &Couleur"
msgstr "&Couleurs RGB"
msgid "&RGB Grayscale"
msgstr "&RGB Ton de Gris"
msgstr "Niveau de Gris &RGB "
msgid "&Amber monitor"
msgstr "Moniteur &Ambre"
@@ -157,7 +157,7 @@ msgid "&White monitor"
msgstr "Moniteur &Blanc"
msgid "Grayscale &conversion type"
msgstr "Mode &Conversion tons de gris"
msgstr "Type de &conversion du niveau de Gris"
msgid "BT&601 (NTSC/PAL)"
msgstr "BT&601 (NTSC/PAL)"
@@ -166,16 +166,16 @@ msgid "BT&709 (HDTV)"
msgstr "BT&709 (HDTV)"
msgid "&Average"
msgstr "&Moyenne"
msgstr "&Moyen"
msgid "CGA/PCjr/Tandy/E&GA/(S)VGA overscan"
msgstr "Overscan CGA/PCjr/Tandy/E&GA/(S)VGA"
msgstr "CGA/PCjr/Tandy/E&GA/(S)VGA overscan"
msgid "Change contrast for &monochrome display"
msgstr "Modifier contraste affichage &monochrome"
msgstr "Modifier le contraste de l'affichage &monochrome"
msgid "&Media"
msgstr "&Media"
msgstr "&Média"
msgid "&Tools"
msgstr "Ou&tils"
@@ -187,7 +187,7 @@ msgid "&Update status bar icons"
msgstr "Mettre à jour la barre de stat&us"
msgid "Take s&creenshot"
msgstr "Copie &Ecran"
msgstr "Copie &d'écran"
msgid "S&ound"
msgstr "S&on"
@@ -196,7 +196,7 @@ msgid "&Preferences..."
msgstr "&Préférences..."
msgid "Enable &Discord integration"
msgstr "Activer intégration &Discord"
msgstr "Activer l'intégration &Discord"
msgid "Sound &gain..."
msgstr "&Gain Son..."
@@ -235,7 +235,7 @@ msgid "&Rewind to the beginning"
msgstr "&Revenir au debut"
msgid "&Fast forward to the end"
msgstr "Aller à la &Fin"
msgstr "Avance rapide jusqu'à la &Fin"
msgid "E&ject"
msgstr "É&jecter"
@@ -244,13 +244,13 @@ msgid "&Image..."
msgstr "&Image..."
msgid "E&xport to 86F..."
msgstr "E&xporter vers 86F..."
msgstr "E&xport vers 86F..."
msgid "&Mute"
msgstr "&Couper"
msgid "E&mpty"
msgstr "E&jecter"
msgstr "V&ide"
msgid "Reload previous image"
msgstr "Recharger image précedente"
@@ -328,7 +328,7 @@ msgid "RPM mode:"
msgstr "Mode RPM:"
msgid "Progress:"
msgstr "Progrès:"
msgstr "Progression:"
msgid "Width:"
msgstr "Largeur:"
@@ -505,10 +505,10 @@ msgid "FD Controller:"
msgstr "Contrôleur FD:"
msgid "Tertiary IDE Controller"
msgstr "Contrôleur IDE tertiaire"
msgstr "Troisième contrôleur IDE"
msgid "Quaternary IDE Controller"
msgstr "Contrôleur IDE quaternair"
msgstr "Quatrième contrôleur IDE"
msgid "SCSI"
msgstr "SCSI"
@@ -583,7 +583,7 @@ msgid "Check BPB"
msgstr "Vérifier BPB"
msgid "CD-ROM drives:"
msgstr "Lecterus CD-ROM:"
msgstr "Lecteurs CD-ROM:"
msgid "MO drives:"
msgstr "Lecteurs magnéto-optiques:"
@@ -598,7 +598,7 @@ msgid "ISA RTC:"
msgstr "Horloge temps réel ISA:"
msgid "ISA Memory Expansion"
msgstr "Extension de mémoire ISA"
msgstr "Extension de la mémoire ISA"
msgid "Card 1:"
msgstr "Carte 1:"
@@ -661,7 +661,7 @@ msgid "All images"
msgstr "Toutes les images"
msgid "Basic sector images"
msgstr "Images basiques du secteur"
msgstr "Images secteur basique"
msgid "Surface images"
msgstr "Images de la surface"
@@ -709,7 +709,7 @@ msgid "Other removable devices"
msgstr "Autres dispositifs amovibles"
msgid "Other peripherals"
msgstr "Autres périfériques"
msgstr "Autres périphériques"
msgid "Click to capture mouse"
msgstr "Cliquer pour capturer la souris"
@@ -724,7 +724,7 @@ msgid "Bus"
msgstr "Bus"
msgid "File"
msgstr "File"
msgstr "Fichier"
msgid "C"
msgstr "C"
@@ -751,7 +751,7 @@ msgid "No PCap devices found"
msgstr "Aucun dispositif PCap trouvé"
msgid "Invalid PCap device"
msgstr "Dispositif PCap non valide"
msgstr "Dispositif PCap invalide"
msgid "2-axis, 2-button joystick(s)"
msgstr "Manette(s) avec 2 axes, 2 boutons"
@@ -793,10 +793,10 @@ msgid "Floppy %1 (%2): %3"
msgstr "Disquette %1 (%2): %3"
msgid "Advanced sector images"
msgstr "Images du secteur avancés"
msgstr "Images secteur avancé"
msgid "Flux images"
msgstr "Images du flux"
msgstr "Images Flux"
msgid "Are you sure you want to hard reset the emulated machine?"
msgstr "Etes-vous sûr de vouloir réinitialiser la machine émulée ?"
@@ -844,7 +844,7 @@ msgid "86Box v"
msgstr "86Box v"
msgid "An emulator of old computers\n\nAuthors: Miran Grča (OBattler), RichardG867, Jasmine Iwanek, TC1995, coldbrewed, Teemu Korhonen (Manaatti), Joakim L. Gilje, Adrien Moulin (elyosh), Daniel Balsom (gloriouscow), Cacodemon345, Fred N. van Kempen (waltje), Tiseno100, reenigne, and others.\n\nWith previous core contributions from Sarah Walker, leilei, JohnElliott, greatpsycho, and others.\n\nReleased under the GNU General Public License version 2 or later. See LICENSE for more information."
msgstr "Un émulateur de vieux ordinateurs\n\nAuteurs: Miran Grča (OBattler), RichardG867, Jasmine Iwanek, TC1995, coldbrewed, Teemu Korhonen (Manaatti), Joakim L. Gilje, Adrien Moulin (elyosh), Daniel Balsom (gloriouscow), Cacodemon345, Fred N. van Kempen (waltje), Tiseno100, reenigne, and others.\n\nAvec les contributions de Sarah Walker, leilei, JohnElliott, greatpsycho et d'autres.\n\nLibéré sous la licence GNU General Public License version 2 ou ultérieure. Pour plus d'informations, voir le fichier LICENSE."
msgstr "Un émulateur d'ordinateurs du passé\n\nAuteurs: Miran Grča (OBattler), RichardG867, Jasmine Iwanek, TC1995, coldbrewed, Teemu Korhonen (Manaatti), Joakim L. Gilje, Adrien Moulin (elyosh), Daniel Balsom (gloriouscow), Cacodemon345, Fred N. van Kempen (waltje), Tiseno100, reenigne, and others.\n\nAvec les contributions de Sarah Walker, leilei, JohnElliott, greatpsycho et d'autres.\n\nLibéré sous la licence GNU General Public License version 2 ou ultérieure. Pour plus d'informations, voir le fichier LICENSE."
msgid "Hardware not available"
msgstr "Matériel non disponible"
@@ -853,7 +853,7 @@ msgid "Make sure %1 is installed and that you are on a %1-compatible network con
msgstr "Assurez-vous que %1 est installé et que vous utilisez une connexion réseau compatible avec %1."
msgid "Invalid configuration"
msgstr "Configuration non valide"
msgstr "Configuration invalide"
msgid "%1 is required for automatic conversion of PostScript files to PDF.\n\nAny documents sent to the generic PostScript printer will be saved as PostScript (.ps) files."
msgstr "%1 est nécessaire pour la conversion automatique des fichiers PostScript en PDF.\n\nTous les documents envoyés à l'imprimante générique PostScript seront sauvés en tant que fichiers PostScript (.ps)."
@@ -889,7 +889,7 @@ msgid "You are loading an unsupported configuration"
msgstr "Vous chargez une configuration non prise en charge"
msgid "CPU type filtering based on selected machine is disabled for this emulated machine.\n\nThis makes it possible to choose a CPU that is otherwise incompatible with the selected machine. However, you may run into incompatibilities with the machine BIOS or other software.\n\nEnabling this setting is not officially supported and any bug reports filed may be closed as invalid."
msgstr "Le filtrage du type du processeur sur la base de la machine sélectionnée est désactivé pur cette machine émulée.\n\nCela permet de sélectionner un processeur qui est sinon incompatible avec la machine sélectionné. Cependant, il pourrait y avoir des incompatibilités avec le BIOS de la machine ou autres logiciels.\n\nL'activation de cette configuration non officiellement prise en charge implique que tout rapport de bogue peut être fermé comme étant invalide."
msgstr "Le filtre du type du processeur basé par rapport à la machine sélectionnée est désactivé pour cette machine émulée.\n\nCela permet de sélectionner un processeur qui est de base incompatible avec la machine sélectionné. Cependant, il pourrait y avoir des incompatibilités avec le BIOS de la machine ou autres logiciels.\n\nL'activation de cette configuration non officiellement prise en charge implique que tout rapport de bogue peut être fermé étant considéré comme invalide."
msgid "Continue"
msgstr "Continuer"
@@ -982,7 +982,7 @@ msgid "Remember to partition and format the newly-created drive."
msgstr "N'oubliez pas de partitionner et de formater le nouveau disque créé."
msgid "The selected file will be overwritten. Are you sure you want to use it?"
msgstr "Le fichier sélectionné sera écrasé. Etes-vous sûr de vouloir l'utiliser?"
msgstr "Le fichier sélectionné sera écrasé. Etes-vous sûr de vouloir l'utiliser ?"
msgid "Unsupported disk image"
msgstr "Image disque non prise en charge"
@@ -1003,13 +1003,13 @@ msgid "HDX image"
msgstr "Image HDX"
msgid "Fixed-size VHD"
msgstr "VHD à taille fixe"
msgstr "VHD de taille fixe"
msgid "Dynamic-size VHD"
msgstr "VHD à taille dynamique"
msgstr "VHD de taille dynamique"
msgid "Differencing VHD"
msgstr "VHD à différenciation"
msgstr "VHD différentiel"
msgid "(N/A)"
msgstr "(N.D.)"
@@ -1024,13 +1024,13 @@ msgid "HDX image (.hdx)"
msgstr "Image HDX (.hdx)"
msgid "Fixed-size VHD (.vhd)"
msgstr "VHD à taille fixe (.vhd)"
msgstr "VHD de taille fixe (.vhd)"
msgid "Dynamic-size VHD (.vhd)"
msgstr "VHD à taille dynamique (.vhd)"
msgstr "VHD de taille dynamique (.vhd)"
msgid "Differencing VHD (.vhd)"
msgstr "VHD à différenciation (.vhd)"
msgstr "VHD différentiel (.vhd)"
msgid "Large blocks (2 MB)"
msgstr "Grands Blocs (2 Mo)"
@@ -1045,7 +1045,7 @@ msgid "Select the parent VHD"
msgstr "Sélectionnez le VHD parent"
msgid "This could mean that the parent image was modified after the differencing image was created.\n\nIt can also happen if the image files were moved or copied, or by a bug in the program that created this disk.\n\nDo you want to fix the timestamps?"
msgstr "Il est possible que l'image parente ai été modifiée après la création de l'image à différenciation.\n\nIl est même possible que les fichiers de limage ont été déplacés ou copiés ou il existe un bogue dans le programme qui a créé ce disque.\n\nVoulez-vous réparer l'horodatage?"
msgstr "Il est possible que l'image parente ai été modifiée après la création de l'image différentielle.\n\nIl est même possible que les fichiers de limage ont été déplacés ou copiés ou il existe un bogue dans le programme qui a créé ce disque.\n\nVoulez-vous réparer l'horodatage ?"
msgid "Parent and child disk timestamps do not match"
msgstr "Les horodatages des disques parents et enfants ne correspondent pas"
@@ -1186,7 +1186,7 @@ msgid "WinBox is no longer supported"
msgstr "WinBox n'est plus pris en charge"
msgid "Development of the WinBox manager stopped in 2022 due to a lack of maintainers. As we direct our efforts towards making 86Box even better, we have made the decision to no longer support WinBox as a manager.\n\nNo further updates will be provided through WinBox, and you may encounter incorrect behavior should you continue using it with newer versions of 86Box. Any bug reports related to WinBox behavior will be closed as invalid.\n\nGo to 86box.net for a list of other managers you can use."
msgstr "Le développement du gestionnaire WinBox s'est arrêté en 2022 en raison d'un manque de mainteneurs. Comme nous concentrons nos efforts sur l'amélioration de 86Box, nous avons pris la décision de ne plus supporter WinBox en tant que gestionnaire.\n\nAucune mise à jour ne sera fournie par WinBox, et vous pourriez rencontrer des comportements incorrects si vous continuez à l'utiliser avec des versions plus récentes de 86Box. Tous les rapports de bogues relatifs au comportement de WinBox seront classés comme non valides.\n\nAllez sur 86box.net pour une liste d'autres gestionnaires que vous pouvez utiliser."
msgstr "Le développement du gestionnaire WinBox s'est arrêté en 2022 en raison d'un manque de mainteneurs. Comme nous concentrons nos efforts sur l'amélioration de 86Box, nous avons pris la décision de ne plus supporter WinBox en tant que gestionnaire.\n\nAucune mise à jour ne sera fournie par WinBox et vous pourriez rencontrer des comportements incorrects si vous continuez à l'utiliser avec des versions plus récentes de 86Box. Tous les rapports de bogues relatifs au comportement de WinBox seront classés comme non valides.\n\nAllez sur 86box.net pour une liste d'autres gestionnaires que vous pouvez utiliser."
msgid "Generate"
msgstr "Générer"
@@ -1228,7 +1228,7 @@ msgid "Open screenshots folder..."
msgstr "Ouvrir le dossier des captures d'écran..."
msgid "Apply fullscreen stretch mode when maximized"
msgstr "Appliquer le mode elargi plein écran lorsque l'écran est maximisé"
msgstr "Appliquer le mode élargi plein écran lorsque la fenêtre est maximisée"
msgid "Cursor/Puck"
msgstr "Curseur/Palette"
@@ -1261,7 +1261,7 @@ msgid "NIC %1 (%2) %3"
msgstr "NIC %1 (%2) %3"
msgid "Render behavior"
msgstr "Comportement de rendu"
msgstr "Comportement du rendu"
msgid "Use target framerate:"
msgstr "Utiliser le taux de rafraîchissement cible:"
@@ -1297,7 +1297,7 @@ msgid "Error initializing OpenGL"
msgstr "Erreur d'initialisation d'OpenGL"
msgid "\nFalling back to software rendering."
msgstr "\nSe rabattre sur le rendu logiciel."
msgstr "\nRevenir au rendu logiciel."
msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>"
msgstr "<html><head/><body><p>Lors de la sélection d'images multimédia (CD-ROM, disquette, etc.), la boîte de dialogue d'ouverture démarrera dans le même répertoire que le fichier de configuration de 86Box. Ce paramètre ne fera probablement une différence que sur macOS.</p></body></html>"
@@ -1354,19 +1354,19 @@ msgid "Novell NetWare 2.x Key Card"
msgstr "Carte clé Novell NetWare 2.x"
msgid "Serial port passthrough 1"
msgstr "Passage du port série 1"
msgstr "Transfert du port série 1"
msgid "Serial port passthrough 2"
msgstr "Passage du port série 2"
msgstr "Transfert du port série 2"
msgid "Serial port passthrough 3"
msgstr "Passage du port série 3"
msgstr "Transfert du port série 3"
msgid "Serial port passthrough 4"
msgstr "Passage du port série 4"
msgstr "Transfert du port série 4"
msgid "Renderer options..."
msgstr "Options de rendu..."
msgstr "Options du rendu..."
msgid "Logitech/Microsoft Bus Mouse"
msgstr "Souris bus Logitech/Microsoft"
@@ -1408,7 +1408,7 @@ msgid "OPL4-ML Daughterboard"
msgstr "Carte fille OPL4-ML"
msgid "System MIDI"
msgstr "MIDI de système"
msgstr "Système MIDI"
msgid "MIDI Input Device"
msgstr "Dispositif d'entrée MIDI"
@@ -1432,7 +1432,7 @@ msgid "Translate 26 -> 17"
msgstr "Traduire 26 -> 17"
msgid "Language"
msgstr "Language"
msgstr "Langage"
msgid "Enable backlight"
msgstr "Activer le rétro-éclairage"
@@ -1471,7 +1471,7 @@ msgid "MIDI Real time"
msgstr "MIDI en temps réel"
msgid "MIDI Thru"
msgstr "Passage de la entrée MIDI"
msgstr "Transfert MIDI"
msgid "MIDI Clockout"
msgstr "Horloge MIDI"
@@ -1486,10 +1486,10 @@ msgid "Chorus"
msgstr "Chœur"
msgid "Chorus Voices"
msgstr "Voix de chœur"
msgstr "Voix du chœur"
msgid "Chorus Level"
msgstr "Niveau de chœur"
msgstr "Niveau du chœur"
msgid "Chorus Speed"
msgstr "Vitesse du chœur"
@@ -1519,7 +1519,7 @@ msgid "Interpolation Method"
msgstr "Méthode d'interpolation"
msgid "Reverb Output Gain"
msgstr "Gain de sortie de réverbération"
msgstr "Gain de sortie réverbération"
msgid "Reversed stereo"
msgstr "Stéréo inversée"
@@ -1555,7 +1555,7 @@ msgid "MAC Address"
msgstr "Adresse MAC"
msgid "MAC Address OUI"
msgstr "OUI de adresse MAC"
msgstr "Adresse MAC OUI"
msgid "Enable BIOS"
msgstr "Activer BIOS"
@@ -1567,7 +1567,7 @@ msgid "TCP/IP listening port"
msgstr "Port d'écoute TCP/IP"
msgid "Phonebook File"
msgstr "Fichier de répertoire"
msgstr "Fichier d'annuaire"
msgid "Telnet emulation"
msgstr "Émulation de Telnet"
@@ -1645,10 +1645,10 @@ msgid "High DMA"
msgstr "DMA haut"
msgid "Control PC speaker"
msgstr "Contrôler l'haut-parleur du PC"
msgstr "Contrôler le haut-parleur du PC"
msgid "Memory size"
msgstr "Taille de mémoire"
msgstr "Taille mémoire"
msgid "EMU8000 Address"
msgstr "Adresse EMU8000"
@@ -1714,10 +1714,10 @@ msgid "Voodoo type"
msgstr "Type de Voodoo"
msgid "Framebuffer memory size"
msgstr "Taille de la mémoire du tampon d'images"
msgstr "Taille mémoire du tampon d'images"
msgid "Texture memory size"
msgstr "Taille de la mémoire des textures"
msgstr "Taille mémoire des textures"
msgid "Dither subtraction"
msgstr "Soustraction de tramage"
@@ -1726,7 +1726,7 @@ msgid "Screen Filter"
msgstr "Filtre d'écran"
msgid "Render threads"
msgstr "Fils de rendu"
msgstr "Tâches du rendu"
msgid "SLI"
msgstr "SLI"
@@ -1780,10 +1780,10 @@ msgid "Linear"
msgstr "Linéaire"
msgid "4th Order"
msgstr "Du 4e ordre"
msgstr "4e ordre"
msgid "7th Order"
msgstr "Du 7e ordre"
msgstr "7e ordre"
msgid "Non-timed (original)"
msgstr "Non temporisé (original)"
@@ -1804,7 +1804,7 @@ msgid "Five + Wheel"
msgstr "Cinq + molette"
msgid "Five + 2 Wheels"
msgstr ""
msgstr "Cinq + 2 molettes"
msgid "A3 - SMT2 Serial / SMT3(R)V"
msgstr "A3 - SMT2 série / SMT3(R)V"
@@ -1900,7 +1900,7 @@ msgid "sRGB interpolation"
msgstr "Interpolation sRVB"
msgid "Linear interpolation"
msgstr "Interpolation linéairee"
msgstr "Interpolation linéaire"
msgid "128 KB"
msgstr "128 Ko"
@@ -1915,7 +1915,7 @@ msgid "Monochrome (5151/MDA) (amber)"
msgstr "Monochrome (5151/MDA) (ambre)"
msgid "Color 40x25 (5153/CGA)"
msgstr "Couler 40x25 (5153/CGA)"
msgstr "Couleur 40x25 (5153/CGA)"
msgid "Color 80x25 (5153/CGA)"
msgstr "Couleur 80x25 (5153/CGA)"
@@ -1954,10 +1954,10 @@ msgid "Mono Non-Interlaced"
msgstr "Monochrome non entrelacé"
msgid "Color Interlaced"
msgstr "Couler entrelacé"
msgstr "Couleur entrelacée"
msgid "Color Non-Interlaced"
msgstr "Couleur non entrelacé"
msgstr "Couleur non entrelacée"
msgid "3Dfx Voodoo Graphics"
msgstr "Graphique 3dfx Voodoo"
@@ -1990,7 +1990,7 @@ msgid "Stereo LPT DAC"
msgstr "Convertisseur numérique stéréo LPT"
msgid "Generic Text Printer"
msgstr "Imprimante Texte générique"
msgstr "Imprimante texte générique"
msgid "Generic ESC/P Dot-Matrix Printer"
msgstr "Imprimante matricielle générique ESC/P"
@@ -2008,16 +2008,16 @@ msgid "Protection Dongle for Savage Quest"
msgstr "Clé de protection pour Savage Quest"
msgid "Serial Passthrough Device"
msgstr "Dispositif de passage du port série"
msgstr "Dispositif de transfert du port série"
msgid "Passthrough Mode"
msgstr "Mode de passage"
msgstr "Mode de transfert"
msgid "Host Serial Device"
msgstr "Dispositif sériel de l'hôte"
msgstr "Dispositif série de l'hôte"
msgid "Name of pipe"
msgstr "Nom du tuyau"
msgstr "Nom du pipeline"
msgid "Data bits"
msgstr "Bits de données"
@@ -2026,13 +2026,13 @@ msgid "Stop bits"
msgstr "Bits d'arrêt"
msgid "Baud Rate of Passthrough"
msgstr "Taux de bauds du passage"
msgstr "Taux de bauds du transfert"
msgid "Named Pipe (Server)"
msgstr "Tuyau nommé (serveur)"
msgstr "Pipeline nommé (serveur)"
msgid "Host Serial Passthrough"
msgstr "Passage du port série de l'hôte"
msgstr "Transfert du port série de l'hôte"
msgid "E&ject %1"
msgstr "É&jecter %1"
@@ -2077,13 +2077,13 @@ msgid "Vendor"
msgstr "Fabricant"
msgid "Generic PC/XT Memory Expansion"
msgstr "Extension de mémoire générique PC/XT"
msgstr "Extension mémoire générique PC/XT"
msgid "Generic PC/AT Memory Expansion"
msgstr "Extension de mémoire générique PC/AT"
msgstr "Extension mémoire générique PC/AT"
msgid "Unable to find Dot-Matrix fonts"
msgstr "Impossible de trouver les polices matricielles"
msgstr "Impossible de trouver les polices matricielles."
msgid "TrueType fonts in the \"roms/printer/fonts\" directory are required for the emulation of the Generic ESC/P Dot-Matrix Printer."
msgstr "Les polices TrueType dans le répertoire \"roms/printer/fonts\" sont nécessaires à l'émulation de l'imprimante générique ESC/P matricielle."
@@ -2103,9 +2103,6 @@ msgstr "Demander confirmation avant de quitter"
msgid "Options"
msgstr "Options"
msgid "Model"
msgstr "Modèle"
msgid "Model:"
msgstr "Modèle:"
@@ -2116,10 +2113,10 @@ msgid "GLSL Error"
msgstr "Erreur GLSL"
msgid "Could not load shader: %1"
msgstr "Impossible de charger le shaker %1"
msgstr "Impossible de charger le shader %1"
msgid "OpenGL version 3.0 or greater is required. Current GLSL version is %1.%2"
msgstr "OpenGL version 3.0 ou supérieur requis. Version installée: %1.%2"
msgstr "OpenGL version 3.0 ou supérieure requis. Version installée: %1.%2"
msgid "Could not load texture: %1"
msgstr "Impossible de charger la texture %1"

View File

@@ -600,8 +600,8 @@ msgstr "Unidades de CD-ROM:"
msgid "MO drives:"
msgstr "Unidades magneto-ópticas:"
msgid "ZIP drives:"
msgstr "Unidades ZIP:"
msgid "Removable disk drives:"
msgstr "Unidades de disco removível:"
msgid "ZIP 250"
msgstr "ZIP 250"
@@ -669,11 +669,14 @@ msgstr " - PAUSADO"
msgid "Speed"
msgstr "Velocidade"
msgid "ZIP %1 %2 (%3): %4"
msgstr "ZIP %1 %2 (%3): %4"
msgid "Removable disk %1 (%2): %3"
msgstr "Disco removível %1 (%2): %3"
msgid "ZIP images"
msgstr "Imagens ZIP"
msgid "Removable disk images"
msgstr "Imagens de disco removível"
msgid "Image %1"
msgstr "Imagem %1"
msgid "86Box could not find any usable ROM images.\n\nPlease <a href=\"https://github.com/86Box/roms/releases/latest\">download</a> a ROM set and extract it into the \"roms\" directory."
msgstr "O 86Box não conseguiu encontrar nenhuma imagem de ROM utilizável.\n\nPor favor, <a href=\"https://github.com/86Box/roms/releases/latest\">baixe</a> um conjunto de ROM e extraia no diretório \"roms\"."
@@ -823,7 +826,7 @@ msgid "Thrustmaster Flight Control System"
msgstr "Sistema de Controle de Voo Thrustmaster"
msgid "Thrustmaster FCS + Rudder Control System"
msgstr "Thrustmaster SCV + Sistema de Controle de Leme"
msgstr "SCV Thrustmaster + Sistema de Controle de Leme"
msgid "2-button gamepad(s)"
msgstr "Gamepad(s) de 2 botões"
@@ -1446,6 +1449,9 @@ msgstr "Mouse de barramento Mouse Systems"
msgid "Microsoft Serial Mouse"
msgstr "Mouse serial Microsoft"
msgid "Microsoft Serial BallPoint"
msgstr "Mouse serial Microsoft BallPoint"
msgid "Logitech Serial Mouse"
msgstr "Mouse serial Logitech"
@@ -1455,6 +1461,9 @@ msgstr "Mouse PS/2"
msgid "3M MicroTouch (Serial)"
msgstr "3M MicroTouch (serial)"
msgid "Default Baud rate"
msgstr "Taxa de transmissão padrão"
msgid "[COM] Standard Hayes-compliant Modem"
msgstr "[COM] Modem padrão compatível com Hayes"

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -8,7 +8,7 @@
#define DEV_HDD 0x01
#define DEV_CDROM 0x02
#define DEV_ZIP 0x04
#define DEV_RDISK 0x04
#define DEV_MO 0x08
#define BUS_MFM 0
@@ -44,7 +44,7 @@ public:
int scsi_bus_full();
/* Set: 0 = Clear the device from the tracking, 1 = Set the device on the tracking.
Device type: 1 = Hard Disk, 2 = CD-ROM, 4 = ZIP, 8 = Magneto-Optical.
Device type: 1 = Hard Disk, 2 = CD-ROM, 4 = Removable disk, 8 = Magneto-Optical.
Bus: 0 = MFM, 1 = ESDI, 2 = XTA, 3 = IDE, 4 = SCSI. */
void device_track(int set, uint8_t dev_type, int bus, int channel);

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,6 +1,5 @@
<RCC>
<qresource prefix="/settings">
<file>qt/icons/browse.ico</file>
<file>qt/icons/cartridge.ico</file>
<file>qt/icons/cartridge_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_host.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/floppy_35.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_disabled.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_removable_devices.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/rewind.ico</file>
<file>qt/icons/sound.ico</file>
@@ -40,10 +39,11 @@
<file>qt/icons/superdisk.ico</file>
<file>qt/icons/superdisk_image.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/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_active.ico</file>
<file>qt/icons/disabled.ico</file>

View File

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

View File

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

View File

@@ -6,7 +6,7 @@
*
* 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_image.h>
#include <86box/mo.h>
#include <86box/zip.h>
#include <86box/rdisk.h>
#include <86box/scsi_disk.h>
#include <86box/plat.h>
#include <86box/ui.h>
@@ -220,58 +220,58 @@ mo_reload(uint8_t id)
}
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);
if (zip_drives[id].bus_type) {
rdisk_disk_close(dev);
if (rdisk_drives[id].bus_type) {
/* 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
media_menu_update_zip(id);
media_menu_update_rdisk(id);
#endif
ui_sb_update_tip(SB_ZIP | id);
ui_sb_update_tip(SB_RDISK | id);
config_save();
}
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);
zip_drives[id].read_only = wp;
zip_load(dev, fn, 0);
rdisk_disk_close(dev);
rdisk_drives[id].read_only = wp;
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
media_menu_update_zip(id);
media_menu_update_rdisk(id);
#endif
ui_sb_update_tip(SB_ZIP | id);
ui_sb_update_tip(SB_RDISK | id);
config_save();
}
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);
if (strlen(zip_drives[id].image_path) == 0) {
ui_sb_update_icon_state(SB_ZIP | id, 1);
rdisk_disk_reload(dev);
if (strlen(rdisk_drives[id].image_path) == 0) {
ui_sb_update_icon_state(SB_RDISK | id, 1);
} else {
ui_sb_update_icon_state(SB_ZIP | id, 0);
ui_sb_update_icon_state(SB_RDISK | id, 0);
}
#if 0
media_menu_update_zip(id);
media_menu_update_rdisk(id);
#endif
ui_sb_update_tip(SB_ZIP | id);
ui_sb_update_tip(SB_RDISK | id);
config_save();
}