MKE: More clean-ups, made port 3 return 0xFF when read (fixes Windows 95's built-in Panasonic driver), and added the Non-Creative version as well.

This commit is contained in:
OBattler
2025-07-27 19:21:24 +02:00
parent 1b142299e5
commit 26249b9c4c
3 changed files with 26 additions and 19 deletions

View File

@@ -120,12 +120,13 @@ static const struct {
const device_t *device; const device_t *device;
} controllers[] = { } controllers[] = {
// clang-format off // clang-format off
{ &cdrom_interface_none_device }, { &cdrom_interface_none_device },
#ifdef USE_CDROM_MITSUMI #ifdef USE_CDROM_MITSUMI
{ &mitsumi_cdrom_device }, { &mitsumi_cdrom_device },
#endif #endif
{ &mke_cdrom_device }, { &mke_cdrom_noncreative_device },
{ NULL } { &mke_cdrom_device },
{ NULL }
// clang-format on // clang-format on
}; };

View File

@@ -38,6 +38,9 @@
#include <86box/sound.h> #include <86box/sound.h>
#include <86box/fifo8.h> #include <86box/fifo8.h>
#include <86box/timer.h> #include <86box/timer.h>
#ifdef ENABLE_MKE_LOG
#include "cpu.h"
#endif
/* /*
https://elixir.bootlin.com/linux/2.0.29/source/include/linux/sbpcd.h https://elixir.bootlin.com/linux/2.0.29/source/include/linux/sbpcd.h
@@ -168,7 +171,8 @@ mke_get_subq(cdrom_t *dev, uint8_t *b)
b[9] = temp_buf[5]; b[9] = temp_buf[5];
/* ? */ /* ? */
b[10] = 0; b[10] = 0;
pclog("mke_get_subq: 0x%02X 0x%02X 0x%02X 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], b[8], b[9], b[10]); mke_log("mke_get_subq: 0x%02X 0x%02X 0x%02X 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], b[8], b[9], b[10]);
} }
/* Lifted from FreeBSD */ /* Lifted from FreeBSD */
@@ -640,23 +644,25 @@ mke_command(mke_t *mke, uint8_t value)
} }
void void
mke_write(uint16_t address, uint8_t value, void *priv) mke_write(uint16_t port, uint8_t val, void *priv)
{ {
mke_t *mke = (mke_t *) priv; mke_t *mke = (mke_t *) priv;
if (!mke->enable_register || ((address & 0xf) == 3)) switch (address & 0xf) { mke_log("[%04X:%08X] [W] %04X = %02X\n", CS, cpu_state.pc, port, val);
if (!mke->enable_register || ((port & 0xf) == 3)) switch (port & 0xf) {
case 0: case 0:
mke_command(mke, value); mke_command(mke, val);
break; break;
case 1: case 1:
if (mke->is_sb) if (mke->is_sb)
mke->data_select = value; mke->data_select = val;
break; break;
case 2: case 2:
mke_reset(mke); mke_reset(mke);
break; break;
case 3: case 3:
mke->enable_register = value; mke->enable_register = val;
break; break;
default: default:
mke_log("w %03x %02x\n", address, value); mke_log("w %03x %02x\n", address, value);
@@ -665,18 +671,18 @@ mke_write(uint16_t address, uint8_t value, void *priv)
} }
uint8_t uint8_t
mke_read(uint16_t address, void *priv) mke_read(uint16_t port, void *priv)
{ {
mke_t *mke = (mke_t *) priv; mke_t *mke = (mke_t *) priv;
uint8_t ret = 0x00; uint8_t ret = 0x00;
if (!mke->enable_register) switch (address & 0xf) { if (!mke->enable_register) switch (port & 0xf) {
case 0: case 0:
/* Info */ /* Info */
if (mke->is_sb && mke->data_select) if (mke->is_sb && mke->data_select)
ret = fifo8_num_used(&mke->data_fifo) ? fifo8_pop(&mke->data_fifo) : 0; ret = fifo8_num_used(&mke->data_fifo) ? fifo8_pop(&mke->data_fifo) : 0x00;
else else
ret = fifo8_num_used(&mke->info_fifo) ? fifo8_pop(&mke->info_fifo) : 0; ret = fifo8_num_used(&mke->info_fifo) ? fifo8_pop(&mke->info_fifo) : 0x00;
break; break;
case 1: case 1:
/* /*
@@ -699,17 +705,16 @@ mke_read(uint16_t address, void *priv)
case 2: case 2:
/* Data */ /* Data */
if (!mke->is_sb) if (!mke->is_sb)
ret = fifo8_num_used(&mke->data_fifo) ? fifo8_pop(&mke->data_fifo) : 0; ret = fifo8_num_used(&mke->data_fifo) ? fifo8_pop(&mke->data_fifo) : 0x00;
break;
case 3:
ret = mke->enable_register;
break; break;
default: default:
mke_log("MKE Unknown Read Address: %03x\n",address); mke_log("MKE Unknown Read Port: %04X\n", port);
ret = 0xff; ret = 0xff;
break; break;
} }
mke_log("[%04X:%08X] [R] %04X = %02X\n", CS, cpu_state.pc, port, ret);
return ret; return ret;
} }

View File

@@ -19,5 +19,6 @@
#define CDROM_MKE_H #define CDROM_MKE_H
extern const device_t mke_cdrom_device; extern const device_t mke_cdrom_device;
extern const device_t mke_cdrom_noncreative_device;
#endif /*CDROM_MKE_H*/ #endif /*CDROM_MKE_H*/