TC1995's port of the IBM PS/2 MCA SCSI controller (Spock).
This commit is contained in:
@@ -8,7 +8,7 @@
|
||||
*
|
||||
* Generic CD-ROM drive core.
|
||||
*
|
||||
* Version: @(#)cdrom.c 1.0.9 2019/12/13
|
||||
* Version: @(#)cdrom.c 1.0.10 2020/03/23
|
||||
*
|
||||
* Author: Miran Grca, <mgrca8@gmail.com>
|
||||
*
|
||||
@@ -41,6 +41,8 @@
|
||||
#define MIN_SEEK 2000
|
||||
#define MAX_SEEK 333333
|
||||
|
||||
#define CD_BCD(x) (((x) % 10) | (((x) / 10) << 4))
|
||||
#define CD_DCB(x) ((((x) & 0xf0) >> 4) * 10 + ((x) & 0x0f))
|
||||
|
||||
#pragma pack(push,1)
|
||||
typedef struct {
|
||||
@@ -345,6 +347,72 @@ cdrom_audio_play(cdrom_t *dev, uint32_t pos, uint32_t len, int ismsf)
|
||||
return 1;
|
||||
}
|
||||
|
||||
uint8_t
|
||||
cdrom_audio_track_search(cdrom_t *dev, uint32_t pos, int type, uint8_t playbit)
|
||||
{
|
||||
int m = 0, s = 0, f = 0;
|
||||
|
||||
if (dev->cd_status == CD_STATUS_DATA_ONLY)
|
||||
return 0;
|
||||
|
||||
switch (type) {
|
||||
case 0x40:
|
||||
cdrom_log("Audio Track Search: MSF = %06x, type = %02x\n", pos, type);
|
||||
m = CD_DCB((pos >> 24) & 0xff);
|
||||
s = CD_DCB((pos >> 16) & 0xff);
|
||||
f = CD_DCB((pos >> 8) & 0xff);
|
||||
pos = MSFtoLBA(m, s, f) - 150;
|
||||
break;
|
||||
}
|
||||
|
||||
/* Do this at this point, since it's at this point that we know the
|
||||
actual LBA position to start playing from. */
|
||||
if (!(dev->ops->track_type(dev, pos) & CD_TRACK_AUDIO)) {
|
||||
cdrom_log("CD-ROM %i: LBA %08X not on an audio track\n", dev->id, pos);
|
||||
cdrom_stop(dev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
dev->seek_pos = pos;
|
||||
dev->noplay = !playbit;
|
||||
dev->cd_status = playbit ? CD_STATUS_PLAYING : CD_STATUS_PAUSED;
|
||||
return 1;
|
||||
}
|
||||
|
||||
uint8_t
|
||||
cdrom_toshiba_audio_play(cdrom_t *dev, uint32_t pos, int type)
|
||||
{
|
||||
int m = 0, s = 0, f = 0;
|
||||
|
||||
if (dev->cd_status == CD_STATUS_DATA_ONLY)
|
||||
return 0;
|
||||
|
||||
if (dev->cd_status == CD_STATUS_STOPPED || dev->cd_status == CD_STATUS_PAUSED)
|
||||
dev->cd_status = CD_STATUS_PLAYING;
|
||||
|
||||
/*Preliminary support, revert if too incomplete*/
|
||||
switch (type) {
|
||||
case 0x40:
|
||||
cdrom_log("Toshiba Play Audio: MSF = %06x, type = %02x\n", pos, type);
|
||||
m = CD_DCB((pos >> 24) & 0xff);
|
||||
s = CD_DCB((pos >> 16) & 0xff);
|
||||
f = CD_DCB((pos >> 8) & 0xff);
|
||||
pos = MSFtoLBA(m, s, f) - 150;
|
||||
break;
|
||||
}
|
||||
|
||||
/* Do this at this point, since it's at this point that we know the
|
||||
actual LBA position to start playing from. */
|
||||
if (!(dev->ops->track_type(dev, pos) & CD_TRACK_AUDIO)) {
|
||||
cdrom_log("CD-ROM %i: LBA %08X not on an audio track\n", dev->id, pos);
|
||||
cdrom_stop(dev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
dev->cd_end = pos;
|
||||
dev->cd_buflen = 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
void
|
||||
cdrom_audio_pause_resume(cdrom_t *dev, uint8_t resume)
|
||||
@@ -409,6 +477,38 @@ cdrom_get_current_subchannel(cdrom_t *dev, uint8_t *b, int msf)
|
||||
return ret;
|
||||
}
|
||||
|
||||
uint8_t
|
||||
cdrom_get_current_subcodeq_playstatus(cdrom_t *dev, uint8_t *b)
|
||||
{
|
||||
uint8_t ret;
|
||||
subchannel_t subc;
|
||||
|
||||
dev->ops->get_subchannel(dev, dev->seek_pos, &subc);
|
||||
|
||||
if (dev->cd_status == CD_STATUS_PLAYING)
|
||||
ret = 0x00;
|
||||
else if (dev->cd_status == CD_STATUS_PAUSED) {
|
||||
if (dev->noplay)
|
||||
ret = 0x02;
|
||||
else
|
||||
ret = 0x01;
|
||||
}
|
||||
else
|
||||
ret = 0x03;
|
||||
|
||||
b[0] = subc.attr;
|
||||
b[1] = CD_BCD(subc.track);
|
||||
b[2] = CD_BCD(subc.index);
|
||||
b[3] = CD_BCD(subc.rel_m);
|
||||
b[4] = CD_BCD(subc.rel_s);
|
||||
b[5] = CD_BCD(subc.rel_f);
|
||||
b[6] = CD_BCD(subc.abs_m);
|
||||
b[7] = CD_BCD(subc.abs_s);
|
||||
b[8] = CD_BCD(subc.abs_f);
|
||||
cdrom_log("CD-ROM %i: Returned subcode-q at %02i:%02i.%02i, track=%02x\n", dev->id, b[3], b[4], b[5], b[1]);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int
|
||||
read_toc_normal(cdrom_t *dev, unsigned char *b, unsigned char start_track, int msf)
|
||||
@@ -557,6 +657,44 @@ cdrom_read_toc(cdrom_t *dev, unsigned char *b, int type, unsigned char start_tra
|
||||
return len;
|
||||
}
|
||||
|
||||
void
|
||||
cdrom_read_disc_info_toc(cdrom_t *dev, unsigned char *b, unsigned char track, int type)
|
||||
{
|
||||
track_info_t ti;
|
||||
int first_track, last_track;
|
||||
|
||||
dev->ops->get_tracks(dev, &first_track, &last_track);
|
||||
|
||||
switch (type) {
|
||||
case 0:
|
||||
b[0] = CD_BCD(first_track);
|
||||
b[1] = CD_BCD(last_track);
|
||||
b[2] = 0;
|
||||
b[3] = 0;
|
||||
break;
|
||||
case 1:
|
||||
dev->ops->get_track_info(dev, 0xAA, 0, &ti);
|
||||
b[0] = CD_BCD(ti.m);
|
||||
b[1] = CD_BCD(ti.s);
|
||||
b[2] = CD_BCD(ti.f);
|
||||
b[3] = 0;
|
||||
break;
|
||||
case 2:
|
||||
dev->ops->get_track_info(dev, CD_DCB(track), 0, &ti);
|
||||
b[0] = CD_BCD(ti.m);
|
||||
b[1] = CD_BCD(ti.s);
|
||||
b[2] = CD_BCD(ti.f);
|
||||
b[3] = ti.attr;
|
||||
cdrom_log("CD-ROM %i: Returned Toshiba disc information at %02i:%02i.%02i, track=%d\n", dev->id, b[0], b[1], b[2], CD_DCB(track));
|
||||
break;
|
||||
case 3:
|
||||
b[0] = 0x00; /*TODO: correct it further, mark it as CD-Audio/CD-ROM disc for now*/
|
||||
b[1] = 0;
|
||||
b[2] = 0;
|
||||
b[3] = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
track_type_is_valid(uint8_t id, int type, int flags, int audio, int mode2)
|
||||
|
@@ -112,7 +112,7 @@ typedef struct cdrom {
|
||||
seek_diff, cd_end;
|
||||
|
||||
int host_drive, prev_host_drive,
|
||||
cd_buflen;
|
||||
cd_buflen, noplay;
|
||||
|
||||
const cdrom_ops_t *ops;
|
||||
|
||||
@@ -134,12 +134,17 @@ extern double cdrom_seek_time(cdrom_t *dev);
|
||||
extern void cdrom_stop(cdrom_t *dev);
|
||||
extern int cdrom_audio_callback(cdrom_t *dev, int16_t *output, int len);
|
||||
extern uint8_t cdrom_audio_play(cdrom_t *dev, uint32_t pos, uint32_t len, int ismsf);
|
||||
extern uint8_t cdrom_audio_track_search(cdrom_t *dev, uint32_t pos, int type, uint8_t playbit);
|
||||
extern uint8_t cdrom_toshiba_audio_play(cdrom_t *dev, uint32_t pos, int type);
|
||||
extern void cdrom_audio_pause_resume(cdrom_t *dev, uint8_t resume);
|
||||
extern uint8_t cdrom_get_current_subchannel(cdrom_t *dev, uint8_t *b, int msf);
|
||||
extern uint8_t cdrom_get_current_subcodeq_playstatus(cdrom_t *dev, uint8_t *b);
|
||||
extern int cdrom_read_toc(cdrom_t *dev, unsigned char *b, int type,
|
||||
unsigned char start_track, int msf, int max_len);
|
||||
extern int cdrom_readsector_raw(cdrom_t *dev, uint8_t *buffer, int sector, int ismsf,
|
||||
int cdrom_sector_type, int cdrom_sector_flags, int *len);
|
||||
extern void cdrom_read_disc_info_toc(cdrom_t *dev, unsigned char *b, unsigned char track, int type);
|
||||
|
||||
extern void cdrom_seek(cdrom_t *dev, uint32_t pos);
|
||||
|
||||
extern void cdrom_close_handler(uint8_t id);
|
||||
|
@@ -38,6 +38,7 @@
|
||||
#include "scsi_buslogic.h"
|
||||
#include "scsi_ncr5380.h"
|
||||
#include "scsi_ncr53c8xx.h"
|
||||
#include "scsi_spock.h"
|
||||
#ifdef WALTJE
|
||||
# include "scsi_wd33c93.h"
|
||||
#endif
|
||||
@@ -72,6 +73,7 @@ static SCSI_CARD scsi_cards[] = {
|
||||
#endif
|
||||
{ "[MCA] Adaptec AHA-1640", "aha1640", &aha1640_device, },
|
||||
{ "[MCA] BusLogic BT-640A", "bt640a", &buslogic_640a_device, },
|
||||
{ "[MCA] IBM PS/2 SCSI", "spock", &spock_device, },
|
||||
{ "[PCI] BusLogic BT-958D", "bt958d", &buslogic_pci_device, },
|
||||
{ "[PCI] NCR 53C810", "ncr53c810", &ncr53c810_pci_device, },
|
||||
{ "[PCI] NCR 53C825A", "ncr53c825a", &ncr53c825a_pci_device, },
|
||||
|
@@ -9,7 +9,7 @@
|
||||
* Implementation of the CD-ROM drive with SCSI(-like)
|
||||
* commands, for both ATAPI and SCSI usage.
|
||||
*
|
||||
* Version: @(#)scsi_cdrom.c 1.0.74 2020/01/17
|
||||
* Version: @(#)scsi_cdrom.c 1.0.75 2020/03/23
|
||||
*
|
||||
* Author: Miran Grca, <mgrca8@gmail.com>
|
||||
*
|
||||
@@ -139,9 +139,15 @@ const uint8_t scsi_cdrom_command_flags[0x100] =
|
||||
IMPLEMENTED, /* 0xBD */
|
||||
IMPLEMENTED | CHECK_READY, /* 0xBE */
|
||||
IMPLEMENTED | CHECK_READY, /* 0xBF */
|
||||
0, 0, /* 0xC0-0xC1 */
|
||||
IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xC0 */
|
||||
IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xC1 */
|
||||
IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xC2 */
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC3-0xCC */
|
||||
0, /* 0xC3 */
|
||||
IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xC4 */
|
||||
0, /* 0xC5 */
|
||||
IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xC6 */
|
||||
IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xC7 */
|
||||
0, 0, 0, 0, 0, /* 0xC8-0xCC */
|
||||
IMPLEMENTED | CHECK_READY | SCSI_ONLY, /* 0xCD */
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xCE-0xD9 */
|
||||
IMPLEMENTED | SCSI_ONLY, /* 0xDA */
|
||||
@@ -151,6 +157,7 @@ const uint8_t scsi_cdrom_command_flags[0x100] =
|
||||
};
|
||||
|
||||
static uint64_t scsi_cdrom_mode_sense_page_flags = (GPMODEP_R_W_ERROR_PAGE |
|
||||
GPMODEP_DISCONNECT_PAGE |
|
||||
GPMODEP_CDROM_PAGE |
|
||||
GPMODEP_CDROM_AUDIO_PAGE |
|
||||
GPMODEP_CAPABILITIES_PAGE |
|
||||
@@ -207,7 +214,7 @@ static const mode_sense_pages_t scsi_cdrom_mode_sense_pages_default_scsi =
|
||||
{ {
|
||||
{ 0, 0 },
|
||||
{ GPMODE_R_W_ERROR_PAGE, 6, 0, 5, 0, 0, 0, 0 },
|
||||
{ 0, 0 },
|
||||
{ GPMODE_DISCONNECT_PAGE, 0x0e, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 0, 0 },
|
||||
{ 0, 0 },
|
||||
{ 0, 0 },
|
||||
@@ -254,7 +261,7 @@ static const mode_sense_pages_t scsi_cdrom_mode_sense_pages_changeable =
|
||||
{ {
|
||||
{ 0, 0 },
|
||||
{ GPMODE_R_W_ERROR_PAGE, 6, 0xFF, 0xFF, 0, 0, 0, 0 },
|
||||
{ 0, 0 },
|
||||
{ GPMODE_DISCONNECT_PAGE, 0x0e, 0xFF, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0xFF, 0, 0, 0, 0 },
|
||||
{ 0, 0 },
|
||||
{ 0, 0 },
|
||||
{ 0, 0 },
|
||||
@@ -672,6 +679,8 @@ scsi_cdrom_command_common(scsi_cdrom_t *dev)
|
||||
case 0xb8:
|
||||
case 0xb9:
|
||||
case 0xbe:
|
||||
case 0xc6:
|
||||
case 0xc7:
|
||||
if (dev->current_cdb[0] == 0x42)
|
||||
dev->callback += 40.0;
|
||||
/* Account for seek time. */
|
||||
@@ -1540,6 +1549,26 @@ scsi_cdrom_command(scsi_common_t *sc, uint8_t *cdb)
|
||||
toc_format, ide->cylinder, dev->buffer[1]); */
|
||||
return;
|
||||
|
||||
case GPCMD_READ_DISC_INFORMATION_TOSHIBA:
|
||||
scsi_cdrom_set_phase(dev, SCSI_PHASE_DATA_IN);
|
||||
|
||||
scsi_cdrom_buf_alloc(dev, 65536);
|
||||
|
||||
if ((!dev->drv->ops) && ((cdb[1] & 3) == 2)) {
|
||||
scsi_cdrom_not_ready(dev);
|
||||
return;
|
||||
}
|
||||
|
||||
memset(dev->buffer, 0, 4);
|
||||
|
||||
cdrom_read_disc_info_toc(dev->drv, dev->buffer, cdb[2], cdb[1] & 3);
|
||||
|
||||
len = 4;
|
||||
scsi_cdrom_set_buf_len(dev, BufLen, &len);
|
||||
|
||||
scsi_cdrom_data_command_finish(dev, len, len, len, 0);
|
||||
return;
|
||||
|
||||
case GPCMD_READ_CD_OLD:
|
||||
/* IMPORTANT: Convert the command to new read CD
|
||||
for pass through purposes. */
|
||||
@@ -1980,6 +2009,36 @@ scsi_cdrom_command(scsi_common_t *sc, uint8_t *cdb)
|
||||
scsi_cdrom_data_command_finish(dev, len, len, max_len, 0);
|
||||
break;
|
||||
|
||||
case GPCMD_AUDIO_TRACK_SEARCH:
|
||||
scsi_cdrom_set_phase(dev, SCSI_PHASE_STATUS);
|
||||
if ((dev->drv->host_drive < 1) || (dev->drv->cd_status <= CD_STATUS_DATA_ONLY)) {
|
||||
scsi_cdrom_illegal_mode(dev);
|
||||
break;
|
||||
}
|
||||
pos = (cdb[2] << 24) | (cdb[3] << 16) | (cdb[4] << 8) | cdb[5];
|
||||
ret = cdrom_audio_track_search(dev->drv, pos, cdb[9], cdb[1] & 1);
|
||||
|
||||
if (ret)
|
||||
scsi_cdrom_command_complete(dev);
|
||||
else
|
||||
scsi_cdrom_illegal_mode(dev);
|
||||
break;
|
||||
|
||||
case GPCMD_TOSHIBA_PLAY_AUDIO:
|
||||
scsi_cdrom_set_phase(dev, SCSI_PHASE_STATUS);
|
||||
if ((dev->drv->host_drive < 1) || (dev->drv->cd_status <= CD_STATUS_DATA_ONLY)) {
|
||||
scsi_cdrom_illegal_mode(dev);
|
||||
break;
|
||||
}
|
||||
pos = (cdb[2] << 24) | (cdb[3] << 16) | (cdb[4] << 8) | cdb[5];
|
||||
ret = cdrom_toshiba_audio_play(dev->drv, pos, cdb[9]);
|
||||
|
||||
if (ret)
|
||||
scsi_cdrom_command_complete(dev);
|
||||
else
|
||||
scsi_cdrom_illegal_mode(dev);
|
||||
break;
|
||||
|
||||
case GPCMD_PLAY_AUDIO_10:
|
||||
case GPCMD_PLAY_AUDIO_12:
|
||||
case GPCMD_PLAY_AUDIO_MSF:
|
||||
@@ -1997,13 +2056,13 @@ scsi_cdrom_command(scsi_common_t *sc, uint8_t *cdb)
|
||||
len = (cdb[7] << 8) | cdb[8];
|
||||
break;
|
||||
case GPCMD_PLAY_AUDIO_12:
|
||||
/* This is apparently deprecated in the ATAPI spec, and apparently
|
||||
has been since 1995 (!). Hence I'm having to guess most of it. */
|
||||
msf = 0;
|
||||
pos = (cdb[2] << 24) | (cdb[3] << 16) | (cdb[4] << 8) | cdb[5];
|
||||
len = (cdb[6] << 24) | (cdb[7] << 16) | (cdb[8] << 8) | cdb[9];
|
||||
break;
|
||||
case GPCMD_PLAY_AUDIO_MSF:
|
||||
/* This is apparently deprecated in the ATAPI spec, and apparently
|
||||
has been since 1995 (!). Hence I'm having to guess most of it. */
|
||||
msf = 1;
|
||||
pos = (cdb[3] << 16) | (cdb[4] << 8) | cdb[5];
|
||||
len = (cdb[6] << 16) | (cdb[7] << 8) | cdb[8];
|
||||
@@ -2118,6 +2177,37 @@ scsi_cdrom_command(scsi_common_t *sc, uint8_t *cdb)
|
||||
scsi_cdrom_data_command_finish(dev, len, len, len, 0);
|
||||
break;
|
||||
|
||||
case GPCMD_READ_SUBCODEQ_PLAYING_STATUS:
|
||||
scsi_cdrom_set_phase(dev, SCSI_PHASE_DATA_IN);
|
||||
|
||||
alloc_length = cdb[1] & 0x1f;
|
||||
|
||||
scsi_cdrom_buf_alloc(dev, alloc_length);
|
||||
|
||||
if (!dev->drv->ops) {
|
||||
scsi_cdrom_not_ready(dev);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!alloc_length) {
|
||||
scsi_cdrom_set_phase(dev, SCSI_PHASE_STATUS);
|
||||
scsi_cdrom_log("CD-ROM %i: All done - callback set\n", dev->id);
|
||||
dev->packet_status = PHASE_COMPLETE;
|
||||
dev->callback = 20.0 * CDROM_TIME;
|
||||
scsi_cdrom_set_callback(dev);
|
||||
break;
|
||||
}
|
||||
|
||||
len = alloc_length;
|
||||
|
||||
memset(dev->buffer, 0, len);
|
||||
dev->buffer[0] = cdrom_get_current_subcodeq_playstatus(dev->drv, &dev->buffer[1]);
|
||||
scsi_cdrom_log("Audio Status = %02x\n", dev->buffer[0]);
|
||||
|
||||
scsi_cdrom_set_buf_len(dev, BufLen, &alloc_length);
|
||||
scsi_cdrom_data_command_finish(dev, len, len, len, 0);
|
||||
break;
|
||||
|
||||
case GPCMD_READ_DVD_STRUCTURE:
|
||||
scsi_cdrom_set_phase(dev, SCSI_PHASE_DATA_IN);
|
||||
|
||||
@@ -2177,6 +2267,13 @@ scsi_cdrom_command(scsi_common_t *sc, uint8_t *cdb)
|
||||
scsi_cdrom_command_complete(dev);
|
||||
break;
|
||||
|
||||
case GPCMD_CADDY_EJECT:
|
||||
scsi_cdrom_set_phase(dev, SCSI_PHASE_STATUS);
|
||||
scsi_cdrom_stop(sc);
|
||||
cdrom_eject(dev->id);
|
||||
scsi_cdrom_command_complete(dev);
|
||||
break;
|
||||
|
||||
case GPCMD_INQUIRY:
|
||||
scsi_cdrom_set_phase(dev, SCSI_PHASE_DATA_IN);
|
||||
|
||||
@@ -2221,10 +2318,15 @@ scsi_cdrom_command(scsi_common_t *sc, uint8_t *cdb)
|
||||
dev->buffer[idx++] = 0x01;
|
||||
dev->buffer[idx++] = 0x00;
|
||||
dev->buffer[idx++] = 68;
|
||||
if (dev->drv->bus_type == CDROM_BUS_SCSI)
|
||||
ide_padstr8(dev->buffer + idx, 8, "TOSHIBA"); /* Vendor */
|
||||
else
|
||||
ide_padstr8(dev->buffer + idx, 8, EMU_NAME); /* Vendor */
|
||||
idx += 8;
|
||||
if (dev->drv->bus_type == CDROM_BUS_SCSI)
|
||||
ide_padstr8(dev->buffer + idx, 40, "XM6201TASUN32XCD1103"); /* Product */
|
||||
else
|
||||
ide_padstr8(dev->buffer + idx, 40, device_identify_ex); /* Product */
|
||||
|
||||
idx += 40;
|
||||
ide_padstr8(dev->buffer + idx, 20, "53R141"); /* Product */
|
||||
idx += 20;
|
||||
@@ -2258,9 +2360,15 @@ scsi_cdrom_command(scsi_common_t *sc, uint8_t *cdb)
|
||||
dev->buffer[7] = 0x20; /* Wide bus supported */
|
||||
}
|
||||
|
||||
if (dev->drv->bus_type == CDROM_BUS_SCSI) {
|
||||
ide_padstr8(dev->buffer + 8, 8, "TOSHIBA"); /* Vendor */
|
||||
ide_padstr8(dev->buffer + 16, 16, "XM6201TASUN32XCD"); /* Product */
|
||||
ide_padstr8(dev->buffer + 32, 4, "1103"); /* Revision */
|
||||
} else {
|
||||
ide_padstr8(dev->buffer + 8, 8, EMU_NAME); /* Vendor */
|
||||
ide_padstr8(dev->buffer + 16, 16, device_identify); /* Product */
|
||||
ide_padstr8(dev->buffer + 32, 4, EMU_VERSION); /* Revision */
|
||||
}
|
||||
|
||||
idx = 36;
|
||||
|
||||
@@ -2285,13 +2393,21 @@ atapi_out:
|
||||
scsi_cdrom_command_complete(dev);
|
||||
break;
|
||||
|
||||
#if 0
|
||||
case GPCMD_PAUSE_RESUME_ALT:
|
||||
#endif
|
||||
case GPCMD_PAUSE_RESUME:
|
||||
scsi_cdrom_set_phase(dev, SCSI_PHASE_STATUS);
|
||||
cdrom_audio_pause_resume(dev->drv, cdb[8] & 0x01);
|
||||
scsi_cdrom_command_complete(dev);
|
||||
break;
|
||||
|
||||
case GPCMD_STILL:
|
||||
scsi_cdrom_set_phase(dev, SCSI_PHASE_STATUS);
|
||||
dev->drv->cd_status = CD_STATUS_PAUSED;
|
||||
scsi_cdrom_command_complete(dev);
|
||||
break;
|
||||
|
||||
case GPCMD_SEEK_6:
|
||||
case GPCMD_SEEK_10:
|
||||
scsi_cdrom_set_phase(dev, SCSI_PHASE_STATUS);
|
||||
|
@@ -8,7 +8,7 @@
|
||||
*
|
||||
* Definitions for the generic SCSI device command handler.
|
||||
*
|
||||
* Version: @(#)scsi_device.h 1.0.17 2019/09/26
|
||||
* Version: @(#)scsi_device.h 1.0.18 2020/03/23
|
||||
*
|
||||
* Authors: Miran Grca, <mgrca8@gmail.com>
|
||||
* Fred N. van Kempen, <decwiz@yahoo.com>
|
||||
@@ -102,8 +102,14 @@
|
||||
#define GPCMD_PLAY_CD 0xbc
|
||||
#define GPCMD_MECHANISM_STATUS 0xbd
|
||||
#define GPCMD_READ_CD 0xbe
|
||||
#define GPCMD_SEND_DVD_STRUCTURE 0xbf /* This is for writing only, irrelevant to PCem. */
|
||||
#define GPCMD_SEND_DVD_STRUCTURE 0xbf /* This is for writing only, irrelevant to 86Box. */
|
||||
#define GPCMD_AUDIO_TRACK_SEARCH 0xc0 /* Toshiba Vendor Unique command */
|
||||
#define GPCMD_TOSHIBA_PLAY_AUDIO 0xc1 /* Toshiba Vendor Unique command */
|
||||
#define GPCMD_PAUSE_RESUME_ALT 0xc2
|
||||
#define GPCMD_STILL 0xc2 /* Toshiba Vendor Unique command */
|
||||
#define GPCMD_CADDY_EJECT 0xc4 /* Toshiba Vendor Unique command */
|
||||
#define GPCMD_READ_SUBCODEQ_PLAYING_STATUS 0xc6 /* Toshiba Vendor Unique command */
|
||||
#define GPCMD_READ_DISC_INFORMATION_TOSHIBA 0xc7 /* Toshiba Vendor Unique command */
|
||||
#define GPCMD_SCAN_ALT 0xcd /* Should be equivalent to 0xba */
|
||||
#define GPCMD_SET_SPEED_ALT 0xda /* Should be equivalent to 0xbb */
|
||||
|
||||
|
1159
src/scsi/scsi_spock.c
Normal file
1159
src/scsi/scsi_spock.c
Normal file
File diff suppressed because it is too large
Load Diff
25
src/scsi/scsi_spock.h
Normal file
25
src/scsi/scsi_spock.h
Normal file
@@ -0,0 +1,25 @@
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
* Implementation of the IBM PS/2 SCSI controller with
|
||||
* cache for MCA only.
|
||||
*
|
||||
* Version: @(#)scsi_spock.h 1.0.0 2020/03/10
|
||||
*
|
||||
* Authors: Sarah Walker, <http://pcem-emulator.co.uk/>
|
||||
* TheCollector1995, <mariogplayer@gmail.com>
|
||||
*
|
||||
* Copyright 2020 Sarah Walker.
|
||||
* Copyright 2020 TheCollector1995.
|
||||
*/
|
||||
#ifndef SCSI_SPOCK_H
|
||||
# define SCSI_SPOCK_H
|
||||
|
||||
extern const device_t spock_device;
|
||||
|
||||
#endif /*SCSI_SPOCK_H*/
|
@@ -642,7 +642,8 @@ SCSIOBJ := scsi.o scsi_device.o \
|
||||
scsi_cdrom.o scsi_disk.o \
|
||||
scsi_x54x.o \
|
||||
scsi_aha154x.o scsi_buslogic.o \
|
||||
scsi_ncr5380.o scsi_ncr53c8xx.o
|
||||
scsi_ncr5380.o scsi_ncr53c8xx.o \
|
||||
scsi_spock.o
|
||||
|
||||
NETOBJ := network.o \
|
||||
net_pcap.o \
|
||||
|
@@ -647,7 +647,8 @@ SCSIOBJ := scsi.o scsi_device.o \
|
||||
scsi_cdrom.o scsi_disk.o \
|
||||
scsi_x54x.o \
|
||||
scsi_aha154x.o scsi_buslogic.o \
|
||||
scsi_ncr5380.o scsi_ncr53c8xx.o
|
||||
scsi_ncr5380.o scsi_ncr53c8xx.o \
|
||||
scsi_spock.o
|
||||
|
||||
NETOBJ := network.o \
|
||||
net_pcap.o \
|
||||
|
Reference in New Issue
Block a user