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