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:
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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
@@ -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
|
||||
};
|
||||
@@ -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*/
|
||||
Reference in New Issue
Block a user