Retooled ZIP emulation into more expansible Removable Disk emulation, ZIP 100 and 250 types remain selectable, alongside the new 86Box (ie. generic) option.
This commit is contained in:
10
src/86box.c
10
src/86box.c
@@ -88,7 +88,7 @@
|
|||||||
#include <86box/scsi_device.h>
|
#include <86box/scsi_device.h>
|
||||||
#include <86box/cdrom.h>
|
#include <86box/cdrom.h>
|
||||||
#include <86box/cdrom_interface.h>
|
#include <86box/cdrom_interface.h>
|
||||||
#include <86box/zip.h>
|
#include <86box/rdisk.h>
|
||||||
#include <86box/mo.h>
|
#include <86box/mo.h>
|
||||||
#include <86box/scsi_disk.h>
|
#include <86box/scsi_disk.h>
|
||||||
#include <86box/cdrom_image.h>
|
#include <86box/cdrom_image.h>
|
||||||
@@ -1066,7 +1066,7 @@ usage:
|
|||||||
network_init();
|
network_init();
|
||||||
mouse_init();
|
mouse_init();
|
||||||
cdrom_global_init();
|
cdrom_global_init();
|
||||||
zip_global_init();
|
rdisk_global_init();
|
||||||
mo_global_init();
|
mo_global_init();
|
||||||
|
|
||||||
/* Initialize the keyboard accelerator list with default values */
|
/* Initialize the keyboard accelerator list with default values */
|
||||||
@@ -1395,7 +1395,7 @@ pc_reset_hard_close(void)
|
|||||||
|
|
||||||
cdrom_close();
|
cdrom_close();
|
||||||
|
|
||||||
zip_close();
|
rdisk_close();
|
||||||
|
|
||||||
mo_close();
|
mo_close();
|
||||||
|
|
||||||
@@ -1501,7 +1501,7 @@ pc_reset_hard_init(void)
|
|||||||
|
|
||||||
mo_hard_reset();
|
mo_hard_reset();
|
||||||
|
|
||||||
zip_hard_reset();
|
rdisk_hard_reset();
|
||||||
|
|
||||||
|
|
||||||
/* Reset any ISA ROM cards. */
|
/* Reset any ISA ROM cards. */
|
||||||
@@ -1664,7 +1664,7 @@ pc_close(UNUSED(thread_t *ptr))
|
|||||||
|
|
||||||
cdrom_close();
|
cdrom_close();
|
||||||
|
|
||||||
zip_close();
|
rdisk_close();
|
||||||
|
|
||||||
mo_close();
|
mo_close();
|
||||||
|
|
||||||
|
|||||||
@@ -99,7 +99,7 @@ if(INSTRUMENT)
|
|||||||
add_compile_definitions(USE_INSTRUMENT)
|
add_compile_definitions(USE_INSTRUMENT)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
target_link_libraries(86Box cpu chipset mch dev mem fdd game cdrom zip mo hdd
|
target_link_libraries(86Box cpu chipset mch dev mem fdd game cdrom rdisk mo hdd
|
||||||
net print scsi sio snd utils vid voodoo plat ui)
|
net print scsi sio snd utils vid voodoo plat ui)
|
||||||
|
|
||||||
if(HAIKU)
|
if(HAIKU)
|
||||||
|
|||||||
212
src/config.c
212
src/config.c
@@ -65,7 +65,7 @@
|
|||||||
#include <86box/scsi_device.h>
|
#include <86box/scsi_device.h>
|
||||||
#include <86box/cdrom.h>
|
#include <86box/cdrom.h>
|
||||||
#include <86box/cdrom_interface.h>
|
#include <86box/cdrom_interface.h>
|
||||||
#include <86box/zip.h>
|
#include <86box/rdisk.h>
|
||||||
#include <86box/mo.h>
|
#include <86box/mo.h>
|
||||||
#include <86box/sound.h>
|
#include <86box/sound.h>
|
||||||
#include <86box/midi.h>
|
#include <86box/midi.h>
|
||||||
@@ -1458,32 +1458,35 @@ load_other_removable_devices(void)
|
|||||||
unsigned int board = 0;
|
unsigned int board = 0;
|
||||||
unsigned int dev = 0;
|
unsigned int dev = 0;
|
||||||
int c;
|
int c;
|
||||||
|
int legacy_zip_drives = 0;
|
||||||
|
|
||||||
memset(temp, 0x00, sizeof(temp));
|
memset(temp, 0x00, sizeof(temp));
|
||||||
for (c = 0; c < ZIP_NUM; c++) {
|
for (c = 0; c < RDISK_NUM; c++) {
|
||||||
sprintf(temp, "zip_%02i_parameters", c + 1);
|
sprintf(temp, "zip_%02i_parameters", c + 1);
|
||||||
p = ini_section_get_string(cat, temp, NULL);
|
p = ini_section_get_string(cat, temp, NULL);
|
||||||
if (p != NULL)
|
if (p != NULL) {
|
||||||
sscanf(p, "%01u, %s", &zip_drives[c].is_250, s);
|
sscanf(p, "%01u, %s", &rdisk_drives[c].type, s);
|
||||||
else
|
legacy_zip_drives++;
|
||||||
sscanf("0, none", "%01u, %s", &zip_drives[c].is_250, s);
|
} else
|
||||||
zip_drives[c].bus_type = hdd_string_to_bus(s, 1);
|
sscanf("0, none", "%01u, %s", &rdisk_drives[c].type, s);
|
||||||
|
rdisk_drives[c].type++;
|
||||||
|
rdisk_drives[c].bus_type = hdd_string_to_bus(s, 1);
|
||||||
|
|
||||||
/* Default values, needed for proper operation of the Settings dialog. */
|
/* Default values, needed for proper operation of the Settings dialog. */
|
||||||
zip_drives[c].ide_channel = zip_drives[c].scsi_device_id = c + 2;
|
rdisk_drives[c].ide_channel = rdisk_drives[c].scsi_device_id = c + 2;
|
||||||
|
|
||||||
if (zip_drives[c].bus_type == ZIP_BUS_ATAPI) {
|
if (rdisk_drives[c].bus_type == RDISK_BUS_ATAPI) {
|
||||||
sprintf(temp, "zip_%02i_ide_channel", c + 1);
|
sprintf(temp, "zip_%02i_ide_channel", c + 1);
|
||||||
sprintf(tmp2, "%01u:%01u", (c + 2) >> 1, (c + 2) & 1);
|
sprintf(tmp2, "%01u:%01u", (c + 2) >> 1, (c + 2) & 1);
|
||||||
p = ini_section_get_string(cat, temp, tmp2);
|
p = ini_section_get_string(cat, temp, tmp2);
|
||||||
sscanf(p, "%01u:%01u", &board, &dev);
|
sscanf(p, "%01u:%01u", &board, &dev);
|
||||||
board &= 3;
|
board &= 3;
|
||||||
dev &= 1;
|
dev &= 1;
|
||||||
zip_drives[c].ide_channel = (board << 1) + dev;
|
rdisk_drives[c].ide_channel = (board << 1) + dev;
|
||||||
|
|
||||||
if (zip_drives[c].ide_channel > 7)
|
if (rdisk_drives[c].ide_channel > 7)
|
||||||
zip_drives[c].ide_channel = 7;
|
rdisk_drives[c].ide_channel = 7;
|
||||||
} else if (zip_drives[c].bus_type == ZIP_BUS_SCSI) {
|
} else if (rdisk_drives[c].bus_type == RDISK_BUS_SCSI) {
|
||||||
sprintf(temp, "zip_%02i_scsi_location", c + 1);
|
sprintf(temp, "zip_%02i_scsi_location", c + 1);
|
||||||
sprintf(tmp2, "%01u:%02u", SCSI_BUS_MAX, c + 2);
|
sprintf(tmp2, "%01u:%02u", SCSI_BUS_MAX, c + 2);
|
||||||
p = ini_section_get_string(cat, temp, tmp2);
|
p = ini_section_get_string(cat, temp, tmp2);
|
||||||
@@ -1491,23 +1494,23 @@ load_other_removable_devices(void)
|
|||||||
if (board >= SCSI_BUS_MAX) {
|
if (board >= SCSI_BUS_MAX) {
|
||||||
/* Invalid bus - check legacy ID */
|
/* Invalid bus - check legacy ID */
|
||||||
sprintf(temp, "zip_%02i_scsi_id", c + 1);
|
sprintf(temp, "zip_%02i_scsi_id", c + 1);
|
||||||
zip_drives[c].scsi_device_id = ini_section_get_int(cat, temp, c + 2);
|
rdisk_drives[c].scsi_device_id = ini_section_get_int(cat, temp, c + 2);
|
||||||
|
|
||||||
if (zip_drives[c].scsi_device_id > 15)
|
if (rdisk_drives[c].scsi_device_id > 15)
|
||||||
zip_drives[c].scsi_device_id = 15;
|
rdisk_drives[c].scsi_device_id = 15;
|
||||||
} else {
|
} else {
|
||||||
board %= SCSI_BUS_MAX;
|
board %= SCSI_BUS_MAX;
|
||||||
dev &= 15;
|
dev &= 15;
|
||||||
zip_drives[c].scsi_device_id = (board << 4) + dev;
|
rdisk_drives[c].scsi_device_id = (board << 4) + dev;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (zip_drives[c].bus_type != ZIP_BUS_ATAPI) {
|
if (rdisk_drives[c].bus_type != RDISK_BUS_ATAPI) {
|
||||||
sprintf(temp, "zip_%02i_ide_channel", c + 1);
|
sprintf(temp, "zip_%02i_ide_channel", c + 1);
|
||||||
ini_section_delete_var(cat, temp);
|
ini_section_delete_var(cat, temp);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (zip_drives[c].bus_type != ZIP_BUS_SCSI) {
|
if (rdisk_drives[c].bus_type != RDISK_BUS_SCSI) {
|
||||||
sprintf(temp, "zip_%02i_scsi_location", c + 1);
|
sprintf(temp, "zip_%02i_scsi_location", c + 1);
|
||||||
ini_section_delete_var(cat, temp);
|
ini_section_delete_var(cat, temp);
|
||||||
}
|
}
|
||||||
@@ -1519,49 +1522,154 @@ load_other_removable_devices(void)
|
|||||||
p = ini_section_get_string(cat, temp, "");
|
p = ini_section_get_string(cat, temp, "");
|
||||||
|
|
||||||
sprintf(temp, "zip_%02i_writeprot", c + 1);
|
sprintf(temp, "zip_%02i_writeprot", c + 1);
|
||||||
zip_drives[c].read_only = ini_section_get_int(cat, temp, 0);
|
rdisk_drives[c].read_only = ini_section_get_int(cat, temp, 0);
|
||||||
ini_section_delete_var(cat, temp);
|
ini_section_delete_var(cat, temp);
|
||||||
|
|
||||||
if (!strcmp(p, usr_path))
|
if (!strcmp(p, usr_path))
|
||||||
p[0] = 0x00;
|
p[0] = 0x00;
|
||||||
|
|
||||||
if (p[0] != 0x00) {
|
if (p[0] != 0x00) {
|
||||||
if (load_image_file(zip_drives[c].image_path, p, &(zip_drives[c].read_only)))
|
if (load_image_file(rdisk_drives[c].image_path, p, &(rdisk_drives[c].read_only)))
|
||||||
fatal("Configuration: Length of zip_%02i_image_path is more than 511\n", c + 1);
|
fatal("Configuration: Length of zip_%02i_image_path is more than 511\n", c + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < MAX_PREV_IMAGES; i++) {
|
for (int i = 0; i < MAX_PREV_IMAGES; i++) {
|
||||||
zip_drives[c].image_history[i] = (char *) calloc((MAX_IMAGE_PATH_LEN + 1) << 1, sizeof(char));
|
rdisk_drives[c].image_history[i] = (char *) calloc((MAX_IMAGE_PATH_LEN + 1) << 1, sizeof(char));
|
||||||
sprintf(temp, "zip_%02i_image_history_%02i", c + 1, i + 1);
|
sprintf(temp, "zip_%02i_image_history_%02i", c + 1, i + 1);
|
||||||
p = ini_section_get_string(cat, temp, NULL);
|
p = ini_section_get_string(cat, temp, NULL);
|
||||||
if (p) {
|
if (p) {
|
||||||
if (load_image_file(zip_drives[c].image_history[i], p, NULL))
|
if (load_image_file(rdisk_drives[c].image_history[i], p, NULL))
|
||||||
fatal("Configuration: Length of zip_%02i_image_history_%02i is more than %i\n",
|
fatal("Configuration: Length of zip_%02i_image_history_%02i is more than %i\n",
|
||||||
c + 1, i + 1, MAX_IMAGE_PATH_LEN - 1);
|
c + 1, i + 1, MAX_IMAGE_PATH_LEN - 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If the ZIP drive is disabled, delete all its variables. */
|
sprintf(temp, "zip_%02i_parameters", c + 1);
|
||||||
if (zip_drives[c].bus_type == ZIP_BUS_DISABLED) {
|
ini_section_delete_var(cat, temp);
|
||||||
sprintf(temp, "zip_%02i_parameters", c + 1);
|
|
||||||
|
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);
|
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);
|
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);
|
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);
|
ini_section_delete_var(cat, temp);
|
||||||
|
|
||||||
for (int i = 0; i < MAX_PREV_IMAGES; i++) {
|
for (int i = 0; i < MAX_PREV_IMAGES; i++) {
|
||||||
sprintf(temp, "zip_%02i_image_history_%02i", c + 1, i + 1);
|
sprintf(temp, "rdisk_%02i_image_history_%02i", c + 1, i + 1);
|
||||||
ini_section_delete_var(cat, temp);
|
ini_section_delete_var(cat, temp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
go_to_mo:
|
||||||
memset(temp, 0x00, sizeof(temp));
|
memset(temp, 0x00, sizeof(temp));
|
||||||
for (c = 0; c < MO_NUM; c++) {
|
for (c = 0; c < MO_NUM; c++) {
|
||||||
sprintf(temp, "mo_%02i_parameters", c + 1);
|
sprintf(temp, "mo_%02i_parameters", c + 1);
|
||||||
@@ -1820,7 +1928,7 @@ config_load(void)
|
|||||||
#ifdef USE_IOCTL
|
#ifdef USE_IOCTL
|
||||||
memset(cdrom_ioctl, 0, sizeof(cdrom_ioctl_t) * CDROM_NUM);
|
memset(cdrom_ioctl, 0, sizeof(cdrom_ioctl_t) * CDROM_NUM);
|
||||||
#endif
|
#endif
|
||||||
memset(zip_drives, 0, sizeof(zip_drive_t));
|
memset(rdisk_drives, 0, sizeof(rdisk_drive_t));
|
||||||
|
|
||||||
config = ini_read(cfg_path);
|
config = ini_read(cfg_path);
|
||||||
|
|
||||||
@@ -3045,52 +3153,52 @@ save_other_removable_devices(void)
|
|||||||
char tmp2[512];
|
char tmp2[512];
|
||||||
int c;
|
int c;
|
||||||
|
|
||||||
for (c = 0; c < ZIP_NUM; c++) {
|
for (c = 0; c < RDISK_NUM; c++) {
|
||||||
sprintf(temp, "zip_%02i_parameters", c + 1);
|
sprintf(temp, "rdisk_%02i_parameters", c + 1);
|
||||||
if (zip_drives[c].bus_type == 0) {
|
if (rdisk_drives[c].bus_type == 0) {
|
||||||
ini_section_delete_var(cat, temp);
|
ini_section_delete_var(cat, temp);
|
||||||
} else {
|
} else {
|
||||||
sprintf(tmp2, "%u, %s", zip_drives[c].is_250,
|
sprintf(tmp2, "%u, %s", rdisk_drives[c].type,
|
||||||
hdd_bus_to_string(zip_drives[c].bus_type, 1));
|
hdd_bus_to_string(rdisk_drives[c].bus_type, 1));
|
||||||
ini_section_set_string(cat, temp, tmp2);
|
ini_section_set_string(cat, temp, tmp2);
|
||||||
}
|
}
|
||||||
|
|
||||||
sprintf(temp, "zip_%02i_ide_channel", c + 1);
|
sprintf(temp, "rdisk_%02i_ide_channel", c + 1);
|
||||||
if (zip_drives[c].bus_type != ZIP_BUS_ATAPI)
|
if (rdisk_drives[c].bus_type != RDISK_BUS_ATAPI)
|
||||||
ini_section_delete_var(cat, temp);
|
ini_section_delete_var(cat, temp);
|
||||||
else {
|
else {
|
||||||
sprintf(tmp2, "%01u:%01u", zip_drives[c].ide_channel >> 1,
|
sprintf(tmp2, "%01u:%01u", rdisk_drives[c].ide_channel >> 1,
|
||||||
zip_drives[c].ide_channel & 1);
|
rdisk_drives[c].ide_channel & 1);
|
||||||
ini_section_set_string(cat, temp, tmp2);
|
ini_section_set_string(cat, temp, tmp2);
|
||||||
}
|
}
|
||||||
|
|
||||||
sprintf(temp, "zip_%02i_scsi_id", c + 1);
|
sprintf(temp, "rdisk_%02i_scsi_id", c + 1);
|
||||||
ini_section_delete_var(cat, temp);
|
ini_section_delete_var(cat, temp);
|
||||||
|
|
||||||
sprintf(temp, "zip_%02i_writeprot", c + 1);
|
sprintf(temp, "rdisk_%02i_writeprot", c + 1);
|
||||||
ini_section_delete_var(cat, temp);
|
ini_section_delete_var(cat, temp);
|
||||||
|
|
||||||
sprintf(temp, "zip_%02i_scsi_location", c + 1);
|
sprintf(temp, "rdisk_%02i_scsi_location", c + 1);
|
||||||
if (zip_drives[c].bus_type != ZIP_BUS_SCSI)
|
if (rdisk_drives[c].bus_type != RDISK_BUS_SCSI)
|
||||||
ini_section_delete_var(cat, temp);
|
ini_section_delete_var(cat, temp);
|
||||||
else {
|
else {
|
||||||
sprintf(tmp2, "%01u:%02u", zip_drives[c].scsi_device_id >> 4,
|
sprintf(tmp2, "%01u:%02u", rdisk_drives[c].scsi_device_id >> 4,
|
||||||
zip_drives[c].scsi_device_id & 15);
|
rdisk_drives[c].scsi_device_id & 15);
|
||||||
ini_section_set_string(cat, temp, tmp2);
|
ini_section_set_string(cat, temp, tmp2);
|
||||||
}
|
}
|
||||||
|
|
||||||
sprintf(temp, "zip_%02i_image_path", c + 1);
|
sprintf(temp, "rdisk_%02i_image_path", c + 1);
|
||||||
if ((zip_drives[c].bus_type == 0) || (strlen(zip_drives[c].image_path) == 0))
|
if ((rdisk_drives[c].bus_type == 0) || (strlen(rdisk_drives[c].image_path) == 0))
|
||||||
ini_section_delete_var(cat, temp);
|
ini_section_delete_var(cat, temp);
|
||||||
else
|
else
|
||||||
save_image_file(cat, temp, zip_drives[c].image_path);
|
save_image_file(cat, temp, rdisk_drives[c].image_path);
|
||||||
|
|
||||||
for (int i = 0; i < MAX_PREV_IMAGES; i++) {
|
for (int i = 0; i < MAX_PREV_IMAGES; i++) {
|
||||||
sprintf(temp, "zip_%02i_image_history_%02i", c + 1, i + 1);
|
sprintf(temp, "rdisk_%02i_image_history_%02i", c + 1, i + 1);
|
||||||
if ((zip_drives[c].image_history[i] == 0) || strlen(zip_drives[c].image_history[i]) == 0)
|
if ((rdisk_drives[c].image_history[i] == 0) || strlen(rdisk_drives[c].image_history[i]) == 0)
|
||||||
ini_section_delete_var(cat, temp);
|
ini_section_delete_var(cat, temp);
|
||||||
else
|
else
|
||||||
save_image_file(cat, temp, zip_drives[c].image_history[i]);
|
save_image_file(cat, temp, rdisk_drives[c].image_history[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ add_library(hdd OBJECT
|
|||||||
hdc_ide_w83769f.c
|
hdc_ide_w83769f.c
|
||||||
)
|
)
|
||||||
|
|
||||||
add_library(zip OBJECT zip.c)
|
add_library(rdisk OBJECT rdisk.c)
|
||||||
|
|
||||||
add_library(mo OBJECT mo.c)
|
add_library(mo OBJECT mo.c)
|
||||||
|
|
||||||
|
|||||||
@@ -46,7 +46,7 @@
|
|||||||
#include <86box/hdc.h>
|
#include <86box/hdc.h>
|
||||||
#include <86box/hdc_ide.h>
|
#include <86box/hdc_ide.h>
|
||||||
#include <86box/hdd.h>
|
#include <86box/hdd.h>
|
||||||
#include <86box/zip.h>
|
#include <86box/rdisk.h>
|
||||||
#include <86box/version.h>
|
#include <86box/version.h>
|
||||||
|
|
||||||
/* Bits of 'atastat' */
|
/* Bits of 'atastat' */
|
||||||
|
|||||||
@@ -34,7 +34,7 @@
|
|||||||
#include <86box/hdc.h>
|
#include <86box/hdc.h>
|
||||||
#include <86box/hdc_ide.h>
|
#include <86box/hdc_ide.h>
|
||||||
#include <86box/hdc_ide_sff8038i.h>
|
#include <86box/hdc_ide_sff8038i.h>
|
||||||
#include <86box/zip.h>
|
#include <86box/rdisk.h>
|
||||||
#include <86box/mo.h>
|
#include <86box/mo.h>
|
||||||
|
|
||||||
typedef struct cmd640_t {
|
typedef struct cmd640_t {
|
||||||
@@ -417,10 +417,10 @@ cmd640_reset(void *priv)
|
|||||||
(cdrom[i].ide_channel <= max_channel) && cdrom[i].priv)
|
(cdrom[i].ide_channel <= max_channel) && cdrom[i].priv)
|
||||||
scsi_cdrom_reset((scsi_common_t *) cdrom[i].priv);
|
scsi_cdrom_reset((scsi_common_t *) cdrom[i].priv);
|
||||||
}
|
}
|
||||||
for (i = 0; i < ZIP_NUM; i++) {
|
for (i = 0; i < RDISK_NUM; i++) {
|
||||||
if ((zip_drives[i].bus_type == ZIP_BUS_ATAPI) && (zip_drives[i].ide_channel >= min_channel) &&
|
if ((rdisk_drives[i].bus_type == RDISK_BUS_ATAPI) && (rdisk_drives[i].ide_channel >= min_channel) &&
|
||||||
(zip_drives[i].ide_channel <= max_channel) && zip_drives[i].priv)
|
(rdisk_drives[i].ide_channel <= max_channel) && rdisk_drives[i].priv)
|
||||||
zip_reset((scsi_common_t *) zip_drives[i].priv);
|
rdisk_reset((scsi_common_t *) rdisk_drives[i].priv);
|
||||||
}
|
}
|
||||||
for (i = 0; i < MO_NUM; i++) {
|
for (i = 0; i < MO_NUM; i++) {
|
||||||
if ((mo_drives[i].bus_type == MO_BUS_ATAPI) && (mo_drives[i].ide_channel >= min_channel) &&
|
if ((mo_drives[i].bus_type == MO_BUS_ATAPI) && (mo_drives[i].ide_channel >= min_channel) &&
|
||||||
|
|||||||
@@ -34,7 +34,7 @@
|
|||||||
#include <86box/hdc.h>
|
#include <86box/hdc.h>
|
||||||
#include <86box/hdc_ide.h>
|
#include <86box/hdc_ide.h>
|
||||||
#include <86box/hdc_ide_sff8038i.h>
|
#include <86box/hdc_ide_sff8038i.h>
|
||||||
#include <86box/zip.h>
|
#include <86box/rdisk.h>
|
||||||
#include <86box/mo.h>
|
#include <86box/mo.h>
|
||||||
|
|
||||||
typedef struct cmd646_t {
|
typedef struct cmd646_t {
|
||||||
@@ -320,9 +320,9 @@ cmd646_reset(void *priv)
|
|||||||
if ((cdrom[i].bus_type == CDROM_BUS_ATAPI) && (cdrom[i].ide_channel < 4) && cdrom[i].priv)
|
if ((cdrom[i].bus_type == CDROM_BUS_ATAPI) && (cdrom[i].ide_channel < 4) && cdrom[i].priv)
|
||||||
scsi_cdrom_reset((scsi_common_t *) cdrom[i].priv);
|
scsi_cdrom_reset((scsi_common_t *) cdrom[i].priv);
|
||||||
}
|
}
|
||||||
for (i = 0; i < ZIP_NUM; i++) {
|
for (i = 0; i < RDISK_NUM; i++) {
|
||||||
if ((zip_drives[i].bus_type == ZIP_BUS_ATAPI) && (zip_drives[i].ide_channel < 4) && zip_drives[i].priv)
|
if ((rdisk_drives[i].bus_type == RDISK_BUS_ATAPI) && (rdisk_drives[i].ide_channel < 4) && rdisk_drives[i].priv)
|
||||||
zip_reset((scsi_common_t *) zip_drives[i].priv);
|
rdisk_reset((scsi_common_t *) rdisk_drives[i].priv);
|
||||||
}
|
}
|
||||||
for (i = 0; i < MO_NUM; i++) {
|
for (i = 0; i < MO_NUM; i++) {
|
||||||
if ((mo_drives[i].bus_type == MO_BUS_ATAPI) && (mo_drives[i].ide_channel < 4) && mo_drives[i].priv)
|
if ((mo_drives[i].bus_type == MO_BUS_ATAPI) && (mo_drives[i].ide_channel < 4) && mo_drives[i].priv)
|
||||||
|
|||||||
@@ -34,7 +34,7 @@
|
|||||||
#include <86box/hdc.h>
|
#include <86box/hdc.h>
|
||||||
#include <86box/hdc_ide.h>
|
#include <86box/hdc_ide.h>
|
||||||
#include <86box/hdc_ide_sff8038i.h>
|
#include <86box/hdc_ide_sff8038i.h>
|
||||||
#include <86box/zip.h>
|
#include <86box/rdisk.h>
|
||||||
#include <86box/mo.h>
|
#include <86box/mo.h>
|
||||||
|
|
||||||
typedef struct rz1000_t {
|
typedef struct rz1000_t {
|
||||||
@@ -182,10 +182,10 @@ rz1000_reset(void *priv)
|
|||||||
(cdrom[i].ide_channel <= max_channel) && cdrom[i].priv)
|
(cdrom[i].ide_channel <= max_channel) && cdrom[i].priv)
|
||||||
scsi_cdrom_reset((scsi_common_t *) cdrom[i].priv);
|
scsi_cdrom_reset((scsi_common_t *) cdrom[i].priv);
|
||||||
}
|
}
|
||||||
for (i = 0; i < ZIP_NUM; i++) {
|
for (i = 0; i < RDISK_NUM; i++) {
|
||||||
if ((zip_drives[i].bus_type == ZIP_BUS_ATAPI) && (zip_drives[i].ide_channel >= min_channel) &&
|
if ((rdisk_drives[i].bus_type == RDISK_BUS_ATAPI) && (rdisk_drives[i].ide_channel >= min_channel) &&
|
||||||
(zip_drives[i].ide_channel <= max_channel) && zip_drives[i].priv)
|
(rdisk_drives[i].ide_channel <= max_channel) && rdisk_drives[i].priv)
|
||||||
zip_reset((scsi_common_t *) zip_drives[i].priv);
|
rdisk_reset((scsi_common_t *) rdisk_drives[i].priv);
|
||||||
}
|
}
|
||||||
for (i = 0; i < MO_NUM; i++) {
|
for (i = 0; i < MO_NUM; i++) {
|
||||||
if ((mo_drives[i].bus_type == MO_BUS_ATAPI) && (mo_drives[i].ide_channel >= min_channel) &&
|
if ((mo_drives[i].bus_type == MO_BUS_ATAPI) && (mo_drives[i].ide_channel >= min_channel) &&
|
||||||
|
|||||||
@@ -42,7 +42,7 @@
|
|||||||
#include <86box/hdc.h>
|
#include <86box/hdc.h>
|
||||||
#include <86box/hdc_ide.h>
|
#include <86box/hdc_ide.h>
|
||||||
#include <86box/hdc_ide_sff8038i.h>
|
#include <86box/hdc_ide_sff8038i.h>
|
||||||
#include <86box/zip.h>
|
#include <86box/rdisk.h>
|
||||||
#include <86box/mo.h>
|
#include <86box/mo.h>
|
||||||
#include <86box/plat_unused.h>
|
#include <86box/plat_unused.h>
|
||||||
|
|
||||||
@@ -489,10 +489,10 @@ sff_reset(void *priv)
|
|||||||
cdrom[i].priv)
|
cdrom[i].priv)
|
||||||
scsi_cdrom_reset((scsi_common_t *) cdrom[i].priv);
|
scsi_cdrom_reset((scsi_common_t *) cdrom[i].priv);
|
||||||
}
|
}
|
||||||
for (uint8_t i = 0; i < ZIP_NUM; i++) {
|
for (uint8_t i = 0; i < RDISK_NUM; i++) {
|
||||||
if ((zip_drives[i].bus_type == ZIP_BUS_ATAPI) && (zip_drives[i].ide_channel < 4) &&
|
if ((rdisk_drives[i].bus_type == RDISK_BUS_ATAPI) && (rdisk_drives[i].ide_channel < 4) &&
|
||||||
zip_drives[i].priv)
|
rdisk_drives[i].priv)
|
||||||
zip_reset((scsi_common_t *) zip_drives[i].priv);
|
rdisk_reset((scsi_common_t *) rdisk_drives[i].priv);
|
||||||
}
|
}
|
||||||
for (uint8_t i = 0; i < MO_NUM; i++) {
|
for (uint8_t i = 0; i < MO_NUM; i++) {
|
||||||
if ((mo_drives[i].bus_type == MO_BUS_ATAPI) && (mo_drives[i].ide_channel < 4) &&
|
if ((mo_drives[i].bus_type == MO_BUS_ATAPI) && (mo_drives[i].ide_channel < 4) &&
|
||||||
|
|||||||
@@ -34,7 +34,7 @@
|
|||||||
#include <86box/hdc.h>
|
#include <86box/hdc.h>
|
||||||
#include <86box/hdc_ide.h>
|
#include <86box/hdc_ide.h>
|
||||||
#include <86box/hdc_ide_sff8038i.h>
|
#include <86box/hdc_ide_sff8038i.h>
|
||||||
#include <86box/zip.h>
|
#include <86box/rdisk.h>
|
||||||
#include <86box/mo.h>
|
#include <86box/mo.h>
|
||||||
|
|
||||||
typedef struct w83769f_t {
|
typedef struct w83769f_t {
|
||||||
@@ -297,10 +297,10 @@ w83769f_reset(void *priv)
|
|||||||
(cdrom[i].ide_channel <= max_channel) && cdrom[i].priv)
|
(cdrom[i].ide_channel <= max_channel) && cdrom[i].priv)
|
||||||
scsi_cdrom_reset((scsi_common_t *) cdrom[i].priv);
|
scsi_cdrom_reset((scsi_common_t *) cdrom[i].priv);
|
||||||
}
|
}
|
||||||
for (i = 0; i < ZIP_NUM; i++) {
|
for (i = 0; i < RDISK_NUM; i++) {
|
||||||
if ((zip_drives[i].bus_type == ZIP_BUS_ATAPI) && (zip_drives[i].ide_channel >= min_channel) &&
|
if ((rdisk_drives[i].bus_type == RDISK_BUS_ATAPI) && (rdisk_drives[i].ide_channel >= min_channel) &&
|
||||||
(zip_drives[i].ide_channel <= max_channel) && zip_drives[i].priv)
|
(rdisk_drives[i].ide_channel <= max_channel) && rdisk_drives[i].priv)
|
||||||
zip_reset((scsi_common_t *) zip_drives[i].priv);
|
rdisk_reset((scsi_common_t *) rdisk_drives[i].priv);
|
||||||
}
|
}
|
||||||
for (i = 0; i < MO_NUM; i++) {
|
for (i = 0; i < MO_NUM; i++) {
|
||||||
if ((mo_drives[i].bus_type == MO_BUS_ATAPI) && (mo_drives[i].ide_channel >= min_channel) &&
|
if ((mo_drives[i].bus_type == MO_BUS_ATAPI) && (mo_drives[i].ide_channel >= min_channel) &&
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -133,7 +133,7 @@ typedef struct config_t {
|
|||||||
|
|
||||||
/* Other removable devices category */
|
/* Other removable devices category */
|
||||||
storage_cfg_t cdrom[CDROM_NUM]; /* CD-ROM drives */
|
storage_cfg_t cdrom[CDROM_NUM]; /* CD-ROM drives */
|
||||||
storage_cfg_t rdisk[ZIP_NUM]; /* Removable disk drives */
|
storage_cfg_t rdisk[RDISK_NUM]; /* Removable disk drives */
|
||||||
} config_t;
|
} config_t;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ typedef struct dev_status_empty_t {
|
|||||||
typedef struct machine_status_t {
|
typedef struct machine_status_t {
|
||||||
dev_status_empty_active_t fdd[FDD_NUM];
|
dev_status_empty_active_t fdd[FDD_NUM];
|
||||||
dev_status_empty_active_t cdrom[CDROM_NUM];
|
dev_status_empty_active_t cdrom[CDROM_NUM];
|
||||||
dev_status_empty_active_t zip[ZIP_NUM];
|
dev_status_empty_active_t rdisk[RDISK_NUM];
|
||||||
dev_status_empty_active_t mo[MO_NUM];
|
dev_status_empty_active_t mo[MO_NUM];
|
||||||
dev_status_empty_active_t cassette;
|
dev_status_empty_active_t cassette;
|
||||||
dev_status_active_t hdd[HDD_BUS_USB];
|
dev_status_active_t hdd[HDD_BUS_USB];
|
||||||
|
|||||||
@@ -185,9 +185,9 @@ extern void floppy_mount(uint8_t id, char *fn, uint8_t wp);
|
|||||||
extern void floppy_eject(uint8_t id);
|
extern void floppy_eject(uint8_t id);
|
||||||
extern void cdrom_mount(uint8_t id, char *fn);
|
extern void cdrom_mount(uint8_t id, char *fn);
|
||||||
extern void plat_cdrom_ui_update(uint8_t id, uint8_t reload);
|
extern void plat_cdrom_ui_update(uint8_t id, uint8_t reload);
|
||||||
extern void zip_eject(uint8_t id);
|
extern void rdisk_eject(uint8_t id);
|
||||||
extern void zip_mount(uint8_t id, char *fn, uint8_t wp);
|
extern void rdisk_mount(uint8_t id, char *fn, uint8_t wp);
|
||||||
extern void zip_reload(uint8_t id);
|
extern void rdisk_reload(uint8_t id);
|
||||||
extern void mo_eject(uint8_t id);
|
extern void mo_eject(uint8_t id);
|
||||||
extern void mo_mount(uint8_t id, char *fn, uint8_t wp);
|
extern void mo_mount(uint8_t id, char *fn, uint8_t wp);
|
||||||
extern void mo_reload(uint8_t id);
|
extern void mo_reload(uint8_t id);
|
||||||
|
|||||||
@@ -16,29 +16,60 @@
|
|||||||
* Copyright 2018-2025 Miran Grca.
|
* Copyright 2018-2025 Miran Grca.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef EMU_ZIP_H
|
#ifndef EMU_RDISK_H
|
||||||
#define EMU_ZIP_H
|
#define EMU_RDISK_H
|
||||||
|
|
||||||
#define ZIP_NUM 4
|
#define RDISK_NUM 4
|
||||||
|
|
||||||
#define BUF_SIZE 32768
|
#define BUF_SIZE 32768
|
||||||
|
|
||||||
#define ZIP_TIME 10.0
|
#define RDISK_TIME 10.0
|
||||||
|
|
||||||
#define ZIP_SECTORS (96 * 2048)
|
#define ZIP_SECTORS (96 * 2048)
|
||||||
|
|
||||||
#define ZIP_250_SECTORS (489532)
|
#define ZIP_250_SECTORS (489532)
|
||||||
|
|
||||||
#define ZIP_IMAGE_HISTORY 10
|
#define RDISK_IMAGE_HISTORY 10
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
ZIP_BUS_DISABLED = 0,
|
RDISK_TYPE_GENERIC = 0,
|
||||||
ZIP_BUS_ATAPI = 5,
|
RDISK_TYPE_ZIP_100,
|
||||||
ZIP_BUS_SCSI = 6,
|
RDISK_TYPE_ZIP_250
|
||||||
ZIP_BUS_USB = 7
|
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct zip_drive_t {
|
typedef struct rdisk_type_t {
|
||||||
|
uint32_t sectors;
|
||||||
|
uint16_t bytes_per_sector;
|
||||||
|
} rdisk_type_t;
|
||||||
|
|
||||||
|
#define KNOWN_RDISK_TYPES 2
|
||||||
|
static const rdisk_type_t rdisk_types[KNOWN_RDISK_TYPES] = {
|
||||||
|
{ ZIP_SECTORS, 512 },
|
||||||
|
{ ZIP_250_SECTORS, 512 },
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct rdisk_drive_type_t {
|
||||||
|
const char *vendor;
|
||||||
|
const char *model;
|
||||||
|
const char *revision;
|
||||||
|
int8_t supported_media[KNOWN_RDISK_TYPES];
|
||||||
|
} rdisk_drive_type_t;
|
||||||
|
|
||||||
|
#define KNOWN_RDISK_DRIVE_TYPES 3
|
||||||
|
static const rdisk_drive_type_t rdisk_drive_types[KNOWN_RDISK_DRIVE_TYPES] = {
|
||||||
|
{ "86BOX", "REMOVABLE DISK", "1.00", { 1, 1 }},
|
||||||
|
{ "IOMEGA", "ZIP 100", "E.08", { 1, 0 }},
|
||||||
|
{ "IOMEGA", "ZIP 250", "42.S", { 1, 1 }}
|
||||||
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
RDISK_BUS_DISABLED = 0,
|
||||||
|
RDISK_BUS_ATAPI = 5,
|
||||||
|
RDISK_BUS_SCSI = 6,
|
||||||
|
RDISK_BUS_USB = 7
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct rdisk_drive_t {
|
||||||
uint8_t id;
|
uint8_t id;
|
||||||
|
|
||||||
union {
|
union {
|
||||||
@@ -64,17 +95,17 @@ typedef struct zip_drive_t {
|
|||||||
char image_path[1024];
|
char image_path[1024];
|
||||||
char prev_image_path[1024];
|
char prev_image_path[1024];
|
||||||
|
|
||||||
char *image_history[ZIP_IMAGE_HISTORY];
|
char *image_history[RDISK_IMAGE_HISTORY];
|
||||||
|
|
||||||
uint32_t is_250;
|
uint32_t type;
|
||||||
uint32_t medium_size;
|
uint32_t medium_size;
|
||||||
uint32_t base;
|
uint32_t base;
|
||||||
} zip_drive_t;
|
} rdisk_drive_t;
|
||||||
|
|
||||||
typedef struct zip_t {
|
typedef struct rdisk_t {
|
||||||
mode_sense_pages_t ms_pages_saved;
|
mode_sense_pages_t ms_pages_saved;
|
||||||
|
|
||||||
zip_drive_t *drv;
|
rdisk_drive_t *drv;
|
||||||
#ifdef EMU_IDE_H
|
#ifdef EMU_IDE_H
|
||||||
ide_tf_t *tf;
|
ide_tf_t *tf;
|
||||||
#else
|
#else
|
||||||
@@ -113,37 +144,37 @@ typedef struct zip_t {
|
|||||||
double callback;
|
double callback;
|
||||||
|
|
||||||
uint8_t (*ven_cmd)(void *sc, uint8_t *cdb, int32_t *BufLen);
|
uint8_t (*ven_cmd)(void *sc, uint8_t *cdb, int32_t *BufLen);
|
||||||
} zip_t;
|
} rdisk_t;
|
||||||
|
|
||||||
extern zip_t *zip[ZIP_NUM];
|
extern rdisk_t *rdisk[RDISK_NUM];
|
||||||
extern zip_drive_t zip_drives[ZIP_NUM];
|
extern rdisk_drive_t rdisk_drives[RDISK_NUM];
|
||||||
extern uint8_t atapi_zip_drives[8];
|
extern uint8_t atapi_rdisk_drives[8];
|
||||||
extern uint8_t scsi_zip_drives[16];
|
extern uint8_t scsi_rdisk_drives[16];
|
||||||
|
|
||||||
#define zip_sense_error dev->sense[0]
|
#define rdisk_sense_error dev->sense[0]
|
||||||
#define zip_sense_key dev->sense[2]
|
#define rdisk_sense_key dev->sense[2]
|
||||||
#define zip_info *(uint32_t *) &(dev->sense[3])
|
#define rdisk_info *(uint32_t *) &(dev->sense[3])
|
||||||
#define zip_asc dev->sense[12]
|
#define rdisk_asc dev->sense[12]
|
||||||
#define zip_ascq dev->sense[13]
|
#define rdisk_ascq dev->sense[13]
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern void zip_disk_close(const zip_t *dev);
|
extern void rdisk_disk_close(const rdisk_t *dev);
|
||||||
extern void zip_disk_reload(const zip_t *dev);
|
extern void rdisk_disk_reload(const rdisk_t *dev);
|
||||||
extern void zip_insert(zip_t *dev);
|
extern void rdisk_insert(rdisk_t *dev);
|
||||||
|
|
||||||
extern void zip_global_init(void);
|
extern void rdisk_global_init(void);
|
||||||
extern void zip_hard_reset(void);
|
extern void rdisk_hard_reset(void);
|
||||||
|
|
||||||
extern void zip_reset(scsi_common_t *sc);
|
extern void rdisk_reset(scsi_common_t *sc);
|
||||||
extern int zip_is_empty(const uint8_t id);
|
extern int rdisk_is_empty(const uint8_t id);
|
||||||
extern void zip_load(const zip_t *dev, const char *fn, const int skip_insert);
|
extern void rdisk_load(const rdisk_t *dev, const char *fn, const int skip_insert);
|
||||||
extern void zip_close(void);
|
extern void rdisk_close(void);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /*EMU_ZIP_H*/
|
#endif /*EMU_RDISK_H*/
|
||||||
@@ -49,7 +49,7 @@ extern int ui_msgbox_header(int flags, void *header, void *message);
|
|||||||
#define SB_CARTRIDGE 0x10
|
#define SB_CARTRIDGE 0x10
|
||||||
#define SB_FLOPPY 0x20
|
#define SB_FLOPPY 0x20
|
||||||
#define SB_CDROM 0x30
|
#define SB_CDROM 0x30
|
||||||
#define SB_ZIP 0x40
|
#define SB_RDISK 0x40
|
||||||
#define SB_MO 0x50
|
#define SB_MO 0x50
|
||||||
#define SB_HDD 0x60
|
#define SB_HDD 0x60
|
||||||
#define SB_NETWORK 0x70
|
#define SB_NETWORK 0x70
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
#include <86box/cartridge.h>
|
#include <86box/cartridge.h>
|
||||||
#include <86box/cassette.h>
|
#include <86box/cassette.h>
|
||||||
#include <86box/cdrom.h>
|
#include <86box/cdrom.h>
|
||||||
#include <86box/zip.h>
|
#include <86box/rdisk.h>
|
||||||
#include <86box/mo.h>
|
#include <86box/mo.h>
|
||||||
#include <86box/hdd.h>
|
#include <86box/hdd.h>
|
||||||
#include <86box/thread.h>
|
#include <86box/thread.h>
|
||||||
@@ -36,9 +36,9 @@ machine_status_init(void)
|
|||||||
machine_status.cdrom[i].empty = (strlen(cdrom[i].image_path) == 0);
|
machine_status.cdrom[i].empty = (strlen(cdrom[i].image_path) == 0);
|
||||||
machine_status.cdrom[i].active = false;
|
machine_status.cdrom[i].active = false;
|
||||||
}
|
}
|
||||||
for (size_t i = 0; i < ZIP_NUM; i++) {
|
for (size_t i = 0; i < RDISK_NUM; i++) {
|
||||||
machine_status.zip[i].empty = (strlen(zip_drives[i].image_path) == 0);
|
machine_status.rdisk[i].empty = (strlen(rdisk_drives[i].image_path) == 0);
|
||||||
machine_status.zip[i].active = false;
|
machine_status.rdisk[i].active = false;
|
||||||
}
|
}
|
||||||
for (size_t i = 0; i < MO_NUM; i++) {
|
for (size_t i = 0; i < MO_NUM; i++) {
|
||||||
machine_status.mo[i].empty = (strlen(mo_drives[i].image_path) == 0);
|
machine_status.mo[i].empty = (strlen(mo_drives[i].image_path) == 0);
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 9.4 KiB After Width: | Height: | Size: 9.4 KiB |
|
Before Width: | Height: | Size: 9.4 KiB After Width: | Height: | Size: 9.4 KiB |
|
Before Width: | Height: | Size: 9.4 KiB After Width: | Height: | Size: 9.4 KiB |
@@ -31,7 +31,7 @@ extern "C" {
|
|||||||
#include <86box/hdc.h>
|
#include <86box/hdc.h>
|
||||||
#include <86box/scsi.h>
|
#include <86box/scsi.h>
|
||||||
#include <86box/scsi_device.h>
|
#include <86box/scsi_device.h>
|
||||||
#include <86box/zip.h>
|
#include <86box/rdisk.h>
|
||||||
#include <86box/mo.h>
|
#include <86box/mo.h>
|
||||||
#include <86box/plat.h>
|
#include <86box/plat.h>
|
||||||
#include <86box/machine.h>
|
#include <86box/machine.h>
|
||||||
@@ -102,7 +102,7 @@ struct Pixmaps {
|
|||||||
PixmapSetEmptyActive floppy_525;
|
PixmapSetEmptyActive floppy_525;
|
||||||
PixmapSetEmptyActive floppy_35;
|
PixmapSetEmptyActive floppy_35;
|
||||||
PixmapSetEmptyActive cdrom;
|
PixmapSetEmptyActive cdrom;
|
||||||
PixmapSetEmptyActive zip;
|
PixmapSetEmptyActive rdisk;
|
||||||
PixmapSetEmptyActive mo;
|
PixmapSetEmptyActive mo;
|
||||||
PixmapSetActive hd;
|
PixmapSetActive hd;
|
||||||
PixmapSetEmptyActive net;
|
PixmapSetEmptyActive net;
|
||||||
@@ -283,7 +283,7 @@ struct MachineStatus::States {
|
|||||||
pixmaps.floppy_525.load(QIcon(":/settings/qt/icons/floppy_525.ico"));
|
pixmaps.floppy_525.load(QIcon(":/settings/qt/icons/floppy_525.ico"));
|
||||||
pixmaps.floppy_35.load(QIcon(":/settings/qt/icons/floppy_35.ico"));
|
pixmaps.floppy_35.load(QIcon(":/settings/qt/icons/floppy_35.ico"));
|
||||||
pixmaps.cdrom.load(QIcon(":/settings/qt/icons/cdrom.ico"));
|
pixmaps.cdrom.load(QIcon(":/settings/qt/icons/cdrom.ico"));
|
||||||
pixmaps.zip.load(QIcon(":/settings/qt/icons/zip.ico"));
|
pixmaps.rdisk.load(QIcon(":/settings/qt/icons/rdisk.ico"));
|
||||||
pixmaps.mo.load(QIcon(":/settings/qt/icons/mo.ico"));
|
pixmaps.mo.load(QIcon(":/settings/qt/icons/mo.ico"));
|
||||||
pixmaps.hd.load(QIcon(":/settings/qt/icons/hard_disk.ico"));
|
pixmaps.hd.load(QIcon(":/settings/qt/icons/hard_disk.ico"));
|
||||||
pixmaps.net.load(QIcon(":/settings/qt/icons/network.ico"));
|
pixmaps.net.load(QIcon(":/settings/qt/icons/network.ico"));
|
||||||
@@ -298,8 +298,8 @@ struct MachineStatus::States {
|
|||||||
for (auto &c : cdrom) {
|
for (auto &c : cdrom) {
|
||||||
c.pixmaps = &pixmaps.cdrom;
|
c.pixmaps = &pixmaps.cdrom;
|
||||||
}
|
}
|
||||||
for (auto &z : zip) {
|
for (auto &z : rdisk) {
|
||||||
z.pixmaps = &pixmaps.zip;
|
z.pixmaps = &pixmaps.rdisk;
|
||||||
}
|
}
|
||||||
for (auto &m : mo) {
|
for (auto &m : mo) {
|
||||||
m.pixmaps = &pixmaps.mo;
|
m.pixmaps = &pixmaps.mo;
|
||||||
@@ -316,7 +316,7 @@ struct MachineStatus::States {
|
|||||||
StateEmptyActive cassette;
|
StateEmptyActive cassette;
|
||||||
std::array<StateEmptyActive, FDD_NUM> fdd;
|
std::array<StateEmptyActive, FDD_NUM> fdd;
|
||||||
std::array<StateEmptyActive, CDROM_NUM> cdrom;
|
std::array<StateEmptyActive, CDROM_NUM> cdrom;
|
||||||
std::array<StateEmptyActive, ZIP_NUM> zip;
|
std::array<StateEmptyActive, RDISK_NUM> rdisk;
|
||||||
std::array<StateEmptyActive, MO_NUM> mo;
|
std::array<StateEmptyActive, MO_NUM> mo;
|
||||||
std::array<StateActive, HDD_BUS_USB> hdds;
|
std::array<StateActive, HDD_BUS_USB> hdds;
|
||||||
std::array<StateEmptyActive, NET_CARD_MAX> net;
|
std::array<StateEmptyActive, NET_CARD_MAX> net;
|
||||||
@@ -397,21 +397,21 @@ MachineStatus::iterateCDROM(const std::function<void(int)> &cb)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
MachineStatus::iterateZIP(const std::function<void(int)> &cb)
|
MachineStatus::iterateRDisk(const std::function<void(int)> &cb)
|
||||||
{
|
{
|
||||||
auto hdc_name = QString(hdc_get_internal_name(hdc_current[0]));
|
auto hdc_name = QString(hdc_get_internal_name(hdc_current[0]));
|
||||||
for (size_t i = 0; i < ZIP_NUM; i++) {
|
for (size_t i = 0; i < RDISK_NUM; i++) {
|
||||||
/* Could be Internal or External IDE.. */
|
/* Could be Internal or External IDE.. */
|
||||||
if ((zip_drives[i].bus_type == ZIP_BUS_ATAPI) && !hasIDE() &&
|
if ((rdisk_drives[i].bus_type == RDISK_BUS_ATAPI) && !hasIDE() &&
|
||||||
(hdc_name.left(3) != QStringLiteral("ide")) &&
|
(hdc_name.left(3) != QStringLiteral("ide")) &&
|
||||||
(hdc_name.left(5) != QStringLiteral("xtide")) &&
|
(hdc_name.left(5) != QStringLiteral("xtide")) &&
|
||||||
(hdc_name.left(5) != QStringLiteral("mcide")))
|
(hdc_name.left(5) != QStringLiteral("mcide")))
|
||||||
continue;
|
continue;
|
||||||
if ((zip_drives[i].bus_type == ZIP_BUS_SCSI) && !hasSCSI() &&
|
if ((rdisk_drives[i].bus_type == RDISK_BUS_SCSI) && !hasSCSI() &&
|
||||||
(scsi_card_current[0] == 0) && (scsi_card_current[1] == 0) &&
|
(scsi_card_current[0] == 0) && (scsi_card_current[1] == 0) &&
|
||||||
(scsi_card_current[2] == 0) && (scsi_card_current[3] == 0))
|
(scsi_card_current[2] == 0) && (scsi_card_current[3] == 0))
|
||||||
continue;
|
continue;
|
||||||
if (zip_drives[i].bus_type != 0) {
|
if (rdisk_drives[i].bus_type != 0) {
|
||||||
cb(i);
|
cb(i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -475,9 +475,9 @@ MachineStatus::refreshEmptyIcons()
|
|||||||
}
|
}
|
||||||
for (size_t i = 0; i < CDROM_NUM; ++i)
|
for (size_t i = 0; i < CDROM_NUM; ++i)
|
||||||
d->cdrom[i].setEmpty(machine_status.cdrom[i].empty);
|
d->cdrom[i].setEmpty(machine_status.cdrom[i].empty);
|
||||||
for (size_t i = 0; i < ZIP_NUM; i++) {
|
for (size_t i = 0; i < RDISK_NUM; i++) {
|
||||||
d->zip[i].setEmpty(machine_status.zip[i].empty);
|
d->rdisk[i].setEmpty(machine_status.rdisk[i].empty);
|
||||||
d->zip[i].setWriteProtected(machine_status.zip[i].write_prot);
|
d->rdisk[i].setWriteProtected(machine_status.rdisk[i].write_prot);
|
||||||
}
|
}
|
||||||
for (size_t i = 0; i < MO_NUM; i++) {
|
for (size_t i = 0; i < MO_NUM; i++) {
|
||||||
d->mo[i].setEmpty(machine_status.mo[i].empty);
|
d->mo[i].setEmpty(machine_status.mo[i].empty);
|
||||||
@@ -515,13 +515,13 @@ MachineStatus::refreshIcons()
|
|||||||
ui_sb_update_icon_write(SB_CDROM | i, 0);
|
ui_sb_update_icon_write(SB_CDROM | i, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (size_t i = 0; i < ZIP_NUM; i++) {
|
for (size_t i = 0; i < RDISK_NUM; i++) {
|
||||||
d->zip[i].setActive(machine_status.zip[i].active);
|
d->rdisk[i].setActive(machine_status.rdisk[i].active);
|
||||||
d->zip[i].setWriteActive(machine_status.zip[i].write_active);
|
d->rdisk[i].setWriteActive(machine_status.rdisk[i].write_active);
|
||||||
if (machine_status.zip[i].active)
|
if (machine_status.rdisk[i].active)
|
||||||
ui_sb_update_icon(SB_ZIP | i, 0);
|
ui_sb_update_icon(SB_RDISK | i, 0);
|
||||||
if (machine_status.zip[i].write_active)
|
if (machine_status.rdisk[i].write_active)
|
||||||
ui_sb_update_icon_write(SB_ZIP | i, 0);
|
ui_sb_update_icon_write(SB_RDISK | i, 0);
|
||||||
}
|
}
|
||||||
for (size_t i = 0; i < MO_NUM; i++) {
|
for (size_t i = 0; i < MO_NUM; i++) {
|
||||||
d->mo[i].setActive(machine_status.mo[i].active);
|
d->mo[i].setActive(machine_status.mo[i].active);
|
||||||
@@ -558,9 +558,9 @@ MachineStatus::clearActivity()
|
|||||||
cdrom.setActive(false);
|
cdrom.setActive(false);
|
||||||
cdrom.setWriteActive(false);
|
cdrom.setWriteActive(false);
|
||||||
}
|
}
|
||||||
for (auto &zip : d->zip) {
|
for (auto &rdisk : d->rdisk) {
|
||||||
zip.setActive(false);
|
rdisk.setActive(false);
|
||||||
zip.setWriteActive(false);
|
rdisk.setWriteActive(false);
|
||||||
}
|
}
|
||||||
for (auto &mo : d->mo) {
|
for (auto &mo : d->mo) {
|
||||||
mo.setActive(false);
|
mo.setActive(false);
|
||||||
@@ -600,8 +600,8 @@ MachineStatus::refresh(QStatusBar *sbar)
|
|||||||
for (size_t i = 0; i < CDROM_NUM; i++) {
|
for (size_t i = 0; i < CDROM_NUM; i++) {
|
||||||
sbar->removeWidget(d->cdrom[i].label.get());
|
sbar->removeWidget(d->cdrom[i].label.get());
|
||||||
}
|
}
|
||||||
for (size_t i = 0; i < ZIP_NUM; i++) {
|
for (size_t i = 0; i < RDISK_NUM; i++) {
|
||||||
sbar->removeWidget(d->zip[i].label.get());
|
sbar->removeWidget(d->rdisk[i].label.get());
|
||||||
}
|
}
|
||||||
for (size_t i = 0; i < MO_NUM; i++) {
|
for (size_t i = 0; i < MO_NUM; i++) {
|
||||||
sbar->removeWidget(d->mo[i].label.get());
|
sbar->removeWidget(d->mo[i].label.get());
|
||||||
@@ -700,38 +700,38 @@ MachineStatus::refresh(QStatusBar *sbar)
|
|||||||
sbar->addWidget(d->cdrom[i].label.get());
|
sbar->addWidget(d->cdrom[i].label.get());
|
||||||
});
|
});
|
||||||
|
|
||||||
iterateZIP([this, sbar](int i) {
|
iterateRDisk([this, sbar](int i) {
|
||||||
d->zip[i].label = std::make_unique<ClickableLabel>();
|
d->rdisk[i].label = std::make_unique<ClickableLabel>();
|
||||||
d->zip[i].setEmpty(QString(zip_drives[i].image_path).isEmpty());
|
d->rdisk[i].setEmpty(QString(rdisk_drives[i].image_path).isEmpty());
|
||||||
if (QString(zip_drives[i].image_path).isEmpty())
|
if (QString(rdisk_drives[i].image_path).isEmpty())
|
||||||
d->zip[i].setWriteProtected(false);
|
d->rdisk[i].setWriteProtected(false);
|
||||||
else if (QString(zip_drives[i].image_path).left(5) == "wp://")
|
else if (QString(rdisk_drives[i].image_path).left(5) == "wp://")
|
||||||
d->zip[i].setWriteProtected(true);
|
d->rdisk[i].setWriteProtected(true);
|
||||||
else
|
else
|
||||||
d->zip[i].setWriteProtected(zip_drives[i].read_only);
|
d->rdisk[i].setWriteProtected(rdisk_drives[i].read_only);
|
||||||
d->zip[i].setActive(false);
|
d->rdisk[i].setActive(false);
|
||||||
d->zip[i].setWriteActive(false);
|
d->rdisk[i].setWriteActive(false);
|
||||||
d->zip[i].refresh();
|
d->rdisk[i].refresh();
|
||||||
connect((ClickableLabel *) d->zip[i].label.get(), &ClickableLabel::clicked, [i](QPoint pos) {
|
connect((ClickableLabel *) d->rdisk[i].label.get(), &ClickableLabel::clicked, [i](QPoint pos) {
|
||||||
MediaMenu::ptr->zipMenus[i]->popup(pos - QPoint(0, MediaMenu::ptr->zipMenus[i]->sizeHint().height()));
|
MediaMenu::ptr->rdiskMenus[i]->popup(pos - QPoint(0, MediaMenu::ptr->rdiskMenus[i]->sizeHint().height()));
|
||||||
});
|
});
|
||||||
connect((ClickableLabel *) d->zip[i].label.get(), &ClickableLabel::dropped, [i](QString str) {
|
connect((ClickableLabel *) d->rdisk[i].label.get(), &ClickableLabel::dropped, [i](QString str) {
|
||||||
MediaMenu::ptr->zipMount(i, str, false);
|
MediaMenu::ptr->rdiskMount(i, str, false);
|
||||||
});
|
});
|
||||||
d->zip[i].label->setToolTip(MediaMenu::ptr->zipMenus[i]->title());
|
d->rdisk[i].label->setToolTip(MediaMenu::ptr->rdiskMenus[i]->title());
|
||||||
d->zip[i].label->setAcceptDrops(true);
|
d->rdisk[i].label->setAcceptDrops(true);
|
||||||
sbar->addWidget(d->zip[i].label.get());
|
sbar->addWidget(d->rdisk[i].label.get());
|
||||||
});
|
});
|
||||||
|
|
||||||
iterateMO([this, sbar](int i) {
|
iterateMO([this, sbar](int i) {
|
||||||
d->mo[i].label = std::make_unique<ClickableLabel>();
|
d->mo[i].label = std::make_unique<ClickableLabel>();
|
||||||
d->mo[i].setEmpty(QString(mo_drives[i].image_path).isEmpty());
|
d->mo[i].setEmpty(QString(mo_drives[i].image_path).isEmpty());
|
||||||
if (QString(zip_drives[i].image_path).isEmpty())
|
if (QString(rdisk_drives[i].image_path).isEmpty())
|
||||||
d->mo[i].setWriteProtected(false);
|
d->mo[i].setWriteProtected(false);
|
||||||
else if (QString(zip_drives[i].image_path).left(5) == "wp://")
|
else if (QString(rdisk_drives[i].image_path).left(5) == "wp://")
|
||||||
d->mo[i].setWriteProtected(true);
|
d->mo[i].setWriteProtected(true);
|
||||||
else
|
else
|
||||||
d->mo[i].setWriteProtected(zip_drives[i].read_only);
|
d->mo[i].setWriteProtected(rdisk_drives[i].read_only);
|
||||||
d->mo[i].setActive(false);
|
d->mo[i].setActive(false);
|
||||||
d->mo[i].setWriteActive(false);
|
d->mo[i].setWriteActive(false);
|
||||||
d->mo[i].refresh();
|
d->mo[i].refresh();
|
||||||
@@ -924,9 +924,9 @@ MachineStatus::updateTip(int tag)
|
|||||||
if (d->cdrom[item].label && MediaMenu::ptr->cdromMenus[item])
|
if (d->cdrom[item].label && MediaMenu::ptr->cdromMenus[item])
|
||||||
d->cdrom[item].label->setToolTip(MediaMenu::ptr->cdromMenus[item]->title());
|
d->cdrom[item].label->setToolTip(MediaMenu::ptr->cdromMenus[item]->title());
|
||||||
break;
|
break;
|
||||||
case SB_ZIP:
|
case SB_RDISK:
|
||||||
if (d->zip[item].label && MediaMenu::ptr->zipMenus[item])
|
if (d->rdisk[item].label && MediaMenu::ptr->rdiskMenus[item])
|
||||||
d->zip[item].label->setToolTip(MediaMenu::ptr->zipMenus[item]->title());
|
d->rdisk[item].label->setToolTip(MediaMenu::ptr->rdiskMenus[item]->title());
|
||||||
break;
|
break;
|
||||||
case SB_MO:
|
case SB_MO:
|
||||||
if (d->mo[item].label && MediaMenu::ptr->moMenus[item])
|
if (d->mo[item].label && MediaMenu::ptr->moMenus[item])
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ public:
|
|||||||
static bool hasSCSI();
|
static bool hasSCSI();
|
||||||
static void iterateFDD(const std::function<void(int i)> &cb);
|
static void iterateFDD(const std::function<void(int i)> &cb);
|
||||||
static void iterateCDROM(const std::function<void(int i)> &cb);
|
static void iterateCDROM(const std::function<void(int i)> &cb);
|
||||||
static void iterateZIP(const std::function<void(int i)> &cb);
|
static void iterateRDisk(const std::function<void(int i)> &cb);
|
||||||
static void iterateMO(const std::function<void(int i)> &cb);
|
static void iterateMO(const std::function<void(int i)> &cb);
|
||||||
static void iterateNIC(const std::function<void(int i)> &cb);
|
static void iterateNIC(const std::function<void(int i)> &cb);
|
||||||
|
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ extern "C" {
|
|||||||
#include <86box/fdd.h>
|
#include <86box/fdd.h>
|
||||||
#include <86box/cdrom.h>
|
#include <86box/cdrom.h>
|
||||||
#include <86box/scsi_device.h>
|
#include <86box/scsi_device.h>
|
||||||
#include <86box/zip.h>
|
#include <86box/rdisk.h>
|
||||||
#include <86box/mo.h>
|
#include <86box/mo.h>
|
||||||
#include <86box/path.h>
|
#include <86box/path.h>
|
||||||
}
|
}
|
||||||
@@ -114,8 +114,8 @@ MediaHistoryManager::maxDevicesSupported(ui::MediaType type)
|
|||||||
return CDROM_NUM;
|
return CDROM_NUM;
|
||||||
case ui::MediaType::Floppy:
|
case ui::MediaType::Floppy:
|
||||||
return FDD_NUM;
|
return FDD_NUM;
|
||||||
case ui::MediaType::Zip:
|
case ui::MediaType::RDisk:
|
||||||
return ZIP_NUM;
|
return RDISK_NUM;
|
||||||
case ui::MediaType::Mo:
|
case ui::MediaType::Mo:
|
||||||
return MO_NUM;
|
return MO_NUM;
|
||||||
case ui::MediaType::Cassette:
|
case ui::MediaType::Cassette:
|
||||||
@@ -200,8 +200,8 @@ MediaHistoryManager::initialDeduplication()
|
|||||||
case ui::MediaType::Optical:
|
case ui::MediaType::Optical:
|
||||||
current_image = cdrom[device_index].image_path;
|
current_image = cdrom[device_index].image_path;
|
||||||
break;
|
break;
|
||||||
case ui::MediaType::Zip:
|
case ui::MediaType::RDisk:
|
||||||
current_image = zip_drives[device_index].image_path;
|
current_image = rdisk_drives[device_index].image_path;
|
||||||
break;
|
break;
|
||||||
case ui::MediaType::Mo:
|
case ui::MediaType::Mo:
|
||||||
current_image = mo_drives[device_index].image_path;
|
current_image = mo_drives[device_index].image_path;
|
||||||
@@ -237,8 +237,8 @@ MediaHistoryManager::getEmuHistoryVarForType(ui::MediaType type, int index)
|
|||||||
return &fdd_image_history[index][0];
|
return &fdd_image_history[index][0];
|
||||||
case ui::MediaType::Optical:
|
case ui::MediaType::Optical:
|
||||||
return &cdrom[index].image_history[0];
|
return &cdrom[index].image_history[0];
|
||||||
case ui::MediaType::Zip:
|
case ui::MediaType::RDisk:
|
||||||
return &zip_drives[index].image_history[0];
|
return &rdisk_drives[index].image_history[0];
|
||||||
case ui::MediaType::Mo:
|
case ui::MediaType::Mo:
|
||||||
return &mo_drives[index].image_history[0];
|
return &mo_drives[index].image_history[0];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ Q_NAMESPACE
|
|||||||
enum class MediaType {
|
enum class MediaType {
|
||||||
Floppy,
|
Floppy,
|
||||||
Optical,
|
Optical,
|
||||||
Zip,
|
RDisk,
|
||||||
Mo,
|
Mo,
|
||||||
Cassette,
|
Cassette,
|
||||||
Cartridge
|
Cartridge
|
||||||
@@ -62,7 +62,7 @@ typedef QHash<ui::MediaType, device_media_history_t> master_list_t;
|
|||||||
static const MediaType AllSupportedMediaHistoryTypes[] = {
|
static const MediaType AllSupportedMediaHistoryTypes[] = {
|
||||||
MediaType::Optical,
|
MediaType::Optical,
|
||||||
MediaType::Floppy,
|
MediaType::Floppy,
|
||||||
MediaType::Zip,
|
MediaType::RDisk,
|
||||||
MediaType::Mo,
|
MediaType::Mo,
|
||||||
MediaType::Cassette,
|
MediaType::Cassette,
|
||||||
MediaType::Cartridge
|
MediaType::Cartridge
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ extern "C" {
|
|||||||
#include <86box/fdd_86f.h>
|
#include <86box/fdd_86f.h>
|
||||||
#include <86box/cdrom.h>
|
#include <86box/cdrom.h>
|
||||||
#include <86box/scsi_device.h>
|
#include <86box/scsi_device.h>
|
||||||
#include <86box/zip.h>
|
#include <86box/rdisk.h>
|
||||||
#include <86box/mo.h>
|
#include <86box/mo.h>
|
||||||
#include <86box/sound.h>
|
#include <86box/sound.h>
|
||||||
#include <86box/ui.h>
|
#include <86box/ui.h>
|
||||||
@@ -187,24 +187,24 @@ MediaMenu::refresh(QMenu *parentMenu)
|
|||||||
cdromUpdateMenu(i);
|
cdromUpdateMenu(i);
|
||||||
});
|
});
|
||||||
|
|
||||||
zipMenus.clear();
|
rdiskMenus.clear();
|
||||||
MachineStatus::iterateZIP([this, parentMenu](int i) {
|
MachineStatus::iterateRDisk([this, parentMenu](int i) {
|
||||||
auto *menu = parentMenu->addMenu("");
|
auto *menu = parentMenu->addMenu("");
|
||||||
QIcon img_icon = QIcon(":/settings/qt/icons/zip_image.ico");
|
QIcon img_icon = QIcon(":/settings/qt/icons/rdisk_image.ico");
|
||||||
menu->addAction(getIconWithIndicator(img_icon, pixmap_size, QIcon::Normal, New), tr("&New image..."), [this, i]() { zipNewImage(i); });
|
menu->addAction(getIconWithIndicator(img_icon, pixmap_size, QIcon::Normal, New), tr("&New image..."), [this, i]() { rdiskNewImage(i); });
|
||||||
menu->addSeparator();
|
menu->addSeparator();
|
||||||
menu->addAction(getIconWithIndicator(img_icon, pixmap_size, QIcon::Normal, Browse), tr("&Existing image..."), [this, i]() { zipSelectImage(i, false); });
|
menu->addAction(getIconWithIndicator(img_icon, pixmap_size, QIcon::Normal, Browse), tr("&Existing image..."), [this, i]() { rdiskSelectImage(i, false); });
|
||||||
menu->addAction(getIconWithIndicator(img_icon, pixmap_size, QIcon::Normal, WriteProtectedBrowse), tr("Existing image (&Write-protected)..."), [this, i]() { zipSelectImage(i, true); });
|
menu->addAction(getIconWithIndicator(img_icon, pixmap_size, QIcon::Normal, WriteProtectedBrowse), tr("Existing image (&Write-protected)..."), [this, i]() { rdiskSelectImage(i, true); });
|
||||||
menu->addSeparator();
|
menu->addSeparator();
|
||||||
for (int slot = 0; slot < MAX_PREV_IMAGES; slot++) {
|
for (int slot = 0; slot < MAX_PREV_IMAGES; slot++) {
|
||||||
zipImageHistoryPos[slot] = menu->children().count();
|
rdiskImageHistoryPos[slot] = menu->children().count();
|
||||||
menu->addAction(img_icon, tr("Image %1").arg(slot), [this, i, slot]() { zipReload(i, slot); })->setCheckable(false);
|
menu->addAction(img_icon, tr("Image %1").arg(slot), [this, i, slot]() { rdiskReload(i, slot); })->setCheckable(false);
|
||||||
}
|
}
|
||||||
menu->addSeparator();
|
menu->addSeparator();
|
||||||
zipEjectPos = menu->children().count();
|
rdiskEjectPos = menu->children().count();
|
||||||
menu->addAction(getIconWithIndicator(img_icon, pixmap_size, QIcon::Normal, Eject), tr("E&ject"), [this, i]() { zipEject(i); });
|
menu->addAction(getIconWithIndicator(img_icon, pixmap_size, QIcon::Normal, Eject), tr("E&ject"), [this, i]() { rdiskEject(i); });
|
||||||
zipMenus[i] = menu;
|
rdiskMenus[i] = menu;
|
||||||
zipUpdateMenu(i);
|
rdiskUpdateMenu(i);
|
||||||
});
|
});
|
||||||
|
|
||||||
moMenus.clear();
|
moMenus.clear();
|
||||||
@@ -725,12 +725,12 @@ MediaMenu::updateImageHistory(int index, int slot, ui::MediaType type)
|
|||||||
}
|
}
|
||||||
imageHistoryUpdatePos->setIcon(menu_icon);
|
imageHistoryUpdatePos->setIcon(menu_icon);
|
||||||
break;
|
break;
|
||||||
case ui::MediaType::Zip:
|
case ui::MediaType::RDisk:
|
||||||
if (!zipMenus.contains(index))
|
if (!rdiskMenus.contains(index))
|
||||||
return;
|
return;
|
||||||
menu = zipMenus[index];
|
menu = rdiskMenus[index];
|
||||||
children = menu->children();
|
children = menu->children();
|
||||||
imageHistoryUpdatePos = dynamic_cast<QAction *>(children[zipImageHistoryPos[slot]]);
|
imageHistoryUpdatePos = dynamic_cast<QAction *>(children[rdiskImageHistoryPos[slot]]);
|
||||||
menu_icon = QIcon(":/settings/qt/icons/mo_image.ico");
|
menu_icon = QIcon(":/settings/qt/icons/mo_image.ico");
|
||||||
if (fn.left(5) == "wp://")
|
if (fn.left(5) == "wp://")
|
||||||
fi.setFile(fn.right(fn.length() - 5));
|
fi.setFile(fn.right(fn.length() - 5));
|
||||||
@@ -842,145 +842,178 @@ MediaMenu::cdromUpdateMenu(int i)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
MediaMenu::zipNewImage(int i)
|
MediaMenu::rdiskNewImage(int i)
|
||||||
{
|
{
|
||||||
NewFloppyDialog dialog(NewFloppyDialog::MediaType::Zip, parentWidget);
|
NewFloppyDialog dialog(NewFloppyDialog::MediaType::RDisk, parentWidget);
|
||||||
switch (dialog.exec()) {
|
switch (dialog.exec()) {
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
case QDialog::Accepted:
|
case QDialog::Accepted:
|
||||||
QByteArray filename = dialog.fileName().toUtf8();
|
QByteArray filename = dialog.fileName().toUtf8();
|
||||||
zipMount(i, filename, false);
|
rdiskMount(i, filename, false);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
MediaMenu::zipSelectImage(int i, bool wp)
|
MediaMenu::rdiskSelectImage(int i, bool wp)
|
||||||
{
|
{
|
||||||
const auto filename = QFileDialog::getOpenFileName(
|
const auto filename = QFileDialog::getOpenFileName(
|
||||||
parentWidget,
|
parentWidget,
|
||||||
QString(),
|
QString(),
|
||||||
QString(),
|
QString(),
|
||||||
tr("ZIP images") % util::DlgFilter({ "im?", "zdi" }) % tr("All files") % util::DlgFilter({ "*" }, true));
|
tr("Removable disk images") % util::DlgFilter({ "im?", "rdi", "zdi" }) % tr("All files") % util::DlgFilter({ "*" }, true));
|
||||||
|
|
||||||
if (!filename.isEmpty())
|
if (!filename.isEmpty())
|
||||||
zipMount(i, filename, wp);
|
rdiskMount(i, filename, wp);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
MediaMenu::zipMount(int i, const QString &filename, bool wp)
|
MediaMenu::rdiskMount(int i, const QString &filename, bool wp)
|
||||||
{
|
{
|
||||||
const auto dev = static_cast<zip_t *>(zip_drives[i].priv);
|
const auto dev = static_cast<rdisk_t *>(rdisk_drives[i].priv);
|
||||||
int was_empty = zip_is_empty(i);
|
int was_empty = rdisk_is_empty(i);
|
||||||
|
|
||||||
zip_disk_close(dev);
|
rdisk_disk_close(dev);
|
||||||
zip_drives[i].read_only = wp;
|
rdisk_drives[i].read_only = wp;
|
||||||
if (!filename.isEmpty()) {
|
if (!filename.isEmpty()) {
|
||||||
QByteArray filenameBytes = filename.toUtf8();
|
QByteArray filenameBytes = filename.toUtf8();
|
||||||
|
|
||||||
if (filename.left(5) == "wp://")
|
if (filename.left(5) == "wp://")
|
||||||
zip_drives[i].read_only = 1;
|
rdisk_drives[i].read_only = 1;
|
||||||
else if (zip_drives[i].read_only)
|
else if (rdisk_drives[i].read_only)
|
||||||
filenameBytes = QString::asprintf(R"(wp://%s)", filename.toUtf8().data()).toUtf8();
|
filenameBytes = QString::asprintf(R"(wp://%s)", filename.toUtf8().data()).toUtf8();
|
||||||
|
|
||||||
zip_load(dev, filenameBytes.data(), 1);
|
rdisk_load(dev, filenameBytes.data(), 1);
|
||||||
|
|
||||||
/* Signal media change to the emulated machine. */
|
/* Signal media change to the emulated machine. */
|
||||||
zip_insert(dev);
|
rdisk_insert(dev);
|
||||||
|
|
||||||
/* The drive was previously empty, transition directly to UNIT ATTENTION. */
|
/* The drive was previously empty, transition directly to UNIT ATTENTION. */
|
||||||
if (was_empty)
|
if (was_empty)
|
||||||
zip_insert(dev);
|
rdisk_insert(dev);
|
||||||
}
|
}
|
||||||
mhm.addImageToHistory(i, ui::MediaType::Zip, zip_drives[i].prev_image_path, zip_drives[i].image_path);
|
mhm.addImageToHistory(i, ui::MediaType::RDisk, rdisk_drives[i].prev_image_path, rdisk_drives[i].image_path);
|
||||||
|
|
||||||
ui_sb_update_icon_state(SB_ZIP | i, filename.isEmpty() ? 1 : 0);
|
ui_sb_update_icon_state(SB_RDISK | i, filename.isEmpty() ? 1 : 0);
|
||||||
ui_sb_update_icon_wp(SB_ZIP | i, wp);
|
ui_sb_update_icon_wp(SB_RDISK | i, wp);
|
||||||
zipUpdateMenu(i);
|
rdiskUpdateMenu(i);
|
||||||
ui_sb_update_tip(SB_ZIP | i);
|
ui_sb_update_tip(SB_RDISK | i);
|
||||||
|
|
||||||
config_save();
|
config_save();
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
MediaMenu::zipEject(int i)
|
MediaMenu::rdiskEject(int i)
|
||||||
{
|
{
|
||||||
const auto dev = static_cast<zip_t *>(zip_drives[i].priv);
|
const auto dev = static_cast<rdisk_t *>(rdisk_drives[i].priv);
|
||||||
|
|
||||||
mhm.addImageToHistory(i, ui::MediaType::Zip, zip_drives[i].image_path, QString());
|
mhm.addImageToHistory(i, ui::MediaType::RDisk, rdisk_drives[i].image_path, QString());
|
||||||
zip_disk_close(dev);
|
rdisk_disk_close(dev);
|
||||||
zip_drives[i].image_path[0] = 0;
|
rdisk_drives[i].image_path[0] = 0;
|
||||||
if (zip_drives[i].bus_type) {
|
if (rdisk_drives[i].bus_type) {
|
||||||
/* Signal disk change to the emulated machine. */
|
/* Signal disk change to the emulated machine. */
|
||||||
zip_insert(dev);
|
rdisk_insert(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
ui_sb_update_icon_state(SB_ZIP | i, 1);
|
ui_sb_update_icon_state(SB_RDISK | i, 1);
|
||||||
zipUpdateMenu(i);
|
rdiskUpdateMenu(i);
|
||||||
ui_sb_update_tip(SB_ZIP | i);
|
ui_sb_update_tip(SB_RDISK | i);
|
||||||
config_save();
|
config_save();
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
MediaMenu::zipReloadPrev(int i)
|
MediaMenu::rdiskReloadPrev(int i)
|
||||||
{
|
{
|
||||||
const auto dev = static_cast<zip_t *>(zip_drives[i].priv);
|
const auto dev = static_cast<rdisk_t *>(rdisk_drives[i].priv);
|
||||||
|
|
||||||
zip_disk_reload(dev);
|
rdisk_disk_reload(dev);
|
||||||
if (strlen(zip_drives[i].image_path) == 0) {
|
if (strlen(rdisk_drives[i].image_path) == 0) {
|
||||||
ui_sb_update_icon_state(SB_ZIP | i, 1);
|
ui_sb_update_icon_state(SB_RDISK | i, 1);
|
||||||
} else {
|
} else {
|
||||||
ui_sb_update_icon_state(SB_ZIP | i, 0);
|
ui_sb_update_icon_state(SB_RDISK | i, 0);
|
||||||
}
|
}
|
||||||
ui_sb_update_icon_wp(SB_ZIP | i, zip_drives[i].read_only);
|
ui_sb_update_icon_wp(SB_RDISK | i, rdisk_drives[i].read_only);
|
||||||
|
|
||||||
zipUpdateMenu(i);
|
rdiskUpdateMenu(i);
|
||||||
ui_sb_update_tip(SB_ZIP | i);
|
ui_sb_update_tip(SB_RDISK | i);
|
||||||
|
|
||||||
config_save();
|
config_save();
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
MediaMenu::zipReload(int index, int slot)
|
MediaMenu::rdiskReload(int index, int slot)
|
||||||
{
|
{
|
||||||
const QString filename = mhm.getImageForSlot(index, slot, ui::MediaType::Zip);
|
const QString filename = mhm.getImageForSlot(index, slot, ui::MediaType::RDisk);
|
||||||
zipMount(index, filename, zip_drives[index].read_only);
|
rdiskMount(index, filename, rdisk_drives[index].read_only);
|
||||||
zipUpdateMenu(index);
|
rdiskUpdateMenu(index);
|
||||||
ui_sb_update_tip(SB_ZIP | index);
|
ui_sb_update_tip(SB_RDISK | index);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
MediaMenu::zipUpdateMenu(int i)
|
MediaMenu::moUpdateMenu(int i)
|
||||||
{
|
{
|
||||||
const QString name = zip_drives[i].image_path;
|
QString name = mo_drives[i].image_path;
|
||||||
const QString prev_name = zip_drives[i].prev_image_path;
|
QString prev_name = mo_drives[i].prev_image_path;
|
||||||
QFileInfo fi(zip_drives[i].image_path);
|
QFileInfo fi(mo_drives[i].image_path);
|
||||||
if (!zipMenus.contains(i))
|
if (!moMenus.contains(i))
|
||||||
return;
|
return;
|
||||||
auto *menu = zipMenus[i];
|
auto *menu = moMenus[i];
|
||||||
auto childs = menu->children();
|
auto childs = menu->children();
|
||||||
|
|
||||||
auto *ejectMenu = dynamic_cast<QAction *>(childs[zipEjectPos]);
|
auto *ejectMenu = dynamic_cast<QAction *>(childs[moEjectPos]);
|
||||||
ejectMenu->setEnabled(!name.isEmpty());
|
ejectMenu->setEnabled(!name.isEmpty());
|
||||||
ejectMenu->setText(name.isEmpty() ? tr("E&ject") : tr("E&ject %1").arg(fi.fileName()));
|
ejectMenu->setText(name.isEmpty() ? tr("E&ject") : tr("E&ject %1").arg(fi.fileName()));
|
||||||
|
|
||||||
QString busName = tr("Unknown Bus");
|
QString busName = tr("Unknown Bus");
|
||||||
switch (zip_drives[i].bus_type) {
|
switch (mo_drives[i].bus_type) {
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
case ZIP_BUS_ATAPI:
|
case MO_BUS_ATAPI:
|
||||||
busName = "ATAPI";
|
busName = "ATAPI";
|
||||||
break;
|
break;
|
||||||
case ZIP_BUS_SCSI:
|
case MO_BUS_SCSI:
|
||||||
busName = "SCSI";
|
busName = "SCSI";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
menu->setTitle(tr("ZIP %1 %2 (%3): %4").arg((zip_drives[i].is_250 > 0) ? QString("250") : QString("100"), QString::number(i + 1), busName, name.isEmpty() ? tr("(empty)") : name));
|
menu->setTitle(tr("MO %1 (%2): %3").arg(QString::number(i + 1), busName, name.isEmpty() ? tr("(empty)") : name));
|
||||||
|
|
||||||
for (int slot = 0; slot < MAX_PREV_IMAGES; slot++)
|
for (int slot = 0; slot < MAX_PREV_IMAGES; slot++)
|
||||||
updateImageHistory(i, slot, ui::MediaType::Zip);
|
updateImageHistory(i, slot, ui::MediaType::Mo);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
MediaMenu::rdiskUpdateMenu(int i)
|
||||||
|
{
|
||||||
|
const QString name = rdisk_drives[i].image_path;
|
||||||
|
const QString prev_name = rdisk_drives[i].prev_image_path;
|
||||||
|
QFileInfo fi(rdisk_drives[i].image_path);
|
||||||
|
if (!rdiskMenus.contains(i))
|
||||||
|
return;
|
||||||
|
auto *menu = rdiskMenus[i];
|
||||||
|
auto childs = menu->children();
|
||||||
|
|
||||||
|
auto *ejectMenu = dynamic_cast<QAction *>(childs[rdiskEjectPos]);
|
||||||
|
ejectMenu->setEnabled(!name.isEmpty());
|
||||||
|
ejectMenu->setText(name.isEmpty() ? tr("E&ject") : tr("E&ject %1").arg(fi.fileName()));
|
||||||
|
|
||||||
|
QString busName = tr("Unknown Bus");
|
||||||
|
switch (rdisk_drives[i].bus_type) {
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
case RDISK_BUS_ATAPI:
|
||||||
|
busName = "ATAPI";
|
||||||
|
break;
|
||||||
|
case RDISK_BUS_SCSI:
|
||||||
|
busName = "SCSI";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
menu->setTitle(tr("Removable disk %1 (%2): %3").arg(QString::number(i + 1), busName, name.isEmpty() ? tr("(empty)") : name));
|
||||||
|
|
||||||
|
for (int slot = 0; slot < MAX_PREV_IMAGES; slot++)
|
||||||
|
updateImageHistory(i, slot, ui::MediaType::RDisk);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -1094,39 +1127,6 @@ MediaMenu::moReload(int index, int slot)
|
|||||||
ui_sb_update_tip(SB_MO | index);
|
ui_sb_update_tip(SB_MO | index);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
MediaMenu::moUpdateMenu(int i)
|
|
||||||
{
|
|
||||||
QString name = mo_drives[i].image_path;
|
|
||||||
QString prev_name = mo_drives[i].prev_image_path;
|
|
||||||
QFileInfo fi(mo_drives[i].image_path);
|
|
||||||
if (!moMenus.contains(i))
|
|
||||||
return;
|
|
||||||
auto *menu = moMenus[i];
|
|
||||||
auto childs = menu->children();
|
|
||||||
|
|
||||||
auto *ejectMenu = dynamic_cast<QAction *>(childs[moEjectPos]);
|
|
||||||
ejectMenu->setEnabled(!name.isEmpty());
|
|
||||||
ejectMenu->setText(name.isEmpty() ? tr("E&ject") : tr("E&ject %1").arg(fi.fileName()));
|
|
||||||
|
|
||||||
QString busName = tr("Unknown Bus");
|
|
||||||
switch (mo_drives[i].bus_type) {
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
case MO_BUS_ATAPI:
|
|
||||||
busName = "ATAPI";
|
|
||||||
break;
|
|
||||||
case MO_BUS_SCSI:
|
|
||||||
busName = "SCSI";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
menu->setTitle(tr("MO %1 (%2): %3").arg(QString::number(i + 1), busName, name.isEmpty() ? tr("(empty)") : name));
|
|
||||||
|
|
||||||
for (int slot = 0; slot < MAX_PREV_IMAGES; slot++)
|
|
||||||
updateImageHistory(i, slot, ui::MediaType::Mo);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
MediaMenu::nicConnect(int i)
|
MediaMenu::nicConnect(int i)
|
||||||
{
|
{
|
||||||
@@ -1241,21 +1241,21 @@ plat_cdrom_ui_update(uint8_t id, uint8_t reload)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
zip_eject(uint8_t id)
|
rdisk_eject(uint8_t id)
|
||||||
{
|
{
|
||||||
MediaMenu::ptr->zipEject(id);
|
MediaMenu::ptr->rdiskEject(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
zip_mount(uint8_t id, char *fn, uint8_t wp)
|
rdisk_mount(uint8_t id, char *fn, uint8_t wp)
|
||||||
{
|
{
|
||||||
MediaMenu::ptr->zipMount(id, QString(fn), wp);
|
MediaMenu::ptr->rdiskMount(id, QString(fn), wp);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
zip_reload(uint8_t id)
|
rdisk_reload(uint8_t id)
|
||||||
{
|
{
|
||||||
MediaMenu::ptr->zipReloadPrev(id);
|
MediaMenu::ptr->rdiskReloadPrev(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ public:
|
|||||||
|
|
||||||
void refresh(QMenu *parentMenu);
|
void refresh(QMenu *parentMenu);
|
||||||
|
|
||||||
// because some 86box C-only code needs to call zip and
|
// because some 86box C-only code needs to call rdisk and
|
||||||
// mo eject directly
|
// mo eject directly
|
||||||
static std::shared_ptr<MediaMenu> ptr;
|
static std::shared_ptr<MediaMenu> ptr;
|
||||||
|
|
||||||
@@ -51,13 +51,13 @@ public:
|
|||||||
void clearImageHistory();
|
void clearImageHistory();
|
||||||
void cdromUpdateMenu(int i);
|
void cdromUpdateMenu(int i);
|
||||||
|
|
||||||
void zipNewImage(int i);
|
void rdiskNewImage(int i);
|
||||||
void zipSelectImage(int i, bool wp);
|
void rdiskSelectImage(int i, bool wp);
|
||||||
void zipMount(int i, const QString &filename, bool wp);
|
void rdiskMount(int i, const QString &filename, bool wp);
|
||||||
void zipEject(int i);
|
void rdiskEject(int i);
|
||||||
void zipReloadPrev(int i);
|
void rdiskReloadPrev(int i);
|
||||||
void zipReload(int index, int slot);
|
void rdiskReload(int index, int slot);
|
||||||
void zipUpdateMenu(int i);
|
void rdiskUpdateMenu(int i);
|
||||||
|
|
||||||
void moNewImage(int i);
|
void moNewImage(int i);
|
||||||
void moSelectImage(int i, bool wp);
|
void moSelectImage(int i, bool wp);
|
||||||
@@ -84,7 +84,7 @@ private:
|
|||||||
QMap<int, QMenu *> cartridgeMenus;
|
QMap<int, QMenu *> cartridgeMenus;
|
||||||
QMap<int, QMenu *> floppyMenus;
|
QMap<int, QMenu *> floppyMenus;
|
||||||
QMap<int, QMenu *> cdromMenus;
|
QMap<int, QMenu *> cdromMenus;
|
||||||
QMap<int, QMenu *> zipMenus;
|
QMap<int, QMenu *> rdiskMenus;
|
||||||
QMap<int, QMenu *> moMenus;
|
QMap<int, QMenu *> moMenus;
|
||||||
QMap<int, QMenu *> netMenus;
|
QMap<int, QMenu *> netMenus;
|
||||||
|
|
||||||
@@ -111,8 +111,8 @@ private:
|
|||||||
int cdromEjectPos;
|
int cdromEjectPos;
|
||||||
int cdromImageHistoryPos[MAX_PREV_IMAGES];
|
int cdromImageHistoryPos[MAX_PREV_IMAGES];
|
||||||
|
|
||||||
int zipEjectPos;
|
int rdiskEjectPos;
|
||||||
int zipImageHistoryPos[MAX_PREV_IMAGES];
|
int rdiskImageHistoryPos[MAX_PREV_IMAGES];
|
||||||
|
|
||||||
int moEjectPos;
|
int moEjectPos;
|
||||||
int moImageHistoryPos[MAX_PREV_IMAGES];
|
int moImageHistoryPos[MAX_PREV_IMAGES];
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ extern "C" {
|
|||||||
#include <86box/plat.h>
|
#include <86box/plat.h>
|
||||||
#include <86box/random.h>
|
#include <86box/random.h>
|
||||||
#include <86box/scsi_device.h>
|
#include <86box/scsi_device.h>
|
||||||
#include <86box/zip.h>
|
#include <86box/rdisk.h>
|
||||||
#include <86box/mo.h>
|
#include <86box/mo.h>
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -110,7 +110,7 @@ static const QStringList floppyTypes = {
|
|||||||
"2.88 MB",
|
"2.88 MB",
|
||||||
};
|
};
|
||||||
|
|
||||||
static const QStringList zipTypes = {
|
static const QStringList rdiskTypes = {
|
||||||
"ZIP 100",
|
"ZIP 100",
|
||||||
"ZIP 250",
|
"ZIP 250",
|
||||||
};
|
};
|
||||||
@@ -146,11 +146,11 @@ NewFloppyDialog::NewFloppyDialog(MediaType type, QWidget *parent)
|
|||||||
tr("All images") % util::DlgFilter({ "86f", "dsk", "flp", "im?", "img", "*fd?" }) % tr("Basic sector images") % util::DlgFilter({ "dsk", "flp", "im?", "img", "*fd?" }) % tr("Surface images") % util::DlgFilter({ "86f" }, true));
|
tr("All images") % util::DlgFilter({ "86f", "dsk", "flp", "im?", "img", "*fd?" }) % tr("Basic sector images") % util::DlgFilter({ "dsk", "flp", "im?", "img", "*fd?" }) % tr("Surface images") % util::DlgFilter({ "86f" }, true));
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case MediaType::Zip:
|
case MediaType::RDisk:
|
||||||
for (int i = 0; i < zipTypes.size(); ++i) {
|
for (int i = 0; i < rdiskTypes.size(); ++i) {
|
||||||
Models::AddEntry(model, tr(zipTypes[i].toUtf8().data()), i);
|
Models::AddEntry(model, tr(rdiskTypes[i].toUtf8().data()), i);
|
||||||
}
|
}
|
||||||
ui->fileField->setFilter(tr("ZIP images") % util::DlgFilter({ "im?", "img", "zdi" }, true));
|
ui->fileField->setFilter(tr("Removable disk images") % util::DlgFilter({ "im?", "img", "rdi", "zdi" }, true));
|
||||||
break;
|
break;
|
||||||
case MediaType::Mo:
|
case MediaType::Mo:
|
||||||
for (int i = 0; i < moTypes.size(); ++i) {
|
for (int i = 0; i < moTypes.size(); ++i) {
|
||||||
@@ -218,13 +218,13 @@ NewFloppyDialog::onCreate()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case MediaType::Zip:
|
case MediaType::RDisk:
|
||||||
{
|
{
|
||||||
fileType = fi.suffix().toLower() == QStringLiteral("zdi") ? FileType::Zdi : FileType::Img;
|
fileType = fi.suffix().toLower() == QStringLiteral("zdi") ? FileType::Zdi : FileType::Img;
|
||||||
|
|
||||||
std::atomic_bool res;
|
std::atomic_bool res;
|
||||||
std::thread t([this, &res, filename, fileType, &progress] {
|
std::thread t([this, &res, filename, fileType, &progress] {
|
||||||
res = createZipSectorImage(filename, disk_sizes[ui->comboBoxSize->currentIndex() + 12], fileType, progress);
|
res = createRDiskSectorImage(filename, disk_sizes[ui->comboBoxSize->currentIndex() + 12], fileType, progress);
|
||||||
});
|
});
|
||||||
progress.exec();
|
progress.exec();
|
||||||
t.join();
|
t.join();
|
||||||
@@ -463,7 +463,7 @@ NewFloppyDialog::createSectorImage(const QString &filename, const disk_size_t &d
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
NewFloppyDialog::createZipSectorImage(const QString &filename, const disk_size_t &disk_size, FileType type, QProgressDialog &pbar)
|
NewFloppyDialog::createRDiskSectorImage(const QString &filename, const disk_size_t &disk_size, FileType type, QProgressDialog &pbar)
|
||||||
{
|
{
|
||||||
uint64_t total_size = 0;
|
uint64_t total_size = 0;
|
||||||
uint32_t total_sectors = 0;
|
uint32_t total_sectors = 0;
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ class NewFloppyDialog : public QDialog {
|
|||||||
public:
|
public:
|
||||||
enum class MediaType {
|
enum class MediaType {
|
||||||
Floppy,
|
Floppy,
|
||||||
Zip,
|
RDisk,
|
||||||
Mo,
|
Mo,
|
||||||
};
|
};
|
||||||
enum class FileType {
|
enum class FileType {
|
||||||
@@ -42,7 +42,7 @@ private:
|
|||||||
|
|
||||||
bool create86f(const QString &filename, const disk_size_t &disk_size, uint8_t rpm_mode);
|
bool create86f(const QString &filename, const disk_size_t &disk_size, uint8_t rpm_mode);
|
||||||
bool createSectorImage(const QString &filename, const disk_size_t &disk_size, FileType type);
|
bool createSectorImage(const QString &filename, const disk_size_t &disk_size, FileType type);
|
||||||
bool createZipSectorImage(const QString &filename, const disk_size_t &disk_size, FileType type, QProgressDialog &pbar);
|
bool createRDiskSectorImage(const QString &filename, const disk_size_t &disk_size, FileType type, QProgressDialog &pbar);
|
||||||
bool createMoSectorImage(const QString &filename, int8_t disk_size, FileType type, QProgressDialog &pbar);
|
bool createMoSectorImage(const QString &filename, int8_t disk_size, FileType type, QProgressDialog &pbar);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -164,24 +164,24 @@ Settings::Settings(QWidget *parent)
|
|||||||
connect(floppyCdrom, &SettingsFloppyCDROM::cdromChannelChanged, otherRemovable,
|
connect(floppyCdrom, &SettingsFloppyCDROM::cdromChannelChanged, otherRemovable,
|
||||||
&SettingsOtherRemovable::reloadBusChannels_MO);
|
&SettingsOtherRemovable::reloadBusChannels_MO);
|
||||||
connect(floppyCdrom, &SettingsFloppyCDROM::cdromChannelChanged, otherRemovable,
|
connect(floppyCdrom, &SettingsFloppyCDROM::cdromChannelChanged, otherRemovable,
|
||||||
&SettingsOtherRemovable::reloadBusChannels_ZIP);
|
&SettingsOtherRemovable::reloadBusChannels_RDisk);
|
||||||
connect(harddisks, &SettingsHarddisks::driveChannelChanged, floppyCdrom,
|
connect(harddisks, &SettingsHarddisks::driveChannelChanged, floppyCdrom,
|
||||||
&SettingsFloppyCDROM::reloadBusChannels);
|
&SettingsFloppyCDROM::reloadBusChannels);
|
||||||
connect(harddisks, &SettingsHarddisks::driveChannelChanged, otherRemovable,
|
connect(harddisks, &SettingsHarddisks::driveChannelChanged, otherRemovable,
|
||||||
&SettingsOtherRemovable::reloadBusChannels_MO);
|
&SettingsOtherRemovable::reloadBusChannels_MO);
|
||||||
connect(harddisks, &SettingsHarddisks::driveChannelChanged, otherRemovable,
|
connect(harddisks, &SettingsHarddisks::driveChannelChanged, otherRemovable,
|
||||||
&SettingsOtherRemovable::reloadBusChannels_ZIP);
|
&SettingsOtherRemovable::reloadBusChannels_RDisk);
|
||||||
connect(otherRemovable, &SettingsOtherRemovable::moChannelChanged, harddisks,
|
connect(otherRemovable, &SettingsOtherRemovable::moChannelChanged, harddisks,
|
||||||
&SettingsHarddisks::reloadBusChannels);
|
&SettingsHarddisks::reloadBusChannels);
|
||||||
connect(otherRemovable, &SettingsOtherRemovable::moChannelChanged, floppyCdrom,
|
connect(otherRemovable, &SettingsOtherRemovable::moChannelChanged, floppyCdrom,
|
||||||
&SettingsFloppyCDROM::reloadBusChannels);
|
&SettingsFloppyCDROM::reloadBusChannels);
|
||||||
connect(otherRemovable, &SettingsOtherRemovable::moChannelChanged, otherRemovable,
|
connect(otherRemovable, &SettingsOtherRemovable::moChannelChanged, otherRemovable,
|
||||||
&SettingsOtherRemovable::reloadBusChannels_ZIP);
|
&SettingsOtherRemovable::reloadBusChannels_RDisk);
|
||||||
connect(otherRemovable, &SettingsOtherRemovable::zipChannelChanged, harddisks,
|
connect(otherRemovable, &SettingsOtherRemovable::rdiskChannelChanged, harddisks,
|
||||||
&SettingsHarddisks::reloadBusChannels);
|
&SettingsHarddisks::reloadBusChannels);
|
||||||
connect(otherRemovable, &SettingsOtherRemovable::zipChannelChanged, floppyCdrom,
|
connect(otherRemovable, &SettingsOtherRemovable::rdiskChannelChanged, floppyCdrom,
|
||||||
&SettingsFloppyCDROM::reloadBusChannels);
|
&SettingsFloppyCDROM::reloadBusChannels);
|
||||||
connect(otherRemovable, &SettingsOtherRemovable::zipChannelChanged, otherRemovable,
|
connect(otherRemovable, &SettingsOtherRemovable::rdiskChannelChanged, otherRemovable,
|
||||||
&SettingsOtherRemovable::reloadBusChannels_MO);
|
&SettingsOtherRemovable::reloadBusChannels_MO);
|
||||||
|
|
||||||
connect(ui->listView->selectionModel(), &QItemSelectionModel::currentChanged, this,
|
connect(ui->listView->selectionModel(), &QItemSelectionModel::currentChanged, this,
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
#define DEV_HDD 0x01
|
#define DEV_HDD 0x01
|
||||||
#define DEV_CDROM 0x02
|
#define DEV_CDROM 0x02
|
||||||
#define DEV_ZIP 0x04
|
#define DEV_RDISK 0x04
|
||||||
#define DEV_MO 0x08
|
#define DEV_MO 0x08
|
||||||
|
|
||||||
#define BUS_MFM 0
|
#define BUS_MFM 0
|
||||||
@@ -44,7 +44,7 @@ public:
|
|||||||
int scsi_bus_full();
|
int scsi_bus_full();
|
||||||
|
|
||||||
/* Set: 0 = Clear the device from the tracking, 1 = Set the device on the tracking.
|
/* Set: 0 = Clear the device from the tracking, 1 = Set the device on the tracking.
|
||||||
Device type: 1 = Hard Disk, 2 = CD-ROM, 4 = ZIP, 8 = Magneto-Optical.
|
Device type: 1 = Hard Disk, 2 = CD-ROM, 4 = Removable disk, 8 = Magneto-Optical.
|
||||||
Bus: 0 = MFM, 1 = ESDI, 2 = XTA, 3 = IDE, 4 = SCSI. */
|
Bus: 0 = MFM, 1 = ESDI, 2 = XTA, 3 = IDE, 4 = SCSI. */
|
||||||
void device_track(int set, uint8_t dev_type, int bus, int channel);
|
void device_track(int set, uint8_t dev_type, int bus, int channel);
|
||||||
|
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ extern "C" {
|
|||||||
#include <86box/timer.h>
|
#include <86box/timer.h>
|
||||||
#include <86box/scsi_device.h>
|
#include <86box/scsi_device.h>
|
||||||
#include <86box/mo.h>
|
#include <86box/mo.h>
|
||||||
#include <86box/zip.h>
|
#include <86box/rdisk.h>
|
||||||
}
|
}
|
||||||
|
|
||||||
#include <QStandardItemModel>
|
#include <QStandardItemModel>
|
||||||
@@ -40,6 +40,13 @@ moDriveTypeName(int i)
|
|||||||
mo_drive_types[i].revision);
|
mo_drive_types[i].revision);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static QString
|
||||||
|
rdiskDriveTypeName(int i)
|
||||||
|
{
|
||||||
|
return QString("%1 %2 %3").arg(rdisk_drive_types[i].vendor, rdisk_drive_types[i].model,
|
||||||
|
rdisk_drive_types[i].revision);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
setMOBus(QAbstractItemModel *model, const QModelIndex &idx, uint8_t bus, uint8_t channel)
|
setMOBus(QAbstractItemModel *model, const QModelIndex &idx, uint8_t bus, uint8_t channel)
|
||||||
{
|
{
|
||||||
@@ -65,27 +72,16 @@ setMOBus(QAbstractItemModel *model, const QModelIndex &idx, uint8_t bus, uint8_t
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
setMOType(QAbstractItemModel *model, const QModelIndex &idx, uint32_t type)
|
setRDiskBus(QAbstractItemModel *model, const QModelIndex &idx, uint8_t bus, uint8_t channel)
|
||||||
{
|
|
||||||
auto i = idx.siblingAtColumn(1);
|
|
||||||
if (idx.siblingAtColumn(0).data(Qt::UserRole).toUInt() == MO_BUS_DISABLED)
|
|
||||||
model->setData(i, QCoreApplication::translate("", "None"));
|
|
||||||
else
|
|
||||||
model->setData(i, moDriveTypeName(type));
|
|
||||||
model->setData(i, type, Qt::UserRole);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
setZIPBus(QAbstractItemModel *model, const QModelIndex &idx, uint8_t bus, uint8_t channel)
|
|
||||||
{
|
{
|
||||||
QIcon icon;
|
QIcon icon;
|
||||||
switch (bus) {
|
switch (bus) {
|
||||||
case ZIP_BUS_DISABLED:
|
case RDISK_BUS_DISABLED:
|
||||||
icon = QIcon(":/settings/qt/icons/zip_disabled.ico");
|
icon = QIcon(":/settings/qt/icons/rdisk_disabled.ico");
|
||||||
break;
|
break;
|
||||||
case ZIP_BUS_ATAPI:
|
case RDISK_BUS_ATAPI:
|
||||||
case ZIP_BUS_SCSI:
|
case RDISK_BUS_SCSI:
|
||||||
icon = QIcon(":/settings/qt/icons/zip.ico");
|
icon = QIcon(":/settings/qt/icons/rdisk.ico");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@@ -100,11 +96,25 @@ setZIPBus(QAbstractItemModel *model, const QModelIndex &idx, uint8_t bus, uint8_
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
setZIPType(QAbstractItemModel *model, const QModelIndex &idx, bool is250)
|
setMOType(QAbstractItemModel *model, const QModelIndex &idx, uint32_t type)
|
||||||
{
|
{
|
||||||
auto i = idx.siblingAtColumn(1);
|
auto i = idx.siblingAtColumn(1);
|
||||||
model->setData(i, is250 ? "ZIP 250" : "ZIP 100");
|
if (idx.siblingAtColumn(0).data(Qt::UserRole).toUInt() == MO_BUS_DISABLED)
|
||||||
model->setData(i, is250, Qt::UserRole);
|
model->setData(i, QCoreApplication::translate("", "None"));
|
||||||
|
else
|
||||||
|
model->setData(i, moDriveTypeName(type));
|
||||||
|
model->setData(i, type, Qt::UserRole);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
setRDiskType(QAbstractItemModel *model, const QModelIndex &idx, uint32_t type)
|
||||||
|
{
|
||||||
|
auto i = idx.siblingAtColumn(1);
|
||||||
|
if (idx.siblingAtColumn(0).data(Qt::UserRole).toUInt() == RDISK_BUS_DISABLED)
|
||||||
|
model->setData(i, QCoreApplication::translate("", "None"));
|
||||||
|
else
|
||||||
|
model->setData(i, rdiskDriveTypeName(type));
|
||||||
|
model->setData(i, type, Qt::UserRole);
|
||||||
}
|
}
|
||||||
|
|
||||||
SettingsOtherRemovable::SettingsOtherRemovable(QWidget *parent)
|
SettingsOtherRemovable::SettingsOtherRemovable(QWidget *parent)
|
||||||
@@ -136,24 +146,28 @@ SettingsOtherRemovable::SettingsOtherRemovable(QWidget *parent)
|
|||||||
connect(ui->tableViewMO->selectionModel(), &QItemSelectionModel::currentRowChanged, this, &SettingsOtherRemovable::onMORowChanged);
|
connect(ui->tableViewMO->selectionModel(), &QItemSelectionModel::currentRowChanged, this, &SettingsOtherRemovable::onMORowChanged);
|
||||||
ui->tableViewMO->setCurrentIndex(model->index(0, 0));
|
ui->tableViewMO->setCurrentIndex(model->index(0, 0));
|
||||||
|
|
||||||
Harddrives::populateRemovableBuses(ui->comboBoxZIPBus->model());
|
Harddrives::populateRemovableBuses(ui->comboBoxRDiskBus->model());
|
||||||
|
model = ui->comboBoxRDiskType->model();
|
||||||
|
for (uint32_t i = 0; i < KNOWN_RDISK_DRIVE_TYPES; i++) {
|
||||||
|
Models::AddEntry(model, rdiskDriveTypeName(i), i);
|
||||||
|
}
|
||||||
|
|
||||||
model = new QStandardItemModel(0, 2, this);
|
model = new QStandardItemModel(0, 2, this);
|
||||||
ui->tableViewZIP->setModel(model);
|
ui->tableViewRDisk->setModel(model);
|
||||||
model->setHeaderData(0, Qt::Horizontal, tr("Bus"));
|
model->setHeaderData(0, Qt::Horizontal, tr("Bus"));
|
||||||
model->setHeaderData(1, Qt::Horizontal, tr("Type"));
|
model->setHeaderData(1, Qt::Horizontal, tr("Type"));
|
||||||
model->insertRows(0, ZIP_NUM);
|
model->insertRows(0, RDISK_NUM);
|
||||||
for (int i = 0; i < ZIP_NUM; i++) {
|
for (int i = 0; i < RDISK_NUM; i++) {
|
||||||
auto idx = model->index(i, 0);
|
auto idx = model->index(i, 0);
|
||||||
setZIPBus(model, idx, zip_drives[i].bus_type, zip_drives[i].res);
|
setRDiskBus(model, idx, rdisk_drives[i].bus_type, rdisk_drives[i].res);
|
||||||
setZIPType(model, idx, zip_drives[i].is_250 > 0);
|
setRDiskType(model, idx.siblingAtColumn(1), rdisk_drives[i].type);
|
||||||
Harddrives::busTrackClass->device_track(1, DEV_ZIP, zip_drives[i].bus_type, zip_drives[i].bus_type == ZIP_BUS_ATAPI ? zip_drives[i].ide_channel : zip_drives[i].scsi_device_id);
|
Harddrives::busTrackClass->device_track(1, DEV_MO, rdisk_drives[i].bus_type, rdisk_drives[i].bus_type == RDISK_BUS_ATAPI ? rdisk_drives[i].ide_channel : rdisk_drives[i].scsi_device_id);
|
||||||
}
|
}
|
||||||
ui->tableViewZIP->resizeColumnsToContents();
|
ui->tableViewRDisk->resizeColumnsToContents();
|
||||||
ui->tableViewZIP->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch);
|
ui->tableViewRDisk->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch);
|
||||||
|
|
||||||
connect(ui->tableViewZIP->selectionModel(), &QItemSelectionModel::currentRowChanged, this, &SettingsOtherRemovable::onZIPRowChanged);
|
connect(ui->tableViewRDisk->selectionModel(), &QItemSelectionModel::currentRowChanged, this, &SettingsOtherRemovable::onRDiskRowChanged);
|
||||||
ui->tableViewZIP->setCurrentIndex(model->index(0, 0));
|
ui->tableViewRDisk->setCurrentIndex(model->index(0, 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
SettingsOtherRemovable::~SettingsOtherRemovable()
|
SettingsOtherRemovable::~SettingsOtherRemovable()
|
||||||
@@ -173,13 +187,13 @@ SettingsOtherRemovable::save()
|
|||||||
mo_drives[i].type = model->index(i, 1).data(Qt::UserRole).toUInt();
|
mo_drives[i].type = model->index(i, 1).data(Qt::UserRole).toUInt();
|
||||||
}
|
}
|
||||||
|
|
||||||
model = ui->tableViewZIP->model();
|
model = ui->tableViewRDisk->model();
|
||||||
for (uint8_t i = 0; i < ZIP_NUM; i++) {
|
for (uint8_t i = 0; i < RDISK_NUM; i++) {
|
||||||
zip_drives[i].fp = NULL;
|
rdisk_drives[i].fp = NULL;
|
||||||
zip_drives[i].priv = NULL;
|
rdisk_drives[i].priv = NULL;
|
||||||
zip_drives[i].bus_type = model->index(i, 0).data(Qt::UserRole).toUInt();
|
rdisk_drives[i].bus_type = model->index(i, 0).data(Qt::UserRole).toUInt();
|
||||||
zip_drives[i].res = model->index(i, 0).data(Qt::UserRole + 1).toUInt();
|
rdisk_drives[i].res = model->index(i, 0).data(Qt::UserRole + 1).toUInt();
|
||||||
zip_drives[i].is_250 = model->index(i, 1).data(Qt::UserRole).toBool() ? 1 : 0;
|
rdisk_drives[i].type = model->index(i, 1).data(Qt::UserRole).toUInt();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -205,24 +219,24 @@ SettingsOtherRemovable::onMORowChanged(const QModelIndex ¤t)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
SettingsOtherRemovable::onZIPRowChanged(const QModelIndex ¤t)
|
SettingsOtherRemovable::onRDiskRowChanged(const QModelIndex ¤t)
|
||||||
{
|
{
|
||||||
uint8_t bus = current.siblingAtColumn(0).data(Qt::UserRole).toUInt();
|
uint8_t bus = current.siblingAtColumn(0).data(Qt::UserRole).toUInt();
|
||||||
uint8_t channel = current.siblingAtColumn(0).data(Qt::UserRole + 1).toUInt();
|
uint8_t channel = current.siblingAtColumn(0).data(Qt::UserRole + 1).toUInt();
|
||||||
bool is250 = current.siblingAtColumn(1).data(Qt::UserRole).toBool();
|
uint8_t type = current.siblingAtColumn(1).data(Qt::UserRole).toUInt();
|
||||||
|
|
||||||
ui->comboBoxZIPBus->setCurrentIndex(-1);
|
ui->comboBoxRDiskBus->setCurrentIndex(-1);
|
||||||
const auto *model = ui->comboBoxZIPBus->model();
|
const auto *model = ui->comboBoxRDiskBus->model();
|
||||||
auto match = model->match(model->index(0, 0), Qt::UserRole, bus);
|
auto match = model->match(model->index(0, 0), Qt::UserRole, bus);
|
||||||
if (!match.isEmpty())
|
if (!match.isEmpty())
|
||||||
ui->comboBoxZIPBus->setCurrentIndex(match.first().row());
|
ui->comboBoxRDiskBus->setCurrentIndex(match.first().row());
|
||||||
|
|
||||||
model = ui->comboBoxZIPChannel->model();
|
model = ui->comboBoxRDiskChannel->model();
|
||||||
match = model->match(model->index(0, 0), Qt::UserRole, channel);
|
match = model->match(model->index(0, 0), Qt::UserRole, channel);
|
||||||
if (!match.isEmpty())
|
if (!match.isEmpty())
|
||||||
ui->comboBoxZIPChannel->setCurrentIndex(match.first().row());
|
ui->comboBoxRDiskChannel->setCurrentIndex(match.first().row());
|
||||||
ui->checkBoxZIP250->setChecked(is250);
|
ui->comboBoxRDiskType->setCurrentIndex(type);
|
||||||
enableCurrentlySelectedChannel_ZIP();
|
enableCurrentlySelectedChannel_RDisk();
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -234,6 +248,15 @@ SettingsOtherRemovable::reloadBusChannels_MO() {
|
|||||||
enableCurrentlySelectedChannel_MO();
|
enableCurrentlySelectedChannel_MO();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
SettingsOtherRemovable::reloadBusChannels_RDisk() {
|
||||||
|
auto selected = ui->comboBoxRDiskChannel->currentIndex();
|
||||||
|
Harddrives::populateBusChannels(ui->comboBoxRDiskChannel->model(),
|
||||||
|
ui->comboBoxRDiskBus->currentData().toInt(), Harddrives::busTrackClass);
|
||||||
|
ui->comboBoxRDiskChannel->setCurrentIndex(selected);
|
||||||
|
enableCurrentlySelectedChannel_RDisk();
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
SettingsOtherRemovable::on_comboBoxMOBus_currentIndexChanged(int index)
|
SettingsOtherRemovable::on_comboBoxMOBus_currentIndexChanged(int index)
|
||||||
{
|
{
|
||||||
@@ -246,6 +269,18 @@ SettingsOtherRemovable::on_comboBoxMOBus_currentIndexChanged(int index)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
SettingsOtherRemovable::on_comboBoxRDiskBus_currentIndexChanged(int index)
|
||||||
|
{
|
||||||
|
if (index >= 0) {
|
||||||
|
int bus = ui->comboBoxRDiskBus->currentData().toInt();
|
||||||
|
bool enabled = (bus != RDISK_BUS_DISABLED);
|
||||||
|
ui->comboBoxRDiskChannel->setEnabled(enabled);
|
||||||
|
ui->comboBoxRDiskType->setEnabled(enabled);
|
||||||
|
Harddrives::populateBusChannels(ui->comboBoxRDiskChannel->model(), bus, Harddrives::busTrackClass);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
SettingsOtherRemovable::on_comboBoxMOBus_activated(int)
|
SettingsOtherRemovable::on_comboBoxMOBus_activated(int)
|
||||||
{
|
{
|
||||||
@@ -253,9 +288,9 @@ SettingsOtherRemovable::on_comboBoxMOBus_activated(int)
|
|||||||
Harddrives::busTrackClass->device_track(0, DEV_MO, ui->tableViewMO->model()->data(i,
|
Harddrives::busTrackClass->device_track(0, DEV_MO, ui->tableViewMO->model()->data(i,
|
||||||
Qt::UserRole).toInt(), ui->tableViewMO->model()->data(i,
|
Qt::UserRole).toInt(), ui->tableViewMO->model()->data(i,
|
||||||
Qt::UserRole + 1).toInt());
|
Qt::UserRole + 1).toInt());
|
||||||
ui->comboBoxMOChannel->setCurrentIndex(ui->comboBoxMOBus->currentData().toUInt() ==
|
ui->comboBoxMOChannel->setCurrentIndex(ui->comboBoxMOBus->currentData().toUInt() == MO_BUS_ATAPI ?
|
||||||
MO_BUS_ATAPI ? Harddrives::busTrackClass->next_free_ide_channel() :
|
Harddrives::busTrackClass->next_free_ide_channel() :
|
||||||
Harddrives::busTrackClass->next_free_scsi_id());
|
Harddrives::busTrackClass->next_free_scsi_id());
|
||||||
ui->tableViewMO->model()->data(i, Qt::UserRole + 1);
|
ui->tableViewMO->model()->data(i, Qt::UserRole + 1);
|
||||||
setMOBus(ui->tableViewMO->model(),
|
setMOBus(ui->tableViewMO->model(),
|
||||||
ui->tableViewMO->selectionModel()->currentIndex(),
|
ui->tableViewMO->selectionModel()->currentIndex(),
|
||||||
@@ -272,6 +307,32 @@ SettingsOtherRemovable::on_comboBoxMOBus_activated(int)
|
|||||||
emit moChannelChanged();
|
emit moChannelChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
SettingsOtherRemovable::on_comboBoxRDiskBus_activated(int)
|
||||||
|
{
|
||||||
|
auto i = ui->tableViewRDisk->selectionModel()->currentIndex().siblingAtColumn(0);
|
||||||
|
Harddrives::busTrackClass->device_track(0, DEV_RDISK, ui->tableViewRDisk->model()->data(i,
|
||||||
|
Qt::UserRole).toInt(), ui->tableViewRDisk->model()->data(i,
|
||||||
|
Qt::UserRole + 1).toInt());
|
||||||
|
ui->comboBoxRDiskChannel->setCurrentIndex(ui->comboBoxRDiskBus->currentData().toUInt() == RDISK_BUS_ATAPI ?
|
||||||
|
Harddrives::busTrackClass->next_free_ide_channel() :
|
||||||
|
Harddrives::busTrackClass->next_free_scsi_id());
|
||||||
|
ui->tableViewRDisk->model()->data(i, Qt::UserRole + 1);
|
||||||
|
setRDiskBus(ui->tableViewRDisk->model(),
|
||||||
|
ui->tableViewRDisk->selectionModel()->currentIndex(),
|
||||||
|
ui->comboBoxRDiskBus->currentData().toUInt(),
|
||||||
|
ui->comboBoxRDiskChannel->currentData().toUInt());
|
||||||
|
setRDiskType(ui->tableViewRDisk->model(),
|
||||||
|
ui->tableViewRDisk->selectionModel()->currentIndex(),
|
||||||
|
ui->comboBoxRDiskType->currentData().toUInt());
|
||||||
|
ui->tableViewRDisk->resizeColumnsToContents();
|
||||||
|
ui->tableViewRDisk->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch);
|
||||||
|
Harddrives::busTrackClass->device_track(1, DEV_RDISK, ui->tableViewRDisk->model()->data(i,
|
||||||
|
Qt::UserRole).toInt(), ui->tableViewRDisk->model()->data(i,
|
||||||
|
Qt::UserRole + 1).toInt());
|
||||||
|
emit rdiskChannelChanged();
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
SettingsOtherRemovable::enableCurrentlySelectedChannel_MO()
|
SettingsOtherRemovable::enableCurrentlySelectedChannel_MO()
|
||||||
{
|
{
|
||||||
@@ -282,6 +343,15 @@ SettingsOtherRemovable::enableCurrentlySelectedChannel_MO()
|
|||||||
item->setEnabled(true);
|
item->setEnabled(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
SettingsOtherRemovable::enableCurrentlySelectedChannel_RDisk()
|
||||||
|
{
|
||||||
|
const auto *item_model = qobject_cast<QStandardItemModel*>(ui->comboBoxRDiskChannel->model());
|
||||||
|
const auto index = ui->comboBoxRDiskChannel->currentIndex();
|
||||||
|
auto *item = item_model->item(index);
|
||||||
|
if (item)
|
||||||
|
item->setEnabled(true);
|
||||||
|
}
|
||||||
void
|
void
|
||||||
SettingsOtherRemovable::on_comboBoxMOChannel_activated(int)
|
SettingsOtherRemovable::on_comboBoxMOChannel_activated(int)
|
||||||
{
|
{
|
||||||
@@ -299,6 +369,23 @@ SettingsOtherRemovable::on_comboBoxMOChannel_activated(int)
|
|||||||
emit moChannelChanged();
|
emit moChannelChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
SettingsOtherRemovable::on_comboBoxRDiskChannel_activated(int)
|
||||||
|
{
|
||||||
|
auto i = ui->tableViewRDisk->selectionModel()->currentIndex().siblingAtColumn(0);
|
||||||
|
Harddrives::busTrackClass->device_track(0, DEV_RDISK, ui->tableViewRDisk->model()->data(i,
|
||||||
|
Qt::UserRole).toInt(), ui->tableViewRDisk->model()->data(i,
|
||||||
|
Qt::UserRole + 1).toInt());
|
||||||
|
setRDiskBus(ui->tableViewRDisk->model(),
|
||||||
|
ui->tableViewRDisk->selectionModel()->currentIndex(),
|
||||||
|
ui->comboBoxRDiskBus->currentData().toUInt(),
|
||||||
|
ui->comboBoxRDiskChannel->currentData().toUInt());
|
||||||
|
Harddrives::busTrackClass->device_track(1, DEV_RDISK, ui->tableViewRDisk->model()->data(i,
|
||||||
|
Qt::UserRole).toInt(),
|
||||||
|
ui->tableViewRDisk->model()->data(i, Qt::UserRole + 1).toInt());
|
||||||
|
emit rdiskChannelChanged();
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
SettingsOtherRemovable::on_comboBoxMOType_activated(int)
|
SettingsOtherRemovable::on_comboBoxMOType_activated(int)
|
||||||
{
|
{
|
||||||
@@ -310,77 +397,11 @@ SettingsOtherRemovable::on_comboBoxMOType_activated(int)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
SettingsOtherRemovable::reloadBusChannels_ZIP() {
|
SettingsOtherRemovable::on_comboBoxRDiskType_activated(int)
|
||||||
auto selected = ui->comboBoxZIPChannel->currentIndex();
|
|
||||||
Harddrives::populateBusChannels(ui->comboBoxZIPChannel->model(),
|
|
||||||
ui->comboBoxZIPBus->currentData().toInt(), Harddrives::busTrackClass);
|
|
||||||
ui->comboBoxZIPChannel->setCurrentIndex(selected);
|
|
||||||
enableCurrentlySelectedChannel_ZIP();
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
SettingsOtherRemovable::on_comboBoxZIPBus_currentIndexChanged(int index)
|
|
||||||
{
|
{
|
||||||
if (index >= 0) {
|
setRDiskType(ui->tableViewRDisk->model(),
|
||||||
int bus = ui->comboBoxZIPBus->currentData().toInt();
|
ui->tableViewRDisk->selectionModel()->currentIndex(),
|
||||||
bool enabled = (bus != ZIP_BUS_DISABLED);
|
ui->comboBoxRDiskType->currentData().toUInt());
|
||||||
ui->comboBoxZIPChannel->setEnabled(enabled);
|
ui->tableViewRDisk->resizeColumnsToContents();
|
||||||
ui->checkBoxZIP250->setEnabled(enabled);
|
ui->tableViewRDisk->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch);
|
||||||
Harddrives::populateBusChannels(ui->comboBoxZIPChannel->model(), bus, Harddrives::busTrackClass);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
SettingsOtherRemovable::on_comboBoxZIPBus_activated(int)
|
|
||||||
{
|
|
||||||
auto i = ui->tableViewZIP->selectionModel()->currentIndex().siblingAtColumn(0);
|
|
||||||
Harddrives::busTrackClass->device_track(0, DEV_ZIP, ui->tableViewZIP->model()->data(i,
|
|
||||||
Qt::UserRole).toInt(), ui->tableViewZIP->model()->data(i,
|
|
||||||
Qt::UserRole + 1).toInt());
|
|
||||||
ui->comboBoxZIPChannel->setCurrentIndex(ui->comboBoxZIPBus->currentData().toUInt() == ZIP_BUS_ATAPI ?
|
|
||||||
Harddrives::busTrackClass->next_free_ide_channel() :
|
|
||||||
Harddrives::busTrackClass->next_free_scsi_id());
|
|
||||||
setZIPBus(ui->tableViewZIP->model(),
|
|
||||||
ui->tableViewZIP->selectionModel()->currentIndex(),
|
|
||||||
ui->comboBoxZIPBus->currentData().toUInt(),
|
|
||||||
ui->comboBoxZIPChannel->currentData().toUInt());
|
|
||||||
Harddrives::busTrackClass->device_track(1, DEV_ZIP, ui->tableViewZIP->model()->data(i,
|
|
||||||
Qt::UserRole).toInt(), ui->tableViewZIP->model()->data(i,
|
|
||||||
Qt::UserRole + 1).toInt());
|
|
||||||
emit zipChannelChanged();
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
SettingsOtherRemovable::enableCurrentlySelectedChannel_ZIP()
|
|
||||||
{
|
|
||||||
const auto *item_model = qobject_cast<QStandardItemModel*>(ui->comboBoxZIPChannel->model());
|
|
||||||
const auto index = ui->comboBoxZIPChannel->currentIndex();
|
|
||||||
auto *item = item_model->item(index);
|
|
||||||
if (item)
|
|
||||||
item->setEnabled(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
SettingsOtherRemovable::on_comboBoxZIPChannel_activated(int)
|
|
||||||
{
|
|
||||||
auto i = ui->tableViewZIP->selectionModel()->currentIndex().siblingAtColumn(0);
|
|
||||||
Harddrives::busTrackClass->device_track(0, DEV_ZIP, ui->tableViewZIP->model()->data(i,
|
|
||||||
Qt::UserRole).toInt(), ui->tableViewZIP->model()->data(i,
|
|
||||||
Qt::UserRole + 1).toInt());
|
|
||||||
setZIPBus(ui->tableViewZIP->model(),
|
|
||||||
ui->tableViewZIP->selectionModel()->currentIndex(),
|
|
||||||
ui->comboBoxZIPBus->currentData().toUInt(),
|
|
||||||
ui->comboBoxZIPChannel->currentData().toUInt());
|
|
||||||
Harddrives::busTrackClass->device_track(1, DEV_ZIP, ui->tableViewZIP->model()->data(i,
|
|
||||||
Qt::UserRole).toInt(),
|
|
||||||
ui->tableViewZIP->model()->data(i, Qt::UserRole + 1).toInt());
|
|
||||||
emit zipChannelChanged();
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
SettingsOtherRemovable::on_checkBoxZIP250_stateChanged(int state)
|
|
||||||
{
|
|
||||||
setZIPType(ui->tableViewZIP->model(),
|
|
||||||
ui->tableViewZIP->selectionModel()->currentIndex(),
|
|
||||||
state == Qt::Checked);
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,13 +14,13 @@ public:
|
|||||||
explicit SettingsOtherRemovable(QWidget *parent = nullptr);
|
explicit SettingsOtherRemovable(QWidget *parent = nullptr);
|
||||||
~SettingsOtherRemovable();
|
~SettingsOtherRemovable();
|
||||||
void reloadBusChannels_MO();
|
void reloadBusChannels_MO();
|
||||||
void reloadBusChannels_ZIP();
|
void reloadBusChannels_RDisk();
|
||||||
|
|
||||||
void save();
|
void save();
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void moChannelChanged();
|
void moChannelChanged();
|
||||||
void zipChannelChanged();
|
void rdiskChannelChanged();
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void onMORowChanged(const QModelIndex ¤t);
|
void onMORowChanged(const QModelIndex ¤t);
|
||||||
@@ -29,16 +29,16 @@ private slots:
|
|||||||
void on_comboBoxMOChannel_activated(int index);
|
void on_comboBoxMOChannel_activated(int index);
|
||||||
void on_comboBoxMOType_activated(int index);
|
void on_comboBoxMOType_activated(int index);
|
||||||
|
|
||||||
void onZIPRowChanged(const QModelIndex ¤t);
|
void onRDiskRowChanged(const QModelIndex ¤t);
|
||||||
void on_comboBoxZIPBus_currentIndexChanged(int index);
|
void on_comboBoxRDiskBus_currentIndexChanged(int index);
|
||||||
void on_comboBoxZIPBus_activated(int index);
|
void on_comboBoxRDiskBus_activated(int index);
|
||||||
void on_comboBoxZIPChannel_activated(int index);
|
void on_comboBoxRDiskChannel_activated(int index);
|
||||||
void on_checkBoxZIP250_stateChanged(int arg1);
|
void on_comboBoxRDiskType_activated(int index);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ui::SettingsOtherRemovable *ui;
|
Ui::SettingsOtherRemovable *ui;
|
||||||
void enableCurrentlySelectedChannel_MO();
|
void enableCurrentlySelectedChannel_MO();
|
||||||
void enableCurrentlySelectedChannel_ZIP();
|
void enableCurrentlySelectedChannel_RDisk();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // QT_SETTINGSOTHERREMOVABLE_HPP
|
#endif // QT_SETTINGSOTHERREMOVABLE_HPP
|
||||||
|
|||||||
@@ -113,14 +113,14 @@
|
|||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="labelZIP">
|
<widget class="QLabel" name="labelRDisk">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>ZIP drives:</string>
|
<string>Removable disk drives:</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QTableView" name="tableViewZIP">
|
<widget class="QTableView" name="tableViewRDisk">
|
||||||
<property name="sizePolicy">
|
<property name="sizePolicy">
|
||||||
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
|
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
|
||||||
<horstretch>0</horstretch>
|
<horstretch>0</horstretch>
|
||||||
@@ -151,40 +151,47 @@
|
|||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QWidget" name="zipControls" native="true">
|
<widget class="QWidget" name="rdiskControls" native="true">
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="labelZIPBus">
|
<widget class="QLabel" name="labelRDiskBus">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Bus:</string>
|
<string>Bus:</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QComboBox" name="comboBoxZIPBus">
|
<widget class="QComboBox" name="comboBoxRDiskBus">
|
||||||
<property name="maxVisibleItems">
|
<property name="maxVisibleItems">
|
||||||
<number>30</number>
|
<number>30</number>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="labelZIPChannel">
|
<widget class="QLabel" name="labelRDiskChannel">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Channel:</string>
|
<string>Channel:</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QComboBox" name="comboBoxZIPChannel">
|
<widget class="QComboBox" name="comboBoxRDiskChannel">
|
||||||
<property name="maxVisibleItems">
|
<property name="maxVisibleItems">
|
||||||
<number>30</number>
|
<number>30</number>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item row="1" column="0">
|
||||||
<widget class="QCheckBox" name="checkBoxZIP250">
|
<widget class="QLabel" name="labelRDiskType">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>ZIP 250</string>
|
<string>Type:</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="1" colspan="3">
|
||||||
|
<widget class="QComboBox" name="comboBoxRDiskType">
|
||||||
|
<property name="maxVisibleItems">
|
||||||
|
<number>30</number>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ extern "C" {
|
|||||||
#include <86box/cartridge.h>
|
#include <86box/cartridge.h>
|
||||||
#include <86box/cassette.h>
|
#include <86box/cassette.h>
|
||||||
#include <86box/cdrom.h>
|
#include <86box/cdrom.h>
|
||||||
#include <86box/zip.h>
|
#include <86box/rdisk.h>
|
||||||
#include <86box/mo.h>
|
#include <86box/mo.h>
|
||||||
#include <86box/hdd.h>
|
#include <86box/hdd.h>
|
||||||
#include <86box/thread.h>
|
#include <86box/thread.h>
|
||||||
@@ -278,8 +278,8 @@ ui_sb_update_icon_wp(int tag, int state)
|
|||||||
case SB_FLOPPY:
|
case SB_FLOPPY:
|
||||||
machine_status.fdd[item].write_prot = state > 0 ? true : false;
|
machine_status.fdd[item].write_prot = state > 0 ? true : false;
|
||||||
break;
|
break;
|
||||||
case SB_ZIP:
|
case SB_RDISK:
|
||||||
machine_status.zip[item].write_prot = state > 0 ? true : false;
|
machine_status.rdisk[item].write_prot = state > 0 ? true : false;
|
||||||
break;
|
break;
|
||||||
case SB_MO:
|
case SB_MO:
|
||||||
machine_status.mo[item].write_prot = state > 0 ? true : false;
|
machine_status.mo[item].write_prot = state > 0 ? true : false;
|
||||||
@@ -312,8 +312,8 @@ ui_sb_update_icon_state(int tag, int state)
|
|||||||
case SB_CDROM:
|
case SB_CDROM:
|
||||||
machine_status.cdrom[item].empty = state > 0 ? true : false;
|
machine_status.cdrom[item].empty = state > 0 ? true : false;
|
||||||
break;
|
break;
|
||||||
case SB_ZIP:
|
case SB_RDISK:
|
||||||
machine_status.zip[item].empty = state > 0 ? true : false;
|
machine_status.rdisk[item].empty = state > 0 ? true : false;
|
||||||
break;
|
break;
|
||||||
case SB_MO:
|
case SB_MO:
|
||||||
machine_status.mo[item].empty = state > 0 ? true : false;
|
machine_status.mo[item].empty = state > 0 ? true : false;
|
||||||
@@ -350,8 +350,8 @@ ui_sb_update_icon(int tag, int active)
|
|||||||
case SB_CDROM:
|
case SB_CDROM:
|
||||||
machine_status.cdrom[item].active = active > 0 ? true : false;
|
machine_status.cdrom[item].active = active > 0 ? true : false;
|
||||||
break;
|
break;
|
||||||
case SB_ZIP:
|
case SB_RDISK:
|
||||||
machine_status.zip[item].active = active > 0 ? true : false;
|
machine_status.rdisk[item].active = active > 0 ? true : false;
|
||||||
break;
|
break;
|
||||||
case SB_MO:
|
case SB_MO:
|
||||||
machine_status.mo[item].active = active > 0 ? true : false;
|
machine_status.mo[item].active = active > 0 ? true : false;
|
||||||
@@ -386,8 +386,8 @@ ui_sb_update_icon_write(int tag, int write)
|
|||||||
case SB_CDROM:
|
case SB_CDROM:
|
||||||
machine_status.cdrom[item].write_active = write > 0 ? true : false;
|
machine_status.cdrom[item].write_active = write > 0 ? true : false;
|
||||||
break;
|
break;
|
||||||
case SB_ZIP:
|
case SB_RDISK:
|
||||||
machine_status.zip[item].write_active = write > 0 ? true : false;
|
machine_status.rdisk[item].write_active = write > 0 ? true : false;
|
||||||
break;
|
break;
|
||||||
case SB_MO:
|
case SB_MO:
|
||||||
machine_status.mo[item].write_active = write > 0 ? true : false;
|
machine_status.mo[item].write_active = write > 0 ? true : false;
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
<RCC>
|
<RCC>
|
||||||
<qresource prefix="/settings">
|
<qresource prefix="/settings">
|
||||||
<file>qt/icons/browse.ico</file>
|
|
||||||
<file>qt/icons/cartridge.ico</file>
|
<file>qt/icons/cartridge.ico</file>
|
||||||
<file>qt/icons/cartridge_image.ico</file>
|
<file>qt/icons/cartridge_image.ico</file>
|
||||||
<file>qt/icons/cassette_image.ico</file>
|
<file>qt/icons/cassette_image.ico</file>
|
||||||
@@ -13,8 +12,6 @@
|
|||||||
<file>qt/icons/cdrom_folder.ico</file>
|
<file>qt/icons/cdrom_folder.ico</file>
|
||||||
<file>qt/icons/cdrom_host.ico</file>
|
<file>qt/icons/cdrom_host.ico</file>
|
||||||
<file>qt/icons/display.ico</file>
|
<file>qt/icons/display.ico</file>
|
||||||
<file>qt/icons/eject.ico</file>
|
|
||||||
<file>qt/icons/export.ico</file>
|
|
||||||
<file>qt/icons/fast_forward.ico</file>
|
<file>qt/icons/fast_forward.ico</file>
|
||||||
<file>qt/icons/floppy_35.ico</file>
|
<file>qt/icons/floppy_35.ico</file>
|
||||||
<file>qt/icons/floppy_35_image.ico</file>
|
<file>qt/icons/floppy_35_image.ico</file>
|
||||||
@@ -29,10 +26,12 @@
|
|||||||
<file>qt/icons/mo_image.ico</file>
|
<file>qt/icons/mo_image.ico</file>
|
||||||
<file>qt/icons/mo_disabled.ico</file>
|
<file>qt/icons/mo_disabled.ico</file>
|
||||||
<file>qt/icons/network.ico</file>
|
<file>qt/icons/network.ico</file>
|
||||||
<file>qt/icons/new.ico</file>
|
|
||||||
<file>qt/icons/other_peripherals.ico</file>
|
<file>qt/icons/other_peripherals.ico</file>
|
||||||
<file>qt/icons/other_removable_devices.ico</file>
|
<file>qt/icons/other_removable_devices.ico</file>
|
||||||
<file>qt/icons/ports.ico</file>
|
<file>qt/icons/ports.ico</file>
|
||||||
|
<file>qt/icons/rdisk.ico</file>
|
||||||
|
<file>qt/icons/rdisk_image.ico</file>
|
||||||
|
<file>qt/icons/rdisk_disabled.ico</file>
|
||||||
<file>qt/icons/record.ico</file>
|
<file>qt/icons/record.ico</file>
|
||||||
<file>qt/icons/rewind.ico</file>
|
<file>qt/icons/rewind.ico</file>
|
||||||
<file>qt/icons/sound.ico</file>
|
<file>qt/icons/sound.ico</file>
|
||||||
@@ -40,10 +39,11 @@
|
|||||||
<file>qt/icons/superdisk.ico</file>
|
<file>qt/icons/superdisk.ico</file>
|
||||||
<file>qt/icons/superdisk_image.ico</file>
|
<file>qt/icons/superdisk_image.ico</file>
|
||||||
<file>qt/icons/superdisk_disabled.ico</file>
|
<file>qt/icons/superdisk_disabled.ico</file>
|
||||||
<file>qt/icons/zip.ico</file>
|
|
||||||
<file>qt/icons/zip_image.ico</file>
|
|
||||||
<file>qt/icons/zip_disabled.ico</file>
|
|
||||||
<file>qt/icons/active.ico</file>
|
<file>qt/icons/active.ico</file>
|
||||||
|
<file>qt/icons/browse.ico</file>
|
||||||
|
<file>qt/icons/eject.ico</file>
|
||||||
|
<file>qt/icons/export.ico</file>
|
||||||
|
<file>qt/icons/new.ico</file>
|
||||||
<file>qt/icons/write_protected.ico</file>
|
<file>qt/icons/write_protected.ico</file>
|
||||||
<file>qt/icons/write_active.ico</file>
|
<file>qt/icons/write_active.ico</file>
|
||||||
<file>qt/icons/disabled.ico</file>
|
<file>qt/icons/disabled.ico</file>
|
||||||
|
|||||||
@@ -33,7 +33,7 @@
|
|||||||
#include <86box/scsi.h>
|
#include <86box/scsi.h>
|
||||||
#include <86box/scsi_device.h>
|
#include <86box/scsi_device.h>
|
||||||
#include <86box/cdrom.h>
|
#include <86box/cdrom.h>
|
||||||
#include <86box/zip.h>
|
#include <86box/rdisk.h>
|
||||||
#include <86box/scsi_disk.h>
|
#include <86box/scsi_disk.h>
|
||||||
#include <86box/scsi_aha154x.h>
|
#include <86box/scsi_aha154x.h>
|
||||||
#include <86box/scsi_buslogic.h>
|
#include <86box/scsi_buslogic.h>
|
||||||
|
|||||||
@@ -1006,12 +1006,12 @@ monitor_thread(UNUSED(void *param))
|
|||||||
printf(
|
printf(
|
||||||
"fddload <id> <filename> <wp> - Load floppy disk image into drive <id>.\n"
|
"fddload <id> <filename> <wp> - Load floppy disk image into drive <id>.\n"
|
||||||
"cdload <id> <filename> - Load CD-ROM image into drive <id>.\n"
|
"cdload <id> <filename> - Load CD-ROM image into drive <id>.\n"
|
||||||
"zipload <id> <filename> <wp> - Load ZIP image into ZIP drive <id>.\n"
|
"rdiskload <id> <filename> <wp> - Load removable disk image into removable disk drive <id>.\n"
|
||||||
"cartload <id> <filename> <wp> - Load cartridge image into cartridge drive <id>.\n"
|
"cartload <id> <filename> <wp> - Load cartridge image into cartridge drive <id>.\n"
|
||||||
"moload <id> <filename> <wp> - Load MO image into MO drive <id>.\n\n"
|
"moload <id> <filename> <wp> - Load MO image into MO drive <id>.\n\n"
|
||||||
"fddeject <id> - eject disk from floppy drive <id>.\n"
|
"fddeject <id> - eject disk from floppy drive <id>.\n"
|
||||||
"cdeject <id> - eject disc from CD-ROM drive <id>.\n"
|
"cdeject <id> - eject disc from CD-ROM drive <id>.\n"
|
||||||
"zipeject <id> - eject ZIP image from ZIP drive <id>.\n"
|
"rdiskeject <id> - eject removable disk image from removable disk drive <id>.\n"
|
||||||
"carteject <id> - eject cartridge from drive <id>.\n"
|
"carteject <id> - eject cartridge from drive <id>.\n"
|
||||||
"moeject <id> - eject image from MO drive <id>.\n\n"
|
"moeject <id> - eject image from MO drive <id>.\n\n"
|
||||||
"hardreset - hard reset the emulated system.\n"
|
"hardreset - hard reset the emulated system.\n"
|
||||||
@@ -1116,8 +1116,8 @@ monitor_thread(UNUSED(void *param))
|
|||||||
mo_eject(atoi(xargv[1]));
|
mo_eject(atoi(xargv[1]));
|
||||||
} else if (strncasecmp(xargv[0], "carteject", 8) == 0 && cmdargc >= 2) {
|
} else if (strncasecmp(xargv[0], "carteject", 8) == 0 && cmdargc >= 2) {
|
||||||
cartridge_eject(atoi(xargv[1]));
|
cartridge_eject(atoi(xargv[1]));
|
||||||
} else if (strncasecmp(xargv[0], "zipeject", 8) == 0 && cmdargc >= 2) {
|
} else if (strncasecmp(xargv[0], "rdiskeject", 8) == 0 && cmdargc >= 2) {
|
||||||
zip_eject(atoi(xargv[1]));
|
rdisk_eject(atoi(xargv[1]));
|
||||||
} else if (strncasecmp(xargv[0], "fddload", 7) == 0 && cmdargc >= 4) {
|
} else if (strncasecmp(xargv[0], "fddload", 7) == 0 && cmdargc >= 4) {
|
||||||
uint8_t id;
|
uint8_t id;
|
||||||
uint8_t wp;
|
uint8_t wp;
|
||||||
@@ -1184,7 +1184,7 @@ monitor_thread(UNUSED(void *param))
|
|||||||
printf("Inserting tape into cartridge holder %hhu: %s\n", id, fn);
|
printf("Inserting tape into cartridge holder %hhu: %s\n", id, fn);
|
||||||
cartridge_mount(id, fn, wp);
|
cartridge_mount(id, fn, wp);
|
||||||
}
|
}
|
||||||
} else if (strncasecmp(xargv[0], "zipload", 7) == 0 && cmdargc >= 4) {
|
} else if (strncasecmp(xargv[0], "rdiskload", 7) == 0 && cmdargc >= 4) {
|
||||||
uint8_t id;
|
uint8_t id;
|
||||||
uint8_t wp;
|
uint8_t wp;
|
||||||
bool err = false;
|
bool err = false;
|
||||||
@@ -1203,8 +1203,8 @@ monitor_thread(UNUSED(void *param))
|
|||||||
if (fn[strlen(fn) - 1] == '\''
|
if (fn[strlen(fn) - 1] == '\''
|
||||||
|| fn[strlen(fn) - 1] == '"')
|
|| fn[strlen(fn) - 1] == '"')
|
||||||
fn[strlen(fn) - 1] = '\0';
|
fn[strlen(fn) - 1] = '\0';
|
||||||
printf("Inserting disk into ZIP drive %c: %s\n", id + 'A', fn);
|
printf("Inserting disk into removable disk drive %c: %s\n", id + 'A', fn);
|
||||||
zip_mount(id, fn, wp);
|
rdisk_mount(id, fn, wp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
free(line);
|
free(line);
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
*
|
*
|
||||||
* This file is part of the 86Box distribution.
|
* This file is part of the 86Box distribution.
|
||||||
*
|
*
|
||||||
* Handle the platform-side of CDROM/ZIP/MO drives.
|
* Handle the platform-side of CDROM/RDisk/MO drives.
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
@@ -34,7 +34,7 @@
|
|||||||
#include <86box/cdrom.h>
|
#include <86box/cdrom.h>
|
||||||
#include <86box/cdrom_image.h>
|
#include <86box/cdrom_image.h>
|
||||||
#include <86box/mo.h>
|
#include <86box/mo.h>
|
||||||
#include <86box/zip.h>
|
#include <86box/rdisk.h>
|
||||||
#include <86box/scsi_disk.h>
|
#include <86box/scsi_disk.h>
|
||||||
#include <86box/plat.h>
|
#include <86box/plat.h>
|
||||||
#include <86box/ui.h>
|
#include <86box/ui.h>
|
||||||
@@ -220,58 +220,58 @@ mo_reload(uint8_t id)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
zip_eject(uint8_t id)
|
rdisk_eject(uint8_t id)
|
||||||
{
|
{
|
||||||
zip_t *dev = (zip_t *) zip_drives[id].priv;
|
rdisk_t *dev = (rdisk_t *) rdisk_drives[id].priv;
|
||||||
|
|
||||||
zip_disk_close(dev);
|
rdisk_disk_close(dev);
|
||||||
if (zip_drives[id].bus_type) {
|
if (rdisk_drives[id].bus_type) {
|
||||||
/* Signal disk change to the emulated machine. */
|
/* Signal disk change to the emulated machine. */
|
||||||
zip_insert(dev);
|
rdisk_insert(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
ui_sb_update_icon_state(SB_ZIP | id, 1);
|
ui_sb_update_icon_state(SB_RDISK | id, 1);
|
||||||
#if 0
|
#if 0
|
||||||
media_menu_update_zip(id);
|
media_menu_update_rdisk(id);
|
||||||
#endif
|
#endif
|
||||||
ui_sb_update_tip(SB_ZIP | id);
|
ui_sb_update_tip(SB_RDISK | id);
|
||||||
config_save();
|
config_save();
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
zip_mount(uint8_t id, char *fn, uint8_t wp)
|
rdisk_mount(uint8_t id, char *fn, uint8_t wp)
|
||||||
{
|
{
|
||||||
zip_t *dev = (zip_t *) zip_drives[id].priv;
|
rdisk_t *dev = (rdisk_t *) rdisk_drives[id].priv;
|
||||||
|
|
||||||
zip_disk_close(dev);
|
rdisk_disk_close(dev);
|
||||||
zip_drives[id].read_only = wp;
|
rdisk_drives[id].read_only = wp;
|
||||||
zip_load(dev, fn, 0);
|
rdisk_load(dev, fn, 0);
|
||||||
|
|
||||||
ui_sb_update_icon_state(SB_ZIP | id, strlen(zip_drives[id].image_path) ? 0 : 1);
|
ui_sb_update_icon_state(SB_RDISK | id, strlen(rdisk_drives[id].image_path) ? 0 : 1);
|
||||||
#if 0
|
#if 0
|
||||||
media_menu_update_zip(id);
|
media_menu_update_rdisk(id);
|
||||||
#endif
|
#endif
|
||||||
ui_sb_update_tip(SB_ZIP | id);
|
ui_sb_update_tip(SB_RDISK | id);
|
||||||
|
|
||||||
config_save();
|
config_save();
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
zip_reload(uint8_t id)
|
rdisk_reload(uint8_t id)
|
||||||
{
|
{
|
||||||
zip_t *dev = (zip_t *) zip_drives[id].priv;
|
rdisk_t *dev = (rdisk_t *) rdisk_drives[id].priv;
|
||||||
|
|
||||||
zip_disk_reload(dev);
|
rdisk_disk_reload(dev);
|
||||||
if (strlen(zip_drives[id].image_path) == 0) {
|
if (strlen(rdisk_drives[id].image_path) == 0) {
|
||||||
ui_sb_update_icon_state(SB_ZIP | id, 1);
|
ui_sb_update_icon_state(SB_RDISK | id, 1);
|
||||||
} else {
|
} else {
|
||||||
ui_sb_update_icon_state(SB_ZIP | id, 0);
|
ui_sb_update_icon_state(SB_RDISK | id, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
media_menu_update_zip(id);
|
media_menu_update_rdisk(id);
|
||||||
#endif
|
#endif
|
||||||
ui_sb_update_tip(SB_ZIP | id);
|
ui_sb_update_tip(SB_RDISK | id);
|
||||||
|
|
||||||
config_save();
|
config_save();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user