This commit is contained in:
waltje
2017-05-29 00:21:02 -04:00
5 changed files with 118 additions and 120 deletions

View File

@@ -1442,26 +1442,19 @@ int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpsz
ghwnd=hwnd; ghwnd=hwnd;
printf("hwndRender;\n");
hwndRender = CreateWindow(L"STATIC", NULL, WS_VISIBLE | WS_CHILD | SS_BITMAP, 0, 0, 1, 1, ghwnd, NULL, hinstance, NULL); hwndRender = CreateWindow(L"STATIC", NULL, WS_VISIBLE | WS_CHILD | SS_BITMAP, 0, 0, 1, 1, ghwnd, NULL, hinstance, NULL);
printf("initpc();\n");
initpc(argc, argv); initpc(argc, argv);
printf("init_cdrom_host_drives();\n");
init_cdrom_host_drives(); init_cdrom_host_drives();
printf("EmulatorStatusBar();\n");
hwndStatus = EmulatorStatusBar(hwnd, IDC_STATUS, hThisInstance); hwndStatus = EmulatorStatusBar(hwnd, IDC_STATUS, hThisInstance);
printf("OriginalStatusBarProcedure;\n");
OriginalStatusBarProcedure = GetWindowLongPtr(hwndStatus, GWLP_WNDPROC); OriginalStatusBarProcedure = GetWindowLongPtr(hwndStatus, GWLP_WNDPROC);
printf("SetWindowLongPtr;\n");
SetWindowLongPtr(hwndStatus, GWL_WNDPROC, (LONG_PTR) &StatusBarProcedure); SetWindowLongPtr(hwndStatus, GWL_WNDPROC, (LONG_PTR) &StatusBarProcedure);
smenu = LoadMenu(hThisInstance, TEXT("StatusBarMenu")); smenu = LoadMenu(hThisInstance, TEXT("StatusBarMenu"));
printf("initmodules();\n");
initmodules(); initmodules();
if (vid_apis[0][vid_api].init(hwndRender) == 0) if (vid_apis[0][vid_api].init(hwndRender) == 0)

View File

@@ -506,14 +506,6 @@ void resetpchard(void)
ide_qua_init(); ide_qua_init();
} }
for (i = 0; i < CDROM_NUM; i++)
{
if (cdrom_drives[i].bus_type == CDROM_BUS_SCSI)
{
SCSIReset(cdrom_drives[i].scsi_device_id, cdrom_drives[i].scsi_device_lun);
}
}
resetide(); resetide();
scsi_card_init(); scsi_card_init();

View File

@@ -1090,6 +1090,7 @@ aha_buf_alloc(Req_t *req, int Is24bit)
uint32_t sg_buffer_pos = 0; uint32_t sg_buffer_pos = 0;
uint32_t DataPointer, DataLength; uint32_t DataPointer, DataLength;
uint32_t SGEntryLength = (Is24bit ? sizeof(SGE) : sizeof(SGE32)); uint32_t SGEntryLength = (Is24bit ? sizeof(SGE) : sizeof(SGE32));
uint32_t Address;
if (Is24bit) { if (Is24bit) {
DataPointer = ADDR_TO_U32(req->CmdBlock.old.DataPointer); DataPointer = ADDR_TO_U32(req->CmdBlock.old.DataPointer);
@@ -1106,8 +1107,6 @@ aha_buf_alloc(Req_t *req, int Is24bit)
free(SCSIDevices[req->TargetID][req->LUN].CmdBuffer); free(SCSIDevices[req->TargetID][req->LUN].CmdBuffer);
SCSIDevices[req->TargetID][req->LUN].CmdBuffer = NULL; SCSIDevices[req->TargetID][req->LUN].CmdBuffer = NULL;
} }
SCSIDevices[req->TargetID][req->LUN].CmdBuffer = (uint8_t *) malloc(DataLength);
memset(SCSIDevices[req->TargetID][req->LUN].CmdBuffer, 0, DataLength);
if ((req->CmdBlock.common.ControlByte != 0x03) && DataLength) { if ((req->CmdBlock.common.ControlByte != 0x03) && DataLength) {
if (req->CmdBlock.common.Opcode == SCATTER_GATHER_COMMAND || if (req->CmdBlock.common.Opcode == SCATTER_GATHER_COMMAND ||
@@ -1126,8 +1125,6 @@ aha_buf_alloc(Req_t *req, int Is24bit)
aha_rd_sge(Is24bit, SGAddrCurrent, SGRead, SGBuffer); aha_rd_sge(Is24bit, SGAddrCurrent, SGRead, SGBuffer);
for (ScatterEntry = 0; ScatterEntry < SGRead; ScatterEntry++) { for (ScatterEntry = 0; ScatterEntry < SGRead; ScatterEntry++) {
uint32_t Address;
pclog("BusLogic S/G Write: ScatterEntry=%u\n", ScatterEntry); pclog("BusLogic S/G Write: ScatterEntry=%u\n", ScatterEntry);
Address = SGBuffer[ScatterEntry].SegmentPointer; Address = SGBuffer[ScatterEntry].SegmentPointer;
@@ -1143,6 +1140,10 @@ aha_buf_alloc(Req_t *req, int Is24bit)
SCSIDevices[req->TargetID][req->LUN].InitLength = DataToTransfer; SCSIDevices[req->TargetID][req->LUN].InitLength = DataToTransfer;
pclog("Allocating buffer for Scatter/Gather (%i bytes)\n", DataToTransfer);
SCSIDevices[req->TargetID][req->LUN].CmdBuffer = (uint8_t *) malloc(DataToTransfer);
memset(SCSIDevices[req->TargetID][req->LUN].CmdBuffer, 0, DataToTransfer);
/* If the control byte is 0x00, it means that the transfer direction is set up by the SCSI command without /* If the control byte is 0x00, it means that the transfer direction is set up by the SCSI command without
checking its length, so do this procedure for both no read/write commands. */ checking its length, so do this procedure for both no read/write commands. */
if ((req->CmdBlock.common.ControlByte == CCB_DATA_XFER_OUT) || if ((req->CmdBlock.common.ControlByte == CCB_DATA_XFER_OUT) ||
@@ -1158,8 +1159,6 @@ aha_buf_alloc(Req_t *req, int Is24bit)
SGRead, SGBuffer); SGRead, SGBuffer);
for (ScatterEntry = 0; ScatterEntry < SGRead; ScatterEntry++) { for (ScatterEntry = 0; ScatterEntry < SGRead; ScatterEntry++) {
uint32_t Address;
pclog("BusLogic S/G Write: ScatterEntry=%u\n", ScatterEntry); pclog("BusLogic S/G Write: ScatterEntry=%u\n", ScatterEntry);
Address = SGBuffer[ScatterEntry].SegmentPointer; Address = SGBuffer[ScatterEntry].SegmentPointer;
@@ -1176,9 +1175,14 @@ aha_buf_alloc(Req_t *req, int Is24bit)
} }
} else if (req->CmdBlock.common.Opcode == SCSI_INITIATOR_COMMAND || } else if (req->CmdBlock.common.Opcode == SCSI_INITIATOR_COMMAND ||
req->CmdBlock.common.Opcode == SCSI_INITIATOR_COMMAND_RES) { req->CmdBlock.common.Opcode == SCSI_INITIATOR_COMMAND_RES) {
uint32_t Address = DataPointer; Address = DataPointer;
SCSIDevices[req->TargetID][req->LUN].InitLength = DataLength; SCSIDevices[req->TargetID][req->LUN].InitLength = DataLength;
pclog("Allocating buffer for direct transfer (%i bytes)\n", DataLength);
SCSIDevices[req->TargetID][req->LUN].CmdBuffer = (uint8_t *) malloc(DataLength);
memset(SCSIDevices[req->TargetID][req->LUN].CmdBuffer, 0, DataLength);
if (DataLength > 0) { if (DataLength > 0) {
DMAPageRead(Address, DMAPageRead(Address,
(char *)SCSIDevices[req->TargetID][req->LUN].CmdBuffer, (char *)SCSIDevices[req->TargetID][req->LUN].CmdBuffer,
@@ -1203,6 +1207,7 @@ aha_buf_free(Req_t *req)
uint32_t SGAddrCurrent; uint32_t SGAddrCurrent;
uint32_t Address; uint32_t Address;
uint32_t Residual; uint32_t Residual;
uint32_t DataToTransfer;
if (req->Is24bit) { if (req->Is24bit) {
DataPointer = ADDR_TO_U32(req->CmdBlock.old.DataPointer); DataPointer = ADDR_TO_U32(req->CmdBlock.old.DataPointer);
@@ -1243,9 +1248,6 @@ aha_buf_free(Req_t *req)
SGRead, SGBuffer); SGRead, SGBuffer);
for (ScatterEntry = 0; ScatterEntry < SGRead; ScatterEntry++) { for (ScatterEntry = 0; ScatterEntry < SGRead; ScatterEntry++) {
uint32_t Address;
uint32_t DataToTransfer;
pclog("BusLogic S/G: ScatterEntry=%u\n", ScatterEntry); pclog("BusLogic S/G: ScatterEntry=%u\n", ScatterEntry);
Address = SGBuffer[ScatterEntry].SegmentPointer; Address = SGBuffer[ScatterEntry].SegmentPointer;
@@ -2202,14 +2204,12 @@ aha_init(int chip, int has_bios)
if (scsi_hard_disks[i][j] != 0xff) { if (scsi_hard_disks[i][j] != 0xff) {
SCSIDevices[i][j].LunType = SCSI_DISK; SCSIDevices[i][j].LunType = SCSI_DISK;
} }
} else if (find_cdrom_for_scsi_id(i, j) != 0xff) {
}
for (i=0; i<16; i++) {
for (j=0; j<8; j++) {
if (find_cdrom_for_scsi_id(i, j) != 0xff) {
SCSIDevices[i][j].LunType = SCSI_CDROM; SCSIDevices[i][j].LunType = SCSI_CDROM;
} }
else {
SCSIDevices[i][j].LunType = SCSI_NONE;
}
} }
} }

View File

@@ -762,8 +762,6 @@ BuslogicDataBufferAllocate(Req_t *req, int Is24bit)
free(SCSIDevices[req->TargetID][req->LUN].CmdBuffer); free(SCSIDevices[req->TargetID][req->LUN].CmdBuffer);
SCSIDevices[req->TargetID][req->LUN].CmdBuffer = NULL; SCSIDevices[req->TargetID][req->LUN].CmdBuffer = NULL;
} }
SCSIDevices[req->TargetID][req->LUN].CmdBuffer = (uint8_t *) malloc(DataLength);
memset(SCSIDevices[req->TargetID][req->LUN].CmdBuffer, 0, DataLength);
if ((req->CmdBlock.common.ControlByte != 0x03) && DataLength) { if ((req->CmdBlock.common.ControlByte != 0x03) && DataLength) {
if (req->CmdBlock.common.Opcode == SCATTER_GATHER_COMMAND || if (req->CmdBlock.common.Opcode == SCATTER_GATHER_COMMAND ||
@@ -799,6 +797,9 @@ BuslogicDataBufferAllocate(Req_t *req, int Is24bit)
SCSIDevices[req->TargetID][req->LUN].InitLength = DataToTransfer; SCSIDevices[req->TargetID][req->LUN].InitLength = DataToTransfer;
SCSIDevices[req->TargetID][req->LUN].CmdBuffer = (uint8_t *) malloc(DataToTransfer);
memset(SCSIDevices[req->TargetID][req->LUN].CmdBuffer, 0, DataToTransfer);
/* If the control byte is 0x00, it means that the transfer direction is set up by the SCSI command without /* If the control byte is 0x00, it means that the transfer direction is set up by the SCSI command without
checking its length, so do this procedure for both no read/write commands. */ checking its length, so do this procedure for both no read/write commands. */
if ((req->CmdBlock.common.ControlByte == CCB_DATA_XFER_OUT) || if ((req->CmdBlock.common.ControlByte == CCB_DATA_XFER_OUT) ||
@@ -835,6 +836,10 @@ BuslogicDataBufferAllocate(Req_t *req, int Is24bit)
uint32_t Address = DataPointer; uint32_t Address = DataPointer;
SCSIDevices[req->TargetID][req->LUN].InitLength = DataLength; SCSIDevices[req->TargetID][req->LUN].InitLength = DataLength;
SCSIDevices[req->TargetID][req->LUN].CmdBuffer = (uint8_t *) malloc(DataLength);
memset(SCSIDevices[req->TargetID][req->LUN].CmdBuffer, 0, DataLength);
if (DataLength > 0) { if (DataLength > 0) {
DMAPageRead(Address, DMAPageRead(Address,
(char *)SCSIDevices[req->TargetID][req->LUN].CmdBuffer, (char *)SCSIDevices[req->TargetID][req->LUN].CmdBuffer,
@@ -2222,22 +2227,17 @@ BuslogicInit(int chip)
pclog("Building SCSI CD-ROM map...\n"); pclog("Building SCSI CD-ROM map...\n");
build_scsi_cdrom_map(); build_scsi_cdrom_map();
for (i=0; i<16; i++) {
for (j=0; j<8; j++)
{
if (scsi_hard_disks[i][j] != 0xff)
{
SCSIDevices[i][j].LunType = SCSI_DISK;
pclog("Found SCSI disk: %02i:%02i\n", i, j);
}
}
}
for (i=0; i<16; i++) { for (i=0; i<16; i++) {
for (j=0; j<8; j++) { for (j=0; j<8; j++) {
if (find_cdrom_for_scsi_id(i, j) != 0xff) { if (scsi_hard_disks[i][j] != 0xff) {
SCSIDevices[i][j].LunType = SCSI_DISK;
}
else if (find_cdrom_for_scsi_id(i, j) != 0xff) {
SCSIDevices[i][j].LunType = SCSI_CDROM; SCSIDevices[i][j].LunType = SCSI_CDROM;
} }
else {
SCSIDevices[i][j].LunType = SCSI_NONE;
}
} }
} }

View File

@@ -966,41 +966,6 @@ static void scsi_hd_data_phase_error(uint8_t id)
scsi_hd_cmd_error(id); scsi_hd_cmd_error(id);
} }
void scsi_hd_update_cdb(uint8_t *cdb, int lba_pos, int number_of_blocks)
{
switch(cdb[0])
{
case GPCMD_READ_6:
case GPCMD_WRITE_6:
cdb[1] = (lba_pos >> 16) & 0xff;
cdb[2] = (lba_pos >> 8) & 0xff;
cdb[3] = lba_pos & 0xff;
break;
case GPCMD_READ_10:
case GPCMD_WRITE_10:
cdb[2] = (lba_pos >> 24) & 0xff;
cdb[3] = (lba_pos >> 16) & 0xff;
cdb[4] = (lba_pos >> 8) & 0xff;
cdb[5] = lba_pos & 0xff;
cdb[7] = (number_of_blocks >> 8) & 0xff;
cdb[8] = number_of_blocks & 0xff;
break;
case GPCMD_READ_12:
case GPCMD_WRITE_12:
cdb[2] = (lba_pos >> 24) & 0xff;
cdb[3] = (lba_pos >> 16) & 0xff;
cdb[4] = (lba_pos >> 8) & 0xff;
cdb[5] = lba_pos & 0xff;
cdb[6] = (number_of_blocks >> 24) & 0xff;
cdb[7] = (number_of_blocks >> 16) & 0xff;
cdb[8] = (number_of_blocks >> 8) & 0xff;
cdb[9] = number_of_blocks & 0xff;
break;
}
}
/*SCSI Sense Initialization*/ /*SCSI Sense Initialization*/
void scsi_hd_sense_code_ok(uint8_t id) void scsi_hd_sense_code_ok(uint8_t id)
{ {
@@ -1124,8 +1089,6 @@ void scsi_hd_reset(uint8_t id)
void scsi_hd_request_sense(uint8_t id, uint8_t *buffer, uint8_t alloc_length) void scsi_hd_request_sense(uint8_t id, uint8_t *buffer, uint8_t alloc_length)
{ {
int is_ua = 0;
/*Will return 18 bytes of 0*/ /*Will return 18 bytes of 0*/
if (alloc_length != 0) if (alloc_length != 0)
{ {
@@ -1140,7 +1103,6 @@ void scsi_hd_request_sense(uint8_t id, uint8_t *buffer, uint8_t alloc_length)
buffer[2]=SENSE_UNIT_ATTENTION; buffer[2]=SENSE_UNIT_ATTENTION;
buffer[12]=ASC_MEDIUM_MAY_HAVE_CHANGED; buffer[12]=ASC_MEDIUM_MAY_HAVE_CHANGED;
buffer[13]=0x00; buffer[13]=0x00;
is_ua = 1;
} }
/* scsi_hd_log("SCSI HD %i: Reporting sense: %02X %02X %02X\n", id, hdbufferb[2], hdbufferb[12], hdbufferb[13]); */ /* scsi_hd_log("SCSI HD %i: Reporting sense: %02X %02X %02X\n", id, hdbufferb[2], hdbufferb[12], hdbufferb[13]); */
@@ -1203,9 +1165,9 @@ void scsi_hd_command(uint8_t id, uint8_t *cdb)
unsigned preamble_len; unsigned preamble_len;
uint32_t alloc_length; uint32_t alloc_length;
uint64_t pos64; uint64_t pos64;
uint64_t full_size = 0;
char device_identify[9] = { '8', '6', 'B', '_', 'H', 'D', '0', '0', 0 }; char device_identify[9] = { '8', '6', 'B', '_', 'H', 'D', '0', '0', 0 };
char device_identify_ex[15] = { '8', '6', 'B', '_', 'H', 'D', '0', '0', ' ', 'v', '1', '.', '0', '0', 0 }; char device_identify_ex[15] = { '8', '6', 'B', '_', 'H', 'D', '0', '0', ' ', 'v', '1', '.', '0', '0', 0 };
char *tempbuffer;
#if 0 #if 0
int CdbLength; int CdbLength;
@@ -1307,7 +1269,13 @@ void scsi_hd_command(uint8_t id, uint8_t *cdb)
break; break;
} }
if (!shdc[id].sector_len) if ((shdc[id].sector_pos > shdc[id].last_sector) || ((shdc[id].sector_pos + shdc[id].sector_len - 1) > shdc[id].last_sector))
{
scsi_hd_lba_out_of_range(id);
return;
}
if ((!shdc[id].sector_len) || (SCSIDevices[hdc[id].scsi_id][hdc[id].scsi_lun].InitLength == 0))
{ {
/* scsi_hd_log("SCSI HD %i: All done - callback set\n", id); */ /* scsi_hd_log("SCSI HD %i: All done - callback set\n", id); */
shdc[id].packet_status = CDROM_PHASE_COMPLETE; shdc[id].packet_status = CDROM_PHASE_COMPLETE;
@@ -1320,16 +1288,23 @@ void scsi_hd_command(uint8_t id, uint8_t *cdb)
pos64 = (uint64_t) shdc[id].sector_pos; pos64 = (uint64_t) shdc[id].sector_pos;
if (shdc[id].requested_blocks > 0) alloc_length = shdc[id].packet_len = max_len << 9;
if ((shdc[id].requested_blocks > 0) && (SCSIDevices[hdc[id].scsi_id][hdc[id].scsi_lun].InitLength > 0))
{ {
shdf[id] = _wfopen(hdc[id].fn, L"rb+"); shdf[id] = _wfopen(hdc[id].fn, L"rb+");
fseeko64(shdf[id], shdc[id].base + (pos64 << 9), SEEK_SET); fseeko64(shdf[id], shdc[id].base + (pos64 << 9), SEEK_SET);
memset(hdbufferb, 0, shdc[id].sector_len << 9); if (alloc_length > SCSIDevices[hdc[id].scsi_id][hdc[id].scsi_lun].InitLength)
fread(hdbufferb, 1, (shdc[id].sector_len << 9), shdf[id]); {
fread(hdbufferb, 1, SCSIDevices[hdc[id].scsi_id][hdc[id].scsi_lun].InitLength, shdf[id]);
}
else
{
fread(hdbufferb, 1, alloc_length, shdf[id]);
}
fclose(shdf[id]); fclose(shdf[id]);
} }
alloc_length = shdc[id].packet_len = max_len << 9;
if (shdc[id].requested_blocks > 1) if (shdc[id].requested_blocks > 1)
{ {
scsi_hd_data_command_finish(id, alloc_length, alloc_length / shdc[id].requested_blocks, alloc_length, 0); scsi_hd_data_command_finish(id, alloc_length, alloc_length / shdc[id].requested_blocks, alloc_length, 0);
@@ -1375,7 +1350,13 @@ void scsi_hd_command(uint8_t id, uint8_t *cdb)
break; break;
} }
if (!shdc[id].sector_len) if ((shdc[id].sector_pos > shdc[id].last_sector) || ((shdc[id].sector_pos + shdc[id].sector_len - 1) > shdc[id].last_sector))
{
scsi_hd_lba_out_of_range(id);
return;
}
if ((!shdc[id].sector_len) || (SCSIDevices[hdc[id].scsi_id][hdc[id].scsi_lun].InitLength == 0))
{ {
/* scsi_hd_log("SCSI HD %i: All done - callback set\n", id); */ /* scsi_hd_log("SCSI HD %i: All done - callback set\n", id); */
shdc[id].packet_status = CDROM_PHASE_COMPLETE; shdc[id].packet_status = CDROM_PHASE_COMPLETE;
@@ -1388,15 +1369,23 @@ void scsi_hd_command(uint8_t id, uint8_t *cdb)
pos64 = (uint64_t) shdc[id].sector_pos; pos64 = (uint64_t) shdc[id].sector_pos;
if (shdc[id].requested_blocks > 0) alloc_length = shdc[id].packet_len = max_len << 9;
if ((shdc[id].requested_blocks > 0) && (SCSIDevices[hdc[id].scsi_id][hdc[id].scsi_lun].InitLength > 0))
{ {
shdf[id] = _wfopen(hdc[id].fn, L"rb+"); shdf[id] = _wfopen(hdc[id].fn, L"rb+");
fseeko64(shdf[id], shdc[id].base + (pos64 << 9), SEEK_SET); fseeko64(shdf[id], shdc[id].base + (pos64 << 9), SEEK_SET);
fwrite(hdbufferb, 1, (shdc[id].sector_len << 9), shdf[id]); if (alloc_length > SCSIDevices[hdc[id].scsi_id][hdc[id].scsi_lun].InitLength)
{
fwrite(hdbufferb, 1, SCSIDevices[hdc[id].scsi_id][hdc[id].scsi_lun].InitLength, shdf[id]);
}
else
{
fwrite(hdbufferb, 1, alloc_length, shdf[id]);
}
fclose(shdf[id]); fclose(shdf[id]);
} }
alloc_length = shdc[id].packet_len = max_len << 9;
if (shdc[id].requested_blocks > 1) if (shdc[id].requested_blocks > 1)
{ {
scsi_hd_data_command_finish(id, alloc_length, alloc_length / shdc[id].requested_blocks, alloc_length, 1); scsi_hd_data_command_finish(id, alloc_length, alloc_length / shdc[id].requested_blocks, alloc_length, 1);
@@ -1444,22 +1433,32 @@ void scsi_hd_command(uint8_t id, uint8_t *cdb)
max_len <<= 8; max_len <<= 8;
max_len |= cdb[4]; max_len |= cdb[4];
if ((!max_len) || (SCSIDevices[hdc[id].scsi_id][hdc[id].scsi_lun].InitLength == 0))
{
/* scsi_hd_log("SCSI HD %i: All done - callback set\n", id); */
shdc[id].packet_status = CDROM_PHASE_COMPLETE;
shdc[id].callback = 20 * SCSI_TIME;
break;
}
tempbuffer = malloc(1024);
if (cdb[1] & 1) if (cdb[1] & 1)
{ {
preamble_len = 4; preamble_len = 4;
size_idx = 3; size_idx = 3;
hdbufferb[idx++] = 05; tempbuffer[idx++] = 05;
hdbufferb[idx++] = cdb[2]; tempbuffer[idx++] = cdb[2];
hdbufferb[idx++] = 0; tempbuffer[idx++] = 0;
idx++; idx++;
switch (cdb[2]) switch (cdb[2])
{ {
case 0x00: case 0x00:
hdbufferb[idx++] = 0x00; tempbuffer[idx++] = 0x00;
hdbufferb[idx++] = 0x83; tempbuffer[idx++] = 0x83;
break; break;
case 0x83: case 0x83:
if (idx + 24 > max_len) if (idx + 24 > max_len)
@@ -1468,10 +1467,10 @@ void scsi_hd_command(uint8_t id, uint8_t *cdb)
return; return;
} }
hdbufferb[idx++] = 0x02; tempbuffer[idx++] = 0x02;
hdbufferb[idx++] = 0x00; tempbuffer[idx++] = 0x00;
hdbufferb[idx++] = 0x00; tempbuffer[idx++] = 0x00;
hdbufferb[idx++] = 20; tempbuffer[idx++] = 20;
ide_padstr8(hdbufferb + idx, 20, "53R141"); /* Serial */ ide_padstr8(hdbufferb + idx, 20, "53R141"); /* Serial */
idx += 20; idx += 20;
@@ -1479,15 +1478,15 @@ void scsi_hd_command(uint8_t id, uint8_t *cdb)
{ {
goto atapi_out; goto atapi_out;
} }
hdbufferb[idx++] = 0x02; tempbuffer[idx++] = 0x02;
hdbufferb[idx++] = 0x01; tempbuffer[idx++] = 0x01;
hdbufferb[idx++] = 0x00; tempbuffer[idx++] = 0x00;
hdbufferb[idx++] = 68; tempbuffer[idx++] = 68;
ide_padstr8(hdbufferb + idx, 8, "86Box"); /* Vendor */ ide_padstr8(tempbuffer + idx, 8, "86Box"); /* Vendor */
idx += 8; idx += 8;
ide_padstr8(hdbufferb + idx, 40, device_identify_ex); /* Product */ ide_padstr8(tempbuffer + idx, 40, device_identify_ex); /* Product */
idx += 40; idx += 40;
ide_padstr8(hdbufferb + idx, 20, "53R141"); /* Product */ ide_padstr8(tempbuffer + idx, 20, "53R141"); /* Product */
idx += 20; idx += 20;
break; break;
default: default:
@@ -1501,30 +1500,44 @@ void scsi_hd_command(uint8_t id, uint8_t *cdb)
preamble_len = 5; preamble_len = 5;
size_idx = 4; size_idx = 4;
memset(hdbufferb, 0, 8); memset(tempbuffer, 0, 8);
hdbufferb[0] = 0; /*SCSI HD*/ tempbuffer[0] = 0; /*SCSI HD*/
if (hdc[id].bus == HDD_BUS_SCSI_REMOVABLE) if (hdc[id].bus == HDD_BUS_SCSI_REMOVABLE)
{ {
hdbufferb[1] = 0x80; /*Removable*/ tempbuffer[1] = 0x80; /*Removable*/
} }
else else
{ {
hdbufferb[1] = 0; /*Fixed*/ tempbuffer[1] = 0; /*Fixed*/
} }
hdbufferb[2] = 0x02; /*SCSI-2 compliant*/ tempbuffer[2] = 0x02; /*SCSI-2 compliant*/
hdbufferb[3] = 0x02; tempbuffer[3] = 0x02;
hdbufferb[4] = 31; tempbuffer[4] = 31;
ide_padstr8(hdbufferb + 8, 8, "86Box"); /* Vendor */ ide_padstr8(tempbuffer + 8, 8, "86Box"); /* Vendor */
ide_padstr8(hdbufferb + 16, 16, device_identify); /* Product */ ide_padstr8(tempbuffer + 16, 16, device_identify); /* Product */
ide_padstr8(hdbufferb + 32, 4, emulator_version); /* Revision */ ide_padstr8(tempbuffer + 32, 4, emulator_version); /* Revision */
idx = 36; idx = 36;
} }
atapi_out: atapi_out:
hdbufferb[size_idx] = idx - preamble_len; tempbuffer[size_idx] = idx - preamble_len;
len=idx; len=idx;
if (len > max_len)
{
len = max_len;
}
if (len > SCSIDevices[hdc[id].scsi_id][hdc[id].scsi_lun].InitLength)
{
len = SCSIDevices[hdc[id].scsi_id][hdc[id].scsi_lun].InitLength;
}
memcpy(hdbufferb, tempbuffer, len);
free(tempbuffer);
scsi_hd_data_command_finish(id, len, len, max_len, 0); scsi_hd_data_command_finish(id, len, len, max_len, 0);
break; break;