Kaynağa Gözat

alternative sector size supported

this let's .BIN files get used at the very least, maybe more depending
on how some of the other optical formats look
reverted a small SCSI phase change that causes problems
Troy 3 yıl önce
ebeveyn
işleme
3a3d68cf99
2 değiştirilmiş dosya ile 28 ekleme ve 25 silme
  1. 18 15
      src/BlueSCSI.cpp
  2. 10 10
      src/BlueSCSI.h

+ 18 - 15
src/BlueSCSI.cpp

@@ -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;

+ 10 - 10
src/BlueSCSI.h

@@ -218,7 +218,7 @@ enum SCSI_DEVICE_TYPE
 // Put DB and DP in output mode
 #define SCSI_DB_OUTPUT() { PBREG->CRL=(PBREG->CRL &0xfffffff0)|DB_MODE_OUT; PBREG->CRH = 0x11111111*DB_MODE_OUT; }
 // Put DB and DP in input mode
-#define SCSI_DB_INPUT()  { PBREG->CRL=(PBREG->CRL &0xfffffff0)|DB_MODE_IN ; PBREG->CRH = (uint32_t)0x11111111*DB_MODE_IN; }
+#define SCSI_DB_INPUT()  { PBREG->CRL=(PBREG->CRL &0xfffffff0)|DB_MODE_IN ; PBREG->CRH = (uint32_t)(0x11111111*DB_MODE_IN); }
 
 // HDDiamge file
 #define HDIMG_ID_POS  2                 // Position to embed ID number
@@ -311,18 +311,18 @@ struct SCSI_INQUIRY_DATA
 // HDD image
 typedef __attribute__((aligned(4))) struct _SCSI_DEVICE
 {
-	FsFile        *m_file;                 // File object
-	uint64_t      m_fileSize;             // File size
-	uint16_t      m_blocksize;            // SCSI BLOCK size
-  uint16_t      m_rawblocksize;
-  uint8_t       m_type;                 // SCSI device type
-  uint32_t      m_blockcount;           // blockcount
-  bool          m_raw;                  // Raw disk
-  SCSI_INQUIRY_DATA *inquiry_block;      // SCSI information
+	FsFile        *m_file;                  // File object
+	uint64_t      m_fileSize;               // File size
+	uint16_t      m_blocksize;              // SCSI BLOCK size
+  uint16_t      m_rawblocksize;           // OPTICAL raw sector size
+  uint8_t       m_type;                   // SCSI device type
+  uint32_t      m_blockcount;             // blockcount
+  bool          m_raw;                    // Raw disk
+  SCSI_INQUIRY_DATA *inquiry_block;       // SCSI information
   uint8_t       m_senseKey;               // Sense key
   uint16_t      m_additional_sense_code;  // ASC/ASCQ 
   bool          m_mode2;                  // MODE2 CDROM
-  uint8_t       m_offset;                 // ISO offset for missing sync header
+  uint8_t       m_sector_offset;          // optical sector offset for missing sync header
 } SCSI_DEVICE;