Whitespace cleanups, formatting, license headers

This commit is contained in:
Jasmine Iwanek
2025-07-25 17:23:42 -04:00
parent 976516fa62
commit 188b6da202
5 changed files with 340 additions and 270 deletions

View File

@@ -120,12 +120,12 @@ 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_device },
{ NULL } { NULL }
// clang-format on // clang-format on
}; };

View File

@@ -1,3 +1,19 @@
/*
* 86Box A hypervisor and IBM PC system emulator that specializes in
* running old operating systems and software designed for IBM
* PC systems and compatibles from 1981 through fairly recent
* system designs based on the PCI bus.
*
* This file is part of the 86Box distribution.
*
* Mitsumi CD-ROM emulation for the ISA bus.
*
* Authors: Miran Grca, <mgrca8@gmail.com>
* Cacodemon345
*
* Copyright 2022-2025 Miran Grca.
* Copyright 2025 Cacodemon345.
*/
#include <inttypes.h> #include <inttypes.h>
#include <stdarg.h> #include <stdarg.h>
#include <stdint.h> #include <stdint.h>
@@ -30,46 +46,44 @@ CR-562-B is classified as Family1 in this driver, so uses the CMD1_ prefix.
#define CDROM_STATUS_DOUBLE_SPEED 0x02 #define CDROM_STATUS_DOUBLE_SPEED 0x02
#define CDROM_STATUS_READY 0x01 #define CDROM_STATUS_READY 0x01
// Status returned from device
//Status returned from device #define STAT_READY 0x01
#define STAT_READY 0x01 #define STAT_PLAY 0x08
#define STAT_PLAY 0x08 #define STAT_ERROR 0x10
#define STAT_ERROR 0x10 #define STAT_DISK 0x40
#define STAT_DISK 0x40 #define STAT_TRAY 0x80 // Seems Correct
#define STAT_TRAY 0x80 //Seems Correct
#define CMD1_PAUSERESUME 0x0D #define CMD1_PAUSERESUME 0x0D
#define CMD1_RESET 0x0a #define CMD1_RESET 0x0a
#define CMD1_LOCK_CTL 0x0c #define CMD1_LOCK_CTL 0x0c
#define CMD1_TRAY_CTL 0x07 #define CMD1_TRAY_CTL 0x07
#define CMD1_MULTISESS 0x8d #define CMD1_MULTISESS 0x8d
#define CMD1_SUBCHANINF 0x11 #define CMD1_SUBCHANINF 0x11
#define CMD1_ABORT 0x08 #define CMD1_ABORT 0x08
//#define CMD1_PATH_CHECK 0x??? // #define CMD1_PATH_CHECK 0x???
#define CMD1_SEEK 0x01 #define CMD1_SEEK 0x01
#define CMD1_READ 0x10 #define CMD1_READ 0x10
#define CMD1_SPINUP 0x02 #define CMD1_SPINUP 0x02
#define CMD1_SPINDOWN 0x06 #define CMD1_SPINDOWN 0x06
#define CMD1_READ_UPC 0x88 #define CMD1_READ_UPC 0x88
//#define CMD1_PLAY 0x??? // #define CMD1_PLAY 0x???
#define CMD1_PLAY_MSF 0x0e #define CMD1_PLAY_MSF 0x0e
#define CMD1_PLAY_TI 0x0f #define CMD1_PLAY_TI 0x0f
#define CMD1_STATUS 0x05 #define CMD1_STATUS 0x05
#define CMD1_READ_ERR 0x82 #define CMD1_READ_ERR 0x82
#define CMD1_READ_VER 0x83 #define CMD1_READ_VER 0x83
#define CMD1_SETMODE 0x09 #define CMD1_SETMODE 0x09
#define CMD1_GETMODE 0x84 #define CMD1_GETMODE 0x84
#define CMD1_CAPACITY 0x85 #define CMD1_CAPACITY 0x85
#define CMD1_READSUBQ 0x87 #define CMD1_READSUBQ 0x87
#define CMD1_DISKINFO 0x8b #define CMD1_DISKINFO 0x8b
#define CMD1_READTOC 0x8c #define CMD1_READTOC 0x8c
#define CMD1_PAU_RES 0x0d #define CMD1_PAU_RES 0x0d
#define CMD1_PACKET 0x8e #define CMD1_PACKET 0x8e
#define CMD1_SESSINFO 0x8d #define CMD1_SESSINFO 0x8d
typedef struct mke_t { typedef struct mke_t {
bool tray_open; bool tray_open;
uint8_t enable_register; uint8_t enable_register;
@@ -78,14 +92,16 @@ typedef struct mke_t {
uint8_t data_select; uint8_t data_select;
uint8_t media_selected;//temporary hack uint8_t media_selected; // temporary hack
Fifo8 data_fifo, info_fifo; Fifo8 data_fifo;
Fifo8 info_fifo;
Fifo8 errors_fifo; Fifo8 errors_fifo;
cdrom_t* cdrom_dev; cdrom_t *cdrom_dev;
uint32_t sector_type, sector_flags; uint32_t sector_type;
uint32_t sector_flags;
uint32_t unit_attention; uint32_t unit_attention;
@@ -95,93 +111,113 @@ mke_t mke;
#define mke_log(x, ...) #define mke_log(x, ...)
#define CHECK_READY() { if (mke.cdrom_dev->cd_status == CD_STATUS_EMPTY) { fifo8_push(&mke.errors_fifo, 0x03); return; } } #define CHECK_READY() \
{ \
if (mke.cdrom_dev->cd_status == CD_STATUS_EMPTY) { \
fifo8_push(&mke.errors_fifo, 0x03); \
return; \
} \
}
static uint8_t temp_buf[65536]; static uint8_t temp_buf[65536];
void mke_get_subq(cdrom_t *dev,uint8_t *b) { void
//dev->ops->get_subchannel(dev, dev->seek_pos, &subc); mke_get_subq(cdrom_t *dev, uint8_t *b)
//cdrom_get_current_subchannel(dev, &subc); {
//cdrom_get_current_subcodeq(dev, b); #if 0
dev->ops->get_subchannel(dev, dev->seek_pos, &subc);
cdrom_get_current_subchannel(dev, &subc);
cdrom_get_current_subcodeq(dev, b);
#endif
cdrom_get_current_subcodeq(dev, temp_buf); cdrom_get_current_subcodeq(dev, temp_buf);
b[0] = 0x80; //? b[0] = 0x80; //?
b[1] = ((temp_buf[0] & 0xf) << 4) | ((temp_buf[0] & 0xf0) >> 4); b[1] = ((temp_buf[0] & 0xf) << 4) | ((temp_buf[0] & 0xf0) >> 4);
b[2] = temp_buf[1]; b[2] = temp_buf[1];
b[3] = temp_buf[2]; b[3] = temp_buf[2];
b[4] = temp_buf[6]; b[4] = temp_buf[6];
b[5] = temp_buf[7]; b[5] = temp_buf[7];
b[6] = temp_buf[8]; b[6] = temp_buf[8];
b[7] = temp_buf[3]; b[7] = temp_buf[3];
b[8] = temp_buf[4]; b[8] = temp_buf[4];
b[9] = temp_buf[5]; b[9] = temp_buf[5];
b[10]=0; //?? b[10] = 0; //??
} }
uint8_t mke_read_toc(cdrom_t *dev, unsigned char *b, uint8_t track) { uint8_t
mke_read_toc(cdrom_t *dev, unsigned char *b, uint8_t track)
{
track_info_t ti; track_info_t ti;
int first_track; int first_track;
int last_track; int last_track;
//dev->ops->get_tracks(dev, &first_track, &last_track); // dev->ops->get_tracks(dev, &first_track, &last_track);
cdrom_read_toc(dev, temp_buf, CD_TOC_NORMAL, 0, 0, 65536); cdrom_read_toc(dev, temp_buf, CD_TOC_NORMAL, 0, 0, 65536);
first_track = temp_buf[2]; first_track = temp_buf[2];
last_track = temp_buf[3]; last_track = temp_buf[3];
if(track > last_track) return 0; //should we allow +1 here? if (track > last_track)
return 0; // should we allow +1 here?
dev->ops->get_track_info(dev, track, 0, &ti); dev->ops->get_track_info(dev, track, 0, &ti);
b[0]=0x0; b[0] = 0x0;
b[1]=ti.attr; b[1] = ti.attr;
b[2]=ti.number; b[2] = ti.number;
b[3]=0; b[3] = 0;
b[4]=ti.m; b[4] = ti.m;
b[5]=ti.s; b[5] = ti.s;
b[6]=ti.f; b[6] = ti.f;
b[7]=0; b[7] = 0;
return 1; return 1;
} }
uint8_t mke_disc_info(cdrom_t *dev, unsigned char *b) {
uint8_t
mke_disc_info(cdrom_t *dev, unsigned char *b)
{
track_info_t ti; track_info_t ti;
int first_track; int first_track;
int last_track; int last_track;
cdrom_read_toc(dev, temp_buf, CD_TOC_NORMAL, 0, 0, 65536); cdrom_read_toc(dev, temp_buf, CD_TOC_NORMAL, 0, 0, 65536);
first_track = temp_buf[2]; first_track = temp_buf[2];
last_track = temp_buf[3]; last_track = temp_buf[3];
dev->ops->get_track_info(dev, last_track+1, 0, &ti); dev->ops->get_track_info(dev, last_track + 1, 0, &ti);
b[0]=0x0; b[0] = 0x0;
b[1]=first_track; b[1] = first_track;
b[2]=last_track; b[2] = last_track;
b[3]=ti.m; b[3] = ti.m;
b[4]=ti.s; b[4] = ti.s;
b[5]=ti.f; b[5] = ti.f;
return 1; return 1;
} }
uint8_t mke_disc_capacity(cdrom_t *dev, unsigned char *b) { uint8_t
mke_disc_capacity(cdrom_t *dev, unsigned char *b)
{
track_info_t ti; track_info_t ti;
int first_track; int first_track;
int last_track; int last_track;
//dev->ops->get_tracks(dev, &first_track, &last_track); // dev->ops->get_tracks(dev, &first_track, &last_track);
cdrom_read_toc(dev, temp_buf, CD_TOC_NORMAL, 0, 0, 65536); cdrom_read_toc(dev, temp_buf, CD_TOC_NORMAL, 0, 0, 65536);
first_track = temp_buf[2]; first_track = temp_buf[2];
last_track = temp_buf[3]; last_track = temp_buf[3];
dev->ops->get_track_info(dev, last_track+1, 0, &ti); dev->ops->get_track_info(dev, last_track + 1, 0, &ti);
b[0]=ti.m; b[0] = ti.m;
b[1]=ti.s; b[1] = ti.s;
b[2]=ti.f-1; //TODO THIS NEEDS TO HANDLE FRAME 0, JUST BEING LAZY 6AM b[2] = ti.f - 1; // TODO THIS NEEDS TO HANDLE FRAME 0, JUST BEING LAZY 6AM
b[3]=0x08; b[3] = 0x08;
b[4]=0x00; b[4] = 0x00;
return 1; return 1;
} }
uint8_t mke_cdrom_status(cdrom_t *dev, mke_t* mke) { uint8_t
mke_cdrom_status(cdrom_t *dev, mke_t *mke)
{
uint8_t status = 0; uint8_t status = 0;
status |= 2;//this bit seems to always be set? status |= 2; // this bit seems to always be set?
//bit 4 never set? // bit 4 never set?
if (dev->cd_status == CD_STATUS_PLAYING) status |= STAT_PLAY; if (dev->cd_status == CD_STATUS_PLAYING)
if (dev->cd_status == CD_STATUS_PAUSED) status |= STAT_PLAY; status |= STAT_PLAY;
if (fifo8_num_used(&mke->errors_fifo)) status |= 0x10; if (dev->cd_status == CD_STATUS_PAUSED)
status |= 0x20;//always set? status |= STAT_PLAY;
if (fifo8_num_used(&mke->errors_fifo))
status |= 0x10;
status |= 0x20; // always set?
status |= STAT_TRAY; status |= STAT_TRAY;
if (mke->cdrom_dev->cd_status != CD_STATUS_EMPTY) { if (mke->cdrom_dev->cd_status != CD_STATUS_EMPTY) {
status |= STAT_DISK; status |= STAT_DISK;
@@ -192,93 +228,99 @@ uint8_t mke_cdrom_status(cdrom_t *dev, mke_t* mke) {
} }
uint8_t ver[10] = "CR-5630.75"; uint8_t ver[10] = "CR-5630.75";
void MKE_COMMAND(uint8_t value) {
uint16_t i,len;
uint8_t x[12];//this is wasteful handling of buffers for compatibility, but will optimize later.
subchannel_t subc;
int old_cd_status;
if(mke.command_buffer_pending) { void
mke.command_buffer[6-mke.command_buffer_pending+1]=value; mke_command(uint8_t value)
{
uint16_t i, len;
uint8_t x[12]; // this is wasteful handling of buffers for compatibility, but will optimize later.
subchannel_t subc;
int old_cd_status;
if (mke.command_buffer_pending) {
mke.command_buffer[6 - mke.command_buffer_pending + 1] = value;
mke.command_buffer_pending--; mke.command_buffer_pending--;
} }
if(mke.command_buffer[0] == CMD1_ABORT) { if (mke.command_buffer[0] == CMD1_ABORT) {
mke_log("CMD_ABORT\n"); mke_log("CMD_ABORT\n");
//fifo8_reset(&mke.info_fifo); // fifo8_reset(&mke.info_fifo);
fifo8_reset(&mke.info_fifo); fifo8_reset(&mke.info_fifo);
mke.command_buffer[0]=0; mke.command_buffer[0] = 0;
mke.command_buffer_pending=7; mke.command_buffer_pending = 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));
fifo8_push(&mke.info_fifo, mke_cdrom_status(mke.cdrom_dev, &mke)); fifo8_push(&mke.info_fifo, mke_cdrom_status(mke.cdrom_dev, &mke));
} }
if (!mke.command_buffer_pending && mke.command_buffer[0]) { if (!mke.command_buffer_pending && mke.command_buffer[0]) {
mke.command_buffer_pending=7; mke.command_buffer_pending = 7;
switch (mke.command_buffer[0]) { switch (mke.command_buffer[0]) {
case 06: { case 06:
fifo8_reset(&mke.info_fifo); {
cdrom_stop(mke.cdrom_dev); fifo8_reset(&mke.info_fifo);
cdrom_eject(mke.cdrom_dev->id); cdrom_stop(mke.cdrom_dev);
fifo8_push(&mke.info_fifo, mke_cdrom_status(mke.cdrom_dev, &mke)); cdrom_eject(mke.cdrom_dev->id);
break; fifo8_push(&mke.info_fifo, mke_cdrom_status(mke.cdrom_dev, &mke));
} break;
case 07: { }
fifo8_reset(&mke.info_fifo); case 07:
cdrom_reload(mke.cdrom_dev->id); {
fifo8_push(&mke.info_fifo, mke_cdrom_status(mke.cdrom_dev, &mke)); fifo8_reset(&mke.info_fifo);
break; cdrom_reload(mke.cdrom_dev->id);
} fifo8_push(&mke.info_fifo, mke_cdrom_status(mke.cdrom_dev, &mke));
case CMD1_READ: { break;
//cdrom_readsector_raw(mke.cdrom_dev, ) }
uint32_t count = mke.command_buffer[6]; case CMD1_READ:
uint8_t* buf = mke.cdbuffer; {
int len = 0; // cdrom_readsector_raw(mke.cdrom_dev, )
int res = 0; uint32_t count = mke.command_buffer[6];
int error = 0; uint8_t *buf = mke.cdbuffer;
uint64_t lba = MSFtoLBA(mke.command_buffer[1], mke.command_buffer[2], mke.command_buffer[3]); int len = 0;
CHECK_READY(); int res = 0;
while (count) { int error = 0;
if ((res = cdrom_readsector_raw(mke.cdrom_dev, buf, lba, 0, mke.sector_type, mke.sector_flags, &len, 0)) > 0) { uint64_t lba = MSFtoLBA(mke.command_buffer[1], mke.command_buffer[2], mke.command_buffer[3]);
fifo8_push_all(&mke.data_fifo, buf, mke.cdrom_dev->sector_size); CHECK_READY();
lba++; while (count) {
buf += mke.cdrom_dev->sector_size; if ((res = cdrom_readsector_raw(mke.cdrom_dev, buf, lba, 0, mke.sector_type, mke.sector_flags, &len, 0)) > 0) {
} else { fifo8_push_all(&mke.data_fifo, buf, mke.cdrom_dev->sector_size);
fifo8_push(&mke.errors_fifo, res == 0 ? 0x10 : 0x05); lba++;
break; buf += mke.cdrom_dev->sector_size;
} else {
fifo8_push(&mke.errors_fifo, res == 0 ? 0x10 : 0x05);
break;
}
count--;
} }
count--; if (count != 0) {
fifo8_reset(&mke.data_fifo);
}
break;
} }
if (count != 0) {
fifo8_reset(&mke.data_fifo);
}
break;
}
case CMD1_READSUBQ: case CMD1_READSUBQ:
CHECK_READY(); CHECK_READY();
mke_get_subq(mke.cdrom_dev, (uint8_t *)&x); mke_get_subq(mke.cdrom_dev, (uint8_t *) &x);
fifo8_reset(&mke.info_fifo); fifo8_reset(&mke.info_fifo);
//fifo8_push_all(&cdrom.info_fifo, x, 11); // fifo8_push_all(&cdrom.info_fifo, x, 11);
fifo8_push_all(&mke.info_fifo, x, 11); fifo8_push_all(&mke.info_fifo, x, 11);
/* #if 0
for(i=0;i<11;i++) { for (i=0; i < 11; i++) {
cdrom_fifo_write(&cdrom.info_fifo,x[i]); cdrom_fifo_write(&cdrom.info_fifo,x[i]);
} }
*/ #endif
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_SETMODE: //Returns 1 case CMD1_SETMODE: // Returns 1
fifo8_reset(&mke.info_fifo); fifo8_reset(&mke.info_fifo);
mke_log("CMD: SET MODE:"); mke_log("CMD: SET MODE:");
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]);
} }
mke_log("\n"); mke_log("\n");
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}; uint8_t mode[5] = { [1] = 0x08 };
fifo8_push_all(&mke.info_fifo, mode, 5); fifo8_push_all(&mke.info_fifo, mode, 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;
@@ -287,65 +329,67 @@ void MKE_COMMAND(uint8_t value) {
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://6 case CMD1_CAPACITY: // 6
mke_log("DISK CAPACITY\n"); mke_log("DISK CAPACITY\n");
CHECK_READY(); CHECK_READY();
mke_disc_capacity(mke.cdrom_dev, (uint8_t *)&x); mke_disc_capacity(mke.cdrom_dev, (uint8_t *) &x);
//fifo8_push_all(&cdrom.info_fifo, x, 5); // fifo8_push_all(&cdrom.info_fifo, x, 5);
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: //7 case CMD1_DISKINFO: // 7
mke_log("DISK INFO\n"); mke_log("DISK INFO\n");
CHECK_READY(); CHECK_READY();
mke_disc_info(mke.cdrom_dev, (uint8_t *)&x); mke_disc_info(mke.cdrom_dev, (uint8_t *) &x);
fifo8_push_all(&mke.info_fifo, x, 6); fifo8_push_all(&mke.info_fifo, x, 6);
/* #if 0
for(i=0;i<6;i++) { for (i=0; i<6; i++) {
mke_log("%02x ",x[i]); mke_log("%02x ",x[i]);
cdrom_fifo_write(&cdrom.info_fifo,x[i]); cdrom_fifo_write(&cdrom.info_fifo,x[i]);
} }
mke_log("\n"); mke_log("\n");
*/ #endif
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(); CHECK_READY();
fifo8_reset(&mke.info_fifo); fifo8_reset(&mke.info_fifo);
/* #if 0
mke_log("READ TOC:"); mke_log("READ TOC:");
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]);
} }
mke_log(" | "); mke_log(" | ");
*/ #endif
mke_read_toc(mke.cdrom_dev,(uint8_t *)&x,mke.command_buffer[2]); mke_read_toc(mke.cdrom_dev, (uint8_t *) &x, mke.command_buffer[2]);
fifo8_push_all(&mke.info_fifo, x, 8); fifo8_push_all(&mke.info_fifo, x, 8);
/* #if 0
for(i=0;i<8;i++) { for (i=0; i<8; i++) {
mke_log("%02x ",x[i]); mke_log("%02x ",x[i]);
cdrom_fifo_write(&cdrom.info_fifo,x[i]); cdrom_fifo_write(&cdrom.info_fifo,x[i]);
} }
*/ mke_log("\n");
/* mke_log("\n"); */ #endif
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_MSF: case CMD1_PLAY_MSF:
CHECK_READY(); CHECK_READY();
fifo8_reset(&mke.info_fifo); fifo8_reset(&mke.info_fifo);
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]);
} }
mke_log("\n"); mke_log("\n");
//cdrom_audio_playmsf(&cdrom, #if 0
// mke.command_buffer[1], cdrom_audio_playmsf(&cdrom,
// mke.command_buffer[2], mke.command_buffer[1],
// mke.command_buffer[3], mke.command_buffer[2],
// mke.command_buffer[4], mke.command_buffer[3],
// mke.command_buffer[5], mke.command_buffer[4],
// mke.command_buffer[6] mke.command_buffer[5],
//); mke.command_buffer[6]
);
#endif
{ {
int msf = 1; int msf = 1;
int pos = (mke.command_buffer[1] << 16) | (mke.command_buffer[2] << 8) | mke.command_buffer[3]; int pos = (mke.command_buffer[1] << 16) | (mke.command_buffer[2] << 8) | mke.command_buffer[3];
@@ -361,9 +405,9 @@ void MKE_COMMAND(uint8_t value) {
CHECK_READY(); 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);
mke_log("SEEK MSF:"); //TODO: DOES THIS IMPACT CURRENT PLAY LENGTH? mke_log("SEEK MSF:"); // TODO: DOES THIS IMPACT CURRENT PLAY LENGTH?
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]);
} }
cdrom_stop(mke.cdrom_dev); cdrom_stop(mke.cdrom_dev);
@@ -378,7 +422,7 @@ void MKE_COMMAND(uint8_t value) {
CHECK_READY(); 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");
uint8_t session_info[6] = {0}; uint8_t session_info[6] = { 0 };
fifo8_push_all(&mke.info_fifo, session_info, 6); fifo8_push_all(&mke.info_fifo, session_info, 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;
@@ -386,14 +430,14 @@ void MKE_COMMAND(uint8_t value) {
CHECK_READY(); 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);
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:
fifo8_reset(&mke.info_fifo); fifo8_reset(&mke.info_fifo);
mke_log("CMD: READ ERR\n"); mke_log("CMD: READ ERR\n");
//cdrom_read_errors(&cdrom,(uint8_t *)x); // cdrom_read_errors(&cdrom,(uint8_t *)x);
memset(x, 0, 8); memset(x, 0, 8);
if (fifo8_num_used(&mke.errors_fifo)) { if (fifo8_num_used(&mke.errors_fifo)) {
fifo8_pop_buf(&mke.errors_fifo, x, fifo8_num_used(&mke.errors_fifo)); fifo8_pop_buf(&mke.errors_fifo, x, fifo8_num_used(&mke.errors_fifo));
@@ -407,7 +451,7 @@ void MKE_COMMAND(uint8_t value) {
SB2CD Expects 12 bytes, but drive only returns 11. SB2CD Expects 12 bytes, but drive only returns 11.
*/ */
fifo8_reset(&mke.info_fifo); fifo8_reset(&mke.info_fifo);
//pclog("CMD: READ VER\n"); // pclog("CMD: READ VER\n");
fifo8_push_all(&mke.info_fifo, ver, 10); fifo8_push_all(&mke.info_fifo, ver, 10);
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;
@@ -416,31 +460,32 @@ void 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;
default: default:
mke_log("MKE: Unknown Commnad [%02x]\n",mke.command_buffer[0]); mke_log("MKE: Unknown Commnad [%02x]\n", mke.command_buffer[0]);
} }
} else if (!mke.command_buffer_pending) { //we are done byt not in a command. should we make sure it is a valid command here? } else if (!mke.command_buffer_pending) { // we are done byt not in a command. should we make sure it is a valid command here?
mke.command_buffer[0]=value; mke.command_buffer[0] = value;
mke.command_buffer_pending=6; mke.command_buffer_pending = 6;
} }
} }
void
void MKE_WRITE(uint16_t address, uint8_t value, void* priv) { mke_write(uint16_t address, uint8_t value, void *priv)
{
pclog("MKEWRITE: 0x%X, 0x%02X\n", address & 0xf, value); pclog("MKEWRITE: 0x%X, 0x%02X\n", address & 0xf, value);
if(mke.enable_register && ((address & 0xF) != 3)) { if (mke.enable_register && ((address & 0xF) != 3)) {
//mke_log("Ignore Write Unit %u\n",mke.enable_register); // mke_log("Ignore Write Unit %u\n",mke.enable_register);
return; return;
} }
//mke_log("MKE WRITE: %02x => %03x\n",value,address); // mke_log("MKE WRITE: %02x => %03x\n",value,address);
switch(address & 0xF) { switch (address & 0xF) {
case 0: case 0:
MKE_COMMAND(value); mke_command(value);
break; break;
case 1: case 1:
mke.data_select=value; mke.data_select = value;
break; break;
case 3: case 3:
mke.enable_register=value; mke.enable_register = value;
break; break;
default: default:
pclog("w %03x %02x\n", address, value); pclog("w %03x %02x\n", address, value);
@@ -448,52 +493,58 @@ void MKE_WRITE(uint16_t address, uint8_t value, void* priv) {
} }
} }
uint8_t MKE_READ(uint16_t address, void* priv) { uint8_t
mke_read(uint16_t address, void *priv)
{
uint8_t x; uint8_t x;
if(mke.enable_register ) { if (mke.enable_register) {
//pclog("Ignore Read Unit %u\n",mke.enable_register); // pclog("Ignore Read Unit %u\n",mke.enable_register);
return 0; return 0;
} }
//pclog("MKEREAD: 0x%X\n", address & 0xf); // pclog("MKEREAD: 0x%X\n", address & 0xf);
switch(address & 0xF) { switch (address & 0xF) {
case 0://Info case 0: // Info
if(mke.data_select) { if (mke.data_select) {
x = fifo8_num_used(&mke.data_fifo) ? fifo8_pop(&mke.data_fifo) : 0; //cdrom_fifo_read(&cdrom.data_fifo); x = fifo8_num_used(&mke.data_fifo) ? fifo8_pop(&mke.data_fifo) : 0; // cdrom_fifo_read(&cdrom.data_fifo);
} else { } else {
x = fifo8_num_used(&mke.info_fifo) ? fifo8_pop(&mke.info_fifo) : 0; x = fifo8_num_used(&mke.info_fifo) ? fifo8_pop(&mke.info_fifo) : 0;
//return cdrom_fifo_read(&cdrom.info_fifo); // return cdrom_fifo_read(&cdrom.info_fifo);
} }
//pclog("Read FIFO 0x%X, %d\n", x, mke.data_select); // pclog("Read FIFO 0x%X, %d\n", x, mke.data_select);
return x; return x;
break; break;
case 1://Status case 1: // Status
/* /*
1 = Status Change 1 = Status Change
2 = Data Ready 2 = Data Ready
4 = Response Ready 4 = Response Ready
8 = Attention / Issue ? 8 = Attention / Issue ?
*/ */
x=0xFF; x = 0xFF;
//if(cdrom.media_changed) x ^= 1; // if(cdrom.media_changed) x ^= 1;
if(fifo8_num_used(&mke.data_fifo)) x ^= 2;//DATA FIFO if (fifo8_num_used(&mke.data_fifo))
if(fifo8_num_used(&mke.info_fifo)) x ^= 4;//STATUS FIFO x ^= 2; // DATA FIFO
if(fifo8_num_used(&mke.errors_fifo)) x ^=8; if (fifo8_num_used(&mke.info_fifo))
x ^= 4; // STATUS FIFO
if (fifo8_num_used(&mke.errors_fifo))
x ^= 8;
return x; return x;
break; break;
case 2://Data case 2: // Data
return fifo8_num_used(&mke.info_fifo) ? fifo8_pop(&mke.data_fifo) : 0; return fifo8_num_used(&mke.info_fifo) ? fifo8_pop(&mke.data_fifo) : 0;
case 3: case 3:
return mke.enable_register; return mke.enable_register;
break; break;
default: default:
/* mke_log("MKE Unknown Read Address: %03x\n",address); */ /* mke_log("MKE Unknown Read Address: %03x\n",address); */
pclog("MKE Unknown Read Address: %03x\n",address); pclog("MKE Unknown Read Address: %03x\n", address);
break; break;
} }
return 0xff; return 0xff;
} }
void mke_close(void* priv) void
mke_close(void *priv)
{ {
fifo8_destroy(&mke.info_fifo); fifo8_destroy(&mke.info_fifo);
fifo8_destroy(&mke.data_fifo); fifo8_destroy(&mke.data_fifo);
@@ -503,26 +554,27 @@ void mke_close(void* priv)
static void static void
mke_cdrom_insert(void *priv) mke_cdrom_insert(void *priv)
{ {
mke_t *dev = (mke_t *)priv; mke_t *dev = (mke_t *) priv;
if ((dev == NULL) || (dev->cdrom_dev == NULL)) if ((dev == NULL) || (dev->cdrom_dev == NULL))
return; return;
if (dev->cdrom_dev->ops == NULL) { if (dev->cdrom_dev->ops == NULL) {
//dev->unit_attention = 0; // dev->unit_attention = 0;
dev->cdrom_dev->cd_status = CD_STATUS_EMPTY; dev->cdrom_dev->cd_status = CD_STATUS_EMPTY;
fifo8_push(&dev->errors_fifo, 0x11); fifo8_push(&dev->errors_fifo, 0x11);
} else { } else {
//dev->unit_attention = 1; // dev->unit_attention = 1;
/* Turn off the medium changed status. */ /* Turn off the medium changed status. */
dev->cdrom_dev->cd_status &= ~CD_STATUS_TRANSITION; dev->cdrom_dev->cd_status &= ~CD_STATUS_TRANSITION;
fifo8_push(&dev->errors_fifo, 0x11); fifo8_push(&dev->errors_fifo, 0x11);
} }
} }
void* mke_init(const device_t* info) void *
mke_init(const device_t *info)
{ {
cdrom_t* dev; cdrom_t *dev;
memset(&mke, 0, sizeof(mke_t)); memset(&mke, 0, sizeof(mke_t));
for (int i = 0; i < CDROM_NUM; i++) { for (int i = 0; i < CDROM_NUM; i++) {
@@ -541,17 +593,17 @@ void* mke_init(const device_t* info)
fifo8_reset(&mke.info_fifo); fifo8_reset(&mke.info_fifo);
fifo8_reset(&mke.data_fifo); fifo8_reset(&mke.data_fifo);
fifo8_reset(&mke.errors_fifo); fifo8_reset(&mke.errors_fifo);
mke.cdrom_dev = dev; mke.cdrom_dev = dev;
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;
dev->priv = &mke; dev->priv = &mke;
dev->insert = mke_cdrom_insert; dev->insert = mke_cdrom_insert;
dev->cached_sector = -1; dev->cached_sector = -1;
dev->sector_size = 2048; dev->sector_size = 2048;
io_sethandler(0x250, 16, MKE_READ, NULL, NULL, MKE_WRITE, NULL, NULL, &mke); io_sethandler(0x250, 16, mke_read, NULL, NULL, mke_write, NULL, NULL, &mke);
return &mke; return &mke;
} }

View File

@@ -1,6 +1,23 @@
/*
* 86Box A hypervisor and IBM PC system emulator that specializes in
* running old operating systems and software designed for IBM
* PC systems and compatibles from 1981 through fairly recent
* system designs based on the PCI bus.
*
* This file is part of the 86Box distribution.
*
* Panasonic/MKE CD-ROM emulation for the ISA bus.
*
* Authors: Miran Grca, <mgrca8@gmail.com>
* Cacodemon345
*
* Copyright 2022-2025 Miran Grca.
* Copyright 2025 Cacodemon345.
*/
#ifndef CDROM_MKE_H #ifndef CDROM_MKE_H
#define CDROM_MKE_H #define CDROM_MKE_H
extern const device_t mke_cdrom_device; extern const device_t mke_cdrom_device;
#endif /*CDROM_MITSUMI_H*/ #endif /*CDROM_MKE_H*/

View File

@@ -834,8 +834,8 @@ MediaMenu::cdromUpdateMenu(int i)
busName = "SCSI"; busName = "SCSI";
break; break;
case CDROM_BUS_MITSUMI: case CDROM_BUS_MITSUMI:
busName = "Mitsumi"; busName = "Mitsumi";
break; break;
case CDROM_BUS_MKE: case CDROM_BUS_MKE:
busName = "Panasonic/MKE"; busName = "Panasonic/MKE";
break; break;

View File

@@ -62,7 +62,8 @@ private:
uint64_t scsi_tracking[32] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, uint64_t scsi_tracking[32] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
bool mitsumi_tracking, mke_tracking; bool mitsumi_tracking;
bool mke_tracking;
}; };
#endif // QT_SETTINGS_BUS_TRACKING_HPP #endif // QT_SETTINGS_BUS_TRACKING_HPP