Merge pull request #664 from 86Box/feature/mo
Added Magneto-Optical disk emulation
This commit is contained in:
101
src/config.c
101
src/config.c
@@ -55,6 +55,7 @@
|
|||||||
#include <86box/scsi_device.h>
|
#include <86box/scsi_device.h>
|
||||||
#include <86box/cdrom.h>
|
#include <86box/cdrom.h>
|
||||||
#include <86box/zip.h>
|
#include <86box/zip.h>
|
||||||
|
#include <86box/mo.h>
|
||||||
#include <86box/sound.h>
|
#include <86box/sound.h>
|
||||||
#include <86box/midi.h>
|
#include <86box/midi.h>
|
||||||
#include <86box/snd_mpu401.h>
|
#include <86box/snd_mpu401.h>
|
||||||
@@ -1186,7 +1187,7 @@ load_other_removable_devices(void)
|
|||||||
zip_drives[c].ide_channel = 7;
|
zip_drives[c].ide_channel = 7;
|
||||||
} else {
|
} else {
|
||||||
sprintf(temp, "zip_%02i_scsi_id", c+1);
|
sprintf(temp, "zip_%02i_scsi_id", c+1);
|
||||||
if (zip_drives[c].bus_type == CDROM_BUS_SCSI) {
|
if (zip_drives[c].bus_type == ZIP_BUS_SCSI) {
|
||||||
zip_drives[c].scsi_device_id = config_get_int(cat, temp, c+2);
|
zip_drives[c].scsi_device_id = config_get_int(cat, temp, c+2);
|
||||||
|
|
||||||
if (zip_drives[c].scsi_device_id > 15)
|
if (zip_drives[c].scsi_device_id > 15)
|
||||||
@@ -1238,6 +1239,69 @@ load_other_removable_devices(void)
|
|||||||
sprintf(temp, "zip_%02i_iso_path", c+1);
|
sprintf(temp, "zip_%02i_iso_path", c+1);
|
||||||
config_delete_var(cat, temp);
|
config_delete_var(cat, temp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
memset(temp, 0x00, sizeof(temp));
|
||||||
|
for (c=0; c<MO_NUM; c++) {
|
||||||
|
sprintf(temp, "mo_%02i_parameters", c+1);
|
||||||
|
p = config_get_string(cat, temp, NULL);
|
||||||
|
if (p != NULL)
|
||||||
|
sscanf(p, "%01u, %s", &mo_drives[c].type, s);
|
||||||
|
else
|
||||||
|
sscanf("0, none", "%01u, %s", &mo_drives[c].type, s);
|
||||||
|
mo_drives[c].bus_type = hdd_string_to_bus(s, 1);
|
||||||
|
|
||||||
|
/* Default values, needed for proper operation of the Settings dialog. */
|
||||||
|
mo_drives[c].ide_channel = mo_drives[c].scsi_device_id = c + 2;
|
||||||
|
|
||||||
|
sprintf(temp, "mo_%02i_ide_channel", c+1);
|
||||||
|
if (mo_drives[c].bus_type == MO_BUS_ATAPI) {
|
||||||
|
sprintf(tmp2, "%01u:%01u", (c+2)>>1, (c+2)&1);
|
||||||
|
p = config_get_string(cat, temp, tmp2);
|
||||||
|
sscanf(p, "%01u:%01u", &board, &dev);
|
||||||
|
board &= 3;
|
||||||
|
dev &= 1;
|
||||||
|
mo_drives[c].ide_channel = (board<<1)+dev;
|
||||||
|
|
||||||
|
if (mo_drives[c].ide_channel > 7)
|
||||||
|
mo_drives[c].ide_channel = 7;
|
||||||
|
} else {
|
||||||
|
sprintf(temp, "mo_%02i_scsi_id", c+1);
|
||||||
|
if (mo_drives[c].bus_type == MO_BUS_SCSI) {
|
||||||
|
mo_drives[c].scsi_device_id = config_get_int(cat, temp, c+2);
|
||||||
|
|
||||||
|
if (mo_drives[c].scsi_device_id > 15)
|
||||||
|
mo_drives[c].scsi_device_id = 15;
|
||||||
|
} else
|
||||||
|
config_delete_var(cat, temp);
|
||||||
|
}
|
||||||
|
|
||||||
|
sprintf(temp, "mo_%02i_image_path", c+1);
|
||||||
|
wp = config_get_wstring(cat, temp, L"");
|
||||||
|
|
||||||
|
wcsncpy(mo_drives[c].image_path, wp, sizeof_w(mo_drives[c].image_path));
|
||||||
|
|
||||||
|
/* If the CD-ROM is disabled, delete all its variables. */
|
||||||
|
if (mo_drives[c].bus_type == MO_BUS_DISABLED) {
|
||||||
|
sprintf(temp, "mo_%02i_host_drive", c+1);
|
||||||
|
config_delete_var(cat, temp);
|
||||||
|
|
||||||
|
sprintf(temp, "mo_%02i_parameters", c+1);
|
||||||
|
config_delete_var(cat, temp);
|
||||||
|
|
||||||
|
sprintf(temp, "mo_%02i_ide_channel", c+1);
|
||||||
|
config_delete_var(cat, temp);
|
||||||
|
|
||||||
|
sprintf(temp, "mo_%02i_scsi_id", c+1);
|
||||||
|
config_delete_var(cat, temp);
|
||||||
|
|
||||||
|
sprintf(temp, "mo_%02i_image_path", c+1);
|
||||||
|
config_delete_var(cat, temp);
|
||||||
|
}
|
||||||
|
|
||||||
|
sprintf(temp, "mo_%02i_iso_path", c+1);
|
||||||
|
config_delete_var(cat, temp);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1918,6 +1982,41 @@ save_other_removable_devices(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (c=0; c<MO_NUM; c++) {
|
||||||
|
sprintf(temp, "mo_%02i_parameters", c+1);
|
||||||
|
if (mo_drives[c].bus_type == 0) {
|
||||||
|
config_delete_var(cat, temp);
|
||||||
|
} else {
|
||||||
|
sprintf(tmp2, "%u, %s", mo_drives[c].type,
|
||||||
|
hdd_bus_to_string(mo_drives[c].bus_type, 1));
|
||||||
|
config_set_string(cat, temp, tmp2);
|
||||||
|
}
|
||||||
|
|
||||||
|
sprintf(temp, "mo_%02i_ide_channel", c+1);
|
||||||
|
if (mo_drives[c].bus_type != MO_BUS_ATAPI)
|
||||||
|
config_delete_var(cat, temp);
|
||||||
|
else {
|
||||||
|
sprintf(tmp2, "%01u:%01u", mo_drives[c].ide_channel>>1,
|
||||||
|
mo_drives[c].ide_channel & 1);
|
||||||
|
config_set_string(cat, temp, tmp2);
|
||||||
|
}
|
||||||
|
|
||||||
|
sprintf(temp, "mo_%02i_scsi_id", c + 1);
|
||||||
|
if (mo_drives[c].bus_type != MO_BUS_SCSI) {
|
||||||
|
config_delete_var(cat, temp);
|
||||||
|
} else {
|
||||||
|
config_set_int(cat, temp, mo_drives[c].scsi_device_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
sprintf(temp, "mo_%02i_image_path", c + 1);
|
||||||
|
if ((mo_drives[c].bus_type == 0) ||
|
||||||
|
(wcslen(mo_drives[c].image_path) == 0)) {
|
||||||
|
config_delete_var(cat, temp);
|
||||||
|
} else {
|
||||||
|
config_set_wstring(cat, temp, mo_drives[c].image_path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
delete_section_if_empty(cat);
|
delete_section_if_empty(cat);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
2156
src/disk/mo.c
Normal file
2156
src/disk/mo.c
Normal file
File diff suppressed because it is too large
Load Diff
@@ -97,6 +97,8 @@
|
|||||||
#define IDS_2121 2121 // "Are you sure you want to..."
|
#define IDS_2121 2121 // "Are you sure you want to..."
|
||||||
#define IDS_2122 2122 // "Are you sure you want to..."
|
#define IDS_2122 2122 // "Are you sure you want to..."
|
||||||
#define IDS_2123 2123 // "Unable to initialize Ghostscript..."
|
#define IDS_2123 2123 // "Unable to initialize Ghostscript..."
|
||||||
|
#define IDS_2124 2124 // "MO %i (%03i): %ls"
|
||||||
|
#define IDS_2125 2125 // "MO images (*.IM?)\0*.IM..."
|
||||||
|
|
||||||
#define IDS_4096 4096 // "Hard disk (%s)"
|
#define IDS_4096 4096 // "Hard disk (%s)"
|
||||||
#define IDS_4097 4097 // "%01i:%01i"
|
#define IDS_4097 4097 // "%01i:%01i"
|
||||||
@@ -175,7 +177,7 @@
|
|||||||
|
|
||||||
#define IDS_LANG_ENUS IDS_7168
|
#define IDS_LANG_ENUS IDS_7168
|
||||||
|
|
||||||
#define STR_NUM_2048 76
|
#define STR_NUM_2048 78
|
||||||
#define STR_NUM_3072 11
|
#define STR_NUM_3072 11
|
||||||
#define STR_NUM_4096 18
|
#define STR_NUM_4096 18
|
||||||
#define STR_NUM_4352 7
|
#define STR_NUM_4352 7
|
||||||
|
183
src/include/86box/mo.h
Normal file
183
src/include/86box/mo.h
Normal file
@@ -0,0 +1,183 @@
|
|||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* Implementation of a generic Magneto-Optical Disk drive
|
||||||
|
* commands, for both ATAPI and SCSI usage.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Authors: Natalia Portillo <claunia@claunia.com>
|
||||||
|
* Fred N. van Kempen, <decwiz@yahoo.com>
|
||||||
|
* Miran Grca, <mgrca8@gmail.com>
|
||||||
|
*
|
||||||
|
* Copyright 2020 Miran Grca.
|
||||||
|
*/
|
||||||
|
#ifndef EMU_MO_H
|
||||||
|
#define EMU_MO_H
|
||||||
|
|
||||||
|
|
||||||
|
#define MO_NUM 4
|
||||||
|
|
||||||
|
#define BUF_SIZE 32768
|
||||||
|
|
||||||
|
#define MO_TIME 10.0
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint32_t sectors;
|
||||||
|
uint16_t bytes_per_sector;
|
||||||
|
int64_t disk_size;
|
||||||
|
char name[255];
|
||||||
|
} mo_type_t;
|
||||||
|
|
||||||
|
#define KNOWN_MO_TYPES 10
|
||||||
|
static const mo_type_t mo_types[KNOWN_MO_TYPES] = {
|
||||||
|
// 3.5" standard M.O. disks
|
||||||
|
{ 248826, 512, 127398912, "3.5\" 128Mb M.O. (ISO 10090)" },
|
||||||
|
{ 446325, 512, 228518400, "3.5\" 230Mb M.O. (ISO 13963)" },
|
||||||
|
{ 1041500, 512, 533248000, "3.5\" 540Mb M.O. (ISO 15498)" },
|
||||||
|
{ 310352, 2048, 635600896, "3.5\" 640Mb M.O. (ISO 15498)" },
|
||||||
|
{ 605846, 2048, 1240772608, "3.5\" 1.3Gb M.O. (GigaMO)" },
|
||||||
|
{ 1063146, 2048, 2177323008, "3.5\" 2.3Gb M.O. (GigaMO 2)" },
|
||||||
|
// 5.25" M.O. disks
|
||||||
|
{573624, 512, 293695488, "5.25\" 600Mb M.O."},
|
||||||
|
{314568, 1024, 322117632, "5.25\" 650Mb M.O."},
|
||||||
|
{904995, 512, 463357440, "5.25\" 1Gb M.O."},
|
||||||
|
{637041, 1024, 652329984, "5.25\" 1.3Gb M.O."},
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
char vendor[8];
|
||||||
|
char model[16];
|
||||||
|
char revision[4];
|
||||||
|
int8_t supported_media[KNOWN_MO_TYPES];
|
||||||
|
} mo_drive_type_t;
|
||||||
|
|
||||||
|
static const mo_drive_type_t mo_drive_types[22] = {
|
||||||
|
{"86BOX", "MAGNETO OPTICAL", "1.00",{1, 1, 1, 1, 1, 1, 1, 1, 1, 1}},
|
||||||
|
{"FUJITSU", "M2512A", "1314",{1, 1, 0, 0, 0, 0, 0, 0, 0}},
|
||||||
|
{"FUJITSU", "M2513-MCC3064SS", "1.00",{1, 1, 1, 1, 0, 0, 0, 0, 0, 0}},
|
||||||
|
{"FUJITSU", "MCE3130SS", "0070",{1, 1, 1, 1, 1, 0, 0, 0, 0, 0}},
|
||||||
|
{"FUJITSU", "MCF3064SS", "0030",{1, 1, 1, 1, 0, 0, 0, 0, 0, 0}},
|
||||||
|
{"FUJITSU", "MCJ3230UB-S", "0040",{1, 1, 1, 1, 1, 1, 0, 0, 0, 0}},
|
||||||
|
{"HP", "S6300.65", "1.00",{0, 0, 0, 0, 0, 0, 1, 1, 0, 0}},
|
||||||
|
{"HP", "C1716C", "1.00",{0, 0, 0, 0, 0, 0, 1, 1, 0, 1}},
|
||||||
|
{"IBM", "0632AAA", "1.00",{0, 0, 0, 0, 0, 0, 1, 1, 0, 0}},
|
||||||
|
{"IBM", "0632CHC", "1.00",{0, 0, 0, 0, 0, 0, 1, 1, 0, 1}},
|
||||||
|
{"IBM", "0632CHX", "1.00",{0, 0, 0, 0, 0, 0, 1, 1, 0, 1}},
|
||||||
|
{"IBM", "MD3125A", "1.00",{1, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
|
||||||
|
{"IBM", "MD3125B", "1.00",{1, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
|
||||||
|
{"IBM", "MTA-3127", "1.00",{1, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
|
||||||
|
{"IBM", "MTA-3230", "1.00",{1, 1, 0, 0, 0, 0, 0, 0, 0, 0}},
|
||||||
|
{"MATSHITA", "LF-3000", "1.00",{1, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
|
||||||
|
{"MOST", "RMD-5100", "1.00",{1, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
|
||||||
|
{"RICOH", "RO-5031E", "1.00",{0, 0, 0, 0, 0, 0, 1, 1, 0, 0}},
|
||||||
|
{"SONY", "SMO-C301", "1.00",{1, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
|
||||||
|
{"SONY", "SMO-C501", "1.00",{0, 0, 0, 0, 0, 0, 1, 1, 0, 0}},
|
||||||
|
{"TEAC", "OD-3000", "1.00",{1, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
|
||||||
|
{"TOSHIBA", "OD-D300", "1.00",{1, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
|
||||||
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
MO_BUS_DISABLED = 0,
|
||||||
|
MO_BUS_ATAPI = 4,
|
||||||
|
MO_BUS_SCSI,
|
||||||
|
MO_BUS_USB
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint8_t id,
|
||||||
|
res, res0, /* Reserved for other ID's. */
|
||||||
|
res1,
|
||||||
|
ide_channel, scsi_device_id,
|
||||||
|
bus_type, /* 0 = ATAPI, 1 = SCSI */
|
||||||
|
bus_mode, /* Bit 0 = PIO suported;
|
||||||
|
Bit 1 = DMA supportd. */
|
||||||
|
read_only, /* Struct variable reserved for
|
||||||
|
media status. */
|
||||||
|
pad, pad0;
|
||||||
|
|
||||||
|
uint32_t medium_size,
|
||||||
|
base;
|
||||||
|
uint16_t sector_size;
|
||||||
|
uint8_t type;
|
||||||
|
|
||||||
|
void *priv;
|
||||||
|
|
||||||
|
FILE *f;
|
||||||
|
|
||||||
|
wchar_t image_path[1024],
|
||||||
|
prev_image_path[1024];
|
||||||
|
} mo_drive_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint8_t id,
|
||||||
|
error, status,
|
||||||
|
phase,
|
||||||
|
features,
|
||||||
|
is_dma,
|
||||||
|
do_page_save,
|
||||||
|
unit_attention;
|
||||||
|
|
||||||
|
mo_drive_t *drv;
|
||||||
|
|
||||||
|
uint16_t request_length,
|
||||||
|
max_transfer_len;
|
||||||
|
|
||||||
|
int requested_blocks, packet_status,
|
||||||
|
request_pos, old_len,
|
||||||
|
total_length;
|
||||||
|
|
||||||
|
uint32_t sector_pos, sector_len,
|
||||||
|
packet_len, pos,
|
||||||
|
seek_pos;
|
||||||
|
|
||||||
|
double callback;
|
||||||
|
|
||||||
|
mode_sense_pages_t ms_pages_saved;
|
||||||
|
|
||||||
|
uint8_t *buffer,
|
||||||
|
atapi_cdb[16],
|
||||||
|
current_cdb[16],
|
||||||
|
sense[256];
|
||||||
|
} mo_t;
|
||||||
|
|
||||||
|
|
||||||
|
extern mo_t *mo[MO_NUM];
|
||||||
|
extern mo_drive_t mo_drives[MO_NUM];
|
||||||
|
extern uint8_t atapi_mo_drives[8];
|
||||||
|
extern uint8_t scsi_mo_drives[16];
|
||||||
|
|
||||||
|
#define mo_sense_error dev->sense[0]
|
||||||
|
#define mo_sense_key dev->sense[2]
|
||||||
|
#define mo_asc dev->sense[12]
|
||||||
|
#define mo_ascq dev->sense[13]
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern void mo_disk_close(mo_t *dev);
|
||||||
|
extern void mo_disk_reload(mo_t *dev);
|
||||||
|
extern void mo_insert(mo_t *dev);
|
||||||
|
|
||||||
|
extern void mo_global_init(void);
|
||||||
|
extern void mo_hard_reset(void);
|
||||||
|
|
||||||
|
extern void mo_reset(scsi_common_t *sc);
|
||||||
|
extern int mo_load(mo_t *dev, wchar_t *fn);
|
||||||
|
extern void mo_close();
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#endif /*EMU_MO_H*/
|
@@ -112,6 +112,8 @@ extern void do_stop(void);
|
|||||||
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 zip_eject(uint8_t id);
|
||||||
extern void zip_reload(uint8_t id);
|
extern void zip_reload(uint8_t id);
|
||||||
|
extern void mo_eject(uint8_t id);
|
||||||
|
extern void mo_reload(uint8_t id);
|
||||||
extern int ioctl_open(uint8_t id, char d);
|
extern int ioctl_open(uint8_t id, char d);
|
||||||
extern void ioctl_reset(uint8_t id);
|
extern void ioctl_reset(uint8_t id);
|
||||||
extern void ioctl_close(uint8_t id);
|
extern void ioctl_close(uint8_t id);
|
||||||
|
@@ -224,6 +224,11 @@
|
|||||||
#define IDC_COMBO_ZIP_CHANNEL_IDE 1184
|
#define IDC_COMBO_ZIP_CHANNEL_IDE 1184
|
||||||
#define IDC_CHECK250 1185
|
#define IDC_CHECK250 1185
|
||||||
#define IDC_COMBO_CD_SPEED 1186
|
#define IDC_COMBO_CD_SPEED 1186
|
||||||
|
#define IDC_LIST_MO_DRIVES 1187
|
||||||
|
#define IDC_COMBO_MO_BUS 1188
|
||||||
|
#define IDC_COMBO_MO_ID 1189
|
||||||
|
#define IDC_COMBO_MO_LUN 1191
|
||||||
|
#define IDC_COMBO_MO_CHANNEL_IDE 1192
|
||||||
|
|
||||||
#define IDC_SLIDER_GAIN 1190 /* sound gain dialog */
|
#define IDC_SLIDER_GAIN 1190 /* sound gain dialog */
|
||||||
|
|
||||||
@@ -340,11 +345,11 @@
|
|||||||
#define IDM_ZIP_EJECT 0x3500
|
#define IDM_ZIP_EJECT 0x3500
|
||||||
#define IDM_ZIP_RELOAD 0x3600
|
#define IDM_ZIP_RELOAD 0x3600
|
||||||
|
|
||||||
#define IDM_RDISK_EJECT 0x4200
|
#define IDM_MO_IMAGE_NEW 0x4200
|
||||||
#define IDM_RDISK_RELOAD 0x4300
|
#define IDM_MO_IMAGE_EXISTING 0x4300
|
||||||
#define IDM_RDISK_SEND_CHANGE 0x4400
|
#define IDM_MO_IMAGE_EXISTING_WP 0x4400
|
||||||
#define IDM_RDISK_IMAGE 0x4500
|
#define IDM_MO_EJECT 0x4500
|
||||||
#define IDM_RDISK_IMAGE_WP 0x4600
|
#define IDM_MO_RELOAD 0x4600
|
||||||
|
|
||||||
|
|
||||||
/* Next default values for new objects */
|
/* Next default values for new objects */
|
||||||
|
@@ -66,8 +66,10 @@
|
|||||||
#define GPCMD_READ_FORMAT_CAPACITIES 0x23
|
#define GPCMD_READ_FORMAT_CAPACITIES 0x23
|
||||||
#define GPCMD_READ_CDROM_CAPACITY 0x25
|
#define GPCMD_READ_CDROM_CAPACITY 0x25
|
||||||
#define GPCMD_READ_10 0x28
|
#define GPCMD_READ_10 0x28
|
||||||
|
#define GPCMD_READ_GENERATION 0x29
|
||||||
#define GPCMD_WRITE_10 0x2a
|
#define GPCMD_WRITE_10 0x2a
|
||||||
#define GPCMD_SEEK_10 0x2b
|
#define GPCMD_SEEK_10 0x2b
|
||||||
|
#define GPCMD_ERASE_10 0x2c
|
||||||
#define GPCMD_WRITE_AND_VERIFY_10 0x2e
|
#define GPCMD_WRITE_AND_VERIFY_10 0x2e
|
||||||
#define GPCMD_VERIFY_10 0x2f
|
#define GPCMD_VERIFY_10 0x2f
|
||||||
#define GPCMD_READ_BUFFER 0x3c
|
#define GPCMD_READ_BUFFER 0x3c
|
||||||
@@ -91,6 +93,7 @@
|
|||||||
#define GPCMD_READ_12 0xa8
|
#define GPCMD_READ_12 0xa8
|
||||||
#define GPCMD_PLAY_AUDIO_TRACK_RELATIVE_12 0xa9
|
#define GPCMD_PLAY_AUDIO_TRACK_RELATIVE_12 0xa9
|
||||||
#define GPCMD_WRITE_12 0xaa
|
#define GPCMD_WRITE_12 0xaa
|
||||||
|
#define GPCMD_ERASE_12 0xac
|
||||||
#define GPCMD_READ_DVD_STRUCTURE 0xad /* For reading. */
|
#define GPCMD_READ_DVD_STRUCTURE 0xad /* For reading. */
|
||||||
#define GPCMD_WRITE_AND_VERIFY_12 0xae
|
#define GPCMD_WRITE_AND_VERIFY_12 0xae
|
||||||
#define GPCMD_VERIFY_12 0xaf
|
#define GPCMD_VERIFY_12 0xaf
|
||||||
|
@@ -46,6 +46,7 @@ extern void ui_check_menu_item(int id, int checked);
|
|||||||
#define SB_FLOPPY 0x00
|
#define SB_FLOPPY 0x00
|
||||||
#define SB_CDROM 0x10
|
#define SB_CDROM 0x10
|
||||||
#define SB_ZIP 0x20
|
#define SB_ZIP 0x20
|
||||||
|
#define SB_MO 0x30
|
||||||
#define SB_HDD 0x40
|
#define SB_HDD 0x40
|
||||||
#define SB_NETWORK 0x50
|
#define SB_NETWORK 0x50
|
||||||
#define SB_SOUND 0x60
|
#define SB_SOUND 0x60
|
||||||
|
@@ -646,6 +646,8 @@ END
|
|||||||
33 ICON DISCARDABLE "win/icons/cdrom_active.ico"
|
33 ICON DISCARDABLE "win/icons/cdrom_active.ico"
|
||||||
48 ICON DISCARDABLE "win/icons/zip.ico"
|
48 ICON DISCARDABLE "win/icons/zip.ico"
|
||||||
49 ICON DISCARDABLE "win/icons/zip_active.ico"
|
49 ICON DISCARDABLE "win/icons/zip_active.ico"
|
||||||
|
56 ICON DISCARDABLE "win/icons/mo.ico"
|
||||||
|
57 ICON DISCARDABLE "win/icons/mo_active.ico"
|
||||||
64 ICON DISCARDABLE "win/icons/hard_disk.ico"
|
64 ICON DISCARDABLE "win/icons/hard_disk.ico"
|
||||||
65 ICON DISCARDABLE "win/icons/hard_disk_active.ico"
|
65 ICON DISCARDABLE "win/icons/hard_disk_active.ico"
|
||||||
80 ICON DISCARDABLE "win/icons/network.ico"
|
80 ICON DISCARDABLE "win/icons/network.ico"
|
||||||
@@ -658,6 +660,8 @@ END
|
|||||||
161 ICON DISCARDABLE "win/icons/cdrom_empty_active.ico"
|
161 ICON DISCARDABLE "win/icons/cdrom_empty_active.ico"
|
||||||
176 ICON DISCARDABLE "win/icons/zip_empty.ico"
|
176 ICON DISCARDABLE "win/icons/zip_empty.ico"
|
||||||
177 ICON DISCARDABLE "win/icons/zip_empty_active.ico"
|
177 ICON DISCARDABLE "win/icons/zip_empty_active.ico"
|
||||||
|
183 ICON DISCARDABLE "win/icons/mo_empty.ico"
|
||||||
|
184 ICON DISCARDABLE "win/icons/mo_empty_active.ico"
|
||||||
240 ICON DISCARDABLE "win/icons/machine.ico"
|
240 ICON DISCARDABLE "win/icons/machine.ico"
|
||||||
241 ICON DISCARDABLE "win/icons/display.ico"
|
241 ICON DISCARDABLE "win/icons/display.ico"
|
||||||
242 ICON DISCARDABLE "win/icons/input_devices.ico"
|
242 ICON DISCARDABLE "win/icons/input_devices.ico"
|
||||||
@@ -669,6 +673,7 @@ END
|
|||||||
248 ICON DISCARDABLE "win/icons/floppy_disabled.ico"
|
248 ICON DISCARDABLE "win/icons/floppy_disabled.ico"
|
||||||
249 ICON DISCARDABLE "win/icons/cdrom_disabled.ico"
|
249 ICON DISCARDABLE "win/icons/cdrom_disabled.ico"
|
||||||
250 ICON DISCARDABLE "win/icons/zip_disabled.ico"
|
250 ICON DISCARDABLE "win/icons/zip_disabled.ico"
|
||||||
|
251 ICON DISCARDABLE "win/icons/mo_disabled.ico"
|
||||||
|
|
||||||
#ifdef APSTUDIO_INVOKED
|
#ifdef APSTUDIO_INVOKED
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
@@ -910,6 +915,8 @@ BEGIN
|
|||||||
IDS_2120 "Unable to initialize SDL, SDL2.dll is required"
|
IDS_2120 "Unable to initialize SDL, SDL2.dll is required"
|
||||||
IDS_2121 "Are you sure you want to hard reset the emulated machine?"
|
IDS_2121 "Are you sure you want to hard reset the emulated machine?"
|
||||||
IDS_2122 "Are you sure you want to quit 86Box?"
|
IDS_2122 "Are you sure you want to quit 86Box?"
|
||||||
|
IDS_2124 "MO %i (%03i): %ls"
|
||||||
|
IDS_2125 "MO images (*.IM?)\0*.IM?\0All files (*.*)\0*.*\0"
|
||||||
END
|
END
|
||||||
|
|
||||||
STRINGTABLE DISCARDABLE
|
STRINGTABLE DISCARDABLE
|
||||||
|
@@ -630,6 +630,8 @@ CDROMOBJ := cdrom.o \
|
|||||||
|
|
||||||
ZIPOBJ := zip.o
|
ZIPOBJ := zip.o
|
||||||
|
|
||||||
|
MOOBJ := mo.o
|
||||||
|
|
||||||
ifeq ($(USB), y)
|
ifeq ($(USB), y)
|
||||||
USBOBJ := usb.o
|
USBOBJ := usb.o
|
||||||
endif
|
endif
|
||||||
@@ -726,7 +728,7 @@ else
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
OBJ := $(MAINOBJ) $(INTELOBJ) $(CPUOBJ) $(CHIPSETOBJ) $(MCHOBJ) \
|
OBJ := $(MAINOBJ) $(INTELOBJ) $(CPUOBJ) $(CHIPSETOBJ) $(MCHOBJ) \
|
||||||
$(DEVOBJ) $(FDDOBJ) $(CDROMOBJ) $(ZIPOBJ) $(HDDOBJ) \
|
$(DEVOBJ) $(FDDOBJ) $(CDROMOBJ) $(ZIPOBJ) $(MOOBJ) $(HDDOBJ) \
|
||||||
$(USBOBJ) $(NETOBJ) $(PRINTOBJ) $(SCSIOBJ) $(SNDOBJ) $(VIDOBJ) \
|
$(USBOBJ) $(NETOBJ) $(PRINTOBJ) $(SCSIOBJ) $(SNDOBJ) $(VIDOBJ) \
|
||||||
$(PLATOBJ) $(UIOBJ) $(D2DOBJ) $(FSYNTHOBJ) $(MUNTOBJ) \
|
$(PLATOBJ) $(UIOBJ) $(D2DOBJ) $(FSYNTHOBJ) $(MUNTOBJ) \
|
||||||
$(DEVBROBJ) $(DISCORDOBJ)
|
$(DEVBROBJ) $(DISCORDOBJ)
|
||||||
|
BIN
src/win/icons/mo.ico
Normal file
BIN
src/win/icons/mo.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.1 KiB |
BIN
src/win/icons/mo_active.ico
Normal file
BIN
src/win/icons/mo_active.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.1 KiB |
BIN
src/win/icons/mo_disabled.ico
Normal file
BIN
src/win/icons/mo_disabled.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.1 KiB |
BIN
src/win/icons/mo_empty.ico
Normal file
BIN
src/win/icons/mo_empty.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.1 KiB |
BIN
src/win/icons/mo_empty_active.ico
Normal file
BIN
src/win/icons/mo_empty_active.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.1 KiB |
@@ -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 drives.
|
* Handle the platform-side of CDROM/ZIP/MO drives.
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
@@ -31,6 +31,7 @@
|
|||||||
#include <86box/hdd.h>
|
#include <86box/hdd.h>
|
||||||
#include <86box/scsi_device.h>
|
#include <86box/scsi_device.h>
|
||||||
#include <86box/cdrom.h>
|
#include <86box/cdrom.h>
|
||||||
|
#include <86box/mo.h>
|
||||||
#include <86box/zip.h>
|
#include <86box/zip.h>
|
||||||
#include <86box/scsi_disk.h>
|
#include <86box/scsi_disk.h>
|
||||||
#include <86box/plat.h>
|
#include <86box/plat.h>
|
||||||
@@ -57,6 +58,44 @@ plat_cdrom_ui_update(uint8_t id, uint8_t reload)
|
|||||||
ui_sb_update_tip(SB_CDROM|id);
|
ui_sb_update_tip(SB_CDROM|id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
mo_eject(uint8_t id)
|
||||||
|
{
|
||||||
|
mo_t *dev = (mo_t *) mo_drives[id].priv;
|
||||||
|
|
||||||
|
mo_disk_close(dev);
|
||||||
|
if (mo_drives[id].bus_type) {
|
||||||
|
/* Signal disk change to the emulated machine. */
|
||||||
|
mo_insert(dev);
|
||||||
|
}
|
||||||
|
|
||||||
|
ui_sb_update_icon_state(SB_MO | id, 1);
|
||||||
|
ui_sb_enable_menu_item(SB_MO|id, IDM_MO_EJECT | id, MF_BYCOMMAND | MF_GRAYED);
|
||||||
|
ui_sb_enable_menu_item(SB_MO|id, IDM_MO_RELOAD | id, MF_BYCOMMAND | MF_ENABLED);
|
||||||
|
ui_sb_update_tip(SB_MO | id);
|
||||||
|
config_save();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
mo_reload(uint8_t id)
|
||||||
|
{
|
||||||
|
mo_t *dev = (mo_t *) mo_drives[id].priv;
|
||||||
|
|
||||||
|
mo_disk_reload(dev);
|
||||||
|
if (wcslen(mo_drives[id].image_path) == 0) {
|
||||||
|
ui_sb_enable_menu_item(SB_MO|id, IDM_MO_EJECT | id, MF_BYCOMMAND | MF_GRAYED);
|
||||||
|
ui_sb_update_icon_state(SB_MO|id, 1);
|
||||||
|
} else {
|
||||||
|
ui_sb_enable_menu_item(SB_MO|id, IDM_MO_EJECT | id, MF_BYCOMMAND | MF_ENABLED);
|
||||||
|
ui_sb_update_icon_state(SB_MO|id, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
ui_sb_enable_menu_item(SB_MO|id, IDM_MO_RELOAD | id, MF_BYCOMMAND | MF_GRAYED);
|
||||||
|
ui_sb_update_tip(SB_MO|id);
|
||||||
|
|
||||||
|
config_save();
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
zip_eject(uint8_t id)
|
zip_eject(uint8_t id)
|
||||||
|
@@ -42,6 +42,7 @@
|
|||||||
#include <86box/scsi_device.h>
|
#include <86box/scsi_device.h>
|
||||||
#include <86box/cdrom.h>
|
#include <86box/cdrom.h>
|
||||||
#include <86box/zip.h>
|
#include <86box/zip.h>
|
||||||
|
#include <86box/mo.h>
|
||||||
#include <86box/cdrom_image.h>
|
#include <86box/cdrom_image.h>
|
||||||
#include <86box/scsi_disk.h>
|
#include <86box/scsi_disk.h>
|
||||||
#include <86box/network.h>
|
#include <86box/network.h>
|
||||||
@@ -191,6 +192,31 @@ StatusBarCreateZIPSubmenu(HMENU m, int id)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
StatusBarCreateMOSubmenu(HMENU m, int id)
|
||||||
|
{
|
||||||
|
AppendMenu(m, MF_STRING, IDM_MO_IMAGE_NEW | id,
|
||||||
|
plat_get_string(IDS_2096));
|
||||||
|
AppendMenu(m, MF_SEPARATOR, 0, 0);
|
||||||
|
AppendMenu(m, MF_STRING, IDM_MO_IMAGE_EXISTING | id,
|
||||||
|
plat_get_string(IDS_2097));
|
||||||
|
AppendMenu(m, MF_STRING, IDM_MO_IMAGE_EXISTING_WP | id,
|
||||||
|
plat_get_string(IDS_2098));
|
||||||
|
AppendMenu(m, MF_SEPARATOR, 0, 0);
|
||||||
|
AppendMenu(m, MF_STRING, IDM_MO_EJECT | id,
|
||||||
|
plat_get_string(IDS_2093));
|
||||||
|
AppendMenu(m, MF_STRING, IDM_MO_RELOAD | id,
|
||||||
|
plat_get_string(IDS_2090));
|
||||||
|
|
||||||
|
if (mo_drives[id].image_path[0] == 0x0000) {
|
||||||
|
EnableMenuItem(m, IDM_MO_EJECT | id, MF_BYCOMMAND | MF_GRAYED);
|
||||||
|
EnableMenuItem(m, IDM_MO_RELOAD | id, MF_BYCOMMAND | MF_ENABLED);
|
||||||
|
} else {
|
||||||
|
EnableMenuItem(m, IDM_MO_EJECT | id, MF_BYCOMMAND | MF_ENABLED);
|
||||||
|
EnableMenuItem(m, IDM_MO_RELOAD | id, MF_BYCOMMAND | MF_GRAYED);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
ui_sb_timer_callback(int pane)
|
ui_sb_timer_callback(int pane)
|
||||||
@@ -336,6 +362,33 @@ StatusBarCreateZIPTip(int part)
|
|||||||
wcscpy(sbTips[part], tempTip);
|
wcscpy(sbTips[part], tempTip);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
StatusBarCreateMOTip(int part)
|
||||||
|
{
|
||||||
|
WCHAR tempTip[512];
|
||||||
|
WCHAR *szText;
|
||||||
|
int id;
|
||||||
|
int drive = sb_part_meanings[part] & 0xf;
|
||||||
|
int bus = mo_drives[drive].bus_type;
|
||||||
|
|
||||||
|
id = IDS_5377 + (bus - 1);
|
||||||
|
szText = plat_get_string(id);
|
||||||
|
|
||||||
|
if (wcslen(mo_drives[drive].image_path) == 0) {
|
||||||
|
_swprintf(tempTip, plat_get_string(IDS_2124),
|
||||||
|
drive+1, szText, plat_get_string(IDS_2057));
|
||||||
|
} else {
|
||||||
|
_swprintf(tempTip, plat_get_string(IDS_2124),
|
||||||
|
drive+1, szText, mo_drives[drive].image_path);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sbTips[part] != NULL) {
|
||||||
|
free(sbTips[part]);
|
||||||
|
sbTips[part] = NULL;
|
||||||
|
}
|
||||||
|
sbTips[part] = (WCHAR *)malloc((wcslen(tempTip) << 1) + 2);
|
||||||
|
wcscpy(sbTips[part], tempTip);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
StatusBarCreateDiskTip(int part)
|
StatusBarCreateDiskTip(int part)
|
||||||
@@ -409,6 +462,10 @@ ui_sb_update_tip(int meaning)
|
|||||||
StatusBarCreateZIPTip(part);
|
StatusBarCreateZIPTip(part);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case SB_MO:
|
||||||
|
StatusBarCreateMOTip(part);
|
||||||
|
break;
|
||||||
|
|
||||||
case SB_HDD:
|
case SB_HDD:
|
||||||
StatusBarCreateDiskTip(part);
|
StatusBarCreateDiskTip(part);
|
||||||
break;
|
break;
|
||||||
@@ -641,6 +698,21 @@ ui_sb_update_panes(void)
|
|||||||
sb_parts++;
|
sb_parts++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
for (i=0; i<MO_NUM; i++) {
|
||||||
|
/* Could be Internal or External IDE.. */
|
||||||
|
if ((mo_drives[i].bus_type == MO_BUS_ATAPI) &&
|
||||||
|
!(hdint || !memcmp(hdc_name, "ide", 3)))
|
||||||
|
continue;
|
||||||
|
if ((mo_drives[i].bus_type == MO_BUS_SCSI) && (scsi_card_current == 0))
|
||||||
|
continue;
|
||||||
|
if (mo_drives[i].bus_type != 0) {
|
||||||
|
edge += SB_ICON_WIDTH;
|
||||||
|
iStatusWidths[sb_parts] = edge;
|
||||||
|
sb_part_meanings[sb_parts] = SB_MO | i;
|
||||||
|
sb_map[SB_MO | i] = sb_parts;
|
||||||
|
sb_parts++;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (c_mfm && (hdint || !memcmp(hdc_name, "st506", 5))) {
|
if (c_mfm && (hdint || !memcmp(hdc_name, "st506", 5))) {
|
||||||
edge += SB_ICON_WIDTH;
|
edge += SB_ICON_WIDTH;
|
||||||
iStatusWidths[sb_parts] = edge;
|
iStatusWidths[sb_parts] = edge;
|
||||||
@@ -732,6 +804,15 @@ ui_sb_update_panes(void)
|
|||||||
StatusBarCreateZIPTip(i);
|
StatusBarCreateZIPTip(i);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case SB_MO: /* Magneto-Optical disk */
|
||||||
|
sb_part_icons[i] = (wcslen(mo_drives[sb_part_meanings[i] & 0xf].image_path) == 0) ? 128 : 0;
|
||||||
|
sb_part_icons[i] |= 56;
|
||||||
|
sb_menu_handles[i] = StatusBarCreatePopupMenu(i);
|
||||||
|
StatusBarCreateMOSubmenu(sb_menu_handles[i], sb_part_meanings[i] & 0xf);
|
||||||
|
EnableMenuItem(sb_menu_handles[i], IDM_MO_EJECT | (sb_part_meanings[i] & 0xf), MF_BYCOMMAND | ((sb_part_icons[i] & 128) ? MF_GRAYED : MF_ENABLED));
|
||||||
|
StatusBarCreateMOTip(i);
|
||||||
|
break;
|
||||||
|
|
||||||
case SB_HDD: /* Hard disk */
|
case SB_HDD: /* Hard disk */
|
||||||
sb_part_icons[i] = 64;
|
sb_part_icons[i] = 64;
|
||||||
StatusBarCreateDiskTip(i);
|
StatusBarCreateDiskTip(i);
|
||||||
@@ -813,6 +894,24 @@ ui_sb_mount_zip_img(uint8_t id, int part, uint8_t wp, wchar_t *file_name)
|
|||||||
config_save();
|
config_save();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ui_sb_mount_mo_img(uint8_t id, int part, uint8_t wp, wchar_t *file_name)
|
||||||
|
{
|
||||||
|
mo_t *dev = (mo_t *) mo_drives[id].priv;
|
||||||
|
|
||||||
|
mo_disk_close(dev);
|
||||||
|
mo_drives[id].read_only = wp;
|
||||||
|
mo_load(dev, file_name);
|
||||||
|
mo_insert(dev);
|
||||||
|
if (sb_ready) {
|
||||||
|
ui_sb_update_icon_state(SB_MO | id, wcslen(mo_drives[id].image_path) ? 0 : 1);
|
||||||
|
EnableMenuItem(sb_menu_handles[part], IDM_MO_EJECT | id, MF_BYCOMMAND | (wcslen(zip_drives[id].image_path) ? MF_ENABLED : MF_GRAYED));
|
||||||
|
EnableMenuItem(sb_menu_handles[part], IDM_MO_RELOAD | id, MF_BYCOMMAND | (wcslen(zip_drives[id].image_path) ? MF_GRAYED : MF_ENABLED));
|
||||||
|
ui_sb_update_tip(SB_MO | id);
|
||||||
|
}
|
||||||
|
config_save();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Handle messages for the Status Bar window. */
|
/* Handle messages for the Status Bar window. */
|
||||||
#if defined(__amd64__) || defined(__aarch64__)
|
#if defined(__amd64__) || defined(__aarch64__)
|
||||||
@@ -980,6 +1079,34 @@ StatusBarProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
|
|||||||
zip_reload(id);
|
zip_reload(id);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case IDM_MO_IMAGE_NEW:
|
||||||
|
id = item_params & 0x0003;
|
||||||
|
part = sb_map[SB_MO | id];
|
||||||
|
NewFloppyDialogCreate(hwnd, id | 0x80, part); /* NewZIPDialogCreate */
|
||||||
|
break;
|
||||||
|
|
||||||
|
case IDM_MO_IMAGE_EXISTING:
|
||||||
|
case IDM_MO_IMAGE_EXISTING_WP:
|
||||||
|
id = item_params & 0x0003;
|
||||||
|
part = sb_map[SB_MO | id];
|
||||||
|
if ((part == 0xff) || (sb_menu_handles == NULL))
|
||||||
|
break;
|
||||||
|
|
||||||
|
ret = file_dlg_w_st(hwnd, IDS_2125, mo_drives[id].image_path, 0);
|
||||||
|
if (! ret)
|
||||||
|
ui_sb_mount_mo_img(id, part, (item_id == IDM_MO_IMAGE_EXISTING_WP) ? 1 : 0, wopenfilestring);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case IDM_MO_EJECT:
|
||||||
|
id = item_params & 0x0003;
|
||||||
|
mo_eject(id);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case IDM_MO_RELOAD:
|
||||||
|
id = item_params & 0x0003;
|
||||||
|
mo_reload(id);
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user