diff --git a/src/cdrom/cdrom_mke.c b/src/cdrom/cdrom_mke.c index 2a57df588..495d3d103 100644 --- a/src/cdrom/cdrom_mke.c +++ b/src/cdrom/cdrom_mke.c @@ -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); } }