The CD-ROM READ SUBCHANNEL command now takes into account the allocated length given in the CDB, fixes some infinite DMA loop problems with NCR 810 SCSI CD-ROM drivers;

Removed some MODE SELECT-related leftovers from cdrom.c and scsi_disk.c.
This commit is contained in:
OBattler
2018-01-25 20:17:56 +01:00
parent 6856a77e2d
commit cfe2912aec
2 changed files with 3 additions and 84 deletions

View File

@@ -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.29 2018/01/24
* Version: @(#)cdrom.c 1.0.30 2018/01/25
*
* Author: Miran Grca, <mgrca8@gmail.com>
*
@@ -2265,6 +2265,7 @@ cdrom_readtoc_fallback:
len = alloc_length;
}
len = MIN(len, max_len);
cdrom_set_buf_len(id, BufLen, &len);
cdrom_data_command_finish(id, len, len, len, 0);
@@ -2652,44 +2653,6 @@ void cdrom_pio_request(uint8_t id, uint8_t out)
}
}
/* 0 = Continue transfer; 1 = Continue transfer, IRQ; -1 = Terminate transfer; -2 = Terminate transfer with error */
int cdrom_mode_select_return(uint8_t id, int ret)
{
switch(ret) {
case 0:
/* Invalid field in parameter list. */
case -6:
/* Attempted to write to a non-existent CD-ROM drive (should never occur, but you never know). */
cdrom_invalid_field_pl(id);
cdrom_buf_free(id);
return -2;
case 1:
/* Successful, more data needed. */
if (cdrom[id].pos >= (cdrom[id].packet_len + 2)) {
cdrom[id].pos = 0;
cdrom_command_write(id);
return 1;
}
return 0;
case 2:
/* Successful, more data needed, second byte not yet processed. */
return 0;
case -3:
/* Not initialized. */
case -4:
/* Unknown phase. */
cdrom_illegal_opcode(id);
cdrom_buf_free(id);
return -2;
case -5:
/* Command terminated successfully. */
cdrom_buf_free(id);
return -1;
default:
return -15;
}
}
void cdrom_phase_callback(uint8_t id);
int cdrom_read_from_ide_dma(uint8_t channel)

View File

@@ -6,7 +6,7 @@
*
* Emulation of SCSI fixed and removable disks.
*
* Version: @(#)scsi_disk.c 1.0.15 2018/01/24
* Version: @(#)scsi_disk.c 1.0.16 2018/01/25
*
* Author: Miran Grca, <mgrca8@gmail.com>
*
@@ -485,12 +485,6 @@ static void scsi_hd_command_read_dma(uint8_t id)
}
static void scsi_hd_command_write(uint8_t id)
{
shdc[id].packet_status = CDROM_PHASE_DATA_OUT;
scsi_hd_command_common(id);
}
static void scsi_hd_command_write_dma(uint8_t id)
{
shdc[id].packet_status = CDROM_PHASE_DATA_OUT_DMA;
@@ -1454,44 +1448,6 @@ atapi_out:
}
/* 0 = Continue transfer; 1 = Continue transfer, IRQ; -1 = Terminate transfer; -2 = Terminate transfer with error */
int scsi_hd_mode_select_return(uint8_t id, int ret)
{
switch(ret)
{
case 0:
/* Invalid field in parameter list. */
case -6:
/* Attempted to write to a non-existent SCSI HDD drive (should never occur, but you never know). */
scsi_hd_invalid_field_pl(id);
return -2;
case 1:
/* Successful, more data needed. */
if (shdc[id].pos >= (shdc[id].packet_len + 2))
{
shdc[id].pos = 0;
scsi_hd_command_write(id);
return 1;
}
return 0;
case 2:
/* Successful, more data needed, second byte not yet processed. */
return 0;
case -3:
/* Not initialized. */
case -4:
/* Unknown phase. */
scsi_hd_illegal_opcode(id);
return -2;
case -5:
/* Command terminated successfully. */
/* scsi_hd_command_complete(id); */
return -1;
default:
return -15;
}
}
void scsi_hd_phase_data_in(uint8_t id)
{
uint8_t *hdbufferb = SCSIDevices[hdd[id].scsi_id][hdd[id].scsi_lun].CmdBuffer;