Implement Mode Sense/Mode Select and volume controls

This commit is contained in:
Cacodemon345
2025-07-27 01:42:12 +06:00
parent c32056b614
commit bc1b5f63bc

View File

@@ -6,13 +6,15 @@
* *
* This file is part of the 86Box distribution. * This file is part of the 86Box distribution.
* *
* Mitsumi CD-ROM emulation for the ISA bus. * Panasonic/MKE CD-ROM emulation for the ISA bus.
* *
* Authors: Miran Grca, <mgrca8@gmail.com> * Authors: Miran Grca, <mgrca8@gmail.com>
* Kevin Moonlight, <me@yyzkevin.com>
* Cacodemon345 * Cacodemon345
* *
* Copyright 2022-2025 Miran Grca. * Copyright (C) 2025 Miran Grca.
* Copyright 2025 Cacodemon345. * Copyright (C) 2025 Cacodemon345.
* Copyright (C) 2024 Kevin Moonlight.
*/ */
#include <inttypes.h> #include <inttypes.h>
#include <stdarg.h> #include <stdarg.h>
@@ -90,6 +92,9 @@ typedef struct mke_t {
uint8_t command_buffer[7]; uint8_t command_buffer[7];
uint8_t command_buffer_pending; uint8_t command_buffer_pending;
uint8_t vol0, vol1, patch0, patch1;
uint8_t mode_select[5];
uint8_t data_select; uint8_t data_select;
uint8_t media_selected; // temporary hack uint8_t media_selected; // temporary hack
@@ -246,6 +251,21 @@ mke_cdrom_status(cdrom_t *dev, mke_t *mke)
uint8_t ver[10] = "CR-5630.75"; uint8_t ver[10] = "CR-5630.75";
static void
mke_reset(void)
{
cdrom_stop(mke.cdrom_dev);
mke.sector_type = 0x08 | (1 << 4);
mke.sector_flags = 0x10;
memset(mke.mode_select, 0, 5);
mke.mode_select[2] = 0x08;
mke.patch0 = 0x01;
mke.patch1 = 0x02;
mke.vol0 = 255;
mke.vol1 = 255;
mke.cdrom_dev->sector_size = 2048;
}
void void
mke_command(uint8_t value) mke_command(uint8_t value)
{ {
@@ -288,6 +308,11 @@ mke_command(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_RESET:
{
mke_reset();
break;
}
case CMD1_READ: case CMD1_READ:
{ {
uint32_t count = mke.command_buffer[6]; uint32_t count = mke.command_buffer[6];
@@ -335,12 +360,48 @@ mke_command(uint8_t value)
mke_log("%02x ", mke.command_buffer[i + 1]); mke_log("%02x ", mke.command_buffer[i + 1]);
} }
mke_log("\n"); mke_log("\n");
switch (mke.command_buffer[1]) {
case 0:
{
switch (mke.command_buffer[2]) {
case 0x00: {
mke.sector_type = 0x08 | (1 << 4);
mke.sector_flags = 0x10;
mke.cdrom_dev->sector_size = 2048;
break;
}
case 0x82: {
mke.sector_type = 0x00;
mke.sector_flags = 0xf8;
mke.cdrom_dev->sector_size = 2352;
break;
}
default: {
fifo8_push(&mke.errors_fifo, 0x0e);
return;
}
}
memcpy(mke.mode_select, &mke.command_buffer[2], 5);
}
case 5: {
mke.vol0 = mke.command_buffer[4];
mke.vol1 = mke.command_buffer[6];
mke.patch0 = mke.command_buffer[3];
mke.patch1 = mke.command_buffer[5];
break;
}
}
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_GETMODE: // 6 case CMD1_GETMODE: // 6
mke_log("GET MODE\n"); mke_log("GET MODE\n");
uint8_t mode[5] = { [1] = 0x08 }; if (mke.command_buffer[1] == 5) {
fifo8_push_all(&mke.info_fifo, mode, 5); uint8_t volsettings[5] = { 0, mke.patch0, mke.vol0, mke.patch1, mke.vol1 };
fifo8_push_all(&mke.info_fifo, volsettings, 5);
}
else
fifo8_push_all(&mke.info_fifo, mke.mode_select, 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_PAUSERESUME: case CMD1_PAUSERESUME:
@@ -505,6 +566,9 @@ mke_write(uint16_t address, uint8_t value, void *priv)
case 1: case 1:
mke.data_select = value; mke.data_select = value;
break; break;
case 2:
mke_reset();
break;
case 3: case 3:
mke.enable_register = value; mke.enable_register = value;
break; break;
@@ -592,6 +656,18 @@ mke_cdrom_insert(void *priv)
} }
} }
uint32_t
mke_get_volume(void *priv, int channel)
{
return channel == 0 ? mke.vol0 : mke.vol1;
}
uint32_t
mke_get_channel(void *priv, int channel)
{
return channel == 0 ? mke.patch0 : mke.patch1;
}
void * void *
mke_init(const device_t *info) mke_init(const device_t *info)
{ {
@@ -618,11 +694,18 @@ mke_init(const device_t *info)
mke.command_buffer_pending = 7; mke.command_buffer_pending = 7;
mke.sector_type = 0x08 | (1 << 4); mke.sector_type = 0x08 | (1 << 4);
mke.sector_flags = 0x10; mke.sector_flags = 0x10;
mke.mode_select[2] = 0x08;
mke.patch0 = 0x01;
mke.patch1 = 0x02;
mke.vol0 = 255;
mke.vol1 = 255;
dev->sector_size = 2048;
dev->priv = &mke; dev->priv = &mke;
dev->insert = mke_cdrom_insert; dev->insert = mke_cdrom_insert;
dev->get_volume = mke_get_volume;
dev->get_channel = mke_get_channel;
dev->cached_sector = -1; dev->cached_sector = -1;
dev->sector_size = 2048;
uint16_t base = device_get_config_hex16("base"); uint16_t base = device_get_config_hex16("base");
io_sethandler(base, 16, mke_read, NULL, NULL, mke_write, NULL, NULL, &mke); io_sethandler(base, 16, mke_read, NULL, NULL, mke_write, NULL, NULL, &mke);