Imported CD-ROM-related changes from VARCem;

Removed cdrom_null.c/h;
Some changes to logging (will be spread to everything else soon).
This commit is contained in:
OBattler
2018-10-17 05:29:48 +02:00
parent 2cd20ea319
commit c663147d11
18 changed files with 908 additions and 972 deletions

View File

@@ -8,7 +8,7 @@
*
* Generic CD-ROM drive core.
*
* Version: @(#)cdrom.c 1.0.1 2018/10/11
* Version: @(#)cdrom.c 1.0.2 2018/10/17
*
* Author: Miran Grca, <mgrca8@gmail.com>
*
@@ -23,9 +23,10 @@
#include <wchar.h>
#define HAVE_STDARG_H
#include "../86box.h"
#include "../config.h"
#include "cdrom.h"
#include "cdrom_image.h"
#include "cdrom_null.h"
#include "../plat.h"
#include "../sound/sound.h"
@@ -33,50 +34,50 @@
#define MAX_SEEK 333333
cdrom_image_t cdrom_image[CDROM_NUM];
cdrom_drive_t cdrom_drives[CDROM_NUM];
cdrom_t cdrom[CDROM_NUM];
#ifdef ENABLE_CDROM_LOG
int cdrom_do_log = ENABLE_CDROM_LOG;
#endif
int cdrom_do_log = ENABLE_CDROM_LOG;
static void
cdrom_log(const char *format, ...)
void
cdrom_log(const char *fmt, ...)
{
#ifdef ENABLE_CDROM_LOG
va_list ap;
if (cdrom_do_log) {
va_start(ap, format);
pclog_ex(format, ap);
va_start(ap, fmt);
pclog_ex(fmt, ap);
va_end(ap);
}
#endif
}
#else
#define cdrom_log(fmt, ...)
#endif
int
cdrom_lba_to_msf_accurate(int lba)
{
int temp_pos;
int pos;
int m, s, f;
temp_pos = lba + 150;
f = temp_pos % 75;
temp_pos -= f;
temp_pos /= 75;
s = temp_pos % 60;
temp_pos -= s;
temp_pos /= 60;
m = temp_pos;
pos = lba + 150;
f = pos % 75;
pos -= f;
pos /= 75;
s = pos % 60;
pos -= s;
pos /= 60;
m = pos;
return ((m << 16) | (s << 8) | f);
}
double
cdrom_get_short_seek(cdrom_drive_t *dev)
static double
cdrom_get_short_seek(cdrom_t *dev)
{
switch(dev->cur_speed) {
case 0:
@@ -107,8 +108,8 @@ cdrom_get_short_seek(cdrom_drive_t *dev)
}
double
cdrom_get_long_seek(cdrom_drive_t *dev)
static double
cdrom_get_long_seek(cdrom_t *dev)
{
switch(dev->cur_speed) {
case 0:
@@ -140,7 +141,7 @@ cdrom_get_long_seek(cdrom_drive_t *dev)
double
cdrom_seek_time(cdrom_drive_t *dev)
cdrom_seek_time(cdrom_t *dev)
{
uint32_t diff = dev->seek_diff;
double sd = (double) (MAX_SEEK - MIN_SEEK);
@@ -157,28 +158,35 @@ cdrom_seek_time(cdrom_drive_t *dev)
void
cdrom_seek(cdrom_drive_t *dev, uint32_t pos)
cdrom_seek(cdrom_t *dev, uint32_t pos)
{
/* cdrom_log("CD-ROM %i: Seek %08X\n", dev->id, pos); */
if (!dev)
return;
dev->seek_pos = pos;
if (dev->handler && dev->handler->stop)
dev->handler->stop(dev->id);
if (dev->ops && dev->ops->stop)
dev->ops->stop(dev);
}
int
cdrom_playing_completed(cdrom_drive_t *dev)
cdrom_playing_completed(cdrom_t *dev)
{
dev->prev_status = dev->cd_status;
dev->cd_status = dev->handler->status(dev->id);
if (dev->ops && dev->ops->status)
dev->cd_status = dev->ops->status(dev);
else {
dev->cd_status = CD_STATUS_EMPTY;
return 0;
}
if (((dev->prev_status == CD_STATUS_PLAYING) || (dev->prev_status == CD_STATUS_PAUSED)) &&
((dev->cd_status != CD_STATUS_PLAYING) && (dev->cd_status != CD_STATUS_PAUSED)))
return 1;
else
return 0;
return 0;
}
@@ -187,44 +195,51 @@ void
cdrom_global_init(void)
{
/* Clear the global data. */
memset(cdrom_drives, 0x00, sizeof(cdrom_drives));
memset(cdrom, 0x00, sizeof(cdrom));
}
static void
cdrom_drive_reset(cdrom_drive_t *drv)
cdrom_drive_reset(cdrom_t *dev)
{
drv->p = NULL;
drv->insert = NULL;
drv->get_volume = NULL;
drv->get_channel = NULL;
drv->close = NULL;
dev->p = NULL;
dev->insert = NULL;
dev->close = NULL;
dev->get_volume = NULL;
dev->get_channel = NULL;
}
void
cdrom_hard_reset(void)
{
int c;
cdrom_drive_t *drv;
cdrom_t *dev;
int i;
for (c = 0; c < CDROM_NUM; c++) {
if (cdrom_drives[c].bus_type) {
cdrom_log("CDROM hard_reset drive=%d\n", c);
for (i = 0; i < CDROM_NUM; i++) {
dev = &cdrom[i];
if (dev->bus_type) {
cdrom_log("CDROM %i: hard_reset\n", i);
drv = &cdrom_drives[c];
drv->id = c;
dev->id = i;
cdrom_drive_reset(drv);
cdrom_drive_reset(dev);
if ((drv->bus_type == CDROM_BUS_ATAPI) || (drv->bus_type == CDROM_BUS_SCSI))
scsi_cdrom_drive_reset(c);
switch(dev->bus_type) {
case CDROM_BUS_ATAPI:
case CDROM_BUS_SCSI:
scsi_cdrom_drive_reset(i);
break;
if (drv->host_drive == 200) {
image_open(c, cdrom_image[c].image_path);
image_reset(c);
} else
cdrom_null_open(c);
default:
break;
}
if (dev->host_drive == 200) {
cdrom_image_open(dev, dev->image_path);
cdrom_image_reset(dev);
}
}
}
@@ -232,39 +247,111 @@ cdrom_hard_reset(void)
}
void
cdrom_close_handler(uint8_t id)
{
cdrom_drive_t *dev = &cdrom_drives[id];
if (!dev)
return;
switch (dev->host_drive) {
case 200:
image_close(id);
break;
default:
null_close(id);
break;
}
dev->handler = NULL;
}
void
cdrom_close(void)
{
int c;
cdrom_t *dev;
int i;
for (c = 0; c < CDROM_NUM; c++) {
if (cdrom_drives[c].handler)
cdrom_close_handler(c);
for (i = 0; i < CDROM_NUM; i++) {
dev = &cdrom[i];
if (cdrom_drives[c].close)
cdrom_drives[c].close(cdrom_drives[c].p);
if (dev->ops && dev->ops->exit)
dev->ops->exit(dev);
cdrom_drive_reset(&cdrom_drives[c]);
dev->ops = NULL;
if (dev->close)
dev->close(dev->p);
cdrom_drive_reset(dev);
}
}
/* Signal disc change to the emulated machine. */
void
cdrom_insert(uint8_t id)
{
cdrom_t *dev = &cdrom[id];
if (dev->bus_type) {
if (dev->insert)
dev->insert(dev->p);
}
}
/* The mechanics of ejecting a CD-ROM from a drive. */
void
cdrom_eject(uint8_t id)
{
cdrom_t *dev = &cdrom[id];
/* This entire block should be in cdrom.c/cdrom_eject(dev*) ... */
if (dev->host_drive == 0) {
/* Switch from empty to empty. Do nothing. */
return;
}
if (dev->prev_image_path) {
free(dev->prev_image_path);
dev->prev_image_path = NULL;
}
if (dev->host_drive == 200) {
dev->prev_image_path = (wchar_t *) malloc(1024);
wcscpy(dev->prev_image_path, dev->image_path);
}
dev->prev_host_drive = dev->host_drive;
dev->host_drive = 0;
dev->ops->exit(dev);
dev->ops = NULL;
memset(dev->image_path, 0, sizeof(dev->image_path));
cdrom_insert(id);
plat_cdrom_ui_update(id, 0);
config_save();
}
/* The mechanics of re-loading a CD-ROM drive. */
void
cdrom_reload(uint8_t id)
{
cdrom_t *dev = &cdrom[id];
if ((dev->host_drive == dev->prev_host_drive) ||
(dev->prev_host_drive == 0) || (dev->host_drive != 0)) {
/* Switch from empty to empty. Do nothing. */
return;
}
if (dev->ops && dev->ops->exit)
dev->ops->exit(dev);
dev->ops = NULL;
memset(dev->image_path, 0, sizeof(dev->image_path));
if (dev->prev_host_drive == 200) {
/* Reload a previous image. */
wcscpy(dev->image_path, dev->prev_image_path);
free(dev->prev_image_path);
dev->prev_image_path = NULL;
cdrom_image_open(dev, dev->image_path);
cdrom_insert(id);
if (wcslen(dev->image_path) == 0)
dev->host_drive = 0;
else
dev->host_drive = 200;
}
plat_cdrom_ui_update(id, 1);
config_save();
}

View File

@@ -8,7 +8,7 @@
*
* Generic CD-ROM drive core header.
*
* Version: @(#)cdrom.h 1.0.14 2018/10/09
* Version: @(#)cdrom.h 1.0.15 2018/10/17
*
* Author: Miran Grca, <mgrca8@gmail.com>
*
@@ -30,6 +30,14 @@
#define CDROM_IMAGE 200
/* This is so that if/when this is changed to something else,
changing this one define will be enough. */
#define CDROM_EMPTY !dev->host_drive
#ifdef __cplusplus
extern "C" {
#endif
enum {
CDROM_BUS_DISABLED = 0,
@@ -39,85 +47,91 @@ enum {
};
/* To shut up the GCC compilers. */
struct cdrom;
/* Define the various CD-ROM drive operations (ops). */
typedef struct {
int (*ready)(uint8_t id);
int (*medium_changed)(uint8_t id);
int (*media_type_id)(uint8_t id);
int (*ready)(struct cdrom *dev);
int (*medium_changed)(struct cdrom *dev);
int (*media_type_id)(struct cdrom *dev);
int (*audio_callback)(uint8_t id, int16_t *output, int len);
void (*audio_stop)(uint8_t id);
int (*readtoc)(uint8_t id, uint8_t *b, uint8_t starttrack, int msf, int maxlen, int single);
int (*readtoc_session)(uint8_t id, uint8_t *b, int msf, int maxlen);
int (*readtoc_raw)(uint8_t id, uint8_t *b, int maxlen);
uint8_t (*getcurrentsubchannel)(uint8_t id, uint8_t *b, int msf);
int (*readsector_raw)(uint8_t id, uint8_t *buffer, int sector, int ismsf, int cdrom_sector_type, int cdrom_sector_flags, int *len);
uint8_t (*playaudio)(uint8_t id, uint32_t pos, uint32_t len, int ismsf);
void (*pause)(uint8_t id);
void (*resume)(uint8_t id);
uint32_t (*size)(uint8_t id);
int (*status)(uint8_t id);
void (*stop)(uint8_t id);
void (*exit)(uint8_t id);
} CDROM;
int (*audio_callback)(struct cdrom *dev, int16_t *output, int len);
void (*audio_stop)(struct cdrom *dev);
int (*readtoc)(struct cdrom *dev, uint8_t *b, uint8_t starttrack, int msf, int maxlen, int single);
int (*readtoc_session)(struct cdrom *dev, uint8_t *b, int msf, int maxlen);
int (*readtoc_raw)(struct cdrom *dev, uint8_t *b, int maxlen);
uint8_t (*getcurrentsubchannel)(struct cdrom *dev, uint8_t *b, int msf);
int (*readsector_raw)(struct cdrom *dev, uint8_t *buffer, int sector, int ismsf, int cdrom_sector_type, int cdrom_sector_flags, int *len);
uint8_t (*playaudio)(struct cdrom *dev, uint32_t pos, uint32_t len, int ismsf);
void (*pause)(struct cdrom *dev);
void (*resume)(struct cdrom *dev);
uint32_t (*size)(struct cdrom *dev);
int (*status)(struct cdrom *dev);
void (*stop)(struct cdrom *dev);
void (*exit)(struct cdrom *dev);
} cdrom_ops_t;
typedef struct {
CDROM *handler;
int16_t cd_buffer[BUF_SIZE];
uint8_t speed, ide_channel,
pad, bus_mode; /* Bit 0 = PIO suported;
typedef struct cdrom {
uint8_t id,
speed, cur_speed,
ide_channel, scsi_device_id,
bus_type, /* 0 = ATAPI, 1 = SCSI */
bus_mode, /* Bit 0 = PIO suported;
Bit 1 = DMA supportd. */
int host_drive, prev_host_drive,
cd_status, prev_status,
cd_buflen, cd_state,
handler_inited, cur_speed,
id;
sound_on;
unsigned int bus_type, /* 0 = ATAPI, 1 = SCSI */
scsi_device_id, sound_on;
FILE* img_fp;
int img_is_iso,
host_drive, prev_host_drive,
cd_status, prev_status,
cd_buflen, cd_state;
uint32_t seek_pos, seek_diff,
cd_end, cdrom_capacity;
cd_end,
cdrom_capacity;
const cdrom_ops_t *ops;
void *image;
void *p;
void (*insert)(void *p);
void (*close)(void *p);
uint32_t (*get_volume)(void *p, int channel);
uint32_t (*get_channel)(void *p, int channel);
void (*close)(void *p);
} cdrom_drive_t;
typedef struct {
wchar_t image_path[1024],
*prev_image_path;
FILE* image;
int image_is_iso;
} cdrom_image_t;
int16_t cd_buffer[BUF_SIZE];
} cdrom_t;
extern cdrom_drive_t cdrom_drives[CDROM_NUM];
extern cdrom_image_t cdrom_image[CDROM_NUM];
#ifdef __cplusplus
extern "C" {
#endif
extern cdrom_t cdrom[CDROM_NUM];
extern int cdrom_lba_to_msf_accurate(int lba);
extern double cdrom_get_short_seek(cdrom_drive_t *dev);
extern double cdrom_get_long_seek(cdrom_drive_t *dev);
extern double cdrom_seek_time(cdrom_drive_t *dev);
extern void cdrom_seek(cdrom_drive_t *dev, uint32_t pos);
extern int cdrom_playing_completed(cdrom_drive_t *dev);
extern double cdrom_seek_time(cdrom_t *dev);
extern void cdrom_seek(cdrom_t *dev, uint32_t pos);
extern int cdrom_playing_completed(cdrom_t *dev);
extern void cdrom_close_handler(uint8_t id);
extern void cdrom_close(void);
extern void cdrom_update_cdb(uint8_t *cdb, int lba_pos, int number_of_blocks);
extern void cdrom_insert(uint8_t id);
extern void cdrom_eject(uint8_t id);
extern void cdrom_reload(uint8_t id);
extern int cdrom_image_open(cdrom_t *dev, const wchar_t *fn);
extern void cdrom_image_close(cdrom_t *dev);
extern void cdrom_image_reset(cdrom_t *dev);
extern void cdrom_update_cdb(uint8_t *cdb, int lba_pos,
int number_of_blocks);
extern int find_cdrom_for_scsi_id(uint8_t scsi_id);
extern void cdrom_close(void);
extern void cdrom_global_init(void);
extern void cdrom_global_reset(void);
extern void cdrom_hard_reset(void);

File diff suppressed because it is too large Load Diff

View File

@@ -1,161 +0,0 @@
/*
* 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 the CD-ROM null interface for unmounted
* guest CD-ROM drives.
*
* Version: @(#)cdrom_null.c 1.0.9 2018/10/09
*
* Authors: Sarah Walker, <http://pcem-emulator.co.uk/>
* Miran Grca, <mgrca8@gmail.com>
*
* Copyright 2008-2016 Sarah Walker.
* Copyright 2016-2018 Miran Grca.
*/
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <wchar.h>
#include "../86box.h"
#include "../scsi/scsi_device.h"
#include "cdrom.h"
static CDROM null_cdrom;
static int
null_ready(uint8_t id)
{
return(0);
}
/* Always return 0, the contents of a null CD-ROM drive never change. */
static int
null_medium_changed(uint8_t id)
{
return(0);
}
static uint8_t
null_getcurrentsubchannel(uint8_t id, uint8_t *b, int msf)
{
return(0x13);
}
static int
null_readsector_raw(uint8_t id, uint8_t *buffer, int sector, int ismsf, int cdrom_sector_type, int cdrom_sector_flags, int *len)
{
*len = 0;
return(0);
}
static int
null_readtoc(uint8_t id, uint8_t *b, uint8_t starttrack, int msf, int maxlen, int single)
{
return(0);
}
static int
null_readtoc_session(uint8_t id, uint8_t *b, int msf, int maxlen)
{
return(0);
}
static int
null_readtoc_raw(uint8_t id, uint8_t *b, int maxlen)
{
return(0);
}
static uint32_t
null_size(uint8_t id)
{
return(0);
}
static int
null_status(uint8_t id)
{
return(CD_STATUS_EMPTY);
}
void
cdrom_null_reset(uint8_t id)
{
}
void cdrom_set_null_handler(uint8_t id);
int
cdrom_null_open(uint8_t id)
{
cdrom_set_null_handler(id);
return(0);
}
void
null_close(uint8_t id)
{
}
static
void null_exit(uint8_t id)
{
}
static int
null_media_type_id(uint8_t id)
{
return(0x70);
}
void
cdrom_set_null_handler(uint8_t id)
{
cdrom_drives[id].handler = &null_cdrom;
cdrom_drives[id].host_drive = 0;
memset(cdrom_image[id].image_path, 0, sizeof(cdrom_image[id].image_path));
}
static CDROM null_cdrom = {
null_ready,
null_medium_changed,
null_media_type_id,
NULL,
NULL,
null_readtoc,
null_readtoc_session,
null_readtoc_raw,
null_getcurrentsubchannel,
null_readsector_raw,
NULL,
NULL,
NULL,
null_size,
null_status,
NULL,
null_exit
};

View File

@@ -1,28 +0,0 @@
/*
* 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 the CD-ROM null interface for unmounted
* guest CD-ROM drives.
*
* Version: @(#)cdrom_null.h 1.0.4 2018/03/31
*
* Authors: Sarah Walker, <http://pcem-emulator.co.uk/>
* Miran Grca, <mgrca8@gmail.com>
* Copyright 2008-2018 Sarah Walker.
* Copyright 2016-2018 Miran Grca.
*/
#ifndef EMU_CDROM_NULL_H
#define EMU_CDROM_NULL_H
extern int cdrom_null_open(uint8_t id);
extern void cdrom_null_reset(uint8_t id);
extern void null_close(uint8_t id);
#endif /*EMU_CDROM_NULL_H*/

View File

@@ -8,7 +8,7 @@
*
* Configuration file handler.
*
* Version: @(#)config.c 1.0.57 2018/10/07
* Version: @(#)config.c 1.0.58 2018/10/17
*
* Authors: Sarah Walker,
* Miran Grca, <mgrca8@gmail.com>
@@ -112,22 +112,22 @@ static list_t config_head;
#ifdef ENABLE_CONFIG_LOG
int config_do_log = ENABLE_CONFIG_LOG;
#endif
static void
config_log(const char *format, ...)
config_log(const char *fmt, ...)
{
#ifdef ENABLE_CONFIG_LOG
va_list ap;
if (config_do_log) {
va_start(ap, format);
pclog_ex(format, ap);
va_start(ap, fmt);
pclog_ex(fmt, ap);
va_end(ap);
}
#endif
}
#else
#define config_log(fmt, ...)
#endif
static section_t *
@@ -1046,46 +1046,47 @@ load_other_removable_devices(void)
char s[512];
unsigned int board = 0, dev = 0;
wchar_t *wp;
int c;
int c, d = 0;
memset(temp, 0x00, sizeof(temp));
for (c=0; c<CDROM_NUM; c++) {
sprintf(temp, "cdrom_%02i_host_drive", c+1);
cdrom_drives[c].host_drive = config_get_int(cat, temp, 0);
cdrom_drives[c].prev_host_drive = cdrom_drives[c].host_drive;
cdrom[c].host_drive = config_get_int(cat, temp, 0);
cdrom[c].prev_host_drive = cdrom[c].host_drive;
sprintf(temp, "cdrom_%02i_parameters", c+1);
p = config_get_string(cat, temp, NULL);
if (p != NULL)
sscanf(p, "%01u, %s", &cdrom_drives[c].sound_on, s);
sscanf(p, "%01u, %s", &d, s);
else
sscanf("0, none", "%01u, %s", &cdrom_drives[c].sound_on, s);
cdrom_drives[c].bus_type = hdd_string_to_bus(s, 1);
sscanf("0, none", "%01u, %s", &d, s);
cdrom[c].sound_on = d;
cdrom[c].bus_type = hdd_string_to_bus(s, 1);
sprintf(temp, "cdrom_%02i_speed", c+1);
cdrom_drives[c].speed = config_get_int(cat, temp, 8);
cdrom[c].speed = config_get_int(cat, temp, 8);
/* Default values, needed for proper operation of the Settings dialog. */
cdrom_drives[c].ide_channel = cdrom_drives[c].scsi_device_id = c + 2;
cdrom[c].ide_channel = cdrom[c].scsi_device_id = c + 2;
sprintf(temp, "cdrom_%02i_ide_channel", c+1);
if (cdrom_drives[c].bus_type == CDROM_BUS_ATAPI) {
if (cdrom[c].bus_type == CDROM_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;
cdrom_drives[c].ide_channel = (board<<1)+dev;
cdrom[c].ide_channel = (board<<1)+dev;
if (cdrom_drives[c].ide_channel > 7)
cdrom_drives[c].ide_channel = 7;
if (cdrom[c].ide_channel > 7)
cdrom[c].ide_channel = 7;
} else {
sprintf(temp, "cdrom_%02i_scsi_id", c+1);
if (cdrom_drives[c].bus_type == CDROM_BUS_SCSI) {
cdrom_drives[c].scsi_device_id = config_get_int(cat, temp, c+2);
if (cdrom[c].bus_type == CDROM_BUS_SCSI) {
cdrom[c].scsi_device_id = config_get_int(cat, temp, c+2);
if (cdrom_drives[c].scsi_device_id > 15)
cdrom_drives[c].scsi_device_id = 15;
if (cdrom[c].scsi_device_id > 15)
cdrom[c].scsi_device_id = 15;
} else
config_delete_var(cat, temp);
}
@@ -1107,20 +1108,20 @@ load_other_removable_devices(void)
* with the EXE path. Just strip
* that off for now...
*/
wcsncpy(cdrom_image[c].image_path, &wp[wcslen(usr_path)], sizeof_w(cdrom_image[c].image_path));
wcsncpy(cdrom[c].image_path, &wp[wcslen(usr_path)], sizeof_w(cdrom[c].image_path));
} else
#endif
wcsncpy(cdrom_image[c].image_path, wp, sizeof_w(cdrom_image[c].image_path));
wcsncpy(cdrom[c].image_path, wp, sizeof_w(cdrom[c].image_path));
if (cdrom_drives[c].host_drive < 'A')
cdrom_drives[c].host_drive = 0;
if (cdrom[c].host_drive && (cdrom[c].host_drive != 200))
cdrom[c].host_drive = 0;
if ((cdrom_drives[c].host_drive == 0x200) &&
(wcslen(cdrom_image[c].image_path) == 0))
cdrom_drives[c].host_drive = 0;
if ((cdrom[c].host_drive == 0x200) &&
(wcslen(cdrom[c].image_path) == 0))
cdrom[c].host_drive = 0;
/* If the CD-ROM is disabled, delete all its variables. */
if (cdrom_drives[c].bus_type == CDROM_BUS_DISABLED) {
if (cdrom[c].bus_type == CDROM_BUS_DISABLED) {
sprintf(temp, "cdrom_%02i_host_drive", c+1);
config_delete_var(cat, temp);
@@ -1231,8 +1232,7 @@ config_load(void)
config_log("Loading config file '%ls'..\n", cfg_path);
memset(hdd, 0, sizeof(hard_disk_t));
memset(cdrom_drives, 0, sizeof(cdrom_drive_t) * CDROM_NUM);
memset(cdrom_image, 0, sizeof(cdrom_image_t) * CDROM_NUM);
memset(cdrom, 0, sizeof(cdrom_t) * CDROM_NUM);
#ifdef USE_IOCTL
memset(cdrom_ioctl, 0, sizeof(cdrom_ioctl_t) * CDROM_NUM);
#endif
@@ -1813,51 +1813,50 @@ save_other_removable_devices(void)
for (c=0; c<CDROM_NUM; c++) {
sprintf(temp, "cdrom_%02i_host_drive", c+1);
if ((cdrom_drives[c].bus_type == 0) ||
(cdrom_drives[c].host_drive < 'A') || ((cdrom_drives[c].host_drive > 'Z') && (cdrom_drives[c].host_drive != 200))) {
if ((cdrom[c].bus_type == 0) || (cdrom[c].host_drive != 200)) {
config_delete_var(cat, temp);
} else {
config_set_int(cat, temp, cdrom_drives[c].host_drive);
config_set_int(cat, temp, cdrom[c].host_drive);
}
sprintf(temp, "cdrom_%02i_speed", c+1);
if ((cdrom_drives[c].bus_type == 0) || (cdrom_drives[c].speed == 8)) {
if ((cdrom[c].bus_type == 0) || (cdrom[c].speed == 8)) {
config_delete_var(cat, temp);
} else {
config_set_int(cat, temp, cdrom_drives[c].speed);
config_set_int(cat, temp, cdrom[c].speed);
}
sprintf(temp, "cdrom_%02i_parameters", c+1);
if (cdrom_drives[c].bus_type == 0) {
if (cdrom[c].bus_type == 0) {
config_delete_var(cat, temp);
} else {
sprintf(tmp2, "%u, %s", cdrom_drives[c].sound_on,
hdd_bus_to_string(cdrom_drives[c].bus_type, 1));
sprintf(tmp2, "%u, %s", cdrom[c].sound_on,
hdd_bus_to_string(cdrom[c].bus_type, 1));
config_set_string(cat, temp, tmp2);
}
sprintf(temp, "cdrom_%02i_ide_channel", c+1);
if (cdrom_drives[c].bus_type != CDROM_BUS_ATAPI)
if (cdrom[c].bus_type != CDROM_BUS_ATAPI)
config_delete_var(cat, temp);
else {
sprintf(tmp2, "%01u:%01u", cdrom_drives[c].ide_channel>>1,
cdrom_drives[c].ide_channel & 1);
sprintf(tmp2, "%01u:%01u", cdrom[c].ide_channel>>1,
cdrom[c].ide_channel & 1);
config_set_string(cat, temp, tmp2);
}
sprintf(temp, "cdrom_%02i_scsi_id", c + 1);
if (cdrom_drives[c].bus_type != CDROM_BUS_SCSI) {
if (cdrom[c].bus_type != CDROM_BUS_SCSI) {
config_delete_var(cat, temp);
} else {
config_set_int(cat, temp, cdrom_drives[c].scsi_device_id);
config_set_int(cat, temp, cdrom[c].scsi_device_id);
}
sprintf(temp, "cdrom_%02i_image_path", c + 1);
if ((cdrom_drives[c].bus_type == 0) ||
(wcslen(cdrom_image[c].image_path) == 0)) {
if ((cdrom[c].bus_type == 0) ||
(wcslen(cdrom[c].image_path) == 0)) {
config_delete_var(cat, temp);
} else {
config_set_wstring(cat, temp, cdrom_image[c].image_path);
config_set_wstring(cat, temp, cdrom[c].image_path);
}
}

View File

@@ -9,7 +9,7 @@
* Implementation of the IDE emulation for hard disks and ATAPI
* CD-ROM devices.
*
* Version: @(#)hdc_ide.c 1.0.50 2018/10/10
* Version: @(#)hdc_ide.c 1.0.51 2018/10/17
*
* Authors: Sarah Walker, <http://pcem-emulator.co.uk/>
* Miran Grca, <mgrca8@gmail.com>
@@ -140,13 +140,11 @@ static void ide_callback(void *priv);
#ifdef ENABLE_IDE_LOG
int ide_do_log = ENABLE_IDE_LOG;
#endif
static void
ide_log(const char *fmt, ...)
{
#ifdef ENABLE_IDE_LOG
va_list ap;
if (ide_do_log) {
@@ -154,8 +152,10 @@ ide_log(const char *fmt, ...)
pclog_ex(fmt, ap);
va_end(ap);
}
#endif
}
#else
#define ide_log(fmt, ...)
#endif
uint8_t
@@ -2427,8 +2427,8 @@ secondary_ide_check(void)
secondary_zips++;
}
for (i=0; i<CDROM_NUM; i++) {
if ((cdrom_drives[i].ide_channel >= 2) && (cdrom_drives[i].ide_channel <= 3) &&
(cdrom_drives[i].bus_type == CDROM_BUS_ATAPI))
if ((cdrom[i].ide_channel >= 2) && (cdrom[i].ide_channel <= 3) &&
(cdrom[i].bus_type == CDROM_BUS_ATAPI))
secondary_cdroms++;
}
if (!secondary_zips && !secondary_cdroms)

View File

@@ -10,7 +10,7 @@
* word 0 - base address
* word 1 - bits 1-15 = byte count, bit 31 = end of transfer
*
* Version: @(#)intel_piix.c 1.0.18 2018/10/02
* Version: @(#)intel_piix.c 1.0.19 2018/10/17
*
* Authors: Sarah Walker, <http://pcem-emulator.co.uk/>
* Miran Grca, <mgrca8@gmail.com>
@@ -69,22 +69,22 @@ static void piix_bus_master_writel(uint16_t port, uint32_t val, void *priv);
#ifdef ENABLE_PIIX_LOG
int piix_do_log = ENABLE_PIIX_LOG;
#endif
static void
piix_log(const char *format, ...)
piix_log(const char *fmt, ...)
{
#ifdef ENABLE_PIIX_LOG
va_list ap;
if (piix_do_log) {
va_start(ap, format);
pclog_ex(format, ap);
va_start(ap, fmt);
pclog_ex(fmt, ap);
va_end(ap);
}
#endif
}
#else
#define piix_log(fmt, ...)
#endif
static void
@@ -427,7 +427,9 @@ static void
piix_bus_master_write(uint16_t port, uint8_t val, void *priv)
{
piix_busmaster_t *dev = (piix_busmaster_t *) priv;
#ifdef ENABLE_PIIX_LOG
int channel = (port & 8) ? 1 : 0;
#endif
piix_log("PIIX Bus master BYTE write: %04X %02X\n", port, val);
@@ -610,11 +612,15 @@ static int
piix_bus_master_dma_op(int channel, uint8_t *data, int transfer_length, int out, void *priv)
{
piix_busmaster_t *dev = (piix_busmaster_t *) priv;
#ifdef ENABLE_PIIX_LOG
char *sop;
#endif
int force_end = 0, buffer_pos = 0;
#ifdef ENABLE_PIIX_LOG
sop = out ? "Writ" : "Read";
#endif
if (!(dev->status & 1))
return 2; /*DMA disabled*/
@@ -825,7 +831,7 @@ piix_reset(void *p)
int i = 0;
for (i = 0; i < CDROM_NUM; i++) {
if (cdrom_drives[i].bus_type == CDROM_BUS_ATAPI)
if (cdrom[i].bus_type == CDROM_BUS_ATAPI)
scsi_cdrom_reset(scsi_cdrom[i]);
}
for (i = 0; i < ZIP_NUM; i++) {

View File

@@ -8,7 +8,7 @@
*
* Main emulator module where most things are controlled.
*
* Version: @(#)pc.c 1.0.83 2018/10/12
* Version: @(#)pc.c 1.0.84 2018/10/17
*
* Authors: Sarah Walker, <http://pcem-emulator.co.uk/>
* Miran Grca, <mgrca8@gmail.com>
@@ -65,7 +65,6 @@
#include "disk/zip.h"
#include "scsi/scsi_disk.h"
#include "cdrom/cdrom_image.h"
#include "cdrom/cdrom_null.h"
#include "network/network.h"
#include "sound/sound.h"
#include "sound/midi.h"

View File

@@ -8,7 +8,7 @@
*
* Define the various platform support functions.
*
* Version: @(#)plat.h 1.0.26 2018/02/14
* Version: @(#)plat.h 1.0.27 2018/10/17
*
* Authors: Miran Grca, <mgrca8@gmail.com>
* Fred N. van Kempen, <decwiz@yahoo.com>
@@ -104,14 +104,7 @@ extern void do_stop(void);
/* Platform-specific device support. */
extern uint8_t host_cdrom_drive_available[26];
extern uint8_t host_cdrom_drive_available_num;
#ifdef USE_IOCTL
extern void cdrom_init_host_drives(void);
#endif
extern void cdrom_eject(uint8_t id);
extern void cdrom_reload(uint8_t id);
extern void plat_cdrom_ui_update(uint8_t id, uint8_t reload);
extern void zip_eject(uint8_t id);
extern void zip_reload(uint8_t id);
extern int ioctl_open(uint8_t id, char d);

View File

@@ -9,7 +9,7 @@
* Implementation of the CD-ROM drive with SCSI(-like)
* commands, for both ATAPI and SCSI usage.
*
* Version: @(#)scsi_cdrom.c 1.0.52 2018/10/09
* Version: @(#)scsi_cdrom.c 1.0.53 2018/10/17
*
* Author: Miran Grca, <mgrca8@gmail.com>
*
@@ -32,12 +32,10 @@
#include "../nvr.h"
#include "../disk/hdc.h"
#include "../disk/hdc_ide.h"
#include "../plat.h"
#include "../sound/sound.h"
#include "../plat.h"
#include "../ui.h"
#include "../cdrom/cdrom.h"
#include "../cdrom/cdrom_image.h"
#include "../cdrom/cdrom_null.h"
#include "scsi_cdrom.h"
@@ -335,13 +333,11 @@ static void scsi_cdrom_callback(void *p);
#ifdef ENABLE_SCSI_CDROM_LOG
int scsi_cdrom_do_log = ENABLE_SCSI_CDROM_LOG;
#endif
static void
scsi_cdrom_log(const char *format, ...)
{
#ifdef ENABLE_SCSI_CDROM_LOG
va_list ap;
if (scsi_cdrom_do_log) {
@@ -349,8 +345,10 @@ scsi_cdrom_log(const char *format, ...)
pclog_ex(format, ap);
va_end(ap);
}
#endif
}
#else
#define scsi_cdrom_log(format, ...)
#endif
static void
@@ -379,8 +377,8 @@ scsi_cdrom_init(scsi_cdrom_t *dev)
if (!dev)
return;
/* Tell the scsi_cdrom_t struct what cdrom_drives element corresponds to it. */
dev->drv = &(cdrom_drives[dev->id]);
/* Tell the scsi_cdrom_t struct what cdrom element corresponds to it. */
dev->drv = &(cdrom[dev->id]);
/* Do a reset (which will also rezero it). */
scsi_cdrom_reset(dev);
@@ -542,7 +540,8 @@ scsi_cdrom_read_capacity(void *p, uint8_t *cdb, uint8_t *buffer, uint32_t *len)
scsi_cdrom_t *dev = (scsi_cdrom_t *) p;
int size = 0;
size = dev->drv->handler->size(dev->id) - 1; /* IMPORTANT: What's returned is the last LBA block. */
if (dev->drv->ops && dev->drv->ops->size)
size = dev->drv->ops->size(dev->drv) - 1; /* IMPORTANT: What's returned is the last LBA block. */
memset(buffer, 0, 8);
buffer[0] = (size >> 24) & 0xff;
buffer[1] = (size >> 16) & 0xff;
@@ -1084,7 +1083,12 @@ scsi_cdrom_read_data(scsi_cdrom_t *dev, int msf, int type, int flags, int32_t *l
int i = 0;
int temp_len = 0;
cdsize = dev->drv->handler->size(dev->id);
if (dev->drv->ops && dev->drv->ops->size)
cdsize = dev->drv->ops->size(dev->drv);
else {
scsi_cdrom_not_ready(dev);
return 0;
}
if (dev->sector_pos >= cdsize) {
scsi_cdrom_log("CD-ROM %i: Trying to read from beyond the end of disc (%i >= %i)\n", dev->id,
@@ -1104,8 +1108,13 @@ scsi_cdrom_read_data(scsi_cdrom_t *dev, int msf, int type, int flags, int32_t *l
*len = 0;
for (i = 0; i < dev->requested_blocks; i++) {
ret = dev->drv->handler->readsector_raw(dev->id, cdbufferb + dev->data_pos, dev->sector_pos + i,
msf, type, flags, &temp_len);
if (dev->drv->ops && dev->drv->ops->readsector_raw)
ret = dev->drv->ops->readsector_raw(dev->drv, cdbufferb + dev->data_pos,
dev->sector_pos + i, msf, type, flags, &temp_len);
else {
scsi_cdrom_not_ready(dev);
return 0;
}
dev->data_pos += temp_len;
dev->old_len += temp_len;
@@ -1173,11 +1182,16 @@ static int
scsi_cdrom_read_dvd_structure(scsi_cdrom_t *dev, int format, const uint8_t *packet, uint8_t *buf)
{
int layer = packet[6];
uint64_t total_sectors;
uint64_t total_sectors = 0;
switch (format) {
case 0x00: /* Physical format information */
total_sectors = (uint64_t) dev->drv->handler->size(dev->id);
if (dev->drv->ops && dev->drv->ops->size)
total_sectors = (uint64_t) dev->drv->ops->size(dev->drv);
else {
scsi_cdrom_not_ready(dev);
return 0;
}
if (layer != 0) {
scsi_cdrom_invalid_field(dev);
@@ -1325,17 +1339,23 @@ scsi_cdrom_pre_execution_check(scsi_cdrom_t *dev, uint8_t *cdb)
return 0;
}
status = dev->drv->handler->status(dev->id);
if (dev->drv->ops && dev->drv->ops->status)
status = dev->drv->ops->status(dev->drv);
else
status = CD_STATUS_EMPTY;
if ((status == CD_STATUS_PLAYING) || (status == CD_STATUS_PAUSED)) {
ready = 1;
goto skip_ready_check;
}
if (dev->drv->handler->medium_changed(dev->id))
scsi_cdrom_insert((void *) dev);
if (dev->drv->ops && dev->drv->ops->medium_changed) {
if (dev->drv->ops->medium_changed(dev->drv))
scsi_cdrom_insert((void *) dev);
}
ready = dev->drv->handler->ready(dev->id);
if (dev->drv->ops && dev->drv->ops->ready)
ready = dev->drv->ops->ready(dev->drv);
skip_ready_check:
/* If the drive is not ready, there is no reason to keep the
@@ -1461,10 +1481,13 @@ scsi_cdrom_request_sense_for_scsi(void *p, uint8_t *buffer, uint8_t alloc_length
scsi_cdrom_t *dev = (scsi_cdrom_t *) p;
int ready = 0;
if (dev->drv->handler->medium_changed(dev->id))
scsi_cdrom_insert((void *) dev);
if (dev->drv->ops && dev->drv->ops->medium_changed) {
if (dev->drv->ops->medium_changed(dev->drv))
scsi_cdrom_insert((void *) dev);
}
ready = dev->drv->handler->ready(dev->id);
if (dev->drv->ops && dev->drv->ops->ready)
ready = dev->drv->ops->ready(dev->drv);
if (!ready && dev->unit_attention) {
/* If the drive is not ready, there is no reason to keep the
@@ -1551,7 +1574,10 @@ scsi_cdrom_command(void *p, uint8_t *cdb)
memcpy(dev->current_cdb, cdb, 12);
dev->drv->cd_status = dev->drv->handler->status(dev->id);
if (dev->drv->ops && dev->drv->ops->status)
dev->drv->cd_status = dev->drv->ops->status(dev->drv);
else
dev->drv->cd_status = CD_STATUS_EMPTY;
if (cdb[0] != 0) {
scsi_cdrom_log("CD-ROM %i: Command 0x%02X, Sense Key %02X, Asc %02X, Ascq %02X, Unit attention: %i\n",
@@ -1579,8 +1605,8 @@ scsi_cdrom_command(void *p, uint8_t *cdb)
break;
case GPCMD_REZERO_UNIT:
if (dev->drv->handler->stop)
dev->drv->handler->stop(dev->id);
if (dev->drv->ops->stop)
dev->drv->ops->stop(dev->drv);
dev->sector_pos = dev->sector_len = 0;
dev->drv->seek_diff = dev->drv->seek_pos;
cdrom_seek(dev->drv, 0);
@@ -1646,17 +1672,34 @@ scsi_cdrom_command(void *p, uint8_t *cdb)
if (toc_format == 0)
toc_format = (cdb[9] >> 6) & 3;
if (!dev->drv->ops) {
scsi_cdrom_not_ready(dev);
return;
}
switch (toc_format) {
case 0: /*Normal*/
len = dev->drv->handler->readtoc(dev->id, cdbufferb, cdb[6], msf, max_len,
if (!dev->drv->ops->readtoc) {
scsi_cdrom_not_ready(dev);
return;
}
len = dev->drv->ops->readtoc(dev->drv, cdbufferb, cdb[6], msf, max_len,
0);
break;
case 1: /*Multi session*/
len = dev->drv->handler->readtoc_session(dev->id, cdbufferb, msf, max_len);
if (!dev->drv->ops->readtoc_session) {
scsi_cdrom_not_ready(dev);
return;
}
len = dev->drv->ops->readtoc_session(dev->drv, cdbufferb, msf, max_len);
cdbufferb[0] = 0; cdbufferb[1] = 0xA;
break;
case 2: /*Raw*/
len = dev->drv->handler->readtoc_raw(dev->id, cdbufferb, max_len);
if (!dev->drv->ops->readtoc_raw) {
scsi_cdrom_not_ready(dev);
return;
}
len = dev->drv->ops->readtoc_raw(dev->drv, cdbufferb, max_len);
break;
default:
scsi_cdrom_invalid_field(dev);
@@ -1826,7 +1869,10 @@ scsi_cdrom_command(void *p, uint8_t *cdb)
len = scsi_cdrom_mode_sense(dev, cdbufferb, 4, cdb[2], block_desc);
len = MIN(len, alloc_length);
cdbufferb[0] = len - 1;
cdbufferb[1] = dev->drv->handler->media_type_id(dev->id);
if (dev->drv->ops && dev->drv->ops->media_type_id)
cdbufferb[1] = dev->drv->ops->media_type_id(dev->drv);
else
cdbufferb[1] = 0x70;
if (block_desc)
cdbufferb[3] = 8;
} else {
@@ -1834,7 +1880,10 @@ scsi_cdrom_command(void *p, uint8_t *cdb)
len = MIN(len, alloc_length);
cdbufferb[0]=(len - 2) >> 8;
cdbufferb[1]=(len - 2) & 255;
cdbufferb[2] = dev->drv->handler->media_type_id(dev->id);
if (dev->drv->ops && dev->drv->ops->media_type_id)
cdbufferb[2] = dev->drv->ops->media_type_id(dev->drv);
else
cdbufferb[2] = 0x70;
if (block_desc) {
cdbufferb[6] = 0;
cdbufferb[7] = 8;
@@ -1892,8 +1941,9 @@ scsi_cdrom_command(void *p, uint8_t *cdb)
* the number of sectors from the media tells us which profile
* to use as current. 0 means there is no media
*/
if (dev->drv->handler->ready(dev->id)) {
len = dev->drv->handler->size(dev->id);
if (dev->drv->ops && dev->drv->ops->ready &&
dev->drv->ops->ready(dev->drv)) {
len = dev->drv->ops->size(dev->drv);
if (len > CD_MAX_SECTORS) {
b[6] = (MMC_PROFILE_DVD_ROM >> 8) & 0xff;
b[7] = MMC_PROFILE_DVD_ROM & 0xff;
@@ -2079,10 +2129,16 @@ scsi_cdrom_command(void *p, uint8_t *cdb)
cdbufferb[5] = (0 << 5) | (0 << 4) | (4 << 0); /* not damaged, primary copy, data track */
cdbufferb[6] = (0 << 7) | (0 << 6) | (0 << 5) | (0 << 6) | (1 << 0); /* not reserved track, not blank, not packet writing, not fixed packet, data mode 1 */
cdbufferb[7] = (0 << 1) | (0 << 0); /* last recorded address not valid, next recordable address not valid */
cdbufferb[24] = (dev->drv->handler->size(dev->id) >> 24) & 0xff; /* track size */
cdbufferb[25] = (dev->drv->handler->size(dev->id) >> 16) & 0xff; /* track size */
cdbufferb[26] = (dev->drv->handler->size(dev->id) >> 8) & 0xff; /* track size */
cdbufferb[27] = dev->drv->handler->size(dev->id) & 0xff; /* track size */
if (dev->drv->ops && dev->drv->ops->size) {
cdbufferb[24] = (dev->drv->ops->size(dev->drv) >> 24) & 0xff; /* track size */
cdbufferb[25] = (dev->drv->ops->size(dev->drv) >> 16) & 0xff; /* track size */
cdbufferb[26] = (dev->drv->ops->size(dev->drv) >> 8) & 0xff; /* track size */
cdbufferb[27] = dev->drv->ops->size(dev->drv) & 0xff; /* track size */
} else {
scsi_cdrom_not_ready(dev);
scsi_cdrom_buf_free(dev);
return;
}
if (len > max_len) {
len = max_len;
@@ -2131,8 +2187,8 @@ scsi_cdrom_command(void *p, uint8_t *cdb)
break;
}
if (dev->drv->handler->playaudio)
ret = dev->drv->handler->playaudio(dev->id, pos, len, msf);
if (dev->drv->ops && dev->drv->ops->playaudio)
ret = dev->drv->ops->playaudio(dev->drv, pos, len, msf);
else
ret = 0;
@@ -2181,7 +2237,13 @@ scsi_cdrom_command(void *p, uint8_t *cdb)
cdbufferb[pos++] = 0; cdbufferb[pos++] = 0; /*Subchannel length*/
cdbufferb[pos++] = cdb[3] & 3; /*Format code*/
if (cdb[3] == 1) {
cdbufferb[1] = dev->drv->handler->getcurrentsubchannel(dev->id, &cdbufferb[5], msf);
if (dev->drv->ops && dev->drv->ops->getcurrentsubchannel)
cdbufferb[1] = dev->drv->ops->getcurrentsubchannel(dev->drv, &cdbufferb[5], msf);
else {
scsi_cdrom_not_ready(dev);
scsi_cdrom_buf_free(dev);
return;
}
switch(dev->drv->cd_status) {
case CD_STATUS_PLAYING:
cdbufferb[1] = 0x11;
@@ -2216,7 +2278,13 @@ scsi_cdrom_command(void *p, uint8_t *cdb)
scsi_cdrom_buf_alloc(dev, alloc_length);
len = dev->drv->handler->size(dev->id);
if (dev->drv->ops && dev->drv->ops->size)
len = dev->drv->ops->size(dev->drv);
else {
scsi_cdrom_not_ready(dev);
scsi_cdrom_buf_free(dev);
return;
}
if ((cdb[7] < 0xc0) && (len <= CD_MAX_SECTORS)) {
scsi_cdrom_incompatible_format(dev);
@@ -2249,15 +2317,16 @@ scsi_cdrom_command(void *p, uint8_t *cdb)
switch(cdb[4] & 3) {
case 0: /* Stop the disc. */
if (dev->drv->handler->stop)
dev->drv->handler->stop(dev->id);
if (dev->drv->ops && dev->drv->ops->stop)
dev->drv->ops->stop(dev->drv);
break;
case 1: /* Start the disc and read the TOC. */
dev->drv->handler->medium_changed(dev->id); /* This causes a TOC reload. */
if (dev->drv->ops && dev->drv->ops->medium_changed)
dev->drv->ops->medium_changed(dev->drv); /* This causes a TOC reload. */
break;
case 2: /* Eject the disc if possible. */
if (dev->drv->handler->stop)
dev->drv->handler->stop(dev->id);
if (dev->drv->ops && dev->drv->ops->stop)
dev->drv->ops->stop(dev->drv);
cdrom_eject(dev->id);
break;
case 3: /* Load the disc (close tray). */
@@ -2371,15 +2440,15 @@ atapi_out:
scsi_cdrom_set_phase(dev, SCSI_PHASE_STATUS);
if (cdb[8] & 1) {
if (dev->drv->handler->resume)
dev->drv->handler->resume(dev->id);
if (dev->drv->ops && dev->drv->ops->resume)
dev->drv->ops->resume(dev->drv);
else {
scsi_cdrom_illegal_mode(dev);
break;
}
} else {
if (dev->drv->handler->pause)
dev->drv->handler->pause(dev->id);
if (dev->drv->ops && dev->drv->ops->pause)
dev->drv->ops->pause(dev->drv);
else {
scsi_cdrom_illegal_mode(dev);
break;
@@ -2423,8 +2492,8 @@ atapi_out:
case GPCMD_STOP_PLAY_SCAN:
scsi_cdrom_set_phase(dev, SCSI_PHASE_STATUS);
if (dev->drv->handler->stop)
dev->drv->handler->stop(dev->id);
if (dev->drv->ops && dev->drv->ops->stop)
dev->drv->ops->stop(dev->drv);
else {
scsi_cdrom_illegal_mode(dev);
break;
@@ -2630,7 +2699,9 @@ scsi_cdrom_irq_raise(scsi_cdrom_t *dev)
static int
scsi_cdrom_read_from_dma(scsi_cdrom_t *dev)
{
#ifdef ENABLE_SCSI_CDROM_LOG
int32_t *BufLen = &scsi_devices[dev->drv->scsi_device_id].buffer_length;
#endif
int ret = 0;
if (dev->drv->bus_type == CDROM_BUS_SCSI)
@@ -2700,7 +2771,9 @@ scsi_cdrom_write_to_scsi_dma(uint8_t scsi_id)
static int
scsi_cdrom_write_to_dma(scsi_cdrom_t *dev)
{
#ifdef ENABLE_SCSI_CDROM_LOG
int32_t *BufLen = &scsi_devices[dev->drv->scsi_device_id].buffer_length;
#endif
int ret = 0;
if (dev->drv->bus_type == CDROM_BUS_SCSI) {
@@ -2930,8 +3003,8 @@ scsi_cdrom_stop(void *p)
{
scsi_cdrom_t *dev = (scsi_cdrom_t *) p;
if (dev->drv->handler->stop)
dev->drv->handler->stop(dev->id);
if (dev->drv->ops && dev->drv->ops->stop)
dev->drv->ops->stop(dev->drv);
}
@@ -2993,6 +3066,7 @@ static void
scsi_cdrom_identify(void *p, int ide_has_dma)
{
ide_t *ide = (ide_t *) p;
#if 0
scsi_cdrom_t *dev;
char device_identify[9] = { '8', '6', 'B', '_', 'C', 'D', '0', '0', 0 };
@@ -3000,6 +3074,7 @@ scsi_cdrom_identify(void *p, int ide_has_dma)
device_identify[7] = dev->id + 0x30;
scsi_cdrom_log("ATAPI Identify: %s\n", device_identify);
#endif
ide->buffer[0] = 0x8000 | (5<<8) | 0x80 | (2<<5); /* ATAPI device, CD-ROM drive, removable media, accelerated DRQ */
ide_padstr((char *) (ide->buffer + 10), "", 20); /* Serial Number */
@@ -3023,7 +3098,7 @@ scsi_cdrom_identify(void *p, int ide_has_dma)
void
scsi_cdrom_drive_reset(int c)
{
cdrom_drive_t *drv = &cdrom_drives[c];
cdrom_t *drv = &cdrom[c];
scsi_device_t *sd;
ide_t *id;
@@ -3063,7 +3138,7 @@ scsi_cdrom_drive_reset(int c)
sd->read_capacity = scsi_cdrom_read_capacity;
sd->type = SCSI_REMOVABLE_CDROM;
scsi_cdrom_log("SCSI CD-ROM drive %i attached to SCSI ID %i\n", c, cdrom_drives[c].scsi_device_id);
scsi_cdrom_log("SCSI CD-ROM drive %i attached to SCSI ID %i\n", c, cdrom[c].scsi_device_id);
} else if (drv->bus_type == CDROM_BUS_ATAPI) {
/* ATAPI CD-ROM, attach to the IDE bus. */
id = ide_drives[drv->ide_channel];
@@ -3086,6 +3161,6 @@ scsi_cdrom_drive_reset(int c)
ide_atapi_attach(id);
}
scsi_cdrom_log("ATAPI CD-ROM drive %i attached to IDE channel %i\n", c, cdrom_drives[c].ide_channel);
scsi_cdrom_log("ATAPI CD-ROM drive %i attached to IDE channel %i\n", c, cdrom[c].ide_channel);
}
}

View File

@@ -9,7 +9,7 @@
* Implementation of the CD-ROM drive with SCSI(-like)
* commands, for both ATAPI and SCSI usage.
*
* Version: @(#)scsi_cdrom.h 1.0.0 2018/10/09
* Version: @(#)scsi_cdrom.h 1.0.1 2018/10/17
*
* Author: Miran Grca, <mgrca8@gmail.com>
*
@@ -27,7 +27,7 @@ typedef struct {
/* Common block. */
mode_sense_pages_t ms_pages_saved;
cdrom_drive_t *drv;
cdrom_t *drv;
uint8_t *buffer,
atapi_cdb[16],

View File

@@ -8,7 +8,7 @@
*
* Sound emulation core.
*
* Version: @(#)sound.c 1.0.21 2018/10/09
* Version: @(#)sound.c 1.0.22 2018/10/17
*
* Authors: Sarah Walker, <http://pcem-emulator.co.uk/>
* Miran Grca, <mgrca8@gmail.com>
@@ -110,13 +110,11 @@ static const SOUND_CARD sound_cards[] =
#ifdef ENABLE_SOUND_LOG
int sound_do_log = ENABLE_SOUND_LOG;
#endif
static void
sound_log(const char *fmt, ...)
{
#ifdef ENABLE_SOUND_LOG
va_list ap;
if (sound_do_log) {
@@ -124,8 +122,10 @@ sound_log(const char *fmt, ...)
pclog_ex(fmt, ap);
va_end(ap);
}
#endif
}
#else
#define sound_log(fmt, ...)
#endif
int sound_card_available(int card)
@@ -218,27 +218,27 @@ static void sound_cd_thread(void *param)
for (i = 0; i < CDROM_NUM; i++) {
has_audio = 0;
if ((cdrom_drives[i].bus_type == CDROM_BUS_DISABLED) || !cdrom_drives[i].handler)
if ((cdrom[i].bus_type == CDROM_BUS_DISABLED) || !cdrom[i].ops)
continue;
if (cdrom_drives[i].handler->audio_callback)
if (cdrom[i].ops->audio_callback)
{
r = cdrom_drives[i].handler->audio_callback(i, cd_buffer[i], CD_BUFLEN*2);
has_audio = (cdrom_drives[i].bus_type && cdrom_drives[i].sound_on/* && r*/);
r = cdrom[i].ops->audio_callback(&(cdrom[i]), cd_buffer[i], CD_BUFLEN*2);
has_audio = (cdrom[i].bus_type && cdrom[i].sound_on/* && r*/);
} else
continue;
if (soundon && has_audio) {
if (cdrom_drives[i].get_volume) {
audio_vol_l = cdrom_drives[i].get_volume(cdrom_drives[i].p, 0);
audio_vol_r = cdrom_drives[i].get_volume(cdrom_drives[i].p, 1);
if (cdrom[i].get_volume) {
audio_vol_l = cdrom[i].get_volume(cdrom[i].p, 0);
audio_vol_r = cdrom[i].get_volume(cdrom[i].p, 1);
} else {
audio_vol_l = 255;
audio_vol_r = 255;
}
if (cdrom_drives[i].get_channel) {
channel_select[0] = cdrom_drives[i].get_channel(cdrom_drives[i].p, 0);
channel_select[1] = cdrom_drives[i].get_channel(cdrom_drives[i].p, 1);
if (cdrom[i].get_channel) {
channel_select[0] = cdrom[i].get_channel(cdrom[i].p, 0);
channel_select[1] = cdrom[i].get_channel(cdrom[i].p, 1);
} else {
channel_select[0] = 1;
channel_select[1] = 2;
@@ -365,7 +365,7 @@ void sound_init(void)
for (i = 0; i < CDROM_NUM; i++)
{
if (cdrom_drives[i].bus_type != CDROM_BUS_DISABLED)
if (cdrom[i].bus_type != CDROM_BUS_DISABLED)
{
available_cdrom_drives++;
}
@@ -528,10 +528,10 @@ void sound_cd_thread_reset(void)
int available_cdrom_drives = 0;
for (i = 0; i < CDROM_NUM; i++) {
if (cdrom_drives[i].handler && cdrom_drives[i].handler->audio_stop)
cdrom_drives[i].handler->audio_stop(i);
if (cdrom[i].ops && cdrom[i].ops->audio_stop)
cdrom[i].ops->audio_stop(&(cdrom[i]));
if (cdrom_drives[i].bus_type != CDROM_BUS_DISABLED)
if (cdrom[i].bus_type != CDROM_BUS_DISABLED)
available_cdrom_drives++;
}

View File

@@ -333,13 +333,13 @@ DLG_CFG_VIDEO DIALOG DISCARDABLE 97, 0, 267, 45
STYLE DS_CONTROL | WS_CHILD
FONT 9, "Segoe UI"
BEGIN
LTEXT "Video:",IDT_1707,7,8,55,10
COMBOBOX IDC_COMBO_VIDEO,71,7,140,120,CBS_DROPDOWNLIST |
LTEXT "Video:",IDT_1707,7,8,48,10
COMBOBOX IDC_COMBO_VIDEO,64,7,155,120,CBS_DROPDOWNLIST |
WS_VSCROLL | WS_TABSTOP
PUSHBUTTON "Configure",IDC_CONFIGURE_VID,214,7,46,12
PUSHBUTTON "Configure",IDC_CONFIGURE_VID,222,7,38,12
CONTROL "Voodoo Graphics",IDC_CHECK_VOODOO,"Button",
BS_AUTOCHECKBOX | WS_TABSTOP,7,27,199,10
PUSHBUTTON "Configure",IDC_BUTTON_VOODOO,214,26,46,12
PUSHBUTTON "Configure",IDC_BUTTON_VOODOO,222,26,38,12
END
DLG_CFG_INPUT DIALOG DISCARDABLE 97, 0, 267, 65
@@ -438,49 +438,49 @@ DLG_CFG_PERIPHERALS DIALOG DISCARDABLE 97, 0, 267, 200
STYLE DS_CONTROL | WS_CHILD
FONT 9, "Segoe UI"
BEGIN
LTEXT "SCSI Controller:",IDT_1716,7,8,59,10
COMBOBOX IDC_COMBO_SCSI,71,7,140,120,CBS_DROPDOWNLIST |
LTEXT "SCSI Controller:",IDT_1716,7,8,48,10
COMBOBOX IDC_COMBO_SCSI,64,7,155,120,CBS_DROPDOWNLIST |
WS_VSCROLL | WS_TABSTOP
PUSHBUTTON "Configure",IDC_CONFIGURE_SCSI,214,7,46,12
PUSHBUTTON "Configure",IDC_CONFIGURE_SCSI,222,7,38,12
LTEXT "HD Controller:",IDT_1717,7,26,61,10
COMBOBOX IDC_COMBO_HDC,71,25,140,120,CBS_DROPDOWNLIST |
LTEXT "HD Controller:",IDT_1717,7,26,48,10
COMBOBOX IDC_COMBO_HDC,64,25,155,120,CBS_DROPDOWNLIST |
WS_VSCROLL | WS_TABSTOP
PUSHBUTTON "Configure",IDC_CONFIGURE_HDC,214,25,46,12
PUSHBUTTON "Configure",IDC_CONFIGURE_HDC,222,25,38,12
CONTROL "Tertiary IDE Controller",IDC_CHECK_IDE_TER,"Button",
BS_AUTOCHECKBOX | WS_TABSTOP,7,44,199,10
PUSHBUTTON "Configure",IDC_BUTTON_IDE_TER,214,43,46,12
PUSHBUTTON "Configure",IDC_BUTTON_IDE_TER,222,43,38,12
CONTROL "Quaternary IDE Controller",IDC_CHECK_IDE_QUA,"Button",
BS_AUTOCHECKBOX | WS_TABSTOP,7,62,199,10
PUSHBUTTON "Configure",IDC_BUTTON_IDE_QUA,214,61,46,12
PUSHBUTTON "Configure",IDC_BUTTON_IDE_QUA,222,61,38,12
CONTROL "ISABugger device",IDC_CHECK_BUGGER,"Button",
BS_AUTOCHECKBOX | WS_TABSTOP,7,80,94,10
LTEXT "ISA RTC",IDT_1767,7,99,61,10
COMBOBOX IDC_COMBO_ISARTC,71,98,140,120,
LTEXT "ISA RTC",IDT_1767,7,99,48,10
COMBOBOX IDC_COMBO_ISARTC,64,98,155,120,
CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
PUSHBUTTON "Configure",IDC_CONFIGURE_ISARTC,214,98,46,12
PUSHBUTTON "Configure",IDC_CONFIGURE_ISARTC,222,98,38,12
GROUPBOX "ISA Memory Expansion",IDC_GROUP_ISAMEM,7,118,255,70
LTEXT "#1:",IDT_1763,12,130,21,10
COMBOBOX IDC_COMBO_ISAMEM_1,25,129,180,120,
COMBOBOX IDC_COMBO_ISAMEM_1,25,129,190,120,
CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
PUSHBUTTON "Configure",IDC_CONFIGURE_ISAMEM_1,209,129,46,12
PUSHBUTTON "Configure",IDC_CONFIGURE_ISAMEM_1,217,129,38,12
LTEXT "#2:",IDT_1764,12,144,21,10
COMBOBOX IDC_COMBO_ISAMEM_2,25,143,180,120,
COMBOBOX IDC_COMBO_ISAMEM_2,25,143,190,120,
CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
PUSHBUTTON "Configure",IDC_CONFIGURE_ISAMEM_2,209,143,46,12
PUSHBUTTON "Configure",IDC_CONFIGURE_ISAMEM_2,217,143,38,12
LTEXT "#3:",IDT_1765,12,158,21,10
COMBOBOX IDC_COMBO_ISAMEM_3,25,157,180,120,
COMBOBOX IDC_COMBO_ISAMEM_3,25,157,190,120,
CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
PUSHBUTTON "Configure",IDC_CONFIGURE_ISAMEM_3,209,157,46,12
PUSHBUTTON "Configure",IDC_CONFIGURE_ISAMEM_3,217,157,38,12
LTEXT "#4:",IDT_1766,12,172,21,10
COMBOBOX IDC_COMBO_ISAMEM_4,25,171,180,120,
COMBOBOX IDC_COMBO_ISAMEM_4,25,171,190,120,
CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
PUSHBUTTON "Configure",IDC_CONFIGURE_ISAMEM_4,209,171,46,12
PUSHBUTTON "Configure",IDC_CONFIGURE_ISAMEM_4,217,171,38,12
END
DLG_CFG_HARD_DISKS DIALOG DISCARDABLE 97, 0, 267, 154

View File

@@ -8,7 +8,7 @@
#
# Makefile for Win32 (MinGW32) environment.
#
# Version: @(#)Makefile.mingw 1.0.129 2018/10/12
# Version: @(#)Makefile.mingw 1.0.130 2018/10/17
#
# Authors: Miran Grca, <mgrca8@gmail.com>
# Fred N. van Kempen, <decwiz@yahoo.com>
@@ -471,7 +471,7 @@ HDDOBJ := hdd.o \
hdc_xtide.o hdc_ide.o
CDROMOBJ := cdrom.o \
cdrom_dosbox.o cdrom_image.o cdrom_null.o
cdrom_dosbox.o cdrom_image.o
ZIPOBJ := zip.o

View File

@@ -8,7 +8,7 @@
*
* Handle the platform-side of CDROM drives.
*
* Version: @(#)win_cdrom.c 1.0.10 2018/10/09
* Version: @(#)win_cdrom.c 1.0.10 2018/10/17
*
* Authors: Sarah Walker, <http://pcem-emulator.co.uk/>
* Miran Grca, <mgrca8@gmail.com>
@@ -32,8 +32,6 @@
#include "../scsi/scsi_device.h"
#include "../cdrom/cdrom.h"
#include "../disk/zip.h"
#include "../cdrom/cdrom_image.h"
#include "../cdrom/cdrom_null.h"
#include "../scsi/scsi_disk.h"
#include "../plat.h"
#include "../ui.h"
@@ -41,86 +39,24 @@
void
cdrom_eject(uint8_t id)
plat_cdrom_ui_update(uint8_t id, uint8_t reload)
{
cdrom_drive_t *drv = &cdrom_drives[id];
cdrom_image_t *img = &cdrom_image[id];
cdrom_t *drv = &cdrom[id];
if (drv->host_drive == 0) {
/* Switch from empty to empty. Do nothing. */
return;
ui_sb_check_menu_item(SB_CDROM|id, IDM_CDROM_EMPTY | id, MF_CHECKED);
drv->host_drive = 0;
ui_sb_check_menu_item(SB_CDROM|id, IDM_CDROM_IMAGE | id, MF_UNCHECKED);
ui_sb_update_icon_state(SB_CDROM|id, 1);
} else {
ui_sb_check_menu_item(SB_CDROM|id, IDM_CDROM_EMPTY | id, MF_UNCHECKED);
drv->host_drive = 200;
ui_sb_check_menu_item(SB_CDROM|id, IDM_CDROM_IMAGE | id, MF_CHECKED);
ui_sb_update_icon_state(SB_CDROM|id, 0);
}
if (img->prev_image_path) {
free(img->prev_image_path);
img->prev_image_path = NULL;
}
if (drv->host_drive == 200) {
img->prev_image_path = (wchar_t *) malloc(1024);
wcscpy(img->prev_image_path, img->image_path);
}
drv->prev_host_drive = drv->host_drive;
drv->handler->exit(id);
cdrom_close_handler(id);
memset(img->image_path, 0, 2048);
cdrom_null_open(id);
if (drv->insert) {
/* Signal disc change to the emulated machine. */
drv->insert(drv->p);
}
ui_sb_check_menu_item(SB_CDROM|id, IDM_CDROM_IMAGE | id, MF_UNCHECKED);
drv->host_drive=0;
ui_sb_check_menu_item(SB_CDROM|id, IDM_CDROM_EMPTY | id, MF_CHECKED);
ui_sb_update_icon_state(SB_CDROM|id, 1);
ui_sb_enable_menu_item(SB_CDROM|id, IDM_CDROM_RELOAD | id, MF_BYCOMMAND | MF_ENABLED);
ui_sb_enable_menu_item(SB_CDROM|id, IDM_CDROM_RELOAD | id, MF_BYCOMMAND | (reload ? MF_GRAYED : MF_ENABLED));
ui_sb_update_tip(SB_CDROM|id);
config_save();
}
void
cdrom_reload(uint8_t id)
{
cdrom_drive_t *drv = &cdrom_drives[id];
cdrom_image_t *img = &cdrom_image[id];
if ((drv->host_drive == drv->prev_host_drive) || !drv->prev_host_drive || drv->host_drive) {
/* Switch from empty to empty. Do nothing. */
return;
}
cdrom_close_handler(id);
memset(img->image_path, 0, 2048);
if (drv->prev_host_drive == 200) {
wcscpy(img->image_path, img->prev_image_path);
free(img->prev_image_path);
img->prev_image_path = NULL;
image_open(id, img->image_path);
if (drv->insert) {
/* Signal disc change to the emulated machine. */
drv->insert(drv->p);
}
if (wcslen(img->image_path) == 0) {
ui_sb_check_menu_item(SB_CDROM|id, IDM_CDROM_EMPTY | id, MF_CHECKED);
drv->host_drive = 0;
ui_sb_check_menu_item(SB_CDROM|id, IDM_CDROM_IMAGE | id, MF_UNCHECKED);
ui_sb_update_icon_state(SB_CDROM|id, 1);
} else {
ui_sb_check_menu_item(SB_CDROM|id, IDM_CDROM_EMPTY | id, MF_UNCHECKED);
drv->host_drive = 200;
ui_sb_check_menu_item(SB_CDROM|id, IDM_CDROM_IMAGE | id, MF_CHECKED);
ui_sb_update_icon_state(SB_CDROM|id, 0);
}
}
ui_sb_enable_menu_item(SB_CDROM|id, IDM_CDROM_RELOAD | id, MF_BYCOMMAND | MF_GRAYED);
ui_sb_update_tip(SB_CDROM|id);
config_save();
}

View File

@@ -8,7 +8,7 @@
*
* Windows 86Box Settings dialog handler.
*
* Version: @(#)win_settings.c 1.0.64 2018/10/08
* Version: @(#)win_settings.c 1.0.65 2018/10/17
*
* Authors: Miran Grca, <mgrca8@gmail.com>
* David Hrdlička, <hrdlickadavid@outlook.com>
@@ -120,7 +120,7 @@ static int temp_fdd_turbo[FDD_NUM];
static int temp_fdd_check_bpb[FDD_NUM];
/* Other removable devices category */
static cdrom_drive_t temp_cdrom_drives[CDROM_NUM];
static cdrom_t temp_cdrom[CDROM_NUM];
static zip_drive_t temp_zip_drives[ZIP_NUM];
static HWND hwndParentDialog, hwndChildDialog;
@@ -281,12 +281,12 @@ win_settings_init(void)
}
/* Other removable devices category */
memcpy(temp_cdrom_drives, cdrom_drives, CDROM_NUM * sizeof(cdrom_drive_t));
memcpy(temp_cdrom, cdrom, CDROM_NUM * sizeof(cdrom_t));
for (i = 0; i < CDROM_NUM; i++) {
if (cdrom_drives[i].bus_type == CDROM_BUS_ATAPI)
ide_tracking |= (2 << (cdrom_drives[i].ide_channel << 3));
else if (cdrom_drives[i].bus_type == CDROM_BUS_SCSI)
scsi_tracking[cdrom_drives[i].scsi_device_id >> 3] |= (1 << ((cdrom_drives[i].scsi_device_id & 0x07) << 3));
if (cdrom[i].bus_type == CDROM_BUS_ATAPI)
ide_tracking |= (2 << (cdrom[i].ide_channel << 3));
else if (cdrom[i].bus_type == CDROM_BUS_SCSI)
scsi_tracking[cdrom[i].scsi_device_id >> 3] |= (1 << ((cdrom[i].scsi_device_id & 0x07) << 3));
}
memcpy(temp_zip_drives, zip_drives, ZIP_NUM * sizeof(zip_drive_t));
for (i = 0; i < ZIP_NUM; i++) {
@@ -372,7 +372,7 @@ win_settings_changed(void)
}
/* Other removable devices category */
i = i || memcmp(cdrom_drives, temp_cdrom_drives, CDROM_NUM * sizeof(cdrom_drive_t));
i = i || memcmp(cdrom, temp_cdrom, CDROM_NUM * sizeof(cdrom_t));
i = i || memcmp(zip_drives, temp_zip_drives, ZIP_NUM * sizeof(zip_drive_t));
i = i || !!temp_deviceconfig;
@@ -482,7 +482,7 @@ win_settings_save(void)
}
/* Removable devices category */
memcpy(cdrom_drives, temp_cdrom_drives, CDROM_NUM * sizeof(cdrom_drive_t));
memcpy(cdrom, temp_cdrom, CDROM_NUM * sizeof(cdrom_t));
memcpy(zip_drives, temp_zip_drives, ZIP_NUM * sizeof(zip_drive_t));
/* Mark configuration as changed. */
@@ -3435,22 +3435,22 @@ win_settings_cdrom_drives_recalc_list(HWND hwndList)
lvI.stateMask = lvI.iSubItem = lvI.state = 0;
for (i = 0; i < 4; i++) {
fsid = combo_id_to_format_string_id(temp_cdrom_drives[i].bus_type);
fsid = combo_id_to_format_string_id(temp_cdrom[i].bus_type);
lvI.iSubItem = 0;
switch (temp_cdrom_drives[i].bus_type) {
switch (temp_cdrom[i].bus_type) {
case CDROM_BUS_DISABLED:
default:
lvI.pszText = plat_get_string(fsid);
lvI.iImage = 0;
break;
case CDROM_BUS_ATAPI:
wsprintf(szText, plat_get_string(fsid), temp_cdrom_drives[i].ide_channel >> 1, temp_cdrom_drives[i].ide_channel & 1);
wsprintf(szText, plat_get_string(fsid), temp_cdrom[i].ide_channel >> 1, temp_cdrom[i].ide_channel & 1);
lvI.pszText = szText;
lvI.iImage = 1;
break;
case CDROM_BUS_SCSI:
wsprintf(szText, plat_get_string(fsid), temp_cdrom_drives[i].scsi_device_id);
wsprintf(szText, plat_get_string(fsid), temp_cdrom[i].scsi_device_id);
lvI.pszText = szText;
lvI.iImage = 1;
break;
@@ -3462,10 +3462,10 @@ win_settings_cdrom_drives_recalc_list(HWND hwndList)
return FALSE;
lvI.iSubItem = 1;
if (temp_cdrom_drives[i].bus_type == CDROM_BUS_DISABLED)
if (temp_cdrom[i].bus_type == CDROM_BUS_DISABLED)
lvI.pszText = plat_get_string(IDS_2112);
else {
wsprintf(szText, L"%ix", temp_cdrom_drives[i].speed);
wsprintf(szText, L"%ix", temp_cdrom[i].speed);
lvI.pszText = szText;
}
lvI.iItem = i;
@@ -3698,21 +3698,21 @@ win_settings_cdrom_drives_update_item(HWND hwndList, int i)
lvI.iSubItem = 0;
lvI.iItem = i;
fsid = combo_id_to_format_string_id(temp_cdrom_drives[i].bus_type);
fsid = combo_id_to_format_string_id(temp_cdrom[i].bus_type);
switch (temp_cdrom_drives[i].bus_type) {
switch (temp_cdrom[i].bus_type) {
case CDROM_BUS_DISABLED:
default:
lvI.pszText = plat_get_string(fsid);
lvI.iImage = 0;
break;
case CDROM_BUS_ATAPI:
wsprintf(szText, plat_get_string(fsid), temp_cdrom_drives[i].ide_channel >> 1, temp_cdrom_drives[i].ide_channel & 1);
wsprintf(szText, plat_get_string(fsid), temp_cdrom[i].ide_channel >> 1, temp_cdrom[i].ide_channel & 1);
lvI.pszText = szText;
lvI.iImage = 1;
break;
case CDROM_BUS_SCSI:
wsprintf(szText, plat_get_string(fsid), temp_cdrom_drives[i].scsi_device_id);
wsprintf(szText, plat_get_string(fsid), temp_cdrom[i].scsi_device_id);
lvI.pszText = szText;
lvI.iImage = 1;
break;
@@ -3722,10 +3722,10 @@ win_settings_cdrom_drives_update_item(HWND hwndList, int i)
return;
lvI.iSubItem = 1;
if (temp_cdrom_drives[i].bus_type == CDROM_BUS_DISABLED)
if (temp_cdrom[i].bus_type == CDROM_BUS_DISABLED)
lvI.pszText = plat_get_string(IDS_2112);
else {
wsprintf(szText, L"%ix", temp_cdrom_drives[i].speed);
wsprintf(szText, L"%ix", temp_cdrom[i].speed);
lvI.pszText = szText;
}
lvI.iItem = i;
@@ -3824,7 +3824,7 @@ static void cdrom_recalc_location_controls(HWND hdlg, int assign_id)
int i = 0;
HWND h;
int bus = temp_cdrom_drives[lv1_current_sel].bus_type;
int bus = temp_cdrom[lv1_current_sel].bus_type;
for (i = IDT_1741; i < (IDT_1742 + 1); i++) {
h = GetDlgItem(hdlg, i);
@@ -3847,7 +3847,7 @@ static void cdrom_recalc_location_controls(HWND hdlg, int assign_id)
} else {
ShowWindow(h, SW_SHOW);
EnableWindow(h, TRUE);
SendMessage(h, CB_SETCURSEL, temp_cdrom_drives[lv1_current_sel].speed - 1, 0);
SendMessage(h, CB_SETCURSEL, temp_cdrom[lv1_current_sel].speed - 1, 0);
}
h = GetDlgItem(hdlg, IDT_1758);
@@ -3866,12 +3866,12 @@ static void cdrom_recalc_location_controls(HWND hdlg, int assign_id)
EnableWindow(h, TRUE);
if (assign_id)
temp_cdrom_drives[lv1_current_sel].ide_channel = next_free_ide_channel();
temp_cdrom[lv1_current_sel].ide_channel = next_free_ide_channel();
h = GetDlgItem(hdlg, IDC_COMBO_CD_CHANNEL_IDE);
ShowWindow(h, SW_SHOW);
EnableWindow(h, TRUE);
SendMessage(h, CB_SETCURSEL, temp_cdrom_drives[lv1_current_sel].ide_channel, 0);
SendMessage(h, CB_SETCURSEL, temp_cdrom[lv1_current_sel].ide_channel, 0);
break;
case CDROM_BUS_SCSI: /* SCSI */
h = GetDlgItem(hdlg, IDT_1741);
@@ -3879,12 +3879,12 @@ static void cdrom_recalc_location_controls(HWND hdlg, int assign_id)
EnableWindow(h, TRUE);
if (assign_id)
next_free_scsi_id((uint8_t *) &temp_cdrom_drives[lv1_current_sel].scsi_device_id);
next_free_scsi_id((uint8_t *) &temp_cdrom[lv1_current_sel].scsi_device_id);
h = GetDlgItem(hdlg, IDC_COMBO_CD_ID);
ShowWindow(h, SW_SHOW);
EnableWindow(h, TRUE);
SendMessage(h, CB_SETCURSEL, temp_cdrom_drives[lv1_current_sel].scsi_device_id, 0);
SendMessage(h, CB_SETCURSEL, temp_cdrom[lv1_current_sel].scsi_device_id, 0);
break;
}
}
@@ -3987,20 +3987,20 @@ zip_recalc_location_controls(HWND hdlg, int assign_id)
static void
cdrom_track(uint8_t id)
{
if (temp_cdrom_drives[id].bus_type == CDROM_BUS_ATAPI)
ide_tracking |= (2 << (temp_cdrom_drives[id].ide_channel << 3));
else if (temp_cdrom_drives[id].bus_type == CDROM_BUS_SCSI)
scsi_tracking[temp_cdrom_drives[id].scsi_device_id >> 3] |= (1 << (temp_cdrom_drives[id].scsi_device_id & 0x07));
if (temp_cdrom[id].bus_type == CDROM_BUS_ATAPI)
ide_tracking |= (2 << (temp_cdrom[id].ide_channel << 3));
else if (temp_cdrom[id].bus_type == CDROM_BUS_SCSI)
scsi_tracking[temp_cdrom[id].scsi_device_id >> 3] |= (1 << (temp_cdrom[id].scsi_device_id & 0x07));
}
static void
cdrom_untrack(uint8_t id)
{
if (temp_cdrom_drives[id].bus_type == CDROM_BUS_ATAPI)
ide_tracking &= ~(2 << (temp_cdrom_drives[id].ide_channel << 3));
else if (temp_cdrom_drives[id].bus_type == CDROM_BUS_SCSI)
scsi_tracking[temp_cdrom_drives[id].scsi_device_id >> 3] &= ~(1 << (temp_cdrom_drives[id].scsi_device_id & 0x07));
if (temp_cdrom[id].bus_type == CDROM_BUS_ATAPI)
ide_tracking &= ~(2 << (temp_cdrom[id].ide_channel << 3));
else if (temp_cdrom[id].bus_type == CDROM_BUS_SCSI)
scsi_tracking[temp_cdrom[id].scsi_device_id >> 3] &= ~(1 << (temp_cdrom[id].scsi_device_id & 0x07));
}
@@ -4157,7 +4157,7 @@ win_settings_other_removable_devices_proc(HWND hdlg, UINT message, WPARAM wParam
h = GetDlgItem(hdlg, IDC_COMBO_CD_BUS);
switch (temp_cdrom_drives[lv1_current_sel].bus_type) {
switch (temp_cdrom[lv1_current_sel].bus_type) {
case CDROM_BUS_DISABLED:
default:
b = 0;
@@ -4224,7 +4224,7 @@ win_settings_other_removable_devices_proc(HWND hdlg, UINT message, WPARAM wParam
h = GetDlgItem(hdlg, IDC_COMBO_CD_BUS);
switch (temp_cdrom_drives[lv1_current_sel].bus_type) {
switch (temp_cdrom[lv1_current_sel].bus_type) {
case CDROM_BUS_DISABLED:
default:
b = 0;
@@ -4298,13 +4298,13 @@ win_settings_other_removable_devices_proc(HWND hdlg, UINT message, WPARAM wParam
b2 = CDROM_BUS_SCSI;
break;
}
if (b2 == temp_cdrom_drives[lv1_current_sel].bus_type)
if (b2 == temp_cdrom[lv1_current_sel].bus_type)
break;
cdrom_untrack(lv1_current_sel);
assign = (temp_cdrom_drives[lv1_current_sel].bus_type == b2) ? 0 : 1;
if (temp_cdrom_drives[lv1_current_sel].bus_type == CDROM_BUS_DISABLED)
temp_cdrom_drives[lv1_current_sel].speed = 8;
temp_cdrom_drives[lv1_current_sel].bus_type = b2;
assign = (temp_cdrom[lv1_current_sel].bus_type == b2) ? 0 : 1;
if (temp_cdrom[lv1_current_sel].bus_type == CDROM_BUS_DISABLED)
temp_cdrom[lv1_current_sel].speed = 8;
temp_cdrom[lv1_current_sel].bus_type = b2;
cdrom_recalc_location_controls(hdlg, assign);
cdrom_track(lv1_current_sel);
h = GetDlgItem(hdlg, IDC_LIST_CDROM_DRIVES);
@@ -4314,7 +4314,7 @@ win_settings_other_removable_devices_proc(HWND hdlg, UINT message, WPARAM wParam
case IDC_COMBO_CD_ID:
h = GetDlgItem(hdlg, IDC_COMBO_CD_ID);
cdrom_untrack(lv1_current_sel);
temp_cdrom_drives[lv1_current_sel].scsi_device_id = SendMessage(h, CB_GETCURSEL, 0, 0);
temp_cdrom[lv1_current_sel].scsi_device_id = SendMessage(h, CB_GETCURSEL, 0, 0);
cdrom_track(lv1_current_sel);
h = GetDlgItem(hdlg, IDC_LIST_CDROM_DRIVES);
win_settings_cdrom_drives_update_item(h, lv1_current_sel);
@@ -4323,7 +4323,7 @@ win_settings_other_removable_devices_proc(HWND hdlg, UINT message, WPARAM wParam
case IDC_COMBO_CD_CHANNEL_IDE:
h = GetDlgItem(hdlg, IDC_COMBO_CD_CHANNEL_IDE);
cdrom_untrack(lv1_current_sel);
temp_cdrom_drives[lv1_current_sel].ide_channel = SendMessage(h, CB_GETCURSEL, 0, 0);
temp_cdrom[lv1_current_sel].ide_channel = SendMessage(h, CB_GETCURSEL, 0, 0);
cdrom_track(lv1_current_sel);
h = GetDlgItem(hdlg, IDC_LIST_CDROM_DRIVES);
win_settings_cdrom_drives_update_item(h, lv1_current_sel);
@@ -4331,7 +4331,7 @@ win_settings_other_removable_devices_proc(HWND hdlg, UINT message, WPARAM wParam
case IDC_COMBO_CD_SPEED:
h = GetDlgItem(hdlg, IDC_COMBO_CD_SPEED);
temp_cdrom_drives[lv1_current_sel].speed = SendMessage(h, CB_GETCURSEL, 0, 0) + 1;
temp_cdrom[lv1_current_sel].speed = SendMessage(h, CB_GETCURSEL, 0, 0) + 1;
h = GetDlgItem(hdlg, IDC_LIST_CDROM_DRIVES);
win_settings_cdrom_drives_update_item(h, lv1_current_sel);
break;

View File

@@ -8,7 +8,7 @@
*
* Implement the application's Status Bar.
*
* Version: @(#)win_stbar.c 1.0.20 2018/10/09
* Version: @(#)win_stbar.c 1.0.21 2018/10/17
*
* Authors: Miran Grca, <mgrca8@gmail.com>
* Fred N. van Kempen, <decwiz@yahoo.com>
@@ -41,7 +41,6 @@
#include "../cdrom/cdrom.h"
#include "../disk/zip.h"
#include "../cdrom/cdrom_image.h"
#include "../cdrom/cdrom_null.h"
#include "../scsi/scsi_disk.h"
#include "../network/network.h"
#include "../video/video.h"
@@ -153,13 +152,13 @@ StatusBarCreateCdromSubmenu(HMENU m, int id)
AppendMenu(m, MF_STRING, IDM_CDROM_IMAGE | id,
plat_get_string(IDS_2089));
if (! cdrom_drives[id].sound_on)
if (! cdrom[id].sound_on)
CheckMenuItem(m, IDM_CDROM_MUTE | id, MF_CHECKED);
if (cdrom_drives[id].host_drive == 200)
if (cdrom[id].host_drive == 200)
CheckMenuItem(m, IDM_CDROM_IMAGE | id, MF_CHECKED);
else {
cdrom_drives[id].host_drive = 0;
cdrom[id].host_drive = 0;
CheckMenuItem(m, IDM_CDROM_EMPTY | id, MF_CHECKED);
}
}
@@ -269,16 +268,16 @@ StatusBarCreateCdromTip(int part)
WCHAR *szText;
int id;
int drive = sb_part_meanings[part] & 0xf;
int bus = cdrom_drives[drive].bus_type;
int bus = cdrom[drive].bus_type;
id = IDS_5377 + (bus - 1);
szText = plat_get_string(id);
if (cdrom_drives[drive].host_drive == 200) {
if (wcslen(cdrom_image[drive].image_path) == 0)
if (cdrom[drive].host_drive == 200) {
if (wcslen(cdrom[drive].image_path) == 0)
_swprintf(tempTip, plat_get_string(IDS_5120), drive+1, szText, plat_get_string(IDS_2057));
else
_swprintf(tempTip, plat_get_string(IDS_5120), drive+1, szText, cdrom_image[drive].image_path);
_swprintf(tempTip, plat_get_string(IDS_5120), drive+1, szText, cdrom[drive].image_path);
} else
_swprintf(tempTip, plat_get_string(IDS_5120), drive+1, szText, plat_get_string(IDS_2057));
@@ -518,14 +517,14 @@ ui_sb_update_panes(void)
}
for (i=0; i<CDROM_NUM; i++) {
/* Could be Internal or External IDE.. */
if ((cdrom_drives[i].bus_type == CDROM_BUS_ATAPI) &&
if ((cdrom[i].bus_type == CDROM_BUS_ATAPI) &&
!(hdint || !memcmp(hdc_name, "ide", 3)))
continue;
if ((cdrom_drives[i].bus_type == CDROM_BUS_SCSI) &&
if ((cdrom[i].bus_type == CDROM_BUS_SCSI) &&
(scsi_card_current == 0))
continue;
if (cdrom_drives[i].bus_type != 0)
if (cdrom[i].bus_type != 0)
sb_parts++;
}
for (i=0; i<ZIP_NUM; i++) {
@@ -581,13 +580,13 @@ ui_sb_update_panes(void)
}
for (i=0; i<CDROM_NUM; i++) {
/* Could be Internal or External IDE.. */
if ((cdrom_drives[i].bus_type == CDROM_BUS_ATAPI) &&
if ((cdrom[i].bus_type == CDROM_BUS_ATAPI) &&
!(hdint || !memcmp(hdc_name, "ide", 3))) {
continue;
}
if ((cdrom_drives[i].bus_type == CDROM_BUS_SCSI) && (scsi_card_current == 0))
if ((cdrom[i].bus_type == CDROM_BUS_SCSI) && (scsi_card_current == 0))
continue;
if (cdrom_drives[i].bus_type != 0) {
if (cdrom[i].bus_type != 0) {
edge += SB_ICON_WIDTH;
iStatusWidths[sb_parts] = edge;
sb_part_meanings[sb_parts] = SB_CDROM | i;
@@ -681,8 +680,8 @@ ui_sb_update_panes(void)
case SB_CDROM: /* CD-ROM */
id = sb_part_meanings[i] & 0xf;
if (cdrom_drives[id].host_drive == 200)
sb_part_icons[i] = (wcslen(cdrom_image[id].image_path) == 0) ? 128 : 0;
if (cdrom[id].host_drive == 200)
sb_part_icons[i] = (wcslen(cdrom[id].image_path) == 0) ? 128 : 0;
else
sb_part_icons[i] = 128;
sb_part_icons[i] |= 32;
@@ -854,8 +853,8 @@ StatusBarProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
if ((part == 0xff) || (sb_menu_handles == NULL))
break;
cdrom_drives[id].sound_on ^= 1;
CheckMenuItem(sb_menu_handles[part], IDM_CDROM_MUTE | id, cdrom_drives[id].sound_on ? MF_UNCHECKED : MF_CHECKED);
cdrom[id].sound_on ^= 1;
CheckMenuItem(sb_menu_handles[part], IDM_CDROM_MUTE | id, cdrom[id].sound_on ? MF_UNCHECKED : MF_CHECKED);
config_save();
sound_cd_thread_reset();
break;
@@ -876,22 +875,23 @@ StatusBarProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
if ((part == 0xff) || (sb_menu_handles == NULL))
break;
if (!file_dlg_w_st(hwnd, IDS_2075, cdrom_image[id].image_path, 0)) {
cdrom_drives[id].prev_host_drive = cdrom_drives[id].host_drive;
if (!file_dlg_w_st(hwnd, IDS_2075, cdrom[id].image_path, 0)) {
cdrom[id].prev_host_drive = cdrom[id].host_drive;
wcscpy(temp_path, wopenfilestring);
if (!cdrom_image[id].prev_image_path)
cdrom_image[id].prev_image_path = (wchar_t *) malloc(1024);
wcscpy(cdrom_image[id].prev_image_path, cdrom_image[id].image_path);
cdrom_drives[id].handler->exit(id);
cdrom_close_handler(id);
memset(cdrom_image[id].image_path, 0, 2048);
image_open(id, temp_path);
if (!cdrom[id].prev_image_path)
cdrom[id].prev_image_path = (wchar_t *) malloc(1024);
wcscpy(cdrom[id].prev_image_path, cdrom[id].image_path);
if (cdrom[id].ops && cdrom[id].ops->exit)
cdrom[id].ops->exit(&(cdrom[id]));
cdrom[id].ops = NULL;
memset(cdrom[id].image_path, 0, 2048);
cdrom_image_open(&(cdrom[id]), temp_path);
/* Signal media change to the emulated machine. */
if (cdrom_drives[id].insert)
cdrom_drives[id].insert(cdrom_drives[id].p);
if (cdrom[id].insert)
cdrom[id].insert(cdrom[id].p);
CheckMenuItem(sb_menu_handles[part], IDM_CDROM_EMPTY | id, MF_UNCHECKED);
cdrom_drives[id].host_drive = (wcslen(cdrom_image[id].image_path) == 0) ? 0 : 200;
if (cdrom_drives[id].host_drive == 200) {
cdrom[id].host_drive = (wcslen(cdrom[id].image_path) == 0) ? 0 : 200;
if (cdrom[id].host_drive == 200) {
CheckMenuItem(sb_menu_handles[part], IDM_CDROM_IMAGE | id, MF_CHECKED);
ui_sb_update_icon_state(SB_CDROM | id, 0);
} else {