Refactored AHA-154x and BusLogic emulation and made them use a common core;
Fixed AHA-154x scatter/gather transfers; Two-phased SCSI read-direction commands; Made scsi_bus.c use a dynamically malloc'd buffer instead of a giant fixed-size buffer; The AHA-154x/BusLogic thread now uses mutexes; The BusLogic BT-545C is now the BT-545S; Added the BusLogic BT-542BH; The AHA-1542CF now again uses the v2.11 BIOS as the CD booting now works; Applied PCem commit that adds NMI support to the recompiler; Applied PCem commit that adds the IBM XT 286; Applied PCem commits that have to do with sound, including the ES1371; Fixed the NCR5380 output data register; Moved the SLiRP mutex stuff from win.c to the appropriate network files; Added sanity checks to everything in win_thread.c.
This commit is contained in:
@@ -9,7 +9,7 @@
|
||||
* Implementation of the CD-ROM drive with SCSI(-like)
|
||||
* commands, for both ATAPI and SCSI usage.
|
||||
*
|
||||
* Version: @(#)cdrom.c 1.0.16 2017/10/12
|
||||
* Version: @(#)cdrom.c 1.0.17 2017/10/14
|
||||
*
|
||||
* Author: Miran Grca, <mgrca8@gmail.com>
|
||||
*
|
||||
@@ -2279,16 +2279,20 @@ void cdrom_command(uint8_t id, uint8_t *cdb)
|
||||
int track = 0;
|
||||
char device_identify[9] = { '8', '6', 'B', '_', 'C', 'D', '0', '0', 0 };
|
||||
char device_identify_ex[15] = { '8', '6', 'B', '_', 'C', 'D', '0', '0', ' ', 'v', '1', '.', '0', '0', 0 };
|
||||
int32_t blen = 0;
|
||||
int32_t *BufLen;
|
||||
|
||||
#if 1
|
||||
int CdbLength;
|
||||
#endif
|
||||
if (cdrom_drives[id].bus_type == CDROM_BUS_SCSI)
|
||||
{
|
||||
BufLen = &SCSIDevices[cdrom_drives[id].scsi_device_id][cdrom_drives[id].scsi_device_lun].BufferLength;
|
||||
cdrom[id].status &= ~ERR_STAT;
|
||||
}
|
||||
else
|
||||
{
|
||||
BufLen = &blen;
|
||||
cdrom[id].error = 0;
|
||||
}
|
||||
|
||||
@@ -2355,13 +2359,13 @@ void cdrom_command(uint8_t id, uint8_t *cdb)
|
||||
SCSIPhase = SCSI_PHASE_DATA_IN;
|
||||
if (cdrom_drives[id].bus_type == CDROM_BUS_SCSI)
|
||||
{
|
||||
if ((SCSI_BufferLength == -1) || (cdb[4] < SCSI_BufferLength))
|
||||
if ((*BufLen == -1) || (cdb[4] < *BufLen))
|
||||
{
|
||||
SCSI_BufferLength = cdb[4];
|
||||
*BufLen = cdb[4];
|
||||
}
|
||||
if (SCSI_BufferLength < cdb[4])
|
||||
if (*BufLen < cdb[4])
|
||||
{
|
||||
cdb[4] = SCSI_BufferLength;
|
||||
cdb[4] = *BufLen;
|
||||
}
|
||||
}
|
||||
cdrom_request_sense(id, cdbufferb, cdb[4]);
|
||||
@@ -2370,7 +2374,7 @@ void cdrom_command(uint8_t id, uint8_t *cdb)
|
||||
|
||||
case GPCMD_SET_SPEED:
|
||||
case GPCMD_SET_SPEED_ALT:
|
||||
SCSIPhase = SCSI_PHASE_DATA_IN;
|
||||
SCSIPhase = SCSI_PHASE_STATUS;
|
||||
cdrom_command_complete(id);
|
||||
break;
|
||||
|
||||
@@ -2379,9 +2383,9 @@ void cdrom_command(uint8_t id, uint8_t *cdb)
|
||||
|
||||
len = (cdb[7] << 16) | (cdb[8] << 8) | cdb[9];
|
||||
|
||||
if ((SCSI_BufferLength == -1) || (len < SCSI_BufferLength))
|
||||
if ((*BufLen == -1) || (len < *BufLen))
|
||||
{
|
||||
SCSI_BufferLength = len;
|
||||
*BufLen = len;
|
||||
}
|
||||
|
||||
memset(cdbufferb, 0, 8);
|
||||
@@ -2410,9 +2414,9 @@ void cdrom_command(uint8_t id, uint8_t *cdb)
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((SCSI_BufferLength == -1) || (len < SCSI_BufferLength))
|
||||
if ((*BufLen == -1) || (len < *BufLen))
|
||||
{
|
||||
SCSI_BufferLength = len;
|
||||
*BufLen = len;
|
||||
}
|
||||
}
|
||||
alloc_length = cdbufferb[0];
|
||||
@@ -2460,9 +2464,9 @@ cdrom_readtoc_fallback:
|
||||
cdbufferb[1] = (len - 2) & 0xff;
|
||||
}
|
||||
|
||||
if ((SCSI_BufferLength == -1) || (len < SCSI_BufferLength))
|
||||
if ((*BufLen == -1) || (len < *BufLen))
|
||||
{
|
||||
SCSI_BufferLength = len;
|
||||
*BufLen = len;
|
||||
}
|
||||
|
||||
cdrom_data_command_finish(id, len, len, len, 0);
|
||||
@@ -2543,9 +2547,9 @@ cdrom_readtoc_fallback:
|
||||
|
||||
cdrom[id].packet_len = max_len * alloc_length;
|
||||
|
||||
if ((SCSI_BufferLength == -1) || (cdrom[id].packet_len < SCSI_BufferLength))
|
||||
if ((*BufLen == -1) || (cdrom[id].packet_len < *BufLen))
|
||||
{
|
||||
SCSI_BufferLength = cdrom[id].packet_len;
|
||||
*BufLen = cdrom[id].packet_len;
|
||||
}
|
||||
|
||||
if (cdrom[id].requested_blocks > 1)
|
||||
@@ -2579,9 +2583,9 @@ cdrom_readtoc_fallback:
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((SCSI_BufferLength == -1) || (len < SCSI_BufferLength))
|
||||
if ((*BufLen == -1) || (len < *BufLen))
|
||||
{
|
||||
SCSI_BufferLength = len;
|
||||
*BufLen = len;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2607,9 +2611,9 @@ cdrom_readtoc_fallback:
|
||||
len = 8;
|
||||
}
|
||||
|
||||
if ((SCSI_BufferLength == -1) || (len < SCSI_BufferLength))
|
||||
if ((*BufLen == -1) || (len < *BufLen))
|
||||
{
|
||||
SCSI_BufferLength = len;
|
||||
*BufLen = len;
|
||||
}
|
||||
|
||||
cdrom_data_command_finish(id, len, len, len, 0);
|
||||
@@ -2688,9 +2692,9 @@ cdrom_readtoc_fallback:
|
||||
alloc_length = len;
|
||||
}
|
||||
|
||||
if ((SCSI_BufferLength == -1) || (alloc_length < SCSI_BufferLength))
|
||||
if ((*BufLen == -1) || (alloc_length < *BufLen))
|
||||
{
|
||||
SCSI_BufferLength = alloc_length;
|
||||
*BufLen = alloc_length;
|
||||
}
|
||||
|
||||
cdrom_log("CD-ROM %i: Reading mode page: %02X...\n", id, cdb[2]);
|
||||
@@ -2711,9 +2715,9 @@ cdrom_readtoc_fallback:
|
||||
len = (cdb[7] << 8) | cdb[8];
|
||||
}
|
||||
|
||||
if ((SCSI_BufferLength == -1) || (len < SCSI_BufferLength))
|
||||
if ((*BufLen == -1) || (len < *BufLen))
|
||||
{
|
||||
SCSI_BufferLength = len;
|
||||
*BufLen = len;
|
||||
}
|
||||
|
||||
ret = cdrom_mode_select_init(id, cdb[0], len, cdb[1] & 1);
|
||||
@@ -2773,9 +2777,9 @@ cdrom_readtoc_fallback:
|
||||
cdbufferb[2] = ((alloc_length - 4) >> 8) & 0xff;
|
||||
cdbufferb[3] = (alloc_length - 4) & 0xff;
|
||||
|
||||
if ((SCSI_BufferLength == -1) || (len < SCSI_BufferLength))
|
||||
if ((*BufLen == -1) || (len < *BufLen))
|
||||
{
|
||||
SCSI_BufferLength = len;
|
||||
*BufLen = len;
|
||||
}
|
||||
|
||||
cdrom_data_command_finish(id, len, len, alloc_length, 0);
|
||||
@@ -2839,9 +2843,9 @@ cdrom_readtoc_fallback:
|
||||
|
||||
memcpy(cdbufferb, gesn_event_header, 4);
|
||||
|
||||
if ((SCSI_BufferLength == -1) || (used_len < SCSI_BufferLength))
|
||||
if ((*BufLen == -1) || (used_len < *BufLen))
|
||||
{
|
||||
SCSI_BufferLength = used_len;
|
||||
*BufLen = used_len;
|
||||
}
|
||||
|
||||
cdrom_data_command_finish(id, used_len, used_len, used_len, 0);
|
||||
@@ -2883,9 +2887,9 @@ cdrom_readtoc_fallback:
|
||||
len=34;
|
||||
}
|
||||
|
||||
if ((SCSI_BufferLength == -1) || (len < SCSI_BufferLength))
|
||||
if ((*BufLen == -1) || (len < *BufLen))
|
||||
{
|
||||
SCSI_BufferLength = len;
|
||||
*BufLen = len;
|
||||
}
|
||||
|
||||
cdrom_data_command_finish(id, len, len, max_len, 0);
|
||||
@@ -2951,9 +2955,9 @@ cdrom_readtoc_fallback:
|
||||
}
|
||||
}
|
||||
|
||||
if ((SCSI_BufferLength == -1) || (len < SCSI_BufferLength))
|
||||
if ((*BufLen == -1) || (len < *BufLen))
|
||||
{
|
||||
SCSI_BufferLength = len;
|
||||
*BufLen = len;
|
||||
}
|
||||
|
||||
cdrom_data_command_finish(id, len, len, max_len, 0);
|
||||
@@ -3120,9 +3124,9 @@ cdrom_readtoc_fallback:
|
||||
}
|
||||
}
|
||||
|
||||
if ((SCSI_BufferLength == -1) || (len < SCSI_BufferLength))
|
||||
if ((*BufLen == -1) || (len < *BufLen))
|
||||
{
|
||||
SCSI_BufferLength = len;
|
||||
*BufLen = len;
|
||||
}
|
||||
|
||||
cdrom_data_command_finish(id, len, len, max_len, 0);
|
||||
@@ -3140,9 +3144,9 @@ cdrom_readtoc_fallback:
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((SCSI_BufferLength == -1) || (len < SCSI_BufferLength))
|
||||
if ((*BufLen == -1) || (len < *BufLen))
|
||||
{
|
||||
SCSI_BufferLength = len;
|
||||
*BufLen = len;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3190,9 +3194,9 @@ cdrom_readtoc_fallback:
|
||||
{
|
||||
ret = cdrom_read_dvd_structure(id, format, cdb, cdbufferb);
|
||||
|
||||
if ((SCSI_BufferLength == -1) || (alloc_length < SCSI_BufferLength))
|
||||
if ((*BufLen == -1) || (alloc_length < *BufLen))
|
||||
{
|
||||
SCSI_BufferLength = alloc_length;
|
||||
*BufLen = alloc_length;
|
||||
}
|
||||
|
||||
if (ret)
|
||||
@@ -3327,9 +3331,9 @@ atapi_out:
|
||||
cdbufferb[size_idx] = idx - preamble_len;
|
||||
len=idx;
|
||||
|
||||
if ((SCSI_BufferLength == -1) || (len < SCSI_BufferLength))
|
||||
if ((*BufLen == -1) || (len < *BufLen))
|
||||
{
|
||||
SCSI_BufferLength = len;
|
||||
*BufLen = len;
|
||||
}
|
||||
|
||||
cdrom_data_command_finish(id, len, len, max_len, 0);
|
||||
@@ -3396,9 +3400,9 @@ atapi_out:
|
||||
return;
|
||||
}
|
||||
|
||||
if ((SCSI_BufferLength == -1) || (len < SCSI_BufferLength))
|
||||
if ((*BufLen == -1) || (len < *BufLen))
|
||||
{
|
||||
SCSI_BufferLength = len;
|
||||
*BufLen = len;
|
||||
}
|
||||
|
||||
cdrom_data_command_finish(id, len, len, len, 0);
|
||||
@@ -3591,6 +3595,7 @@ int cdrom_read_from_scsi_dma(uint8_t scsi_id, uint8_t scsi_lun)
|
||||
uint8_t *cdbufferb;
|
||||
|
||||
uint8_t id = scsi_cdrom_drives[scsi_id][scsi_lun];
|
||||
int32_t *BufLen = &SCSIDevices[scsi_id][scsi_lun].BufferLength;
|
||||
|
||||
cdbufferb = (uint8_t *) cdrom[id].buffer;
|
||||
|
||||
@@ -3599,14 +3604,15 @@ int cdrom_read_from_scsi_dma(uint8_t scsi_id, uint8_t scsi_lun)
|
||||
return 0;
|
||||
}
|
||||
|
||||
cdrom_log("Reading from SCSI DMA: SCSI ID %02X, init length %i\n", scsi_id, SCSI_BufferLength);
|
||||
memcpy(cdbufferb, SCSIDevices[scsi_id][scsi_lun].CmdBuffer, SCSI_BufferLength);
|
||||
cdrom_log("Reading from SCSI DMA: SCSI ID %02X, init length %i\n", scsi_id, *BufLen);
|
||||
memcpy(cdbufferb, SCSIDevices[scsi_id][scsi_lun].CmdBuffer, *BufLen);
|
||||
return 1;
|
||||
}
|
||||
|
||||
int cdrom_read_from_dma(uint8_t id)
|
||||
{
|
||||
uint8_t *cdbufferb = (uint8_t *) cdrom[id].buffer;
|
||||
int32_t *BufLen = &SCSIDevices[cdrom_drives[id].scsi_device_id][cdrom_drives[id].scsi_device_lun].BufferLength;
|
||||
|
||||
int i = 0;
|
||||
int ret = 0;
|
||||
@@ -3629,7 +3635,7 @@ int cdrom_read_from_dma(uint8_t id)
|
||||
|
||||
if (cdrom_drives[id].bus_type == CDROM_BUS_SCSI)
|
||||
{
|
||||
in_data_length = SCSI_BufferLength;
|
||||
in_data_length = *BufLen;
|
||||
cdrom_log("CD-ROM %i: SCSI Input data length: %i\n", id, in_data_length);
|
||||
}
|
||||
else
|
||||
@@ -3714,6 +3720,7 @@ int cdrom_write_to_scsi_dma(uint8_t scsi_id, uint8_t scsi_lun)
|
||||
uint8_t *cdbufferb;
|
||||
|
||||
uint8_t id = scsi_cdrom_drives[scsi_id][scsi_lun];
|
||||
int32_t *BufLen = &SCSIDevices[scsi_id][scsi_lun].BufferLength;
|
||||
|
||||
if (id > CDROM_NUM)
|
||||
{
|
||||
@@ -3722,8 +3729,8 @@ int cdrom_write_to_scsi_dma(uint8_t scsi_id, uint8_t scsi_lun)
|
||||
|
||||
cdbufferb = (uint8_t *) cdrom[id].buffer;
|
||||
|
||||
cdrom_log("Writing to SCSI DMA: SCSI ID %02X, init length %i\n", scsi_id, SCSI_BufferLength);
|
||||
memcpy(SCSIDevices[scsi_id][scsi_lun].CmdBuffer, cdbufferb, SCSI_BufferLength);
|
||||
cdrom_log("Writing to SCSI DMA: SCSI ID %02X, init length %i\n", scsi_id, *BufLen);
|
||||
memcpy(SCSIDevices[scsi_id][scsi_lun].CmdBuffer, cdbufferb, *BufLen);
|
||||
cdrom_log("CD-ROM %i: Data from CD buffer: %02X %02X %02X %02X %02X %02X %02X %02X\n", id, cdbufferb[0], cdbufferb[1], cdbufferb[2], cdbufferb[3], cdbufferb[4], cdbufferb[5], cdbufferb[6], cdbufferb[7]);
|
||||
cdrom_log("CD-ROM %i: Data from SCSI DMA : %02X %02X %02X %02X %02X %02X %02X %02X\n", id, SCSIDevices[scsi_id][scsi_lun].CmdBuffer[0], SCSIDevices[scsi_id][scsi_lun].CmdBuffer[1], SCSIDevices[scsi_id][scsi_lun].CmdBuffer[2], SCSIDevices[scsi_id][scsi_lun].CmdBuffer[3], SCSIDevices[scsi_id][scsi_lun].CmdBuffer[4], SCSIDevices[scsi_id][scsi_lun].CmdBuffer[5], SCSIDevices[scsi_id][scsi_lun].CmdBuffer[6], SCSIDevices[scsi_id][scsi_lun].CmdBuffer[7]);
|
||||
return 1;
|
||||
@@ -3735,6 +3742,7 @@ int cdrom_write_to_dma(uint8_t id)
|
||||
|
||||
if (cdrom_drives[id].bus_type == CDROM_BUS_SCSI)
|
||||
{
|
||||
cdrom_log("Write to SCSI DMA: (%02X:%02X)\n", cdrom_drives[id].scsi_device_id, cdrom_drives[id].scsi_device_lun);
|
||||
ret = cdrom_write_to_scsi_dma(cdrom_drives[id].scsi_device_id, cdrom_drives[id].scsi_device_lun);
|
||||
}
|
||||
else
|
||||
|
||||
Reference in New Issue
Block a user