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:
@@ -124,6 +124,7 @@ static const struct {
|
|||||||
#ifdef USE_CDROM_MITSUMI
|
#ifdef USE_CDROM_MITSUMI
|
||||||
{ &mitsumi_cdrom_device },
|
{ &mitsumi_cdrom_device },
|
||||||
#endif
|
#endif
|
||||||
|
{ &mke_cdrom_noncreative_device },
|
||||||
{ &mke_cdrom_device },
|
{ &mke_cdrom_device },
|
||||||
{ NULL }
|
{ NULL }
|
||||||
// clang-format on
|
// clang-format on
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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*/
|
||||||
|
|||||||
Reference in New Issue
Block a user