Cleaned up MODE_SELECT blocksize request

OnReadBuffer uses generic buffer and only transfers actual length
This commit is contained in:
Troy 2022-09-11 18:32:29 -04:00
parent 3f279230d9
commit 67d3909dd9
1 changed files with 35 additions and 35 deletions

View File

@ -72,6 +72,7 @@ byte m_sts; // Status byte
byte m_msg; // Message bytes
byte m_buf[MAX_BLOCKSIZE]; // General purpose buffer
byte m_scsi_buf[SCSI_BUF_SIZE]; // Buffer for SCSI READ/WRITE Buffer
unsigned m_scsi_buf_size = 0;
byte m_msb[256]; // Command storage bytes
SCSI_DEVICE scsi_device_list[NUM_SCSIID][NUM_SCSILUN]; // Maximum number
SCSI_INQUIRY_DATA default_hdd, default_optical;
@ -1597,17 +1598,15 @@ byte onModeSense(SCSI_DEVICE *dev, const byte *cdb)
m_buf[a + 1] = 0x16; // Page length
if(pageControl != 1) {
unsigned cylinders = dev->m_blockcount / (16 * 63);
if(pageControl != 1) {
m_buf[a + 2] = (byte)(cylinders >> 16); // Cylinders
m_buf[a + 3] = (byte)(cylinders >> 8);
m_buf[a + 4] = (byte)cylinders;
m_buf[a + 5] = 16; //Number of heads
} else {
m_buf[a + 2] = 0xFF; // Cylinder length
m_buf[a + 3] = 0xFF;
m_buf[a + 4] = 0xFF;
m_buf[a + 5] = 16; //Number of heads
}
m_buf[a + 2] = (byte)(cylinders >> 16); // Cylinders
m_buf[a + 3] = (byte)(cylinders >> 8);
m_buf[a + 4] = (byte)cylinders;
m_buf[a + 5] = 16; //Number of heads
} else {
m_buf[a + 2] = 0xFF; // Cylinder length
m_buf[a + 3] = 0xFF;
m_buf[a + 4] = 0xFF;
m_buf[a + 5] = 16; //Number of heads
}
a += 0x18;
if(pageCode != SCSI_SENSE_MODE_ALL) break;
@ -1759,6 +1758,11 @@ byte onModeSelect(SCSI_DEVICE *dev, const byte *cdb)
if(length > 0x800) { length = 0x800; }
}
if(length == 0)
{
return SCSI_STATUS_GOOD;
}
memset(m_buf, 0, length);
readDataPhase(length, m_buf);
//Apple HD SC Setup sends:
@ -1766,27 +1770,23 @@ byte onModeSelect(SCSI_DEVICE *dev, const byte *cdb)
//I believe mode page 0 set to 10 00 is Disable Unit Attention
//Mode page 1 set to 24 10 08 00 00 00 is TB and PER set, read retry count 16, correction span 8
// Requested change of blocksize
// Only supporting 512 or 2048 for optical devices
if(dev->m_type == SCSI_DEVICE_OPTICAL)
{
// hacky for now
for(unsigned i = 0; i < length; i++)
// check for a block descriptor
if(m_buf[3] == 8)
{
if(m_buf[i] == 8)
// Requested change of blocksize
// Only supporting 512 or 2048 for optical devices
uint32_t new_block_size = ((uint32_t)m_buf[8] << 16) | ((uint32_t)m_buf[10] << 8) | m_buf[9];
switch(new_block_size)
{
// found the block length so we know the offset
// for the desired block length
switch(m_buf[i + 7])
{
// 512
case 2: setBlockLength(dev, 512);
break;
// 2048
case 8: setBlockLength(dev, 2048);
break;
}
case 512: setBlockLength(dev, 512);
break;
case 2048: setBlockLength(dev, 2048);
break;
default: LOG("Err BlockSize:"); LOG(new_block_size); LOG(" ");
}
}
}
@ -1869,16 +1869,16 @@ byte onReadBuffer(SCSI_DEVICE *dev, const byte *cdb)
if (mode == MODE_COMBINED_HEADER_DATA)
{
byte scsi_buf_response[SCSI_BUF_SIZE + 4];
memset(m_buf, 0, 4 + m_scsi_buf_size);
// four byte read buffer header
scsi_buf_response[0] = 0;
scsi_buf_response[1] = (SCSI_BUF_SIZE >> 16) & 0xff;
scsi_buf_response[2] = (SCSI_BUF_SIZE >> 8) & 0xff;
scsi_buf_response[3] = SCSI_BUF_SIZE & 0xff;
m_buf[0] = 0;
m_buf[1] = (SCSI_BUF_SIZE >> 16) & 0xff;
m_buf[2] = (SCSI_BUF_SIZE >> 8) & 0xff;
m_buf[3] = SCSI_BUF_SIZE & 0xff;
// actual data
memcpy((&scsi_buf_response[4]), m_scsi_buf, SCSI_BUF_SIZE);
memcpy((&m_buf[4]), m_scsi_buf, m_scsi_buf_size);
writeDataPhase(SCSI_BUF_SIZE + 4, scsi_buf_response);
writeDataPhase(4 + m_scsi_buf_size, m_buf);
#if DEBUG > 0
for (unsigned i = 0; i < allocLength; i++) {
@ -1890,7 +1890,7 @@ byte onReadBuffer(SCSI_DEVICE *dev, const byte *cdb)
}
else if (mode == MODE_DATA)
{
writeDataPhase(allocLength, m_scsi_buf);
writeDataPhase(m_scsi_buf_size, m_scsi_buf);
#if DEBUG > 0
for (unsigned i = 0; i < allocLength; i++) {
LOGHEX(m_scsi_buf[i]);LOG(" ");