Whitespace cleanups, formatting, license headers
This commit is contained in:
@@ -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 <stdarg.h>
|
||||
#include <stdint.h>
|
||||
@@ -30,14 +46,12 @@ CR-562-B is classified as Family1 in this driver, so uses the CMD1_ prefix.
|
||||
#define CDROM_STATUS_DOUBLE_SPEED 0x02
|
||||
#define CDROM_STATUS_READY 0x01
|
||||
|
||||
|
||||
//Status returned from device
|
||||
// Status returned from device
|
||||
#define STAT_READY 0x01
|
||||
#define STAT_PLAY 0x08
|
||||
#define STAT_ERROR 0x10
|
||||
#define STAT_DISK 0x40
|
||||
#define STAT_TRAY 0x80 //Seems Correct
|
||||
|
||||
#define STAT_TRAY 0x80 // Seems Correct
|
||||
|
||||
#define CMD1_PAUSERESUME 0x0D
|
||||
#define CMD1_RESET 0x0a
|
||||
@@ -46,13 +60,13 @@ CR-562-B is classified as Family1 in this driver, so uses the CMD1_ prefix.
|
||||
#define CMD1_MULTISESS 0x8d
|
||||
#define CMD1_SUBCHANINF 0x11
|
||||
#define CMD1_ABORT 0x08
|
||||
//#define CMD1_PATH_CHECK 0x???
|
||||
// #define CMD1_PATH_CHECK 0x???
|
||||
#define CMD1_SEEK 0x01
|
||||
#define CMD1_READ 0x10
|
||||
#define CMD1_SPINUP 0x02
|
||||
#define CMD1_SPINDOWN 0x06
|
||||
#define CMD1_READ_UPC 0x88
|
||||
//#define CMD1_PLAY 0x???
|
||||
// #define CMD1_PLAY 0x???
|
||||
#define CMD1_PLAY_MSF 0x0e
|
||||
#define CMD1_PLAY_TI 0x0f
|
||||
#define CMD1_STATUS 0x05
|
||||
@@ -78,14 +92,16 @@ typedef struct mke_t {
|
||||
|
||||
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;
|
||||
|
||||
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;
|
||||
|
||||
@@ -95,14 +111,24 @@ mke_t mke;
|
||||
|
||||
#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];
|
||||
|
||||
void mke_get_subq(cdrom_t *dev,uint8_t *b) {
|
||||
//dev->ops->get_subchannel(dev, dev->seek_pos, &subc);
|
||||
//cdrom_get_current_subchannel(dev, &subc);
|
||||
//cdrom_get_current_subcodeq(dev, b);
|
||||
void
|
||||
mke_get_subq(cdrom_t *dev, uint8_t *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);
|
||||
b[0] = 0x80; //?
|
||||
b[1] = ((temp_buf[0] & 0xf) << 4) | ((temp_buf[0] & 0xf0) >> 4);
|
||||
@@ -114,74 +140,84 @@ void mke_get_subq(cdrom_t *dev,uint8_t *b) {
|
||||
b[7] = temp_buf[3];
|
||||
b[8] = temp_buf[4];
|
||||
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;
|
||||
int first_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);
|
||||
first_track = temp_buf[2];
|
||||
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);
|
||||
b[0]=0x0;
|
||||
b[1]=ti.attr;
|
||||
b[2]=ti.number;
|
||||
b[3]=0;
|
||||
b[4]=ti.m;
|
||||
b[5]=ti.s;
|
||||
b[6]=ti.f;
|
||||
b[7]=0;
|
||||
b[0] = 0x0;
|
||||
b[1] = ti.attr;
|
||||
b[2] = ti.number;
|
||||
b[3] = 0;
|
||||
b[4] = ti.m;
|
||||
b[5] = ti.s;
|
||||
b[6] = ti.f;
|
||||
b[7] = 0;
|
||||
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;
|
||||
int first_track;
|
||||
int last_track;
|
||||
cdrom_read_toc(dev, temp_buf, CD_TOC_NORMAL, 0, 0, 65536);
|
||||
first_track = temp_buf[2];
|
||||
last_track = temp_buf[3];
|
||||
dev->ops->get_track_info(dev, last_track+1, 0, &ti);
|
||||
b[0]=0x0;
|
||||
b[1]=first_track;
|
||||
b[2]=last_track;
|
||||
b[3]=ti.m;
|
||||
b[4]=ti.s;
|
||||
b[5]=ti.f;
|
||||
dev->ops->get_track_info(dev, last_track + 1, 0, &ti);
|
||||
b[0] = 0x0;
|
||||
b[1] = first_track;
|
||||
b[2] = last_track;
|
||||
b[3] = ti.m;
|
||||
b[4] = ti.s;
|
||||
b[5] = ti.f;
|
||||
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;
|
||||
int first_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);
|
||||
first_track = temp_buf[2];
|
||||
last_track = temp_buf[3];
|
||||
dev->ops->get_track_info(dev, last_track+1, 0, &ti);
|
||||
b[0]=ti.m;
|
||||
b[1]=ti.s;
|
||||
b[2]=ti.f-1; //TODO THIS NEEDS TO HANDLE FRAME 0, JUST BEING LAZY 6AM
|
||||
b[3]=0x08;
|
||||
b[4]=0x00;
|
||||
dev->ops->get_track_info(dev, last_track + 1, 0, &ti);
|
||||
b[0] = ti.m;
|
||||
b[1] = ti.s;
|
||||
b[2] = ti.f - 1; // TODO THIS NEEDS TO HANDLE FRAME 0, JUST BEING LAZY 6AM
|
||||
b[3] = 0x08;
|
||||
b[4] = 0x00;
|
||||
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;
|
||||
status |= 2;//this bit seems to always be set?
|
||||
//bit 4 never set?
|
||||
if (dev->cd_status == CD_STATUS_PLAYING) status |= STAT_PLAY;
|
||||
if (dev->cd_status == CD_STATUS_PAUSED) status |= STAT_PLAY;
|
||||
if (fifo8_num_used(&mke->errors_fifo)) status |= 0x10;
|
||||
status |= 0x20;//always set?
|
||||
status |= 2; // this bit seems to always be set?
|
||||
// bit 4 never set?
|
||||
if (dev->cd_status == CD_STATUS_PLAYING)
|
||||
status |= STAT_PLAY;
|
||||
if (dev->cd_status == CD_STATUS_PAUSED)
|
||||
status |= STAT_PLAY;
|
||||
if (fifo8_num_used(&mke->errors_fifo))
|
||||
status |= 0x10;
|
||||
status |= 0x20; // always set?
|
||||
status |= STAT_TRAY;
|
||||
if (mke->cdrom_dev->cd_status != CD_STATUS_EMPTY) {
|
||||
status |= STAT_DISK;
|
||||
@@ -192,47 +228,53 @@ uint8_t mke_cdrom_status(cdrom_t *dev, mke_t* mke) {
|
||||
}
|
||||
|
||||
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.
|
||||
|
||||
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) {
|
||||
mke.command_buffer[6-mke.command_buffer_pending+1]=value;
|
||||
if (mke.command_buffer_pending) {
|
||||
mke.command_buffer[6 - mke.command_buffer_pending + 1] = value;
|
||||
mke.command_buffer_pending--;
|
||||
}
|
||||
|
||||
if(mke.command_buffer[0] == CMD1_ABORT) {
|
||||
if (mke.command_buffer[0] == CMD1_ABORT) {
|
||||
mke_log("CMD_ABORT\n");
|
||||
//fifo8_reset(&mke.info_fifo);
|
||||
// fifo8_reset(&mke.info_fifo);
|
||||
fifo8_reset(&mke.info_fifo);
|
||||
mke.command_buffer[0]=0;
|
||||
mke.command_buffer_pending=7;
|
||||
//fifo8_push(&mke.info_fifo, mke_cdrom_status(mke.cdrom_dev, &mke));
|
||||
mke.command_buffer[0] = 0;
|
||||
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));
|
||||
}
|
||||
|
||||
if (!mke.command_buffer_pending && mke.command_buffer[0]) {
|
||||
mke.command_buffer_pending=7;
|
||||
mke.command_buffer_pending = 7;
|
||||
switch (mke.command_buffer[0]) {
|
||||
case 06: {
|
||||
case 06:
|
||||
{
|
||||
fifo8_reset(&mke.info_fifo);
|
||||
cdrom_stop(mke.cdrom_dev);
|
||||
cdrom_eject(mke.cdrom_dev->id);
|
||||
fifo8_push(&mke.info_fifo, mke_cdrom_status(mke.cdrom_dev, &mke));
|
||||
break;
|
||||
}
|
||||
case 07: {
|
||||
case 07:
|
||||
{
|
||||
fifo8_reset(&mke.info_fifo);
|
||||
cdrom_reload(mke.cdrom_dev->id);
|
||||
fifo8_push(&mke.info_fifo, mke_cdrom_status(mke.cdrom_dev, &mke));
|
||||
break;
|
||||
}
|
||||
case CMD1_READ: {
|
||||
//cdrom_readsector_raw(mke.cdrom_dev, )
|
||||
case CMD1_READ:
|
||||
{
|
||||
// cdrom_readsector_raw(mke.cdrom_dev, )
|
||||
uint32_t count = mke.command_buffer[6];
|
||||
uint8_t* buf = mke.cdbuffer;
|
||||
uint8_t *buf = mke.cdbuffer;
|
||||
int len = 0;
|
||||
int res = 0;
|
||||
int error = 0;
|
||||
@@ -256,29 +298,29 @@ void MKE_COMMAND(uint8_t value) {
|
||||
}
|
||||
case CMD1_READSUBQ:
|
||||
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_push_all(&cdrom.info_fifo, x, 11);
|
||||
// fifo8_push_all(&cdrom.info_fifo, x, 11);
|
||||
fifo8_push_all(&mke.info_fifo, x, 11);
|
||||
/*
|
||||
for(i=0;i<11;i++) {
|
||||
#if 0
|
||||
for (i=0; i < 11; i++) {
|
||||
cdrom_fifo_write(&cdrom.info_fifo,x[i]);
|
||||
}
|
||||
*/
|
||||
#endif
|
||||
fifo8_push(&mke.info_fifo, mke_cdrom_status(mke.cdrom_dev, &mke));
|
||||
break;
|
||||
case CMD1_SETMODE: //Returns 1
|
||||
case CMD1_SETMODE: // Returns 1
|
||||
fifo8_reset(&mke.info_fifo);
|
||||
mke_log("CMD: SET MODE:");
|
||||
for(i=0;i<6;i++) {
|
||||
mke_log("%02x ",mke.command_buffer[i+1]);
|
||||
for (i = 0; i < 6; i++) {
|
||||
mke_log("%02x ", mke.command_buffer[i + 1]);
|
||||
}
|
||||
mke_log("\n");
|
||||
fifo8_push(&mke.info_fifo, mke_cdrom_status(mke.cdrom_dev, &mke));
|
||||
break;
|
||||
case CMD1_GETMODE://6
|
||||
case CMD1_GETMODE: // 6
|
||||
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(&mke.info_fifo, mke_cdrom_status(mke.cdrom_dev, &mke));
|
||||
break;
|
||||
@@ -287,65 +329,67 @@ void MKE_COMMAND(uint8_t value) {
|
||||
cdrom_audio_pause_resume(mke.cdrom_dev, mke.command_buffer[1] >> 7);
|
||||
fifo8_push(&mke.info_fifo, mke_cdrom_status(mke.cdrom_dev, &mke));
|
||||
break;
|
||||
case CMD1_CAPACITY://6
|
||||
case CMD1_CAPACITY: // 6
|
||||
mke_log("DISK CAPACITY\n");
|
||||
CHECK_READY();
|
||||
mke_disc_capacity(mke.cdrom_dev, (uint8_t *)&x);
|
||||
//fifo8_push_all(&cdrom.info_fifo, x, 5);
|
||||
mke_disc_capacity(mke.cdrom_dev, (uint8_t *) &x);
|
||||
// fifo8_push_all(&cdrom.info_fifo, x, 5);
|
||||
fifo8_push_all(&mke.info_fifo, x, 5);
|
||||
fifo8_push(&mke.info_fifo, mke_cdrom_status(mke.cdrom_dev, &mke));
|
||||
break;
|
||||
case CMD1_DISKINFO: //7
|
||||
case CMD1_DISKINFO: // 7
|
||||
mke_log("DISK INFO\n");
|
||||
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);
|
||||
/*
|
||||
for(i=0;i<6;i++) {
|
||||
#if 0
|
||||
for (i=0; i<6; i++) {
|
||||
mke_log("%02x ",x[i]);
|
||||
cdrom_fifo_write(&cdrom.info_fifo,x[i]);
|
||||
}
|
||||
mke_log("\n");
|
||||
*/
|
||||
#endif
|
||||
fifo8_push(&mke.info_fifo, mke_cdrom_status(mke.cdrom_dev, &mke));
|
||||
break;
|
||||
case CMD1_READTOC:
|
||||
CHECK_READY();
|
||||
fifo8_reset(&mke.info_fifo);
|
||||
/*
|
||||
#if 0
|
||||
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(" | ");
|
||||
*/
|
||||
mke_read_toc(mke.cdrom_dev,(uint8_t *)&x,mke.command_buffer[2]);
|
||||
#endif
|
||||
mke_read_toc(mke.cdrom_dev, (uint8_t *) &x, mke.command_buffer[2]);
|
||||
fifo8_push_all(&mke.info_fifo, x, 8);
|
||||
/*
|
||||
for(i=0;i<8;i++) {
|
||||
#if 0
|
||||
for (i=0; i<8; i++) {
|
||||
mke_log("%02x ",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));
|
||||
break;
|
||||
case CMD1_PLAY_MSF:
|
||||
CHECK_READY();
|
||||
fifo8_reset(&mke.info_fifo);
|
||||
mke_log("PLAY MSF:");
|
||||
for(i=0;i<6;i++) {
|
||||
mke_log("%02x ",mke.command_buffer[i+1]);
|
||||
for (i = 0; i < 6; i++) {
|
||||
mke_log("%02x ", mke.command_buffer[i + 1]);
|
||||
}
|
||||
mke_log("\n");
|
||||
//cdrom_audio_playmsf(&cdrom,
|
||||
// mke.command_buffer[1],
|
||||
// mke.command_buffer[2],
|
||||
// mke.command_buffer[3],
|
||||
// mke.command_buffer[4],
|
||||
// mke.command_buffer[5],
|
||||
// mke.command_buffer[6]
|
||||
//);
|
||||
#if 0
|
||||
cdrom_audio_playmsf(&cdrom,
|
||||
mke.command_buffer[1],
|
||||
mke.command_buffer[2],
|
||||
mke.command_buffer[3],
|
||||
mke.command_buffer[4],
|
||||
mke.command_buffer[5],
|
||||
mke.command_buffer[6]
|
||||
);
|
||||
#endif
|
||||
{
|
||||
int msf = 1;
|
||||
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();
|
||||
old_cd_status = mke.cdrom_dev->cd_status;
|
||||
fifo8_reset(&mke.info_fifo);
|
||||
mke_log("SEEK MSF:"); //TODO: DOES THIS IMPACT CURRENT PLAY LENGTH?
|
||||
for(i=0;i<6;i++) {
|
||||
mke_log("%02x ",mke.command_buffer[i+1]);
|
||||
mke_log("SEEK MSF:"); // TODO: DOES THIS IMPACT CURRENT PLAY LENGTH?
|
||||
for (i = 0; i < 6; i++) {
|
||||
mke_log("%02x ", mke.command_buffer[i + 1]);
|
||||
}
|
||||
|
||||
cdrom_stop(mke.cdrom_dev);
|
||||
@@ -378,7 +422,7 @@ void MKE_COMMAND(uint8_t value) {
|
||||
CHECK_READY();
|
||||
fifo8_reset(&mke.info_fifo);
|
||||
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(&mke.info_fifo, mke_cdrom_status(mke.cdrom_dev, &mke));
|
||||
break;
|
||||
@@ -386,14 +430,14 @@ void MKE_COMMAND(uint8_t value) {
|
||||
CHECK_READY();
|
||||
fifo8_reset(&mke.info_fifo);
|
||||
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(&mke.info_fifo, mke_cdrom_status(mke.cdrom_dev, &mke));
|
||||
break;
|
||||
case CMD1_READ_ERR:
|
||||
fifo8_reset(&mke.info_fifo);
|
||||
mke_log("CMD: READ ERR\n");
|
||||
//cdrom_read_errors(&cdrom,(uint8_t *)x);
|
||||
// cdrom_read_errors(&cdrom,(uint8_t *)x);
|
||||
memset(x, 0, 8);
|
||||
if (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.
|
||||
*/
|
||||
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(&mke.info_fifo, mke_cdrom_status(mke.cdrom_dev, &mke));
|
||||
break;
|
||||
@@ -416,31 +460,32 @@ void MKE_COMMAND(uint8_t value) {
|
||||
fifo8_push(&mke.info_fifo, mke_cdrom_status(mke.cdrom_dev, &mke));
|
||||
break;
|
||||
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?
|
||||
mke.command_buffer[0]=value;
|
||||
mke.command_buffer_pending=6;
|
||||
} 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_pending = 6;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void MKE_WRITE(uint16_t address, uint8_t value, void* priv) {
|
||||
void
|
||||
mke_write(uint16_t address, uint8_t value, void *priv)
|
||||
{
|
||||
pclog("MKEWRITE: 0x%X, 0x%02X\n", address & 0xf, value);
|
||||
if(mke.enable_register && ((address & 0xF) != 3)) {
|
||||
//mke_log("Ignore Write Unit %u\n",mke.enable_register);
|
||||
if (mke.enable_register && ((address & 0xF) != 3)) {
|
||||
// mke_log("Ignore Write Unit %u\n",mke.enable_register);
|
||||
return;
|
||||
}
|
||||
//mke_log("MKE WRITE: %02x => %03x\n",value,address);
|
||||
switch(address & 0xF) {
|
||||
// mke_log("MKE WRITE: %02x => %03x\n",value,address);
|
||||
switch (address & 0xF) {
|
||||
case 0:
|
||||
MKE_COMMAND(value);
|
||||
mke_command(value);
|
||||
break;
|
||||
case 1:
|
||||
mke.data_select=value;
|
||||
mke.data_select = value;
|
||||
break;
|
||||
case 3:
|
||||
mke.enable_register=value;
|
||||
mke.enable_register = value;
|
||||
break;
|
||||
default:
|
||||
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;
|
||||
if(mke.enable_register ) {
|
||||
//pclog("Ignore Read Unit %u\n",mke.enable_register);
|
||||
if (mke.enable_register) {
|
||||
// pclog("Ignore Read Unit %u\n",mke.enable_register);
|
||||
return 0;
|
||||
}
|
||||
//pclog("MKEREAD: 0x%X\n", address & 0xf);
|
||||
switch(address & 0xF) {
|
||||
case 0://Info
|
||||
if(mke.data_select) {
|
||||
x = fifo8_num_used(&mke.data_fifo) ? fifo8_pop(&mke.data_fifo) : 0; //cdrom_fifo_read(&cdrom.data_fifo);
|
||||
// pclog("MKEREAD: 0x%X\n", address & 0xf);
|
||||
switch (address & 0xF) {
|
||||
case 0: // Info
|
||||
if (mke.data_select) {
|
||||
x = fifo8_num_used(&mke.data_fifo) ? fifo8_pop(&mke.data_fifo) : 0; // cdrom_fifo_read(&cdrom.data_fifo);
|
||||
} else {
|
||||
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;
|
||||
break;
|
||||
case 1://Status
|
||||
case 1: // Status
|
||||
/*
|
||||
1 = Status Change
|
||||
2 = Data Ready
|
||||
4 = Response Ready
|
||||
8 = Attention / Issue ?
|
||||
*/
|
||||
x=0xFF;
|
||||
//if(cdrom.media_changed) x ^= 1;
|
||||
if(fifo8_num_used(&mke.data_fifo)) x ^= 2;//DATA FIFO
|
||||
if(fifo8_num_used(&mke.info_fifo)) x ^= 4;//STATUS FIFO
|
||||
if(fifo8_num_used(&mke.errors_fifo)) x ^=8;
|
||||
x = 0xFF;
|
||||
// if(cdrom.media_changed) x ^= 1;
|
||||
if (fifo8_num_used(&mke.data_fifo))
|
||||
x ^= 2; // DATA FIFO
|
||||
if (fifo8_num_used(&mke.info_fifo))
|
||||
x ^= 4; // STATUS FIFO
|
||||
if (fifo8_num_used(&mke.errors_fifo))
|
||||
x ^= 8;
|
||||
return x;
|
||||
break;
|
||||
case 2://Data
|
||||
case 2: // Data
|
||||
return fifo8_num_used(&mke.info_fifo) ? fifo8_pop(&mke.data_fifo) : 0;
|
||||
case 3:
|
||||
return mke.enable_register;
|
||||
break;
|
||||
default:
|
||||
/* 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;
|
||||
}
|
||||
return 0xff;
|
||||
}
|
||||
|
||||
void mke_close(void* priv)
|
||||
void
|
||||
mke_close(void *priv)
|
||||
{
|
||||
fifo8_destroy(&mke.info_fifo);
|
||||
fifo8_destroy(&mke.data_fifo);
|
||||
@@ -503,26 +554,27 @@ void mke_close(void* priv)
|
||||
static void
|
||||
mke_cdrom_insert(void *priv)
|
||||
{
|
||||
mke_t *dev = (mke_t *)priv;
|
||||
mke_t *dev = (mke_t *) priv;
|
||||
|
||||
if ((dev == NULL) || (dev->cdrom_dev == NULL))
|
||||
return;
|
||||
|
||||
if (dev->cdrom_dev->ops == NULL) {
|
||||
//dev->unit_attention = 0;
|
||||
// dev->unit_attention = 0;
|
||||
dev->cdrom_dev->cd_status = CD_STATUS_EMPTY;
|
||||
fifo8_push(&dev->errors_fifo, 0x11);
|
||||
} else {
|
||||
//dev->unit_attention = 1;
|
||||
// dev->unit_attention = 1;
|
||||
/* Turn off the medium changed status. */
|
||||
dev->cdrom_dev->cd_status &= ~CD_STATUS_TRANSITION;
|
||||
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));
|
||||
|
||||
for (int i = 0; i < CDROM_NUM; i++) {
|
||||
@@ -551,7 +603,7 @@ void* mke_init(const device_t* info)
|
||||
dev->cached_sector = -1;
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
#define CDROM_MKE_H
|
||||
|
||||
extern const device_t mke_cdrom_device;
|
||||
|
||||
#endif /*CDROM_MITSUMI_H*/
|
||||
#endif /*CDROM_MKE_H*/
|
||||
|
||||
@@ -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,
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user