|  | @@ -215,8 +215,9 @@ bool VerifyISOPVD(SCSI_DEVICE *dev, unsigned sector_size, bool mode2)
 | 
	
		
			
				|  |  |  bool hddimageOpen(SCSI_DEVICE *dev, FsFile *file,int id,int lun,int blocksize)
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  |    dev->m_fileSize= 0;
 | 
	
		
			
				|  |  | -  dev->m_offset = 0;
 | 
	
		
			
				|  |  | +  dev->m_sector_offset = 0;
 | 
	
		
			
				|  |  |    dev->m_blocksize = blocksize;
 | 
	
		
			
				|  |  | +  dev->m_rawblocksize = blocksize;
 | 
	
		
			
				|  |  |    dev->m_file = file;
 | 
	
		
			
				|  |  |    if(!dev->m_file->isOpen()) { goto failed; }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -229,25 +230,25 @@ bool hddimageOpen(SCSI_DEVICE *dev, FsFile *file,int id,int lun,int blocksize)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    if(dev->m_type == SCSI_DEVICE_OPTICAL) {
 | 
	
		
			
				|  |  |      LOG_FILE.print(" CDROM");
 | 
	
		
			
				|  |  | +    dev->m_blocksize = CDROM_COMMON_SECTORSIZE;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      // Borrowed from PCEM
 | 
	
		
			
				|  |  |      if(VerifyISOPVD(dev, CDROM_COMMON_SECTORSIZE, false)) {
 | 
	
		
			
				|  |  | -      dev->m_blocksize = CDROM_COMMON_SECTORSIZE;
 | 
	
		
			
				|  |  | +      dev->m_rawblocksize = CDROM_COMMON_SECTORSIZE;
 | 
	
		
			
				|  |  |        dev->m_mode2 = false;
 | 
	
		
			
				|  |  |      } else if(VerifyISOPVD(dev, CDROM_RAW_SECTORSIZE, false)) {
 | 
	
		
			
				|  |  | -      dev->m_blocksize = CDROM_RAW_SECTORSIZE;
 | 
	
		
			
				|  |  | -      dev->m_rawblocksize = CDROM_COMMON_SECTORSIZE;
 | 
	
		
			
				|  |  | +      dev->m_rawblocksize = CDROM_RAW_SECTORSIZE;
 | 
	
		
			
				|  |  |        dev->m_mode2 = false;
 | 
	
		
			
				|  |  |        dev->m_raw = true;
 | 
	
		
			
				|  |  | -      dev->m_offset = 16;
 | 
	
		
			
				|  |  | +      dev->m_sector_offset = 16;
 | 
	
		
			
				|  |  |      } else if(VerifyISOPVD(dev, 2336, true)) {
 | 
	
		
			
				|  |  | -      dev->m_blocksize = 2336;
 | 
	
		
			
				|  |  | +      dev->m_rawblocksize = 2336;
 | 
	
		
			
				|  |  |        dev->m_mode2 = true;
 | 
	
		
			
				|  |  |      } else if(VerifyISOPVD(dev, CDROM_RAW_SECTORSIZE, true)) {
 | 
	
		
			
				|  |  | -      dev->m_blocksize = CDROM_RAW_SECTORSIZE;
 | 
	
		
			
				|  |  | +      dev->m_rawblocksize = CDROM_RAW_SECTORSIZE;
 | 
	
		
			
				|  |  |        dev->m_mode2 = true;
 | 
	
		
			
				|  |  |        dev->m_raw = true;
 | 
	
		
			
				|  |  | -      dev->m_offset = 16;
 | 
	
		
			
				|  |  | +      dev->m_sector_offset = 24;
 | 
	
		
			
				|  |  |      } else {
 | 
	
		
			
				|  |  |        // Last ditch effort
 | 
	
		
			
				|  |  |        // size must be less than 700MB
 | 
	
	
		
			
				|  | @@ -282,7 +283,7 @@ bool hddimageOpen(SCSI_DEVICE *dev, FsFile *file,int id,int lun,int blocksize)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    if(dev->m_type == SCSI_DEVICE_OPTICAL) {
 | 
	
		
			
				|  |  |      LOG_FILE.print(" MODE2:");LOG_FILE.print(dev->m_mode2);
 | 
	
		
			
				|  |  | -    LOG_FILE.print(" BlockSize:");LOG_FILE.println(dev->m_blocksize);
 | 
	
		
			
				|  |  | +    LOG_FILE.print(" BlockSize:");LOG_FILE.println(dev->m_rawblocksize);
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |    return true; // File opened
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -927,7 +928,7 @@ void writeDataPhaseSD(SCSI_DEVICE *dev, uint32_t adds, uint32_t len)
 | 
	
		
			
				|  |  |    LOG (" DI(SD) ");
 | 
	
		
			
				|  |  |    SCSI_PHASE_CHANGE(SCSI_PHASE_DATAIN);
 | 
	
		
			
				|  |  |    //Bus settle delay 400ns, file.seek() measured at over 1000ns.
 | 
	
		
			
				|  |  | -  uint64_t pos = (uint64_t)adds * dev->m_blocksize;
 | 
	
		
			
				|  |  | +  uint64_t pos = (uint64_t)adds * dev->m_rawblocksize;
 | 
	
		
			
				|  |  |    dev->m_file->seekSet(pos);
 | 
	
		
			
				|  |  |  #ifdef XCVR
 | 
	
		
			
				|  |  |    TRANSCEIVER_IO_SET(vTR_DBP,TR_OUTPUT)
 | 
	
	
		
			
				|  | @@ -937,10 +938,10 @@ void writeDataPhaseSD(SCSI_DEVICE *dev, uint32_t adds, uint32_t len)
 | 
	
		
			
				|  |  |    for(uint32_t i = 0; i < len; i++) {
 | 
	
		
			
				|  |  |        // Asynchronous reads will make it faster ...
 | 
	
		
			
				|  |  |      m_resetJmp = false;
 | 
	
		
			
				|  |  | -    dev->m_file->read(m_buf, dev->m_blocksize);
 | 
	
		
			
				|  |  | +    dev->m_file->read(m_buf, dev->m_rawblocksize);
 | 
	
		
			
				|  |  |      enableResetJmp();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    writeDataLoop(dev->m_blocksize, m_buf);
 | 
	
		
			
				|  |  | +    writeDataLoop(dev->m_blocksize, &m_buf[dev->m_sector_offset]);
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -1073,11 +1074,12 @@ void loop()
 | 
	
		
			
				|  |  |    m_lun = 0xff;
 | 
	
		
			
				|  |  |    SCSI_DEVICE *dev = (SCSI_DEVICE *)0; // HDD image for current SCSI-ID, LUN
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  do {} while( !SCSI_IN(vBSY) || SCSI_IN(vRST));
 | 
	
		
			
				|  |  | +  do {} while( SCSI_IN(vBSY) || !SCSI_IN(vSEL) || SCSI_IN(vRST));
 | 
	
		
			
				|  |  | +  //do {} while( !SCSI_IN(vBSY) || SCSI_IN(vRST));
 | 
	
		
			
				|  |  |    // We're in ARBITRATION
 | 
	
		
			
				|  |  |    //LOG(" A:"); LOGHEX(readIO()); LOG(" ");
 | 
	
		
			
				|  |  |    
 | 
	
		
			
				|  |  | -  do {} while( SCSI_IN(vBSY) || !SCSI_IN(vSEL) || SCSI_IN(vRST));
 | 
	
		
			
				|  |  | +  //do {} while( SCSI_IN(vBSY) || !SCSI_IN(vSEL) || SCSI_IN(vRST));
 | 
	
		
			
				|  |  |    //LOG(" S:"); LOGHEX(readIO()); LOG(" ");
 | 
	
		
			
				|  |  |    // We're in SELECTION
 | 
	
		
			
				|  |  |    
 | 
	
	
		
			
				|  | @@ -1368,6 +1370,7 @@ byte onReadCapacity(SCSI_DEVICE *dev, const byte *cdb)
 | 
	
		
			
				|  |  |      (byte)(dev->m_blocksize >> 8),
 | 
	
		
			
				|  |  |      (byte)(dev->m_blocksize)
 | 
	
		
			
				|  |  |    };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    writeDataPhase(sizeof(buf), buf);
 | 
	
		
			
				|  |  |    return SCSI_STATUS_GOOD;
 | 
	
		
			
				|  |  |  }
 | 
	
	
		
			
				|  | @@ -1552,7 +1555,7 @@ byte onModeSense(SCSI_DEVICE *dev, const byte *cdb)
 | 
	
		
			
				|  |  |        0, //Reserve
 | 
	
		
			
				|  |  |        (byte)(dev->m_blocksize >> 16),
 | 
	
		
			
				|  |  |        (byte)(dev->m_blocksize >> 8),
 | 
	
		
			
				|  |  | -      (byte)(dev->m_blocksize),    
 | 
	
		
			
				|  |  | +      (byte)(dev->m_blocksize),
 | 
	
		
			
				|  |  |      };
 | 
	
		
			
				|  |  |      memcpy(&m_buf[a], c, 8);
 | 
	
		
			
				|  |  |      a += 8;
 |