|  | @@ -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(" ");
 |