Merge remote-tracking branch 'upstream/master' into feature/machine_z150

This commit is contained in:
Jasmine Iwanek
2022-10-19 16:27:26 -04:00
76 changed files with 1907 additions and 118 deletions

View File

@@ -13,4 +13,4 @@
# Copyright 2020,2021 David Hrdlička.
#
add_library(cdrom OBJECT cdrom.c cdrom_image_backend.c cdrom_image.c)
add_library(cdrom OBJECT cdrom.c cdrom_image_backend.c cdrom_image_viso.c cdrom_image.c)

View File

@@ -268,14 +268,16 @@ cdrom_image_open(cdrom_t *dev, const char *fn)
dev->image = img;
/* Open the image. */
if (!cdi_set_device(img, fn))
int i = cdi_set_device(img, fn);
if (!i)
return image_open_abort(dev);
/* All good, reset state. */
if (!strcasecmp(path_get_extension((char *) fn), "ISO"))
if (i >= 2)
dev->cd_status = CD_STATUS_DATA_ONLY;
else
dev->cd_status = CD_STATUS_STOPPED;
dev->is_dir = (i == 3);
dev->seek_pos = 0;
dev->cd_buflen = 0;
dev->cdrom_capacity = image_get_capacity(dev);

View File

@@ -1,36 +1,37 @@
/*
* 86Box A hypervisor and IBM PC system emulator that specializes in
* running old operating systems and software designed for IBM
* PC systems and compatibles from 1981 through fairly recent
* system designs based on the PCI bus.
* 86Box A hypervisor and IBM PC system emulator that specializes in
* running old operating systems and software designed for IBM
* PC systems and compatibles from 1981 through fairly recent
* system designs based on the PCI bus.
*
* This file is part of the 86Box distribution.
* This file is part of the 86Box distribution.
*
* CD-ROM image file handling module, translated to C from
* cdrom_dosbox.cpp.
* CD-ROM image file handling module, translated to C from
* cdrom_dosbox.cpp.
*
* Authors: Miran Grca, <mgrca8@gmail.com>
* Fred N. van Kempen, <decwiz@yahoo.com>
* The DOSBox Team, <unknown>
* Authors: Miran Grca, <mgrca8@gmail.com>
* Fred N. van Kempen, <decwiz@yahoo.com>
* The DOSBox Team, <unknown>
*
* Copyright 2016-2020 Miran Grca.
* Copyright 2017-2020 Fred N. van Kempen.
* Copyright 2002-2020 The DOSBox Team.
* Copyright 2016-2020 Miran Grca.
* Copyright 2017-2020 Fred N. van Kempen.
* Copyright 2002-2020 The DOSBox Team.
*/
#define __STDC_FORMAT_MACROS
#include <stdarg.h>
#include <inttypes.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <ctype.h>
#include <inttypes.h>
#include <stdarg.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#ifdef _WIN32
# include <string.h>
# include <sys/types.h>
#else
# include <libgen.h>
#endif
#include <wchar.h>
#define HAVE_STDARG_H
#include <86box/86box.h>
#include <86box/path.h>
@@ -132,6 +133,7 @@ static track_file_t *
bin_init(const char *filename, int *error)
{
track_file_t *tf = (track_file_t *) malloc(sizeof(track_file_t));
struct stat stats;
if (tf == NULL) {
*error = 1;
@@ -143,7 +145,11 @@ bin_init(const char *filename, int *error)
tf->file = plat_fopen64(tf->fn, "rb");
cdrom_image_backend_log("CDROM: binary_open(%s) = %08lx\n", tf->fn, tf->file);
*error = (tf->file == NULL);
if (stat(tf->fn, &stats) != 0) {
/* Use a blank structure if stat failed. */
memset(&stats, 0, sizeof(struct stat));
}
*error = ((tf->file == NULL) || ((stats.st_mode & S_IFMT) == S_IFDIR));
/* Set the function pointers. */
if (!*error) {
@@ -222,11 +228,13 @@ cdi_close(cd_img_t *cdi)
int
cdi_set_device(cd_img_t *cdi, const char *path)
{
if (cdi_load_cue(cdi, path))
return 1;
int ret;
if (cdi_load_iso(cdi, path))
return 1;
if ((ret = cdi_load_cue(cdi, path)))
return ret;
if ((ret = cdi_load_iso(cdi, path)))
return ret;
return 0;
}
@@ -532,7 +540,7 @@ cdi_track_push_back(cd_img_t *cdi, track_t *trk)
int
cdi_load_iso(cd_img_t *cdi, const char *filename)
{
int error;
int error, ret = 2;
track_t trk;
cdi->tracks = NULL;
@@ -545,7 +553,13 @@ cdi_load_iso(cd_img_t *cdi, const char *filename)
if (error) {
if ((trk.file != NULL) && (trk.file->close != NULL))
trk.file->close(trk.file);
return 0;
ret = 3;
trk.file = viso_init(filename, &error);
if (error) {
if ((trk.file != NULL) && (trk.file->close != NULL))
trk.file->close(trk.file);
return 0;
}
}
trk.number = 1;
trk.track_number = 1;
@@ -585,7 +599,7 @@ cdi_load_iso(cd_img_t *cdi, const char *filename)
trk.file = NULL;
cdi_track_push_back(cdi, &trk);
return 1;
return ret;
}
static int

1489
src/cdrom/cdrom_image_viso.c Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -47,17 +47,17 @@ void codegen_accumulate(int acc_reg, int delta)
void codegen_accumulate_flush(void)
{
intptr_t rip;
if (acc_regs[0].count) {
addbyte(0x55); /*push rbp*/
addbyte(0x48); /*mov rbp,val*/
addbyte(0xbd);
addlong((uint32_t) (acc_regs[0].dest_reg & 0xffffffffULL));
addlong((uint32_t) (acc_regs[0].dest_reg >> 32ULL));
addbyte(0x81); /* add d,[rbp][0],val */
addbyte(0x45);
addbyte(0x00);
/* To reduce the size of the generated code, we take advantage of
the fact that the target offset points to _cycles within cpu_state,
so we can just use our existing infrastracture for variables
relative to cpu_state. */
addbyte(0x81); /*ADDL $acc_regs[0].count,(_cycles)*/
addbyte(0x45);
addbyte((uint8_t)cpu_state_offset(_cycles));
addlong(acc_regs[0].count);
addbyte(0x5d); /*pop rbp*/
}
acc_regs[0].count = 0;

View File

@@ -45,9 +45,13 @@ void codegen_accumulate(int acc_reg, int delta)
void codegen_accumulate_flush(void)
{
if (acc_regs[0].count) {
addbyte(0x81); /*ADD $acc_regs[0].count,acc_regs[0].dest*/
addbyte(0x05);
addlong((uint32_t) acc_regs[0].dest_reg);
/* To reduce the size of the generated code, we take advantage of
the fact that the target offset points to _cycles within cpu_state,
so we can just use our existing infrastracture for variables
relative to cpu_state. */
addbyte(0x81); /*MOVL $acc_regs[0].count,(_cycles)*/
addbyte(0x45);
addbyte((uint8_t)cpu_state_offset(_cycles));
addlong(acc_regs[0].count);
}

View File

@@ -1291,6 +1291,14 @@ load_floppy_and_cdrom_drives(void)
sprintf(temp, "fdd_%02i_check_bpb", c + 1);
ini_section_delete_var(cat, temp);
}
for (int i = 0; i < MAX_PREV_IMAGES; i++) {
fdd_image_history[c][i] = (char *) calloc(MAX_IMAGE_PATH_LEN + 1, sizeof(char));
sprintf(temp, "fdd_%02i_image_history_%02i", c + 1, i + 1);
p = ini_section_get_string(cat, temp, NULL);
if (p) {
sprintf(fdd_image_history[c][i], "%s", p);
}
}
}
memset(temp, 0x00, sizeof(temp));
@@ -2680,6 +2688,15 @@ save_floppy_and_cdrom_drives(void)
ini_section_delete_var(cat, temp);
else
ini_section_set_int(cat, temp, fdd_get_check_bpb(c));
for (int i = 0; i < MAX_PREV_IMAGES; i++) {
sprintf(temp, "fdd_%02i_image_history_%02i", c + 1, i + 1);
if ((fdd_image_history[c][i] == 0) || strlen(fdd_image_history[c][i]) == 0) {
ini_section_delete_var(cat, temp);
} else {
ini_section_set_string(cat, temp, fdd_image_history[c][i]);
}
}
}
for (c = 0; c < CDROM_NUM; c++) {

View File

@@ -158,10 +158,13 @@ static const macro_op_t lods_op =
};
static const macro_op_t loop_op =
{
.nr_uops = 2,
.nr_uops = 5,
.decode_type = DECODE_COMPLEX,
.uop[0] = {.type = UOP_ALU, .latency = 1},
.uop[1] = {.type = UOP_BRANCH, .latency = 2}
.uop[1] = {.type = UOP_ALU, .latency = 1},
.uop[2] = {.type = UOP_ALU, .latency = 1},
.uop[3] = {.type = UOP_ALU, .latency = 1},
.uop[4] = {.type = UOP_BRANCH, .latency = 1}
};
static const macro_op_t mov_reg_seg_op =
{

View File

@@ -442,16 +442,16 @@ hdd_preset_get_num()
return sizeof(hdd_speed_presets) / sizeof(hdd_preset_t);
}
char *
const char *
hdd_preset_getname(int preset)
{
return (char *) hdd_speed_presets[preset].name;
return hdd_speed_presets[preset].name;
}
char *
const char *
hdd_preset_get_internal_name(int preset)
{
return (char *) hdd_speed_presets[preset].internal_name;
return hdd_speed_presets[preset].internal_name;
}
int

View File

@@ -76,6 +76,7 @@ typedef struct {
fdd_t fdd[FDD_NUM];
char floppyfns[FDD_NUM][512];
char *fdd_image_history[FDD_NUM][FLOPPY_IMAGE_HISTORY];
pc_timer_t fdd_poll_time[FDD_NUM];

View File

@@ -102,7 +102,7 @@ typedef struct cdrom {
media status. */
speed, cur_speed;
FILE *img_fp;
int is_dir;
void *priv;
char image_path[1024],

View File

@@ -52,6 +52,7 @@ typedef struct {
char fn[260];
FILE *file;
void *priv;
} track_file_t;
typedef struct {
@@ -88,4 +89,10 @@ extern int cdi_load_cue(cd_img_t *cdi, const char *cuefile);
extern int cdi_has_data_track(cd_img_t *cdi);
extern int cdi_has_audio_track(cd_img_t *cdi);
/* Virtual ISO functions. */
extern int viso_read(void *p, uint8_t *buffer, uint64_t seek, size_t count);
extern uint64_t viso_get_length(void *p);
extern void viso_close(void *p);
extern track_file_t *viso_init(const char *dirname, int *error);
#endif /*CDROM_IMAGE_BACKEND_H*/

View File

@@ -22,6 +22,7 @@
#define EMU_FDD_H
#define FDD_NUM 4
#define FLOPPY_IMAGE_HISTORY 4
#define SEEK_RECALIBRATE -999
#ifdef __cplusplus
@@ -83,6 +84,7 @@ typedef struct {
extern DRIVE drives[FDD_NUM];
extern char floppyfns[FDD_NUM][512];
extern char *fdd_image_history[FDD_NUM][FLOPPY_IMAGE_HISTORY];
extern pc_timer_t fdd_poll_time[FDD_NUM];
extern int ui_writeprot[FDD_NUM];

View File

@@ -203,13 +203,13 @@ extern int image_is_hdi(const char *s);
extern int image_is_hdx(const char *s, int check_signature);
extern int image_is_vhd(const char *s, int check_signature);
extern double hdd_timing_write(hard_disk_t *hdd, uint32_t addr, uint32_t len);
extern double hdd_timing_read(hard_disk_t *hdd, uint32_t addr, uint32_t len);
extern double hdd_seek_get_time(hard_disk_t *hdd, uint32_t dst_addr, uint8_t operation, uint8_t continuous, double max_seek_time);
int hdd_preset_get_num();
char *hdd_preset_getname(int preset);
extern char *hdd_preset_get_internal_name(int preset);
extern int hdd_preset_get_from_internal_name(char *s);
extern void hdd_preset_apply(int hdd_id);
extern double hdd_timing_write(hard_disk_t *hdd, uint32_t addr, uint32_t len);
extern double hdd_timing_read(hard_disk_t *hdd, uint32_t addr, uint32_t len);
extern double hdd_seek_get_time(hard_disk_t *hdd, uint32_t dst_addr, uint8_t operation, uint8_t continuous, double max_seek_time);
int hdd_preset_get_num();
const char *hdd_preset_getname(int preset);
extern const char *hdd_preset_get_internal_name(int preset);
extern int hdd_preset_get_from_internal_name(char *s);
extern void hdd_preset_apply(int hdd_id);
#endif /*EMU_HDD_H*/

View File

@@ -784,6 +784,7 @@ extern int machine_xt_sansx16_init(const machine_t *);
extern int machine_xt_bw230_init(const machine_t *);
extern int machine_xt_iskra3104_init(const machine_t *);
extern int machine_xt_pravetz16_imko4_init(const machine_t *);
/* m_xt_compaq.c */
extern int machine_xt_compaq_deskpro_init(const machine_t *);

View File

@@ -76,6 +76,10 @@ extern "C" {
# define atomic_bool_t atomic_bool
#endif
#if defined(_MSC_VER)
# define ssize_t intptr_t
#endif
/* Global variables residing in the platform module. */
extern int dopause, /* system is paused */
mouse_capture; /* mouse is captured in app */

View File

@@ -17,6 +17,8 @@
#ifndef PLAT_DIR_H
#define PLAT_DIR_H
/* Windows needs the POSIX re-implementations */
#if defined(_WIN32)
#ifdef _MAX_FNAME
# define MAXNAMLEN _MAX_FNAME
#else
@@ -63,5 +65,10 @@ extern void seekdir(DIR *, long);
extern int closedir(DIR *);
#define rewinddir(dirp) seekdir(dirp, 0L)
#else
/* On linux and macOS, use the standard functions and types */
#include <sys/dir.h>
#endif
#endif /*PLAT_DIR_H*/

View File

@@ -445,7 +445,8 @@
#define IDM_CDROM_EMPTY 0x4300
#define IDM_CDROM_RELOAD 0x4400
#define IDM_CDROM_IMAGE 0x4500
#define IDM_CDROM_HOST_DRIVE 0x4600
#define IDM_CDROM_DIR 0x4600
#define IDM_CDROM_HOST_DRIVE 0x4700
#define IDM_ZIP_IMAGE_NEW 0x5200
#define IDM_ZIP_IMAGE_EXISTING 0x5300

View File

@@ -509,6 +509,7 @@ extern const device_t ibm_ps1_2121_device;
extern const device_t tvga8900b_device;
extern const device_t tvga8900d_device;
extern const device_t tvga9000b_device;
extern const device_t nec_sv9000_device;
/* IBM VGA */
extern const device_t vga_device;

View File

@@ -328,6 +328,24 @@ machine_xt_iskra3104_init(const machine_t *model)
return ret;
}
int
machine_xt_pravetz16_imko4_init(const machine_t *model)
{
int ret;
ret = bios_load_linear("roms/machines/pravetz16/BIOS_IMKO4_FE00.bin",
0x000fe000, 8192, 0);
if (bios_only || !ret)
return ret;
device_add(&keyboard_at_device);
machine_xt_common_init(model);
return ret;
}
int
machine_xt_pc4i_init(const machine_t *model)
{

View File

@@ -1643,6 +1643,42 @@ const machine_t machines[] = {
.snd_device = NULL,
.net_device = NULL
},
{
.name = "[8088] Pravetz 16 / IMKO-4",
.internal_name = "pravetz16",
.type = MACHINE_TYPE_8088,
.chipset = MACHINE_CHIPSET_DISCRETE,
.init = machine_xt_pravetz16_imko4_init,
.pad = 0,
.pad0 = 0,
.pad1 = MACHINE_AVAILABLE,
.pad2 = 0,
.cpu = {
.package = CPU_PKG_8088,
.block = CPU_BLOCK_NONE,
.min_bus = 0,
.max_bus = 0,
.min_voltage = 0,
.max_voltage = 0,
.min_multi = 0,
.max_multi = 0
},
.bus_flags = MACHINE_PC,
.flags = MACHINE_FLAGS_NONE,
.ram = {
.min = 64,
.max = 640,
.step = 64
},
.nvrmask = 0,
.kbc = KBC_IBM_PC_XT,
.kbc_p1 = 0xff00,
.gpio = 0xffffffff,
.device = NULL,
.vid_device = NULL,
.snd_device = NULL,
.net_device = NULL
},
/* 8086 Machines */
{

View File

@@ -229,6 +229,9 @@ msgstr "&Načíst znova předchozí obraz"
msgid "&Image"
msgstr "&Obraz..."
msgid "&Folder..."
msgstr "&Folder..."
msgid "Target &framerate"
msgstr "&Cílová snímková frekvence"

View File

@@ -229,6 +229,9 @@ msgstr "&Voriges Image neu laden"
msgid "&Image"
msgstr "&Image"
msgid "&Folder..."
msgstr "&Folder..."
msgid "Target &framerate"
msgstr "Ziel&framerate"

View File

@@ -229,6 +229,9 @@ msgstr "&Reload previous image"
msgid "&Image"
msgstr "&Image"
msgid "&Folder..."
msgstr "&Folder..."
msgid "Target &framerate"
msgstr "Target &framerate"

View File

@@ -229,6 +229,9 @@ msgstr "&Reload previous image"
msgid "&Image"
msgstr "&Image"
msgid "&Folder..."
msgstr "&Folder..."
msgid "Target &framerate"
msgstr "Target &framerate"

View File

@@ -229,6 +229,9 @@ msgstr "&Recargar imagen previa"
msgid "&Image"
msgstr "&Imagen..."
msgid "&Folder..."
msgstr "&Folder..."
msgid "Target &framerate"
msgstr "&Tasa de refresco objetivo"

View File

@@ -229,6 +229,9 @@ msgstr "&Lataa edellinen levykuva uudelleen"
msgid "&Image"
msgstr "L&evykuva"
msgid "&Folder..."
msgstr "&Folder..."
msgid "Target &framerate"
msgstr "&Kuvataajuustavoite"

View File

@@ -229,6 +229,9 @@ msgstr "&Recharger image précedente"
msgid "&Image"
msgstr "&Image"
msgid "&Folder..."
msgstr "&Folder..."
msgid "Target &framerate"
msgstr "&Taux de rafraîchissement cible"

View File

@@ -229,6 +229,9 @@ msgstr "&Ponovo učitaj prethodnu sliku"
msgid "&Image"
msgstr "&Slika"
msgid "&Folder..."
msgstr "&Folder..."
msgid "Target &framerate"
msgstr "&Ciljni broj okvira u sekundi"

View File

@@ -229,6 +229,9 @@ msgstr "Előző képfájl &újratöltése"
msgid "&Image"
msgstr "&Meglévő képfájl &megnyitása..."
msgid "&Folder..."
msgstr "&Folder..."
msgid "Target &framerate"
msgstr "Cél &képkockasebesség"

View File

@@ -229,6 +229,9 @@ msgstr "&Ricarica l'immagine precedente"
msgid "&Image"
msgstr "&Immagine"
msgid "&Folder..."
msgstr "&Folder..."
msgid "Target &framerate"
msgstr "Imposta obiettivo &fotogrammi"

View File

@@ -229,6 +229,9 @@ msgstr "前のイメージを再読み込み(&R)"
msgid "&Image"
msgstr "イメージ(&I)"
msgid "&Folder..."
msgstr "&Folder..."
msgid "Target &framerate"
msgstr "目標フレームレート(&F)"

View File

@@ -229,6 +229,9 @@ msgstr "이전 이미지 다시 불러오기(&R)"
msgid "&Image"
msgstr "이미지(&I)"
msgid "&Folder..."
msgstr "&Folder..."
msgid "Target &framerate"
msgstr "목표 프레임 레이트(&F)"

View File

@@ -229,6 +229,9 @@ msgstr "&Przeładuj poprzedni obraz"
msgid "&Image"
msgstr "&Obraz"
msgid "&Folder..."
msgstr "&Folder..."
msgid "Target &framerate"
msgstr "Docelowa &liczba klatek na sekundę"

View File

@@ -229,6 +229,9 @@ msgstr "&Recarregar imagem anterior"
msgid "&Image"
msgstr "&Imagem"
msgid "&Folder..."
msgstr "&Pasta..."
msgid "Target &framerate"
msgstr "&Taxa de quadro pretendida"

View File

@@ -229,6 +229,9 @@ msgstr "&Recarregar imagem anterior"
msgid "&Image"
msgstr "&Imagem"
msgid "&Folder..."
msgstr "&Folder..."
msgid "Target &framerate"
msgstr "&Taxa de quadros de destino"

View File

@@ -229,6 +229,9 @@ msgstr "&Снова загрузить предыдущий образ"
msgid "&Image"
msgstr "&Образ..."
msgid "&Folder..."
msgstr "&Folder..."
msgid "Target &framerate"
msgstr "Целевая &частота кадров"

View File

@@ -229,6 +229,9 @@ msgstr "&Naloži zadnjo sliko"
msgid "&Image"
msgstr "&Slika"
msgid "&Folder..."
msgstr "&Folder..."
msgid "Target &framerate"
msgstr "&Ciljno št. sličic na sekundo"

View File

@@ -229,6 +229,9 @@ msgstr "&Önceki imajı seç"
msgid "&Image"
msgstr "&İmaj seç"
msgid "&Folder..."
msgstr "&Folder..."
msgid "Target &framerate"
msgstr "Hedef &kare oranı"

View File

@@ -229,6 +229,9 @@ msgstr "&Знову завантажити попередній образ"
msgid "&Image"
msgstr "&Образ..."
msgid "&Folder..."
msgstr "&Folder..."
msgid "Target &framerate"
msgstr "Цільова &частота кадрів"

View File

@@ -229,6 +229,9 @@ msgstr "载入上一个镜像(&R)"
msgid "&Image"
msgstr "镜像(&I)"
msgid "&Folder..."
msgstr "&Folder..."
msgid "Target &framerate"
msgstr "目标帧率(&F)"

View File

@@ -202,7 +202,8 @@ MainWindow::MainWindow(QWidget *parent) :
}
}
#endif
ui->actionPause->setChecked(dopause);
ui->actionPause->setChecked(false);
ui->actionPause->setCheckable(false);
});
connect(this, &MainWindow::getTitleForNonQtThread, this, &MainWindow::getTitle_, Qt::BlockingQueuedConnection);
@@ -753,6 +754,10 @@ void MainWindow::on_actionCtrl_Alt_Esc_triggered() {
void MainWindow::on_actionPause_triggered() {
plat_pause(dopause ^ 1);
auto pause_icon = dopause ? QIcon(":/menuicons/win/icons/run.ico") : QIcon(":/menuicons/win/icons/pause.ico");
auto tooltip_text = dopause ? QString(tr("Resume execution")) : QString(tr("Pause execution"));
ui->actionPause->setIcon(pause_icon);
ui->actionPause->setToolTip(tooltip_text);
}
void MainWindow::on_actionExit_triggered() {

View File

@@ -21,10 +21,15 @@
#include <QMetaEnum>
#include <QStringBuilder>
#include <utility>
#include "86box/cdrom.h"
#include "qt_mediahistorymanager.hpp"
extern "C"
{
#include <86box/timer.h>
#include <86box/cdrom.h>
#include <86box/fdd.h>
}
namespace ui {
MediaHistoryManager::MediaHistoryManager() {
@@ -158,6 +163,9 @@ void MediaHistoryManager::initialDeduplication()
case ui::MediaType::Optical:
current_image = cdrom[device_index].image_path;
break;
case ui::MediaType::Floppy:
current_image = floppyfns[device_index];
break;
default:
continue;
break;
@@ -180,6 +188,8 @@ char ** MediaHistoryManager::getEmuHistoryVarForType(ui::MediaType type, int ind
switch (type) {
case ui::MediaType::Optical:
return &cdrom[index].image_history[0];
case ui::MediaType::Floppy:
return &fdd_image_history[index][0];
default:
return nullptr;

View File

@@ -59,7 +59,8 @@ namespace ui {
// 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::Optical,
MediaType::Floppy,
};
class MediaHistoryManager {
@@ -87,7 +88,7 @@ namespace ui {
// Main hash of hash of vector of strings
master_list_t master_list;
const master_list_t &getMasterList() const;
[[nodiscard]] const master_list_t &getMasterList() const;
void setMasterList(const master_list_t &masterList);
device_index_list_t index_list, empty_device_index_list;

View File

@@ -105,6 +105,11 @@ void MediaMenu::refresh(QMenu *parentMenu) {
menu->addAction(tr("&Existing image..."), [this, i]() { floppySelectImage(i, false); });
menu->addAction(tr("Existing image (&Write-protected)..."), [this, i]() { floppySelectImage(i, true); });
menu->addSeparator();
for (int slot = 0; slot < MAX_PREV_IMAGES; slot++) {
floppyImageHistoryPos[slot] = menu->children().count();
menu->addAction(QString::asprintf(tr("Image %i").toUtf8().constData(), slot), [this, i, slot]() { floppyMenuSelect(i, slot); })->setCheckable(false);
}
menu->addSeparator();
floppyExportPos = menu->children().count();
menu->addAction(tr("E&xport to 86F..."), [this, i]() { floppyExportTo86f(i); });
menu->addSeparator();
@@ -120,7 +125,8 @@ void MediaMenu::refresh(QMenu *parentMenu) {
cdromMutePos = menu->children().count();
menu->addAction(tr("&Mute"), [this, i]() { cdromMute(i); })->setCheckable(true);
menu->addSeparator();
menu->addAction(tr("&Image..."), [this, i]() { cdromMount(i); })->setCheckable(false);
menu->addAction(tr("&Image..."), [this, i]() { cdromMount(i, 0); })->setCheckable(false);
menu->addAction(tr("&Folder..."), [this, i]() { cdromMount(i, 1); })->setCheckable(false);
menu->addSeparator();
for (int slot = 0; slot < MAX_PREV_IMAGES; slot++) {
cdromImageHistoryPos[slot] = menu->children().count();
@@ -128,6 +134,7 @@ void MediaMenu::refresh(QMenu *parentMenu) {
}
menu->addSeparator();
cdromImagePos = menu->children().count();
cdromDirPos = menu->children().count();
menu->addAction(tr("E&ject"), [this, i]() { cdromEject(i); })->setCheckable(false);
cdromMenus[i] = menu;
cdromUpdateMenu(i);
@@ -328,6 +335,7 @@ void MediaMenu::floppySelectImage(int i, bool wp) {
}
void MediaMenu::floppyMount(int i, const QString &filename, bool wp) {
auto previous_image = QFileInfo(floppyfns[i]);
fdd_close(i);
ui_writeprot[i] = wp ? 1 : 0;
if (! filename.isEmpty()) {
@@ -335,12 +343,14 @@ void MediaMenu::floppyMount(int i, const QString &filename, bool wp) {
fdd_load(i, filenameBytes.data());
}
ui_sb_update_icon_state(SB_FLOPPY | i, filename.isEmpty() ? 1 : 0);
mhm.addImageToHistory(i, ui::MediaType::Floppy, previous_image.filePath(), filename);
floppyUpdateMenu(i);
ui_sb_update_tip(SB_FLOPPY | i);
config_save();
}
void MediaMenu::floppyEject(int i) {
mhm.addImageToHistory(i, ui::MediaType::Floppy, floppyfns[i], QString());
fdd_close(i);
ui_sb_update_icon_state(SB_FLOPPY | i, 1);
floppyUpdateMenu(i);
@@ -376,11 +386,22 @@ void MediaMenu::floppyUpdateMenu(int i) {
ejectMenu->setText(QString::asprintf(tr("Eject %s").toUtf8().constData(), name.isEmpty() ? QString().toUtf8().constData() : fi.fileName().toUtf8().constData()));
exportMenu->setEnabled(!name.isEmpty());
for (int slot = 0; slot < MAX_PREV_IMAGES; slot++) {
updateImageHistory(i, slot, ui::MediaType::Floppy);
}
int type = fdd_get_type(i);
//floppyMenus[i]->setTitle(tr("Floppy %1 (%2): %3").arg(QString::number(i+1), fdd_getname(type), name.isEmpty() ? tr("(empty)") : name));
floppyMenus[i]->setTitle(QString::asprintf(tr("Floppy %i (%s): %ls").toUtf8().constData(), i + 1, fdd_getname(type), name.isEmpty() ? tr("(empty)").toStdU16String().data() : name.toStdU16String().data()));
}
void MediaMenu::floppyMenuSelect(int index, int slot) {
QString filename = mhm.getImageForSlot(index, slot, ui::MediaType::Floppy);
floppyMount(index, filename.toUtf8().constData(), false);
floppyUpdateMenu(index);
ui_sb_update_tip(SB_FLOPPY | index);
}
void MediaMenu::cdromMute(int i) {
cdrom[i].sound_on ^= 1;
config_save();
@@ -415,16 +436,23 @@ void MediaMenu::cdromMount(int i, const QString &filename)
config_save();
}
void MediaMenu::cdromMount(int i) {
void MediaMenu::cdromMount(int i, int dir) {
QString filename;
QFileInfo fi(cdrom[i].image_path);
auto filename = QFileDialog::getOpenFileName(
parentWidget,
QString(),
getMediaOpenDirectory(),
tr("CD-ROM images") %
util::DlgFilter({ "iso","cue" }) %
tr("All files") %
util::DlgFilter({ "*" }, true));
if (dir) {
filename = QFileDialog::getExistingDirectory(
parentWidget);
} else {
filename = QFileDialog::getOpenFileName(
parentWidget,
QString(),
QString(),
tr("CD-ROM images") %
util::DlgFilter({ "iso","cue" }) %
tr("All files") %
util::DlgFilter({ "*" }, true));
}
if (filename.isEmpty()) {
return;
@@ -501,8 +529,9 @@ void MediaMenu::cdromUpdateMenu(int i) {
imageMenu->setEnabled(!name.isEmpty());
imageMenu->setText(QString::asprintf(tr("Eject %s").toUtf8().constData(), name.isEmpty() ? QString().toUtf8().constData() : fi.fileName().toUtf8().constData()));
for (int slot = 0; slot < MAX_PREV_IMAGES; slot++)
for (int slot = 0; slot < MAX_PREV_IMAGES; slot++) {
updateImageHistory(i, slot, ui::MediaType::Optical);
}
QString busName = tr("Unknown Bus");
switch (cdrom[i].bus_type) {

View File

@@ -37,11 +37,12 @@ public:
void floppySelectImage(int i, bool wp);
void floppyMount(int i, const QString& filename, bool wp);
void floppyEject(int i);
void floppyMenuSelect(int index, int slot);
void floppyExportTo86f(int i);
void floppyUpdateMenu(int i);
void cdromMute(int i);
void cdromMount(int i);
void cdromMount(int i, int dir);
void cdromMount(int i, const QString& filename);
void cdromEject(int i);
void cdromReload(int index, int slot);
@@ -94,6 +95,7 @@ private:
int cdromMutePos;
int cdromReloadPos;
int cdromImagePos;
int cdromDirPos;
int cdromImageHistoryPos[MAX_PREV_IMAGES];
int floppyImageHistoryPos[MAX_PREV_IMAGES];

View File

@@ -161,7 +161,13 @@ plat_timer_read(void)
FILE *
plat_fopen(const char *path, const char *mode)
{
#if defined(Q_OS_MACOS) or defined(Q_OS_LINUX)
QFileInfo fi(path);
QString filename = (fi.isRelative() && !fi.filePath().isEmpty()) ? usr_path + fi.filePath() : fi.filePath();
return fopen(filename.toUtf8().constData(), mode);
#else
return fopen(QString::fromUtf8(path).toLocal8Bit(), mode);
#endif
}
FILE *
@@ -169,7 +175,7 @@ plat_fopen64(const char *path, const char *mode)
{
#if defined(Q_OS_MACOS) or defined(Q_OS_LINUX)
QFileInfo fi(path);
QString filename = fi.isRelative() ? usr_path + fi.filePath() : fi.filePath();
QString filename = (fi.isRelative() && !fi.filePath().isEmpty()) ? usr_path + fi.filePath() : fi.filePath();
return fopen(filename.toUtf8().constData(), mode);
#else
return fopen(QString::fromUtf8(path).toLocal8Bit(), mode);

View File

@@ -154,7 +154,7 @@ void SettingsFloppyCDROM::save() {
/* Removable devices category */
model = ui->tableViewCDROM->model();
for (int i = 0; i < CDROM_NUM; i++) {
cdrom[i].img_fp = NULL;
cdrom[i].is_dir = 0;
cdrom[i].priv = NULL;
cdrom[i].ops = NULL;
cdrom[i].image = NULL;

View File

@@ -139,6 +139,7 @@ video_cards[] = {
{ &tvga8900b_device },
{ &tvga8900d_device },
{ &tvga9000b_device },
{ &nec_sv9000_device },
{ &et4000k_isa_device },
{ &et2000_device },
{ &et4000_isa_device },

View File

@@ -35,9 +35,10 @@
#define TVGA9000B_ID 0x23
#define TVGA8900CLD_ID 0x33
#define ROM_TVGA_8900B "roms/video/tvga/tvga8900b.vbi"
#define ROM_TVGA_8900CLD "roms/video/tvga/trident.bin"
#define ROM_TVGA_9000B "roms/video/tvga/tvga9000b.bin"
#define ROM_TVGA_8900B "roms/video/tvga/tvga8900b.vbi"
#define ROM_TVGA_8900CLD "roms/video/tvga/trident.bin"
#define ROM_TVGA_9000B "roms/video/tvga/tvga9000b.bin"
#define ROM_TVGA_9000B_NEC_SV9000 "roms/video/tvga/SV9000.VBI"
typedef struct tvga_t {
mem_mapping_t linear_mapping;
@@ -389,7 +390,9 @@ tvga_init(const device_t *info)
tvga_t *tvga = malloc(sizeof(tvga_t));
memset(tvga, 0, sizeof(tvga_t));
if (info->local == TVGA9000B_ID) {
tvga->card_id = info->local & 0xFF;
if (tvga->card_id == TVGA9000B_ID) {
video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_tvga9000);
tvga->vram_size = 512 << 10;
} else {
@@ -399,9 +402,7 @@ tvga_init(const device_t *info)
tvga->vram_mask = tvga->vram_size - 1;
tvga->card_id = info->local;
switch (info->local) {
switch (tvga->card_id) {
case TVGA8900B_ID:
bios_fn = ROM_TVGA_8900B;
break;
@@ -409,7 +410,7 @@ tvga_init(const device_t *info)
bios_fn = ROM_TVGA_8900CLD;
break;
case TVGA9000B_ID:
bios_fn = ROM_TVGA_9000B;
bios_fn = (info->local & 0x100) ? ROM_TVGA_9000B_NEC_SV9000 : ROM_TVGA_9000B;
break;
default:
free(tvga);
@@ -424,7 +425,7 @@ tvga_init(const device_t *info)
NULL,
NULL);
if (info->local != TVGA9000B_ID)
if (tvga->card_id != TVGA9000B_ID)
tvga->svga.ramdac = device_add(&tkd8001_ramdac_device);
io_sethandler(0x03c0, 0x0020, tvga_in, NULL, NULL, tvga_out, NULL, NULL, tvga);
@@ -450,6 +451,12 @@ tvga9000b_available(void)
return rom_present(ROM_TVGA_9000B);
}
static int
tvga9000b_nec_sv9000_available(void)
{
return rom_present(ROM_TVGA_9000B_NEC_SV9000);
}
void
tvga_close(void *p)
{
@@ -549,3 +556,17 @@ const device_t tvga9000b_device = {
.force_redraw = tvga_force_redraw,
.config = NULL
};
const device_t nec_sv9000_device = {
.name = "NEC SV9000 (Trident TVGA 9000B)",
.internal_name = "nec_sv9000",
.flags = DEVICE_ISA,
.local = TVGA9000B_ID | 0x100,
.init = tvga_init,
.close = tvga_close,
.reset = NULL,
{ .available = tvga9000b_nec_sv9000_available },
.speed_changed = tvga_speed_changed,
.force_redraw = tvga_force_redraw,
.config = NULL
};

View File

@@ -632,7 +632,7 @@ MINIVHDOBJ := cwalk.o libxml2_encoding.o minivhd_convert.o \
minivhd_struct_rw.o minivhd_util.o
CDROMOBJ := cdrom.o \
cdrom_image_backend.o cdrom_image.o
cdrom_image_backend.o cdrom_image_viso.o cdrom_image.o
ZIPOBJ := zip.o

View File

@@ -177,6 +177,7 @@ BEGIN
MENUITEM "&Načíst znova předchozí obraz", IDM_CDROM_RELOAD
MENUITEM SEPARATOR
MENUITEM "&Obraz...", IDM_CDROM_IMAGE
MENUITEM "&Folder", IDM_CDROM_DIR
END
END

View File

@@ -177,6 +177,7 @@ BEGIN
MENUITEM "&Voriges Image neu laden", IDM_CDROM_RELOAD
MENUITEM SEPARATOR
MENUITEM "&Image", IDM_CDROM_IMAGE
MENUITEM "&Folder", IDM_CDROM_DIR
END
END

View File

@@ -177,6 +177,7 @@ BEGIN
MENUITEM "&Reload previous image", IDM_CDROM_RELOAD
MENUITEM SEPARATOR
MENUITEM "&Image", IDM_CDROM_IMAGE
MENUITEM "&Folder", IDM_CDROM_DIR
END
END

View File

@@ -177,6 +177,7 @@ BEGIN
MENUITEM "&Reload previous image", IDM_CDROM_RELOAD
MENUITEM SEPARATOR
MENUITEM "&Image", IDM_CDROM_IMAGE
MENUITEM "&Folder", IDM_CDROM_DIR
END
END

View File

@@ -177,6 +177,7 @@ BEGIN
MENUITEM "&Recargar imagen previa", IDM_CDROM_RELOAD
MENUITEM SEPARATOR
MENUITEM "&Imagen...", IDM_CDROM_IMAGE
MENUITEM "&Folder", IDM_CDROM_DIR
END
END

View File

@@ -177,6 +177,7 @@ BEGIN
MENUITEM "&Lataa edellinen levykuva uudelleen", IDM_CDROM_RELOAD
MENUITEM SEPARATOR
MENUITEM "L&evykuva", IDM_CDROM_IMAGE
MENUITEM "&Folder", IDM_CDROM_DIR
END
END

View File

@@ -177,6 +177,7 @@ BEGIN
MENUITEM "&Recharger image précedente", IDM_CDROM_RELOAD
MENUITEM SEPARATOR
MENUITEM "&Image", IDM_CDROM_IMAGE
MENUITEM "&Folder", IDM_CDROM_DIR
END
END

View File

@@ -177,6 +177,7 @@ BEGIN
MENUITEM "&Ponovo učitaj prethodnu sliku", IDM_CDROM_RELOAD
MENUITEM SEPARATOR
MENUITEM "&Slika", IDM_CDROM_IMAGE
MENUITEM "&Folder", IDM_CDROM_DIR
END
END

View File

@@ -182,6 +182,7 @@ BEGIN
MENUITEM "Előző képfájl &újratöltése", IDM_CDROM_RELOAD
MENUITEM SEPARATOR
MENUITEM "&Meglévő képfájl &megnyitása...", IDM_CDROM_IMAGE
MENUITEM "&Folder", IDM_CDROM_DIR
END
END

View File

@@ -178,6 +178,7 @@ BEGIN
MENUITEM "&Ricarica l'immagine precedente", IDM_CDROM_RELOAD
MENUITEM SEPARATOR
MENUITEM "&Immagine", IDM_CDROM_IMAGE
MENUITEM "&Folder", IDM_CDROM_DIR
END
END

View File

@@ -177,6 +177,7 @@ BEGIN
MENUITEM "前のイメージを再読み込み(&R)", IDM_CDROM_RELOAD
MENUITEM SEPARATOR
MENUITEM "イメージ(&I)", IDM_CDROM_IMAGE
MENUITEM "&Folder", IDM_CDROM_DIR
END
END

View File

@@ -177,6 +177,7 @@ BEGIN
MENUITEM "이전 이미지 다시 불러오기(&R)", IDM_CDROM_RELOAD
MENUITEM SEPARATOR
MENUITEM "이미지(&I)", IDM_CDROM_IMAGE
MENUITEM "&Folder", IDM_CDROM_DIR
END
END

View File

@@ -177,6 +177,7 @@ BEGIN
MENUITEM "&Przeładuj poprzedni obraz", IDM_CDROM_RELOAD
MENUITEM SEPARATOR
MENUITEM "&Obraz", IDM_CDROM_IMAGE
MENUITEM "&Folder", IDM_CDROM_DIR
END
END

View File

@@ -180,6 +180,7 @@ BEGIN
MENUITEM "&Recarregar imagem anterior", IDM_CDROM_RELOAD
MENUITEM SEPARATOR
MENUITEM "&Imagem", IDM_CDROM_IMAGE
MENUITEM "&Pasta", IDM_CDROM_DIR
END
END

View File

@@ -177,6 +177,7 @@ BEGIN
MENUITEM "&Recarregar imagem anterior", IDM_CDROM_RELOAD
MENUITEM SEPARATOR
MENUITEM "&Imagem", IDM_CDROM_IMAGE
MENUITEM "&Folder", IDM_CDROM_DIR
END
END

View File

@@ -177,6 +177,7 @@ BEGIN
MENUITEM "&Снова загрузить предыдущий образ", IDM_CDROM_RELOAD
MENUITEM SEPARATOR
MENUITEM "&Образ...", IDM_CDROM_IMAGE
MENUITEM "&Folder", IDM_CDROM_DIR
END
END

View File

@@ -177,6 +177,7 @@ BEGIN
MENUITEM "&Naloži zadnjo sliko", IDM_CDROM_RELOAD
MENUITEM SEPARATOR
MENUITEM "&Slika", IDM_CDROM_IMAGE
MENUITEM "&Folder", IDM_CDROM_DIR
END
END

View File

@@ -177,6 +177,7 @@ BEGIN
MENUITEM "&Önceki imajı seç", IDM_CDROM_RELOAD
MENUITEM SEPARATOR
MENUITEM "&İmaj seç", IDM_CDROM_IMAGE
MENUITEM "&Folder", IDM_CDROM_DIR
END
END

View File

@@ -177,6 +177,7 @@ BEGIN
MENUITEM "&Знову завантажити попередній образ", IDM_CDROM_RELOAD
MENUITEM SEPARATOR
MENUITEM "&Образ...", IDM_CDROM_IMAGE
MENUITEM "&Folder", IDM_CDROM_DIR
END
END

View File

@@ -177,6 +177,7 @@ BEGIN
MENUITEM "载入上一个镜像(&R)", IDM_CDROM_RELOAD
MENUITEM SEPARATOR
MENUITEM "镜像(&I)", IDM_CDROM_IMAGE
MENUITEM "&Folder", IDM_CDROM_DIR
END
END

View File

@@ -172,7 +172,8 @@ file_dlg_w(HWND hwnd, WCHAR *f, WCHAR *fn, WCHAR *title, int save)
* not use the contents of szFile to initialize itself.
*/
memset(ofn.lpstrFile, 0x00, 512 * sizeof(WCHAR));
memcpy(ofn.lpstrFile, fn, (wcslen(fn) << 1) + 2);
if (fn)
memcpy(ofn.lpstrFile, fn, (wcslen(fn) << 1) + 2);
ofn.nMaxFile = sizeof_w(wopenfilestring);
ofn.lpstrFilter = f;
ofn.nFilterIndex = 1;
@@ -211,11 +212,12 @@ file_dlg(HWND hwnd, WCHAR *f, char *fn, char *title, int save)
{
WCHAR ufn[512], title_buf[512];
mbstoc16s(ufn, fn, strlen(fn) + 1);
if (fn)
mbstoc16s(ufn, fn, strlen(fn) + 1);
if (title)
mbstoc16s(title_buf, title, sizeof title_buf);
return (file_dlg_w(hwnd, f, ufn, title ? title_buf : NULL, save));
return (file_dlg_w(hwnd, f, fn ? ufn : NULL, title ? title_buf : NULL, save));
}
int

View File

@@ -3,6 +3,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <shlobj.h>
#include <86box/86box.h>
#include <86box/cdrom.h>
#include <86box/config.h>
@@ -294,11 +295,13 @@ media_menu_update_cdrom(int id)
CheckMenuItem(menus[i], IDM_CDROM_MUTE | id, MF_BYCOMMAND | MF_UNCHECKED);
if (cdrom[id].host_drive == 200) {
CheckMenuItem(menus[i], IDM_CDROM_IMAGE | id, MF_BYCOMMAND | MF_CHECKED);
CheckMenuItem(menus[i], IDM_CDROM_IMAGE | id, MF_BYCOMMAND | (cdrom[id].is_dir ? MF_UNCHECKED : MF_CHECKED));
CheckMenuItem(menus[i], IDM_CDROM_DIR | id, MF_BYCOMMAND | (cdrom[id].is_dir ? MF_CHECKED : MF_UNCHECKED));
CheckMenuItem(menus[i], IDM_CDROM_EMPTY | id, MF_BYCOMMAND | MF_UNCHECKED);
} else {
cdrom[id].host_drive = 0;
CheckMenuItem(menus[i], IDM_CDROM_IMAGE | id, MF_BYCOMMAND | MF_UNCHECKED);
CheckMenuItem(menus[i], IDM_CDROM_DIR | id, MF_BYCOMMAND | MF_UNCHECKED);
CheckMenuItem(menus[i], IDM_CDROM_EMPTY | id, MF_BYCOMMAND | MF_CHECKED);
}
@@ -629,11 +632,32 @@ media_menu_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
break;
case IDM_CDROM_IMAGE:
if (!file_dlg_st(hwnd, IDS_2140, cdrom[id].image_path, NULL, 0)) {
if (!file_dlg_st(hwnd, IDS_2140, cdrom[id].is_dir ? NULL : cdrom[id].image_path, NULL, 0)) {
cdrom_mount(id, openfilestring);
}
break;
case IDM_CDROM_DIR:
BROWSEINFO bi = {
.hwndOwner = hwnd,
.ulFlags = BIF_EDITBOX
};
OleInitialize(NULL);
int old_dopause = dopause;
plat_pause(1);
LPITEMIDLIST pidl = SHBrowseForFolder(&bi);
plat_pause(old_dopause);
plat_chdir(usr_path);
if (pidl) {
wchar_t wbuf[MAX_PATH + 1];
if (SHGetPathFromIDList(pidl, wbuf)) {
char buf[MAX_PATH + 1];
c16stombs(buf, wbuf, sizeof(buf) - 1);
cdrom_mount(id, buf);
}
}
break;
case IDM_ZIP_IMAGE_NEW:
NewFloppyDialogCreate(hwnd, id | 0x80, 0); /* NewZIPDialogCreate */
break;

View File

@@ -51,27 +51,27 @@ typedef struct {
} disk_size_t;
static const disk_size_t disk_sizes[14] = {
// { 1, 1, 2, 1, 1, 77, 26, 0, 0, 4, 2, 6, 68 }, /* 250k 8" */
// { 1, 2, 2, 1, 1, 77, 26, 0, 0, 4, 2, 6, 68 }, /* 500k 8" */
// { 1, 1, 2, 1, 1, 77, 8, 3, 0, 1, 2, 2, 192 }, /* 616k 8" */
// { 1, 2, 0, 1, 1, 77, 8, 3, 0, 1, 2, 2, 192 }, /* 1232k 8" */
{ 0, 1, 2, 1, 0, 40, 8, 2, 0xfe, 1, 2, 1, 64 }, /* 160k */
{ 0, 1, 2, 1, 0, 40, 9, 2, 0xfc, 1, 2, 2, 64 }, /* 180k */
{ 0, 2, 2, 1, 0, 40, 8, 2, 0xff, 2, 2, 1, 112 }, /* 320k */
{ 0, 2, 2, 1, 0, 40, 9, 2, 0xfd, 2, 2, 2, 112 }, /* 360k */
{ 0, 2, 2, 1, 0, 80, 8, 2, 0xfb, 2, 2, 2, 112 }, /* 640k */
{ 0, 2, 2, 1, 0, 80, 9, 2, 0xf9, 2, 2, 3, 112 }, /* 720k */
{ 1, 2, 0, 1, 1, 80, 15, 2, 0xf9, 1, 2, 7, 224 }, /* 1.2M */
{ 1, 2, 0, 1, 1, 77, 8, 3, 0xfe, 1, 2, 2, 192 }, /* 1.25M */
{ 1, 2, 0, 1, 0, 80, 18, 2, 0xf0, 1, 2, 9, 224 }, /* 1.44M */
{ 1, 2, 0, 1, 0, 80, 21, 2, 0xf0, 2, 2, 5, 16 }, /* DMF cluster 1024 */
{ 1, 2, 0, 1, 0, 80, 21, 2, 0xf0, 4, 2, 3, 16 }, /* DMF cluster 2048 */
{ 2, 2, 3, 1, 0, 80, 36, 2, 0xf0, 2, 2, 9, 240 }, /* 2.88M */
{ 0, 64, 0, 0, 0, 96, 32, 2, 0, 0, 0, 0, 0 }, /* ZIP 100 */
{ 0, 64, 0, 0, 0, 239, 32, 2, 0, 0, 0, 0, 0 } }; /* ZIP 250 */
static unsigned char *empty;
// { 1, 1, 2, 1, 1, 77, 26, 0, 0, 4, 2, 6, 68 }, /* 250k 8" */
// { 1, 2, 2, 1, 1, 77, 26, 0, 0, 4, 2, 6, 68 }, /* 500k 8" */
// { 1, 1, 2, 1, 1, 77, 8, 3, 0, 1, 2, 2, 192 }, /* 616k 8" */
// { 1, 2, 0, 1, 1, 77, 8, 3, 0, 1, 2, 2, 192 }, /* 1232k 8" */
{0, 1, 2, 1, 0, 40, 8, 2, 0xfe, 1, 2, 1, 64 }, /* 160k */
{ 0, 1, 2, 1, 0, 40, 9, 2, 0xfc, 1, 2, 2, 64 }, /* 180k */
{ 0, 2, 2, 1, 0, 40, 8, 2, 0xff, 2, 2, 1, 112}, /* 320k */
{ 0, 2, 2, 1, 0, 40, 9, 2, 0xfd, 2, 2, 2, 112}, /* 360k */
{ 0, 2, 2, 1, 0, 80, 8, 2, 0xfb, 2, 2, 2, 112}, /* 640k */
{ 0, 2, 2, 1, 0, 80, 9, 2, 0xf9, 2, 2, 3, 112}, /* 720k */
{ 1, 2, 0, 1, 1, 80, 15, 2, 0xf9, 1, 2, 7, 224}, /* 1.2M */
{ 1, 2, 0, 1, 1, 77, 8, 3, 0xfe, 1, 2, 2, 192}, /* 1.25M */
{ 1, 2, 0, 1, 0, 80, 18, 2, 0xf0, 1, 2, 9, 224}, /* 1.44M */
{ 1, 2, 0, 1, 0, 80, 21, 2, 0xf0, 2, 2, 5, 16 }, /* DMF cluster 1024 */
{ 1, 2, 0, 1, 0, 80, 21, 2, 0xf0, 4, 2, 3, 16 }, /* DMF cluster 2048 */
{ 2, 2, 3, 1, 0, 80, 36, 2, 0xf0, 2, 2, 9, 240}, /* 2.88M */
{ 0, 64, 0, 0, 0, 96, 32, 2, 0, 0, 0, 0, 0 }, /* ZIP 100 */
{ 0, 64, 0, 0, 0, 239, 32, 2, 0, 0, 0, 0, 0 }
}; /* ZIP 250 */
static unsigned char *empty;
static int
create_86f(char *file_name, disk_size_t disk_size, uint8_t rpm_mode)

View File

@@ -595,7 +595,7 @@ win_settings_save(void)
/* Removable devices category */
memcpy(cdrom, temp_cdrom, CDROM_NUM * sizeof(cdrom_t));
for (i = 0; i < CDROM_NUM; i++) {
cdrom[i].img_fp = NULL;
cdrom[i].is_dir = 0;
cdrom[i].priv = NULL;
cdrom[i].ops = NULL;
cdrom[i].image = NULL;