Panasonic/MKE OS freeze fixes (redo)

This commit is contained in:
Cacodemon345
2025-07-30 13:17:16 +06:00
parent bfd84a8be4
commit 55d892ee37

View File

@@ -160,6 +160,13 @@ mke_log(const char *fmt, ...)
return; \
}
#define REPORT_IF_NOT_READY() \
{ \
if (!mke_pre_execution_check(mke)) { \
fifo8_push(&mke->info_fifo, mke_cdrom_status(mke->cdrom_dev, mke)); \
} \
}
#define CHECK_READY_READ() \
{ \
if (!mke_pre_execution_check(mke)) { \
@@ -407,17 +414,20 @@ 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. */
uint8_t disc_type_buf[34];
cdrom_read_toc(mke->cdrom_dev, mke->temp_buf, CD_TOC_SESSION, 1, 1, 65536);
cdrom_read_disc_information(mke->cdrom_dev, disc_type_buf);
if (disc_type_buf[17] == 0 && disc_type_buf[18] == 0 && disc_type_buf[19] == 0)
{
uint8_t no_multisess[6] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
fifo8_push_all(&mke->info_fifo, no_multisess, 6);
} else {
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);
} else {
uint8_t no_multisess[6] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
fifo8_push_all(&mke->info_fifo, no_multisess, 6);
}
}
@@ -462,7 +472,7 @@ mke_command(mke_t *mke, uint8_t value)
{
uint16_t i;
/* This is wasteful handling of buffers for compatibility, but will optimize later. */
uint8_t x[12];
uint8_t x[12] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
int old_cd_status;
if (mke->command_buffer_pending) {
@@ -540,8 +550,9 @@ mke_command(mke_t *mke, uint8_t value)
}
break;
} case CMD1_READSUBQ:
CHECK_READY();
mke_get_subq(mke, (uint8_t *) &x);
if (mke_pre_execution_check(mke)) {
mke_get_subq(mke, (uint8_t *) &x);
}
fifo8_reset(&mke->info_fifo);
fifo8_push_all(&mke->info_fifo, x, 11);
fifo8_push(&mke->info_fifo, mke_cdrom_status(mke->cdrom_dev, mke));
@@ -569,6 +580,7 @@ mke_command(mke_t *mke, uint8_t value)
if (!sector_size) {
mke_update_sense(mke, 0x0e);
fifo8_push(&mke->info_fifo, mke_cdrom_status(mke->cdrom_dev, mke));
return;
} else {
switch (sector_size) {
@@ -604,6 +616,7 @@ mke_command(mke_t *mke, uint8_t value)
break;
default:
mke_update_sense(mke, 0x0e);
fifo8_push(&mke->info_fifo, mke_cdrom_status(mke->cdrom_dev, mke));
return;
}
}
@@ -615,6 +628,7 @@ mke_command(mke_t *mke, uint8_t value)
break;
default:
mke_update_sense(mke, 0x0e);
fifo8_push(&mke->info_fifo, mke_cdrom_status(mke->cdrom_dev, mke));
return;
}
@@ -640,45 +654,45 @@ mke_command(mke_t *mke, uint8_t value)
fifo8_push(&mke->info_fifo, mke_cdrom_status(mke->cdrom_dev, mke));
break;
case CMD1_PAUSERESUME:
CHECK_READY();
CHECK_READY_READ();
cdrom_audio_pause_resume(mke->cdrom_dev, mke->command_buffer[1] >> 7);
fifo8_push(&mke->info_fifo, mke_cdrom_status(mke->cdrom_dev, mke));
break;
case CMD1_CAPACITY:
/* 6 */
mke_log("DISK CAPACITY\n");
CHECK_READY();
mke_disc_capacity(mke->cdrom_dev, (uint8_t *) &x);
if (mke_pre_execution_check(mke))
mke_disc_capacity(mke->cdrom_dev, (uint8_t *) &x);
fifo8_push_all(&mke->info_fifo, x, 5);
fifo8_push(&mke->info_fifo, mke_cdrom_status(mke->cdrom_dev, mke));
break;
case CMD1_DISKINFO:
/* 7 */
mke_log("DISK INFO\n");
CHECK_READY();
mke_disc_info(mke, (uint8_t *) &x);
fifo8_reset(&mke->info_fifo);
if (mke_pre_execution_check(mke))
mke_disc_info(mke, (uint8_t *) &x);
fifo8_push_all(&mke->info_fifo, x, 6);
fifo8_push(&mke->info_fifo, mke_cdrom_status(mke->cdrom_dev, mke));
break;
case CMD1_READTOC:
CHECK_READY();
fifo8_reset(&mke->info_fifo);
mke_read_toc(mke, (uint8_t *) &x, mke->command_buffer[2]);
if (mke_pre_execution_check(mke))
mke_read_toc(mke, (uint8_t *) &x, mke->command_buffer[2]);
fifo8_push_all(&mke->info_fifo, x, 8);
fifo8_push(&mke->info_fifo, mke_cdrom_status(mke->cdrom_dev, mke));
break;
case CMD1_PLAY_TI:
CHECK_READY();
/* Index is ignored for now. */
fifo8_reset(&mke->info_fifo);
if (cdrom_audio_play(mke->cdrom_dev, mke->command_buffer[1], mke->command_buffer[3], 2))
fifo8_push(&mke->info_fifo, mke_cdrom_status(mke->cdrom_dev, mke));
else
CHECK_READY_READ();
if (!cdrom_audio_play(mke->cdrom_dev, mke->command_buffer[1], mke->command_buffer[3], 2))
mke_update_sense(mke, 0x10);
fifo8_push(&mke->info_fifo, mke_cdrom_status(mke->cdrom_dev, mke));
break;
case CMD1_PLAY_MSF:
CHECK_READY();
fifo8_reset(&mke->info_fifo);
CHECK_READY_READ();
mke_log("PLAY MSF:");
for (i = 0; i < 6; i++) {
mke_log("%02x ", mke->command_buffer[i + 1]);
@@ -690,16 +704,16 @@ mke_command(mke_t *mke, uint8_t value)
mke->command_buffer[3];
int len = (mke->command_buffer[4] << 16) | (mke->command_buffer[5] << 8) |
mke->command_buffer[6];
if (!cdrom_audio_play(mke->cdrom_dev, pos, len, msf))
if (!cdrom_audio_play(mke->cdrom_dev, pos, len, msf)){
mke_update_sense(mke, 0x10);
else
fifo8_push(&mke->info_fifo, mke_cdrom_status(mke->cdrom_dev, mke));
}
fifo8_push(&mke->info_fifo, mke_cdrom_status(mke->cdrom_dev, mke));
}
break;
case CMD1_SEEK:
CHECK_READY();
old_cd_status = mke->cdrom_dev->cd_status;
fifo8_reset(&mke->info_fifo);
CHECK_READY_READ();
/* TODO: DOES THIS IMPACT CURRENT PLAY LENGTH? */
mke_log("SEEK MSF:");
for (i = 0; i < 6; i++) {
@@ -717,18 +731,20 @@ mke_command(mke_t *mke, uint8_t value)
fifo8_push(&mke->info_fifo, mke_cdrom_status(mke->cdrom_dev, mke));
break;
case CMD1_SESSINFO:
CHECK_READY();
fifo8_reset(&mke->info_fifo);
mke_log("CMD: READ SESSION INFO\n");
mke_read_multisess(mke);
if (mke_pre_execution_check(mke))
mke_read_multisess(mke);
else
fifo8_push_all(&mke->info_fifo, x, 6);
fifo8_push(&mke->info_fifo, mke_cdrom_status(mke->cdrom_dev, mke));
break;
case CMD1_READ_UPC:
CHECK_READY();
fifo8_reset(&mke->info_fifo);
mke_log("CMD: READ UPC\n");
uint8_t upc[8] = { [0] = 80 };
fifo8_push_all(&mke->info_fifo, upc, 8);
REPORT_IF_NOT_READY();
fifo8_push(&mke->info_fifo, mke_cdrom_status(mke->cdrom_dev, mke));
break;
case CMD1_READ_ERR: