Run clang-formats for merge

This commit is contained in:
RichardG867
2022-10-15 13:38:10 -03:00
parent ac68e1f562
commit e706fffb34
34 changed files with 10714 additions and 11082 deletions

View File

@@ -28,76 +28,71 @@
#include <86box/scsi_device.h>
#include <86box/sound.h>
/* The addresses sent from the guest are absolute, ie. a LBA of 0 corresponds to a MSF of 00:00:00. Otherwise, the counter displayed by the guest is wrong:
there is a seeming 2 seconds in which audio plays but counter does not move, while a data track before audio jumps to 2 seconds before the actual start
of the audio while audio still plays. With an absolute conversion, the counter is fine. */
#undef MSFtoLBA
#define MSFtoLBA(m,s,f) ((((m*60)+s)*75)+f)
#define MSFtoLBA(m, s, f) ((((m * 60) + s) * 75) + f)
#define RAW_SECTOR_SIZE 2352
#define COOKED_SECTOR_SIZE 2048
#define RAW_SECTOR_SIZE 2352
#define COOKED_SECTOR_SIZE 2048
#define MIN_SEEK 2000
#define MAX_SEEK 333333
#define MIN_SEEK 2000
#define MAX_SEEK 333333
#define CD_BCD(x) (((x) % 10) | (((x) / 10) << 4))
#define CD_DCB(x) ((((x) & 0xf0) >> 4) * 10 + ((x) & 0x0f))
#define CD_BCD(x) (((x) % 10) | (((x) / 10) << 4))
#define CD_DCB(x) ((((x) &0xf0) >> 4) * 10 + ((x) &0x0f))
#pragma pack(push,1)
#pragma pack(push, 1)
typedef struct {
uint8_t user_data[2048],
ecc[288];
ecc[288];
} m1_data_t;
typedef struct {
uint8_t sub_header[8],
user_data[2328];
user_data[2328];
} m2_data_t;
typedef union {
m1_data_t m1_data;
m2_data_t m2_data;
uint8_t raw_data[2336];
uint8_t raw_data[2336];
} sector_data_t;
typedef struct {
uint8_t sync[12];
uint8_t header[4];
uint8_t sync[12];
uint8_t header[4];
sector_data_t data;
} sector_raw_data_t;
typedef union {
sector_raw_data_t sector_data;
uint8_t raw_data[2352];
uint8_t raw_data[2352];
} sector_t;
typedef struct {
sector_t sector;
uint8_t c2[296];
uint8_t subchannel_raw[96];
uint8_t subchannel_q[16];
uint8_t subchannel_rw[96];
uint8_t c2[296];
uint8_t subchannel_raw[96];
uint8_t subchannel_q[16];
uint8_t subchannel_rw[96];
} cdrom_sector_t;
typedef union {
cdrom_sector_t cdrom_sector;
uint8_t buffer[2856];
uint8_t buffer[2856];
} sector_buffer_t;
#pragma pack(pop)
static int cdrom_sector_size;
static uint8_t raw_buffer[2856]; /* Needs to be the same size as sector_buffer_t in the structs. */
static uint8_t extra_buffer[296];
static int cdrom_sector_size;
static uint8_t raw_buffer[2856]; /* Needs to be the same size as sector_buffer_t in the structs. */
static uint8_t extra_buffer[296];
cdrom_t cdrom[CDROM_NUM];
cdrom_t cdrom[CDROM_NUM];
#ifdef ENABLE_CDROM_LOG
int cdrom_do_log = ENABLE_CDROM_LOG;
int cdrom_do_log = ENABLE_CDROM_LOG;
void
cdrom_log(const char *fmt, ...)
@@ -111,10 +106,9 @@ cdrom_log(const char *fmt, ...)
}
}
#else
#define cdrom_log(fmt, ...)
# define cdrom_log(fmt, ...)
#endif
int
cdrom_lba_to_msf_accurate(int lba)
{
@@ -122,7 +116,7 @@ cdrom_lba_to_msf_accurate(int lba)
int m, s, f;
pos = lba + 150;
f = pos % 75;
f = pos % 75;
pos -= f;
pos /= 75;
s = pos % 60;
@@ -133,11 +127,10 @@ cdrom_lba_to_msf_accurate(int lba)
return ((m << 16) | (s << 8) | f);
}
static double
cdrom_get_short_seek(cdrom_t *dev)
{
switch(dev->cur_speed) {
switch (dev->cur_speed) {
case 0:
fatal("CD-ROM %i: 0x speed\n", dev->id);
return 0.0;
@@ -147,16 +140,37 @@ cdrom_get_short_seek(cdrom_t *dev)
return 160.0;
case 3:
return 150.0;
case 4: case 5: case 6: case 7: case 8:
case 9: case 10: case 11:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
case 10:
case 11:
return 112.0;
case 12: case 13: case 14: case 15:
case 12:
case 13:
case 14:
case 15:
return 75.0;
case 16: case 17: case 18: case 19:
case 16:
case 17:
case 18:
case 19:
return 58.0;
case 20: case 21: case 22: case 23:
case 40: case 41: case 42: case 43:
case 44: case 45: case 46: case 47:
case 20:
case 21:
case 22:
case 23:
case 40:
case 41:
case 42:
case 43:
case 44:
case 45:
case 46:
case 47:
case 48:
return 50.0;
default:
@@ -165,11 +179,10 @@ cdrom_get_short_seek(cdrom_t *dev)
}
}
static double
cdrom_get_long_seek(cdrom_t *dev)
{
switch(dev->cur_speed) {
switch (dev->cur_speed) {
case 0:
fatal("CD-ROM %i: 0x speed\n", dev->id);
return 0.0;
@@ -179,16 +192,37 @@ cdrom_get_long_seek(cdrom_t *dev)
return 1000.0;
case 3:
return 900.0;
case 4: case 5: case 6: case 7: case 8:
case 9: case 10: case 11:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
case 10:
case 11:
return 675.0;
case 12: case 13: case 14: case 15:
case 12:
case 13:
case 14:
case 15:
return 400.0;
case 16: case 17: case 18: case 19:
case 16:
case 17:
case 18:
case 19:
return 350.0;
case 20: case 21: case 22: case 23:
case 40: case 41: case 42: case 43:
case 44: case 45: case 46: case 47:
case 20:
case 21:
case 22:
case 23:
case 40:
case 41:
case 42:
case 43:
case 44:
case 45:
case 46:
case 47:
case 48:
return 300.0;
default:
@@ -197,12 +231,11 @@ cdrom_get_long_seek(cdrom_t *dev)
}
}
double
cdrom_seek_time(cdrom_t *dev)
{
uint32_t diff = dev->seek_diff;
double sd = (double) (MAX_SEEK - MIN_SEEK);
double sd = (double) (MAX_SEEK - MIN_SEEK);
if (diff < MIN_SEEK)
return 0.0;
@@ -214,7 +247,6 @@ cdrom_seek_time(cdrom_t *dev)
return cdrom_get_short_seek(dev) + ((cdrom_get_long_seek(dev) * ((double) diff)) / sd);
}
void
cdrom_stop(cdrom_t *dev)
{
@@ -222,7 +254,6 @@ cdrom_stop(cdrom_t *dev)
dev->cd_status = CD_STATUS_STOPPED;
}
void
cdrom_seek(cdrom_t *dev, uint32_t pos)
{
@@ -231,11 +262,10 @@ cdrom_seek(cdrom_t *dev, uint32_t pos)
cdrom_log("CD-ROM %i: Seek to LBA %08X\n", dev->id, pos);
dev->seek_pos = pos;
dev->seek_pos = pos;
cdrom_stop(dev);
}
int
cdrom_is_pre(cdrom_t *dev, uint32_t lba)
{
@@ -245,7 +275,6 @@ cdrom_is_pre(cdrom_t *dev, uint32_t lba)
return 0;
}
int
cdrom_audio_callback(cdrom_t *dev, int16_t *output, int len)
{
@@ -272,14 +301,14 @@ cdrom_audio_callback(cdrom_t *dev, int16_t *output, int len)
memset(&(dev->cd_buffer[dev->cd_buflen]), 0x00, (BUF_SIZE - dev->cd_buflen) * 2);
dev->cd_status = CD_STATUS_STOPPED;
dev->cd_buflen = len;
ret = 0;
ret = 0;
}
} else {
cdrom_log("CD-ROM %i: Playing completed\n", dev->id);
memset(&dev->cd_buffer[dev->cd_buflen], 0x00, (BUF_SIZE - dev->cd_buflen) * 2);
dev->cd_status = CD_STATUS_PLAYING_COMPLETED;
dev->cd_buflen = len;
ret = 0;
ret = 0;
}
}
@@ -291,12 +320,11 @@ cdrom_audio_callback(cdrom_t *dev, int16_t *output, int len)
return ret;
}
uint8_t
cdrom_audio_play(cdrom_t *dev, uint32_t pos, uint32_t len, int ismsf)
{
track_info_t ti;
int m = 0, s = 0, f = 0;
int m = 0, s = 0, f = 0;
if (dev->cd_status == CD_STATUS_DATA_ONLY)
return 0;
@@ -324,9 +352,9 @@ cdrom_audio_play(cdrom_t *dev, uint32_t pos, uint32_t len, int ismsf)
} else
pos = MSFtoLBA(m, s, f) - 150;
m = (len >> 16) & 0xff;
s = (len >> 8) & 0xff;
f = len & 0xff;
m = (len >> 16) & 0xff;
s = (len >> 8) & 0xff;
f = len & 0xff;
len = MSFtoLBA(m, s, f) - 150;
cdrom_log("CD-ROM %i: MSF - pos = %08X len = %08X\n", dev->id, pos, len);
@@ -346,15 +374,14 @@ cdrom_audio_play(cdrom_t *dev, uint32_t pos, uint32_t len, int ismsf)
return 0;
}
dev->seek_pos = pos;
dev->cd_end = len;
dev->seek_pos = pos;
dev->cd_end = len;
dev->cd_status = CD_STATUS_PLAYING;
dev->cd_buflen = 0;
return 1;
}
uint8_t
cdrom_audio_track_search(cdrom_t *dev, uint32_t pos, int type, uint8_t playbit)
{
@@ -366,9 +393,9 @@ cdrom_audio_track_search(cdrom_t *dev, uint32_t pos, int type, uint8_t playbit)
switch (type) {
case 0x40:
cdrom_log("Audio Track Search: MSF = %06x, type = %02x\n", pos, type);
m = CD_DCB((pos >> 24) & 0xff);
s = CD_DCB((pos >> 16) & 0xff);
f = CD_DCB((pos >> 8) & 0xff);
m = CD_DCB((pos >> 24) & 0xff);
s = CD_DCB((pos >> 16) & 0xff);
f = CD_DCB((pos >> 8) & 0xff);
pos = MSFtoLBA(m, s, f) - 150;
break;
}
@@ -381,13 +408,12 @@ cdrom_audio_track_search(cdrom_t *dev, uint32_t pos, int type, uint8_t playbit)
return 0;
}
dev->seek_pos = pos;
dev->noplay = !playbit;
dev->seek_pos = pos;
dev->noplay = !playbit;
dev->cd_status = playbit ? CD_STATUS_PLAYING : CD_STATUS_PAUSED;
return 1;
}
uint8_t
cdrom_toshiba_audio_play(cdrom_t *dev, uint32_t pos, int type)
{
@@ -403,9 +429,9 @@ cdrom_toshiba_audio_play(cdrom_t *dev, uint32_t pos, int type)
switch (type) {
case 0x40:
cdrom_log("Toshiba Play Audio: MSF = %06x, type = %02x\n", pos, type);
m = CD_DCB((pos >> 24) & 0xff);
s = CD_DCB((pos >> 16) & 0xff);
f = CD_DCB((pos >> 8) & 0xff);
m = CD_DCB((pos >> 24) & 0xff);
s = CD_DCB((pos >> 16) & 0xff);
f = CD_DCB((pos >> 8) & 0xff);
pos = MSFtoLBA(m, s, f) - 150;
break;
}
@@ -418,12 +444,11 @@ cdrom_toshiba_audio_play(cdrom_t *dev, uint32_t pos, int type)
return 0;
}
dev->cd_end = pos;
dev->cd_end = pos;
dev->cd_buflen = 0;
return 1;
}
void
cdrom_audio_pause_resume(cdrom_t *dev, uint8_t resume)
{
@@ -431,14 +456,13 @@ cdrom_audio_pause_resume(cdrom_t *dev, uint8_t resume)
dev->cd_status = (dev->cd_status & 0xfe) | (resume & 0x01);
}
uint8_t
cdrom_get_current_subchannel(cdrom_t *dev, uint8_t *b, int msf)
{
uint8_t ret;
uint8_t ret;
subchannel_t subc;
int pos = 1;
uint32_t dat;
int pos = 1;
uint32_t dat;
dev->ops->get_subchannel(dev, dev->seek_pos, &subc);
cdrom_log("CD-ROM %i: Returned subchannel at %02i:%02i.%02i\n", subc.abs_m, subc.abs_s, subc.abs_f);
@@ -473,12 +497,12 @@ cdrom_get_current_subchannel(cdrom_t *dev, uint8_t *b, int msf)
b[pos + 3] = subc.rel_f;
pos += 4;
} else {
dat = MSFtoLBA(subc.abs_m, subc.abs_s, subc.abs_f) - 150;
dat = MSFtoLBA(subc.abs_m, subc.abs_s, subc.abs_f) - 150;
b[pos++] = (dat >> 24) & 0xff;
b[pos++] = (dat >> 16) & 0xff;
b[pos++] = (dat >> 8) & 0xff;
b[pos++] = dat & 0xff;
dat = MSFtoLBA(subc.rel_m, subc.rel_s, subc.rel_f);
dat = MSFtoLBA(subc.rel_m, subc.rel_s, subc.rel_f);
b[pos++] = (dat >> 24) & 0xff;
b[pos++] = (dat >> 16) & 0xff;
b[pos++] = (dat >> 8) & 0xff;
@@ -488,11 +512,10 @@ cdrom_get_current_subchannel(cdrom_t *dev, uint8_t *b, int msf)
return ret;
}
uint8_t
cdrom_get_current_subcodeq_playstatus(cdrom_t *dev, uint8_t *b)
{
uint8_t ret;
uint8_t ret;
subchannel_t subc;
dev->ops->get_subchannel(dev, dev->seek_pos, &subc);
@@ -521,14 +544,13 @@ cdrom_get_current_subcodeq_playstatus(cdrom_t *dev, uint8_t *b)
return ret;
}
static int
read_toc_normal(cdrom_t *dev, unsigned char *b, unsigned char start_track, int msf)
{
track_info_t ti;
int i, len = 4;
int first_track, last_track;
uint32_t temp;
int i, len = 4;
int first_track, last_track;
uint32_t temp;
cdrom_log("read_toc_normal(%08X, %08X, %02X, %i)\n", dev, b, start_track, msf);
@@ -570,18 +592,18 @@ read_toc_normal(cdrom_t *dev, unsigned char *b, unsigned char start_track, int m
cdrom_log(" tracks(%i) = %02X, %02X, %i:%02i.%02i\n", i, ti.attr, ti.number, ti.m, ti.s, ti.f);
dev->ops->get_track_info(dev, i + 1, 0, &ti);
b[len++] = 0; /* reserved */
b[len++] = ti.attr;
b[len++] = ti.number; /* track number */
b[len++] = 0; /* reserved */
b[len++] = 0; /* reserved */
b[len++] = ti.attr;
b[len++] = ti.number; /* track number */
b[len++] = 0; /* reserved */
if (msf) {
if (msf) {
b[len++] = 0;
b[len++] = ti.m;
b[len++] = ti.s;
b[len++] = ti.f;
} else {
temp = MSFtoLBA(ti.m, ti.s, ti.f) - 150;
} else {
temp = MSFtoLBA(ti.m, ti.s, ti.f) - 150;
b[len++] = temp >> 24;
b[len++] = temp >> 16;
b[len++] = temp >> 8;
@@ -592,13 +614,12 @@ read_toc_normal(cdrom_t *dev, unsigned char *b, unsigned char start_track, int m
return len;
}
static int
read_toc_session(cdrom_t *dev, unsigned char *b, int msf)
{
track_info_t ti;
int len = 4;
uint32_t temp;
int len = 4;
uint32_t temp;
cdrom_log("read_toc_session(%08X, %08X, %i)\n", dev, b, msf);
@@ -612,7 +633,7 @@ read_toc_session(cdrom_t *dev, unsigned char *b, int msf)
b[len++] = 0; /* reserved */
b[len++] = ti.attr;
b[len++] = ti.number; /* track number */
b[len++] = 0; /* reserved */
b[len++] = 0; /* reserved */
if (msf) {
b[len++] = 0;
@@ -620,7 +641,7 @@ read_toc_session(cdrom_t *dev, unsigned char *b, int msf)
b[len++] = ti.s;
b[len++] = ti.f;
} else {
temp = MSFtoLBA(ti.m, ti.s, ti.f) - 150;
temp = MSFtoLBA(ti.m, ti.s, ti.f) - 150;
b[len++] = temp >> 24;
b[len++] = temp >> 16;
b[len++] = temp >> 8;
@@ -630,13 +651,12 @@ read_toc_session(cdrom_t *dev, unsigned char *b, int msf)
return len;
}
static int
read_toc_raw(cdrom_t *dev, unsigned char *b)
{
track_info_t ti;
int i, len = 4;
int first_track, last_track;
int i, len = 4;
int first_track, last_track;
cdrom_log("read_toc_raw(%08X, %08X)\n", dev, b);
@@ -650,13 +670,13 @@ read_toc_raw(cdrom_t *dev, unsigned char *b)
cdrom_log(" tracks(%i) = %02X, %02X, %i:%02i.%02i\n", i, ti.attr, ti.number, ti.m, ti.s, ti.f);
b[len++] = 1; /* Session number */
b[len++] = ti.attr; /* Track ADR and Control */
b[len++] = 0; /* TNO (always 0) */
b[len++] = ti.number; /* Point (for track points - track number) */
b[len++] = ti.m; /* M */
b[len++] = ti.s; /* S */
b[len++] = ti.f; /* F */
b[len++] = 1; /* Session number */
b[len++] = ti.attr; /* Track ADR and Control */
b[len++] = 0; /* TNO (always 0) */
b[len++] = ti.number; /* Point (for track points - track number) */
b[len++] = ti.m; /* M */
b[len++] = ti.s; /* S */
b[len++] = ti.f; /* F */
b[len++] = 0;
b[len++] = 0;
b[len++] = 0;
@@ -665,13 +685,12 @@ read_toc_raw(cdrom_t *dev, unsigned char *b)
return len;
}
int
cdrom_read_toc(cdrom_t *dev, unsigned char *b, int type, unsigned char start_track, int msf, int max_len)
{
int len;
switch(type) {
switch (type) {
case CD_TOC_NORMAL:
len = read_toc_normal(dev, b, start_track, msf);
break;
@@ -694,13 +713,12 @@ cdrom_read_toc(cdrom_t *dev, unsigned char *b, int type, unsigned char start_tra
return len;
}
/* A new API call for Mitsumi CD-ROM. */
void
cdrom_get_track_buffer(cdrom_t *dev, uint8_t *buf)
{
track_info_t ti;
int first_track, last_track;
int first_track, last_track;
if (dev != NULL) {
dev->ops->get_tracks(dev, &first_track, &last_track);
@@ -719,12 +737,11 @@ cdrom_get_track_buffer(cdrom_t *dev, uint8_t *buf)
memset(buf, 0x00, 9);
}
void
cdrom_read_disc_info_toc(cdrom_t *dev, unsigned char *b, unsigned char track, int type)
{
track_info_t ti;
int first_track, last_track;
int first_track, last_track;
dev->ops->get_tracks(dev, &first_track, &last_track);
@@ -759,11 +776,10 @@ cdrom_read_disc_info_toc(cdrom_t *dev, unsigned char *b, unsigned char track, in
}
}
static int
track_type_is_valid(uint8_t id, int type, int flags, int audio, int mode2)
{
if (!(flags & 0x70) && (flags & 0xf8)) { /* 0x08/0x80/0x88 are illegal modes */
if (!(flags & 0x70) && (flags & 0xf8)) { /* 0x08/0x80/0x88 are illegal modes */
cdrom_log("CD-ROM %i: [Any Mode] 0x08/0x80/0x88 are illegal modes\n", id);
return 0;
}
@@ -779,22 +795,22 @@ track_type_is_valid(uint8_t id, int type, int flags, int audio, int mode2)
return 0;
}
if ((flags & 0x18) == 0x08) { /* EDC/ECC without user data is an illegal mode */
if ((flags & 0x18) == 0x08) { /* EDC/ECC without user data is an illegal mode */
cdrom_log("CD-ROM %i: [Any Data Mode] EDC/ECC without user data is an illegal mode\n", id);
return 0;
}
if (((flags & 0xf0) == 0x90) || ((flags & 0xf0) == 0xc0)) { /* 0x90/0x98/0xC0/0xC8 are illegal modes */
if (((flags & 0xf0) == 0x90) || ((flags & 0xf0) == 0xc0)) { /* 0x90/0x98/0xC0/0xC8 are illegal modes */
cdrom_log("CD-ROM %i: [Any Data Mode] 0x90/0x98/0xC0/0xC8 are illegal modes\n", id);
return 0;
}
if (((type > 3) && (type != 8)) || (mode2 && (mode2 & 0x03))) {
if ((flags & 0xf0) == 0x30) { /* 0x30/0x38 are illegal modes */
if ((flags & 0xf0) == 0x30) { /* 0x30/0x38 are illegal modes */
cdrom_log("CD-ROM %i: [Any XA Mode 2] 0x30/0x38 are illegal modes\n", id);
return 0;
}
if (((flags & 0xf0) == 0xb0) || ((flags & 0xf0) == 0xd0)) { /* 0xBx and 0xDx are illegal modes */
if (((flags & 0xf0) == 0xb0) || ((flags & 0xf0) == 0xd0)) { /* 0xBx and 0xDx are illegal modes */
cdrom_log("CD-ROM %i: [Any XA Mode 2] 0xBx and 0xDx are illegal modes\n", id);
return 0;
}
@@ -804,7 +820,6 @@ track_type_is_valid(uint8_t id, int type, int flags, int audio, int mode2)
return 1;
}
static void
read_sector_to_buffer(cdrom_t *dev, uint8_t *rbuf, uint32_t msf, uint32_t lba, int mode2, int len)
{
@@ -832,7 +847,6 @@ read_sector_to_buffer(cdrom_t *dev, uint8_t *rbuf, uint32_t msf, uint32_t lba, i
memset(bb, 0, 288);
}
static void
read_audio(cdrom_t *dev, uint32_t lba, uint8_t *b)
{
@@ -843,7 +857,6 @@ read_audio(cdrom_t *dev, uint32_t lba, uint8_t *b)
cdrom_sector_size = 2352;
}
static void
read_mode1(cdrom_t *dev, int cdrom_sector_flags, uint32_t lba, uint32_t msf, int mode2, uint8_t *b)
{
@@ -898,7 +911,6 @@ read_mode1(cdrom_t *dev, int cdrom_sector_flags, uint32_t lba, uint32_t msf, int
}
}
static void
read_mode2_non_xa(cdrom_t *dev, int cdrom_sector_flags, uint32_t lba, uint32_t msf, int mode2, uint8_t *b)
{
@@ -943,7 +955,6 @@ read_mode2_non_xa(cdrom_t *dev, int cdrom_sector_flags, uint32_t lba, uint32_t m
}
}
static void
read_mode2_xa_form1(cdrom_t *dev, int cdrom_sector_flags, uint32_t lba, uint32_t msf, int mode2, uint8_t *b)
{
@@ -995,7 +1006,6 @@ read_mode2_xa_form1(cdrom_t *dev, int cdrom_sector_flags, uint32_t lba, uint32_t
}
}
static void
read_mode2_xa_form2(cdrom_t *dev, int cdrom_sector_flags, uint32_t lba, uint32_t msf, int mode2, uint8_t *b)
{
@@ -1039,15 +1049,14 @@ read_mode2_xa_form2(cdrom_t *dev, int cdrom_sector_flags, uint32_t lba, uint32_t
}
}
int
cdrom_readsector_raw(cdrom_t *dev, uint8_t *buffer, int sector, int ismsf, int cdrom_sector_type,
int cdrom_sector_flags, int *len)
int cdrom_sector_flags, int *len)
{
uint8_t *b, *temp_b;
uint32_t msf, lba;
int audio = 0, mode2 = 0;
int m, s, f;
int audio = 0, mode2 = 0;
int m, s, f;
if (dev->cd_status == CD_STATUS_EMPTY)
return 0;
@@ -1057,9 +1066,9 @@ cdrom_readsector_raw(cdrom_t *dev, uint8_t *buffer, int sector, int ismsf, int c
*len = 0;
if (ismsf) {
m = (sector >> 16) & 0xff;
s = (sector >> 8) & 0xff;
f = sector & 0xff;
m = (sector >> 16) & 0xff;
s = (sector >> 8) & 0xff;
f = sector & 0xff;
lba = MSFtoLBA(m, s, f) - 150;
msf = sector;
} else {
@@ -1184,7 +1193,6 @@ cdrom_readsector_raw(cdrom_t *dev, uint8_t *buffer, int sector, int ismsf, int c
return 1;
}
/* Peform a master init on the entire module. */
void
cdrom_global_init(void)
@@ -1193,23 +1201,21 @@ cdrom_global_init(void)
memset(cdrom, 0x00, sizeof(cdrom));
}
static void
cdrom_drive_reset(cdrom_t *dev)
{
dev->priv = NULL;
dev->insert = NULL;
dev->close = NULL;
dev->get_volume = NULL;
dev->priv = NULL;
dev->insert = NULL;
dev->close = NULL;
dev->get_volume = NULL;
dev->get_channel = NULL;
}
void
cdrom_hard_reset(void)
{
cdrom_t *dev;
int i;
int i;
for (i = 0; i < CDROM_NUM; i++) {
dev = &cdrom[i];
@@ -1220,7 +1226,7 @@ cdrom_hard_reset(void)
cdrom_drive_reset(dev);
switch(dev->bus_type) {
switch (dev->bus_type) {
case CDROM_BUS_ATAPI:
case CDROM_BUS_SCSI:
scsi_cdrom_drive_reset(i);
@@ -1240,12 +1246,11 @@ cdrom_hard_reset(void)
sound_cd_thread_reset();
}
void
cdrom_close(void)
{
cdrom_t *dev;
int i;
int i;
for (i = 0; i < CDROM_NUM; i++) {
dev = &cdrom[i];
@@ -1259,14 +1264,13 @@ cdrom_close(void)
if (dev->ops && dev->ops->exit)
dev->ops->exit(dev);
dev->ops = NULL;
dev->ops = NULL;
dev->priv = NULL;
cdrom_drive_reset(dev);
}
}
/* Signal disc change to the emulated machine. */
void
cdrom_insert(uint8_t id)
@@ -1279,7 +1283,6 @@ cdrom_insert(uint8_t id)
}
}
/* The mechanics of ejecting a CD-ROM from a drive. */
void
cdrom_eject(uint8_t id)
@@ -1296,7 +1299,7 @@ cdrom_eject(uint8_t id)
strcpy(dev->prev_image_path, dev->image_path);
dev->prev_host_drive = dev->host_drive;
dev->host_drive = 0;
dev->host_drive = 0;
dev->ops->exit(dev);
dev->ops = NULL;
@@ -1309,15 +1312,13 @@ cdrom_eject(uint8_t id)
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)) {
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;
}

View File

@@ -33,11 +33,9 @@
#include <86box/cdrom.h>
#include <86box/cdrom_image.h>
#ifdef ENABLE_CDROM_IMAGE_LOG
int cdrom_image_do_log = ENABLE_CDROM_IMAGE_LOG;
void
cdrom_image_log(const char *fmt, ...)
{
@@ -50,31 +48,28 @@ cdrom_image_log(const char *fmt, ...)
}
}
#else
#define cdrom_image_log(fmt, ...)
# define cdrom_image_log(fmt, ...)
#endif
/* The addresses sent from the guest are absolute, ie. a LBA of 0 corresponds to a MSF of 00:00:00. Otherwise, the counter displayed by the guest is wrong:
there is a seeming 2 seconds in which audio plays but counter does not move, while a data track before audio jumps to 2 seconds before the actual start
of the audio while audio still plays. With an absolute conversion, the counter is fine. */
#define MSFtoLBA(m,s,f) ((((m * 60) + s) * 75) + f)
#define MSFtoLBA(m, s, f) ((((m * 60) + s) * 75) + f)
static void
image_get_tracks(cdrom_t *dev, int *first, int *last)
{
cd_img_t *img = (cd_img_t *)dev->image;
TMSF tmsf;
cd_img_t *img = (cd_img_t *) dev->image;
TMSF tmsf;
cdi_get_audio_tracks(img, first, last, &tmsf);
}
static void
image_get_track_info(cdrom_t *dev, uint32_t track, int end, track_info_t *ti)
{
cd_img_t *img = (cd_img_t *)dev->image;
TMSF tmsf;
cd_img_t *img = (cd_img_t *) dev->image;
TMSF tmsf;
cdi_get_audio_track_info(img, end, track, &ti->number, &tmsf, &ti->attr);
@@ -83,12 +78,11 @@ image_get_track_info(cdrom_t *dev, uint32_t track, int end, track_info_t *ti)
ti->f = tmsf.fr;
}
static void
image_get_subchannel(cdrom_t *dev, uint32_t lba, subchannel_t *subc)
{
cd_img_t *img = (cd_img_t *)dev->image;
TMSF rel_pos, abs_pos;
cd_img_t *img = (cd_img_t *) dev->image;
TMSF rel_pos, abs_pos;
cdi_get_audio_sub(img, lba, &subc->attr, &subc->track, &subc->index,
&rel_pos, &abs_pos);
@@ -102,15 +96,14 @@ image_get_subchannel(cdrom_t *dev, uint32_t lba, subchannel_t *subc)
subc->rel_f = rel_pos.fr;
}
static int
image_get_capacity(cdrom_t *dev)
{
cd_img_t *img = (cd_img_t *)dev->image;
int first_track, last_track;
int number, c;
cd_img_t *img = (cd_img_t *) dev->image;
int first_track, last_track;
int number, c;
unsigned char attr;
uint32_t address = 0, lb = 0;
uint32_t address = 0, lb = 0;
if (!img)
return 0;
@@ -126,23 +119,22 @@ image_get_capacity(cdrom_t *dev)
return lb;
}
static int
image_is_track_audio(cdrom_t *dev, uint32_t pos, int ismsf)
{
cd_img_t *img = (cd_img_t *)dev->image;
uint8_t attr;
TMSF tmsf;
int m, s, f;
int number, track;
cd_img_t *img = (cd_img_t *) dev->image;
uint8_t attr;
TMSF tmsf;
int m, s, f;
int number, track;
if (!img || (dev->cd_status == CD_STATUS_DATA_ONLY))
return 0;
if (ismsf) {
m = (pos >> 16) & 0xff;
s = (pos >> 8) & 0xff;
f = pos & 0xff;
m = (pos >> 16) & 0xff;
s = (pos >> 8) & 0xff;
f = pos & 0xff;
pos = MSFtoLBA(m, s, f) - 150;
}
@@ -156,12 +148,11 @@ image_is_track_audio(cdrom_t *dev, uint32_t pos, int ismsf)
}
}
static int
image_is_track_pre(cdrom_t *dev, uint32_t lba)
{
cd_img_t *img = (cd_img_t *)dev->image;
int track;
cd_img_t *img = (cd_img_t *) dev->image;
int track;
/* GetTrack requires LBA. */
track = cdi_get_track(img, lba);
@@ -172,20 +163,18 @@ image_is_track_pre(cdrom_t *dev, uint32_t lba)
return 0;
}
static int
image_sector_size(struct cdrom *dev, uint32_t lba)
{
cd_img_t *img = (cd_img_t *)dev->image;
cd_img_t *img = (cd_img_t *) dev->image;
return cdi_get_sector_size(img, lba);
}
static int
image_read_sector(struct cdrom *dev, int type, uint8_t *b, uint32_t lba)
{
cd_img_t *img = (cd_img_t *)dev->image;
cd_img_t *img = (cd_img_t *) dev->image;
switch (type) {
case CD_READ_DATA:
@@ -203,11 +192,10 @@ image_read_sector(struct cdrom *dev, int type, uint8_t *b, uint32_t lba)
}
}
static int
image_track_type(cdrom_t *dev, uint32_t lba)
{
cd_img_t *img = (cd_img_t *)dev->image;
cd_img_t *img = (cd_img_t *) dev->image;
if (img) {
if (image_is_track_audio(dev, lba, 0))
@@ -215,17 +203,16 @@ image_track_type(cdrom_t *dev, uint32_t lba)
else {
if (cdi_is_mode2(img, lba))
return CD_TRACK_MODE2 | cdi_get_mode2_form(img, lba);
}
}
}
return 0;
}
static void
image_exit(cdrom_t *dev)
{
cd_img_t *img = (cd_img_t *)dev->image;
cd_img_t *img = (cd_img_t *) dev->image;
cdrom_image_log("CDROM: image_exit(%s)\n", dev->image_path);
dev->cd_status = CD_STATUS_EMPTY;
@@ -238,7 +225,6 @@ image_exit(cdrom_t *dev)
dev->ops = NULL;
}
static const cdrom_ops_t cdrom_image_ops = {
image_get_tracks,
image_get_track_info,
@@ -250,17 +236,15 @@ static const cdrom_ops_t cdrom_image_ops = {
image_exit
};
static int
image_open_abort(cdrom_t *dev)
{
cdrom_image_close(dev);
dev->ops = NULL;
dev->ops = NULL;
dev->host_drive = 0;
return 1;
}
int
cdrom_image_open(cdrom_t *dev, const char *fn)
{
@@ -289,12 +273,12 @@ cdrom_image_open(cdrom_t *dev, const char *fn)
/* All good, reset state. */
if (i >= 2)
dev->cd_status = CD_STATUS_DATA_ONLY;
dev->cd_status = CD_STATUS_DATA_ONLY;
else
dev->cd_status = CD_STATUS_STOPPED;
dev->is_dir = (i == 3);
dev->seek_pos = 0;
dev->cd_buflen = 0;
dev->cd_status = CD_STATUS_STOPPED;
dev->is_dir = (i == 3);
dev->seek_pos = 0;
dev->cd_buflen = 0;
dev->cdrom_capacity = image_get_capacity(dev);
cdrom_image_log("CD-ROM capacity: %i sectors (%" PRIi64 " bytes)\n", dev->cdrom_capacity, ((uint64_t) dev->cdrom_capacity) << 11ULL);
@@ -304,7 +288,6 @@ cdrom_image_open(cdrom_t *dev, const char *fn)
return 0;
}
void
cdrom_image_close(cdrom_t *dev)
{

View File

@@ -36,8 +36,7 @@
#include <86box/plat.h>
#include <86box/cdrom_image_backend.h>
#define CDROM_BCD(x) (((x) % 10) | (((x) / 10) << 4))
#define CDROM_BCD(x) (((x) % 10) | (((x) / 10) << 4))
#define MAX_LINE_LENGTH 512
#define MAX_FILENAME_LENGTH 256
@@ -425,12 +424,11 @@ cdi_read_sectors(cd_img_t *cdi, uint8_t *buffer, int raw, uint32_t sector, uint3
for (i = 0; i < num; i++) {
success = cdi_read_sector(cdi, &buf[i * sector_size], raw, sector + i);
if (!success)
break;
/* Based on the DOSBox patch, but check all 8 bytes and makes sure it's not an
audio track. */
if (raw && sector < cdi->tracks[0].length && !cdi->tracks[0].mode2 &&
(cdi->tracks[0].attr != AUDIO_TRACK) && *(uint64_t *) &(buf[i * sector_size + 2068]))
return 0;
break;
/* Based on the DOSBox patch, but check all 8 bytes and makes sure it's not an
audio track. */
if (raw && sector < cdi->tracks[0].length && !cdi->tracks[0].mode2 && (cdi->tracks[0].attr != AUDIO_TRACK) && *(uint64_t *) &(buf[i * sector_size + 2068]))
return 0;
}
memcpy((void *) buffer, buf, buf_len);
@@ -548,7 +546,7 @@ cdi_load_iso(cd_img_t *cdi, const char *filename)
if (error) {
if ((trk.file != NULL) && (trk.file->close != NULL))
trk.file->close(trk.file);
ret = 3;
ret = 3;
trk.file = viso_init(filename, &error);
if (error) {
if ((trk.file != NULL) && (trk.file->close != NULL))