MKE CD-ROM: Fix TOC and multi-session reading, fixes the Windows 95 built-in driver with the non-Creative interface.

This commit is contained in:
OBattler
2025-07-30 16:31:11 +02:00
parent 2ec7fa9e06
commit 325887a567

View File

@@ -326,8 +326,8 @@ mke_get_subq(mke_t *mke, uint8_t *b)
}
/* Lifted from FreeBSD */
static void blk_to_msf(int blk, unsigned char *msf)
static void
blk_to_msf(int blk, unsigned char *msf)
{
blk = blk + 150; /* 2 seconds skip required to
reach ISO data */
@@ -339,28 +339,50 @@ static void blk_to_msf(int blk, unsigned char *msf)
return;
}
uint8_t mke_read_toc(mke_t *mke, unsigned char *b, uint8_t track) {
cdrom_t *dev = mke->cdrom_dev;
uint8_t
mke_read_toc(mke_t *mke, unsigned char *b, uint8_t track) {
cdrom_t *dev = mke->cdrom_dev;
#if 0
track_info_t ti;
int last_track;
#endif
const raw_track_info_t *trti = (raw_track_info_t *) mke->temp_buf;
int num = 0;
int ret = 0;
cdrom_read_toc(dev, mke->temp_buf, CD_TOC_NORMAL, 0, 0, 65536);
last_track = mke->temp_buf[3];
/* Should we allow +1 here? */
if (track > last_track)
return 0;
dev->ops->get_track_info(dev->local, track, 0, &ti);
b[0]=0;
b[1]=ti.attr;
b[2]=ti.number;
b[3]=0;
b[4]=ti.m;
b[5]=ti.s;
b[6]=ti.f;
b[7]=0;
mke_log("mke_read_toc: 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X\n",
b[0], b[1], b[2], b[3], b[4], b[5], b[6], b[7]);
return 1;
dev->ops->get_raw_track_info(dev->local, &num, mke->temp_buf);
if (num > 0) {
if (track == 0xaa)
track = 0xa2;
int trk = - 1;
for (int i = (num - 1); i >= 0; i--) {
if (trti[i].point == track) {
trk = i;
break;
}
}
if (trk != -1) {
b[0] = 0;
b[1] = trti[trk].adr_ctl;
b[2] = (trti[trk].point == 0xa2) ? 0xaa : trti[trk].point;
b[3] = 0;
b[4] = trti[trk].pm;
b[5] = trti[trk].ps;
b[6] = trti[trk].pf;
b[7] = 0;
ret = 1;
}
mke_log("mke_read_toc: 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X\n",
b[0], b[1], b[2], b[3], b[4], b[5], b[6], b[7]);
}
return ret;
}
@@ -407,17 +429,56 @@ mke_disc_capacity(cdrom_t *dev, unsigned char *b)
void
mke_read_multisess(mke_t *mke)
{
if ((mke->temp_buf[9] != 0) || (mke->temp_buf[10] != 0) || (mke->temp_buf[11] != 0)) {
/* Multi-session disc. */
fifo8_push(&mke->info_fifo, 0x80);
fifo8_push(&mke->info_fifo, mke->temp_buf[9]);
fifo8_push(&mke->info_fifo, mke->temp_buf[10]);
fifo8_push(&mke->info_fifo, mke->temp_buf[11]);
fifo8_push(&mke->info_fifo, 0);
fifo8_push(&mke->info_fifo, 0);
cdrom_t *dev = mke->cdrom_dev;
uint8_t *b = (uint8_t *) &(mke->temp_buf[32768]);
const raw_track_info_t *trti = (raw_track_info_t *) mke->temp_buf;
int num = 0;
int first_sess = 0;
int last_sess = 0;
dev->ops->get_raw_track_info(dev->local, &num, mke->temp_buf);
if (num > 0) {
int trk = - 1;
for (int i = 0; i < num; i++) {
if (trti[i].point == 0xa2) {
first_sess = trti[i].session;
break;
}
}
for (int i = (num - 1); i >= 0; i--) {
if (trti[i].point == 0xa2) {
last_sess = trti[i].session;
break;
}
}
for (int i = 0; i < num; i++) {
if ((trti[i].point >= 1) && (trti[i].point >= 99) &&
(trti[i].session == last_sess)) {
trk = i;
break;
}
}
if ((first_sess > 0) && (last_sess < 0) && (trk != -1)) {
b[0] = (first_sess == last_sess) ? 0x00 : 0x80;
b[1] = trti[trk].pm;
b[2] = trti[trk].ps;
b[3] = trti[trk].pf;
b[4] = 0;
b[5] = 0;
}
fifo8_push_all(&mke->info_fifo, b, 6);
mke_log("mke_read_multisess: 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X\n",
b[0], b[1], b[2], b[3], b[4], b[5]);
} else {
uint8_t no_multisess[6] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
fifo8_push_all(&mke->info_fifo, no_multisess, 6);
memset(b, 0x00, 6);
fifo8_push_all(&mke->info_fifo, b, 6);
}
}