mirror of
https://github.com/86Box/86Box.git
synced 2026-02-25 04:45:31 -07:00
Update for rewrite
This commit is contained in:
22
src/config.c
22
src/config.c
@@ -1986,7 +1986,7 @@ go_to_mo:
|
||||
ini_section_delete_var(cat, temp);
|
||||
}
|
||||
|
||||
sprintf(temp, "superdiske_%02i_scsi_id", c + 1);
|
||||
sprintf(temp, "superdisk_%02i_scsi_id", c + 1);
|
||||
ini_section_delete_var(cat, temp);
|
||||
|
||||
sprintf(temp, "superdisk_%02i_image_path", c + 1);
|
||||
@@ -1998,8 +1998,7 @@ go_to_mo:
|
||||
if (p[0] != 0x00) {
|
||||
if (path_abs(p)) {
|
||||
if (strlen(p) > 511)
|
||||
fatal("load_other_removable_devices(): strlen(p) > 511 (superdisk_drives[%i].image_path)\n",
|
||||
c);
|
||||
fatal("Configuration: Length of superdisk_%02i_image_path is more than 511\n", c + 1);
|
||||
else
|
||||
strncpy(superdisk_drives[c].image_path, p, 511);
|
||||
} else
|
||||
@@ -2008,18 +2007,18 @@ go_to_mo:
|
||||
}
|
||||
|
||||
for (int i = 0; i < MAX_PREV_IMAGES; i++) {
|
||||
superdisk_drives[c].image_history[i] = (char *) calloc(MAX_IMAGE_PATH_LEN + 1, sizeof(char));
|
||||
superdisk_drives[c].image_history[i] = (char *) calloc((MAX_IMAGE_PATH_LEN + 1) << 1, sizeof(char));
|
||||
sprintf(temp, "superdisk_%02i_image_history_%02i", c + 1, i + 1);
|
||||
p = ini_section_get_string(cat, temp, NULL);
|
||||
if (p) {
|
||||
if (path_abs(p)) {
|
||||
if (strlen(p) > 511)
|
||||
fatal("load_other_removable_devices(): strlen(p) > 511 "
|
||||
"(superdisk_drives[%i].image_history[%i])\n", c, i);
|
||||
if (strlen(p) > (MAX_IMAGE_PATH_LEN - 1))
|
||||
fatal("Configuration: Length of superdisk_%02i_image_history_%02i is more than %i\n",
|
||||
c + 1, i + 1, MAX_IMAGE_PATH_LEN - 1);
|
||||
else
|
||||
snprintf(superdisk_drives[c].image_history[i], 511, "%s", p);
|
||||
snprintf(superdisk_drives[c].image_history[i], MAX_IMAGE_PATH_LEN, "%s", p);
|
||||
} else
|
||||
snprintf(superdisk_drives[c].image_history[i], 511, "%s%s%s", usr_path,
|
||||
snprintf(superdisk_drives[c].image_history[i], MAX_IMAGE_PATH_LEN, "%s%s%s", usr_path,
|
||||
path_get_slash(usr_path), p);
|
||||
path_normalize(superdisk_drives[c].image_history[i]);
|
||||
}
|
||||
@@ -2027,16 +2026,13 @@ go_to_mo:
|
||||
|
||||
/* If the SuperDisk drive is disabled, delete all its variables. */
|
||||
if (superdisk_drives[c].bus_type == SUPERDISK_BUS_DISABLED) {
|
||||
sprintf(temp, "superdisk_%02i_host_drive", c + 1);
|
||||
ini_section_delete_var(cat, temp);
|
||||
|
||||
sprintf(temp, "superdisk_%02i_parameters", c + 1);
|
||||
ini_section_delete_var(cat, temp);
|
||||
|
||||
sprintf(temp, "superdisk_%02i_ide_channel", c + 1);
|
||||
ini_section_delete_var(cat, temp);
|
||||
|
||||
sprintf(temp, "superdisk_%02i_scsi_id", c + 1);
|
||||
sprintf(temp, "superdisk_%02i_scsi_location", c + 1);
|
||||
ini_section_delete_var(cat, temp);
|
||||
|
||||
sprintf(temp, "superdisk_%02i_image_path", c + 1);
|
||||
|
||||
1705
src/disk/superdisk.c
1705
src/disk/superdisk.c
File diff suppressed because it is too large
Load Diff
@@ -14,8 +14,8 @@
|
||||
* Authors: Miran Grca, <mgrca8@gmail.com>
|
||||
* Jasmine Iwanek, <jriwanek@gmail.com>
|
||||
*
|
||||
* Copyright 2018-2019 Miran Grca.
|
||||
* Copyright 2022-2023 Jasmine Iwanek.
|
||||
* Copyright 2018-2025 Miran Grca.
|
||||
* Copyright 2022-2025 Jasmine Iwanek.
|
||||
*/
|
||||
|
||||
#ifndef EMU_SUPERDISK_H
|
||||
@@ -31,7 +31,7 @@
|
||||
|
||||
#define SUPERDISK_240_SECTORS (469504)
|
||||
|
||||
#define SUPERDISK_IMAGE_HISTORY 4
|
||||
#define SUPERDISK_IMAGE_HISTORY 10
|
||||
|
||||
enum {
|
||||
SUPERDISK_BUS_DISABLED = 0,
|
||||
@@ -41,35 +41,36 @@ enum {
|
||||
};
|
||||
|
||||
typedef struct superdisk_drive_t {
|
||||
uint8_t id;
|
||||
uint8_t id;
|
||||
|
||||
union {
|
||||
uint8_t res;
|
||||
uint8_t res0; /* Reserved for other ID's. */
|
||||
uint8_t res1;
|
||||
uint8_t ide_channel;
|
||||
uint8_t scsi_device_id;
|
||||
uint8_t res;
|
||||
/* Reserved for other ID's. */
|
||||
uint8_t res0;
|
||||
uint8_t res1;
|
||||
uint8_t ide_channel;
|
||||
uint8_t scsi_device_id;
|
||||
};
|
||||
|
||||
uint8_t bus_type; /* 0 = ATAPI, 1 = SCSI */
|
||||
uint8_t bus_mode; /* Bit 0 = PIO suported;
|
||||
Bit 1 = DMA supportd. */
|
||||
uint8_t read_only; /* Struct variable reserved for
|
||||
media status. */
|
||||
uint8_t pad;
|
||||
uint8_t pad0;
|
||||
uint8_t bus_type; /* 0 = ATAPI, 1 = SCSI */
|
||||
uint8_t bus_mode; /* Bit 0 = PIO suported;
|
||||
Bit 1 = DMA supportd. */
|
||||
uint8_t read_only; /* Struct variable reserved for
|
||||
media status. */
|
||||
uint8_t pad;
|
||||
uint8_t pad0;
|
||||
|
||||
FILE *fp;
|
||||
void *priv;
|
||||
FILE *fp;
|
||||
void *priv;
|
||||
|
||||
char image_path[1024];
|
||||
char prev_image_path[1024];
|
||||
char image_path[1024];
|
||||
char prev_image_path[1024];
|
||||
|
||||
char *image_history[SUPERDISK_IMAGE_HISTORY];
|
||||
char *image_history[SUPERDISK_IMAGE_HISTORY];
|
||||
|
||||
uint32_t is_240;
|
||||
uint32_t medium_size;
|
||||
uint32_t base;
|
||||
uint32_t is_240;
|
||||
uint32_t medium_size;
|
||||
uint32_t base;
|
||||
} superdisk_drive_t;
|
||||
|
||||
typedef struct superdisk_t {
|
||||
@@ -82,51 +83,45 @@ typedef struct superdisk_t {
|
||||
void *tf;
|
||||
#endif
|
||||
|
||||
uint8_t *buffer;
|
||||
uint8_t atapi_cdb[16];
|
||||
uint8_t current_cdb[16];
|
||||
uint8_t sense[256];
|
||||
uint8_t *buffer;
|
||||
uint8_t atapi_cdb[16];
|
||||
uint8_t current_cdb[16];
|
||||
uint8_t sense[256];
|
||||
|
||||
#ifdef ANCIENT_CODE
|
||||
/* Task file. */
|
||||
uint8_t features;
|
||||
uint8_t phase;
|
||||
uint16_t request_length;
|
||||
uint8_t status;
|
||||
uint8_t error;
|
||||
uint16_t pad;
|
||||
uint32_t pos;
|
||||
#endif
|
||||
uint8_t id;
|
||||
uint8_t cur_lun;
|
||||
uint8_t pad0;
|
||||
uint8_t pad1;
|
||||
|
||||
uint8_t id;
|
||||
uint8_t cur_lun;
|
||||
uint8_t pad0;
|
||||
uint8_t pad1;
|
||||
uint16_t max_transfer_len;
|
||||
uint16_t pad2;
|
||||
|
||||
uint16_t max_transfer_len;
|
||||
uint16_t pad2;
|
||||
int requested_blocks;
|
||||
int packet_status;
|
||||
int total_length;
|
||||
int do_page_save;
|
||||
int unit_attention;
|
||||
int request_pos;
|
||||
int old_len;
|
||||
int transition;
|
||||
|
||||
int requested_blocks;
|
||||
int packet_status;
|
||||
int total_length;
|
||||
int do_page_save;
|
||||
int unit_attention;
|
||||
int request_pos;
|
||||
int old_len;
|
||||
int pad3;
|
||||
uint32_t sector_pos;
|
||||
uint32_t sector_len;
|
||||
uint32_t packet_len;
|
||||
|
||||
uint32_t sector_pos;
|
||||
uint32_t sector_len;
|
||||
uint32_t packet_len;
|
||||
double callback;
|
||||
|
||||
double callback;
|
||||
uint8_t (*ven_cmd)(void *sc, uint8_t *cdb, int32_t *BufLen);
|
||||
} superdisk_t;
|
||||
|
||||
extern superdisk_t *superdisk[SUPERDISK_NUM];
|
||||
extern superdisk_drive_t superdisk_drives[SUPERDISK_NUM];
|
||||
extern uint8_t atapi_superdisk_drives[8];
|
||||
extern uint8_t scsi_superdisk_drives[16];
|
||||
|
||||
#define superdisk_sense_error dev->sense[0]
|
||||
#define superdisk_sense_key dev->sense[2]
|
||||
#define superdisk_info *(uint32_t *) &(dev->sense[3])
|
||||
#define superdisk_asc dev->sense[12]
|
||||
#define superdisk_ascq dev->sense[13]
|
||||
|
||||
@@ -134,15 +129,16 @@ extern superdisk_drive_t superdisk_drives[SUPERDISK_NUM];
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
extern void superdisk_disk_close(superdisk_t *dev);
|
||||
extern void superdisk_disk_reload(superdisk_t *dev);
|
||||
extern void superdisk_disk_close(const superdisk_t *dev);
|
||||
extern void superdisk_disk_reload(const superdisk_t *dev);
|
||||
extern void superdisk_insert(superdisk_t *dev);
|
||||
|
||||
extern void superdisk_global_init(void);
|
||||
extern void superdisk_hard_reset(void);
|
||||
|
||||
extern void superdisk_reset(scsi_common_t *sc);
|
||||
extern int superdisk_load(superdisk_t *dev, char *fn);
|
||||
extern int superdisk_is_empty(const uint8_t id);
|
||||
extern void superdisk_load(const superdisk_t *dev, const char *fn, const int skip_insert);
|
||||
extern void superdisk_close(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
@@ -44,6 +44,7 @@ enum class MediaType {
|
||||
Optical,
|
||||
RDisk,
|
||||
Mo,
|
||||
SuperDisk,
|
||||
Cassette,
|
||||
Cartridge
|
||||
};
|
||||
@@ -57,10 +58,10 @@ typedef QHash<ui::MediaType, device_media_history_t> master_list_t;
|
||||
// Used to iterate over all supported types when preparing data structures
|
||||
// Also useful to indicate which types support history
|
||||
static const MediaType AllSupportedMediaHistoryTypes[] = {
|
||||
MediaType::Optical,
|
||||
MediaType::Floppy,
|
||||
MediaType::RDisk,
|
||||
MediaType::Mo,
|
||||
MediaType::SuperDisk,
|
||||
MediaType::Cassette,
|
||||
MediaType::Cartridge
|
||||
};
|
||||
|
||||
@@ -1142,6 +1142,8 @@ MediaMenu::superdiskNewImage(int i)
|
||||
{
|
||||
NewFloppyDialog dialog(NewFloppyDialog::MediaType::SuperDisk, parentWidget);
|
||||
switch (dialog.exec()) {
|
||||
default:
|
||||
break;
|
||||
case QDialog::Accepted:
|
||||
QByteArray filename = dialog.fileName().toUtf8();
|
||||
superdiskMount(i, filename, false);
|
||||
@@ -1152,14 +1154,11 @@ MediaMenu::superdiskNewImage(int i)
|
||||
void
|
||||
MediaMenu::superdiskSelectImage(int i, bool wp)
|
||||
{
|
||||
auto filename = QFileDialog::getOpenFileName(
|
||||
const auto filename = QFileDialog::getOpenFileName(
|
||||
parentWidget,
|
||||
QString(),
|
||||
QString(),
|
||||
tr("Superdisk images") %
|
||||
util::DlgFilter({ "im?", "sdi" }) %
|
||||
tr("All files") %
|
||||
util::DlgFilter({ "*" }, true));
|
||||
tr("SuperDisk images") % util::DlgFilter({ "im?", "sdi" }) % tr("All files") % util::DlgFilter({ "*" }, true));
|
||||
|
||||
if (!filename.isEmpty())
|
||||
superdiskMount(i, filename, wp);
|
||||
@@ -1168,15 +1167,23 @@ MediaMenu::superdiskSelectImage(int i, bool wp)
|
||||
void
|
||||
MediaMenu::superdiskMount(int i, const QString &filename, bool wp)
|
||||
{
|
||||
superdisk_t *dev = (superdisk_t *) superdisk_drives[i].priv;
|
||||
const auto dev = static_cast<superdisk_t *>(superdisk_drives[i].priv);
|
||||
int was_empty = superdisk_is_empty(i);
|
||||
|
||||
superdisk_disk_close(dev);
|
||||
superdisk_drives[i].read_only = wp;
|
||||
if (!filename.isEmpty()) {
|
||||
QByteArray filenameBytes = filename.toUtf8();
|
||||
superdisk_load(dev, filenameBytes.data());
|
||||
superdisk_load(dev, filenameBytes.data(), 1);
|
||||
|
||||
/* Signal media change to the emulated machine. */
|
||||
superdisk_insert(dev);
|
||||
|
||||
/* The drive was previously empty, transition directly to UNIT ATTENTION. */
|
||||
if (was_empty)
|
||||
superdisk_insert(dev);
|
||||
}
|
||||
mhm.addImageToHistory(i, ui::MediaType::SuperDisk, superdisk_drives[i].prev_image_path, superdisk_drives[i].image_path);
|
||||
|
||||
ui_sb_update_icon_state(SB_SUPERDISK | i, filename.isEmpty() ? 1 : 0);
|
||||
superdiskUpdateMenu(i);
|
||||
@@ -1188,8 +1195,9 @@ MediaMenu::superdiskMount(int i, const QString &filename, bool wp)
|
||||
void
|
||||
MediaMenu::superdiskEject(int i)
|
||||
{
|
||||
superdisk_t *dev = (superdisk_t *) superdisk_drives[i].priv;
|
||||
const auto dev = static_cast<superdisk_t *>(superdisk_drives[i].priv);
|
||||
|
||||
mhm.addImageToHistory(i, ui::MediaType::SuperDisk, superdisk_drives[i].image_path, QString());
|
||||
superdisk_disk_close(dev);
|
||||
superdisk_drives[i].image_path[0] = 0;
|
||||
if (superdisk_drives[i].bus_type) {
|
||||
@@ -1204,40 +1212,49 @@ MediaMenu::superdiskEject(int i)
|
||||
}
|
||||
|
||||
void
|
||||
MediaMenu::superdiskReload(int i)
|
||||
MediaMenu::superdiskReloadPrev(int i)
|
||||
{
|
||||
superdisk_t *dev = (superdisk_t *) superdisk_drives[i].priv;
|
||||
const auto dev = static_cast<superdisk_t *>(superdisk_drives[i].priv);
|
||||
|
||||
superdisk_disk_reload(dev);
|
||||
if (strlen(superdisk_drives[i].image_path) == 0) {
|
||||
ui_sb_update_icon_state(SB_SUPERDISK| i, 1);
|
||||
ui_sb_update_icon_state(SB_SUPERDISK | i, 1);
|
||||
} else {
|
||||
ui_sb_update_icon_state(SB_SUPERDISK| i, 0);
|
||||
ui_sb_update_icon_state(SB_SUPERDISK | i, 0);
|
||||
}
|
||||
|
||||
superdiskUpdateMenu(i);
|
||||
ui_sb_update_tip(SB_SUPERDISK| i);
|
||||
ui_sb_update_tip(SB_SUPERDISK | i);
|
||||
|
||||
config_save();
|
||||
}
|
||||
|
||||
void
|
||||
MediaMenu::superdiskReload(int index, int slot)
|
||||
{
|
||||
const QString filename = mhm.getImageForSlot(index, slot, ui::MediaType::SuperDisk);
|
||||
superdiskMount(index, filename, false);
|
||||
superdiskUpdateMenu(index);
|
||||
ui_sb_update_tip(SB_SUPERDISK | index);
|
||||
}
|
||||
|
||||
void
|
||||
MediaMenu::superdiskUpdateMenu(int i)
|
||||
{
|
||||
QString name = superdisk_drives[i].image_path;
|
||||
QString prev_name = superdisk_drives[i].prev_image_path;
|
||||
const QString name = superdisk_drives[i].image_path;
|
||||
const QString prev_name = superdisk_drives[i].prev_image_path;
|
||||
if (!superdiskMenus.contains(i))
|
||||
return;
|
||||
auto *menu = superdiskMenus[i];
|
||||
auto childs = menu->children();
|
||||
|
||||
auto *ejectMenu = dynamic_cast<QAction*>(childs[superdiskEjectPos]);
|
||||
auto *reloadMenu = dynamic_cast<QAction*>(childs[superdiskReloadPos]);
|
||||
auto *ejectMenu = dynamic_cast<QAction *>(childs[superdiskEjectPos]);
|
||||
ejectMenu->setEnabled(!name.isEmpty());
|
||||
reloadMenu->setEnabled(!prev_name.isEmpty());
|
||||
|
||||
QString busName = tr("Unknown Bus");
|
||||
switch (superdisk_drives[i].bus_type) {
|
||||
default:
|
||||
break;
|
||||
case SUPERDISK_BUS_ATAPI:
|
||||
busName = "ATAPI";
|
||||
break;
|
||||
@@ -1247,9 +1264,12 @@ MediaMenu::superdiskUpdateMenu(int i)
|
||||
}
|
||||
|
||||
#if 0
|
||||
menu->setTitle(tr("SUPERDISK %1 %2 (%3): %4").arg((superdisk_drives[i].is_240 > 0) ? "240" : "120", QString::number(i+1), busName, name.isEmpty() ? tr("(empty)") : name));
|
||||
menu->setTitle(tr("SuperDisk %1 %2 (%3): %4").arg((superdisk_drives[i].is_240 > 0) ? "240" : "120", QString::number(i+1), busName, name.isEmpty() ? tr("(empty)") : name));
|
||||
#endif
|
||||
menu->setTitle(QString::asprintf(tr("SUPERDISK %03i %i (%s): %ls").toUtf8().constData(), (superdisk_drives[i].is_240 > 0) ? 240 : 120, i + 1, busName.toUtf8().data(), name.isEmpty() ? tr("(empty)").toStdU16String().data() : name.toStdU16String().data()));
|
||||
menu->setTitle(QString::asprintf(tr("SuperDisk %03i %i (%s): %ls").toUtf8().constData(), (superdisk_drives[i].is_240 > 0) ? 240 : 120, i + 1, busName.toUtf8().data(), name.isEmpty() ? tr("(empty)").toStdU16String().data() : name.toStdU16String().data()));
|
||||
|
||||
for (int slot = 0; slot < MAX_PREV_IMAGES; slot++)
|
||||
updateImageHistory(i, slot, ui::MediaType::SuperDisk);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -1415,10 +1435,16 @@ superdisk_eject(uint8_t id)
|
||||
MediaMenu::ptr->superdiskEject(id);
|
||||
}
|
||||
|
||||
void
|
||||
superdisk_mount(uint8_t id, char *fn, uint8_t wp)
|
||||
{
|
||||
MediaMenu::ptr->superdiskMount(id, QString(fn), wp);
|
||||
}
|
||||
|
||||
void
|
||||
superdisk_reload(uint8_t id)
|
||||
{
|
||||
MediaMenu::ptr->superdiskReload(id);
|
||||
MediaMenu::ptr->superdiskReloadPrev(id);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -69,9 +69,10 @@ public:
|
||||
|
||||
void superdiskNewImage(int i);
|
||||
void superdiskSelectImage(int i, bool wp);
|
||||
void superdiskMount(int i, const QString& filename, bool wp);
|
||||
void superdiskMount(int i, const QString &filename, bool wp);
|
||||
void superdiskEject(int i);
|
||||
void superdiskReload(int i);
|
||||
void superdiskReloadPrev(int i);
|
||||
void superdiskReload(int index, int slot);
|
||||
void superdiskUpdateMenu(int i);
|
||||
|
||||
void nicConnect(int i);
|
||||
|
||||
@@ -244,7 +244,7 @@ NewFloppyDialog::onCreate()
|
||||
break;
|
||||
case MediaType::SuperDisk:
|
||||
{
|
||||
fileType = fi.suffix().toLower() == QStringLiteral("zdi") ? FileType::Zdi: FileType::Img;
|
||||
fileType = fi.suffix().toLower() == QStringLiteral("sdi") ? FileType::Sdi: FileType::Img;
|
||||
|
||||
std::atomic_bool res;
|
||||
std::thread t([this, &res, filename, fileType, &progress] {
|
||||
|
||||
@@ -24,6 +24,7 @@ public:
|
||||
Img,
|
||||
Fdi,
|
||||
Zdi,
|
||||
Sdi,
|
||||
Mdi,
|
||||
};
|
||||
explicit NewFloppyDialog(MediaType type, QWidget *parent = nullptr);
|
||||
|
||||
@@ -169,8 +169,7 @@ superdisk_mount(uint8_t id, char *fn, uint8_t wp)
|
||||
|
||||
superdisk_disk_close(dev);
|
||||
superdisk_drives[id].read_only = wp;
|
||||
superdisk_load(dev, fn);
|
||||
superdisk_insert(dev);
|
||||
superdisk_load(dev, fn, 0);
|
||||
|
||||
ui_sb_update_icon_state(SB_SUPERDISK | id, strlen(superdisk_drives[id].image_path) ? 0 : 1);
|
||||
#if 0
|
||||
|
||||
Reference in New Issue
Block a user