Update for rewrite

This commit is contained in:
Jasmine Iwanek
2025-03-04 14:41:35 -05:00
parent fef4f8b9c5
commit c783404f6a
9 changed files with 872 additions and 1051 deletions

View File

@@ -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);

File diff suppressed because it is too large Load Diff

View File

@@ -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

View File

@@ -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
};

View File

@@ -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);
}
}

View File

@@ -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);

View File

@@ -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] {

View File

@@ -24,6 +24,7 @@ public:
Img,
Fdi,
Zdi,
Sdi,
Mdi,
};
explicit NewFloppyDialog(MediaType type, QWidget *parent = nullptr);

View File

@@ -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