Преглед изворни кода

Merge pull request #552 from ZuluSCSI/fix/sparc-book-install

Fix reported sector size for the Read Capacity command
Alex Perez пре 7 месеци
родитељ
комит
ab3c7e9949
2 измењених фајлова са 13 додато и 10 уклоњено
  1. 6 5
      src/ZuluSCSI_cdrom.cpp
  2. 7 5
      src/ZuluSCSI_disk.cpp

+ 6 - 5
src/ZuluSCSI_cdrom.cpp

@@ -2019,6 +2019,7 @@ static void doReadSubchannel(bool time, bool subq, uint8_t parameter, uint8_t tr
 static bool doReadCapacity(uint32_t lba, uint8_t pmi)
 {
     image_config_t &img = *(image_config_t*)scsiDev.target->cfg;
+
     uint32_t capacity = img.get_capacity_lba();
     if (capacity > 0)
     {
@@ -2035,15 +2036,15 @@ static bool doReadCapacity(uint32_t lba, uint8_t pmi)
     {
         logmsg("WARNING: unable to find capacity of device ID ", (int) 7 & img.scsiId);
     }
-
+    uint32_t bytes_per_sector  = scsiDev.target->liveCfg.bytesPerSector;
     scsiDev.data[0] = capacity >> 24;
     scsiDev.data[1] = capacity >> 16;
     scsiDev.data[2] = capacity >> 8;
     scsiDev.data[3] = capacity;
-    scsiDev.data[4] = 0;
-    scsiDev.data[5] = 0;
-    scsiDev.data[6] = 0x08; // rest of code assumes 2048 here
-    scsiDev.data[7] = 0x00;
+    scsiDev.data[4] = bytes_per_sector >> 24;
+    scsiDev.data[5] = bytes_per_sector >> 16;
+    scsiDev.data[6] = bytes_per_sector >> 8;
+    scsiDev.data[7] = bytes_per_sector;
     scsiDev.dataLen = 8;
     scsiDev.phase = DATA_IN;
     return true;

+ 7 - 5
src/ZuluSCSI_disk.cpp

@@ -212,19 +212,22 @@ uint32_t image_config_t::get_capacity_lba()
                 bin_file.close();
             }
             if (last_track.track_number != 0)
-                return last_track.data_start + prev_capacity / last_track.sector_length;
+                return last_track.data_start  + prev_capacity / last_track.sector_length;
             else
                 return 0;
         }
         else
         {
             // Single bin file
-            track = parser.next_track();
-            return track->data_start + bin_container.size() / track->sector_length;
+            while((track = parser.next_track()) != nullptr)
+            {
+                last_track = *track;
+            }
+            return last_track.track_number == 0 ? 0 : last_track.data_start + (bin_container.size() - last_track.file_offset) / last_track.sector_length;
         }
     }
     else
-        return file.size() / bytesPerSector;
+        return file.size() / scsiDev.target->liveCfg.bytesPerSector;
 
 }
 
@@ -1629,7 +1632,6 @@ int doTestUnitReady()
 static void doSeek(uint32_t lba)
 {
     image_config_t &img = *(image_config_t*)scsiDev.target->cfg;
-    uint32_t bytesPerSector = scsiDev.target->liveCfg.bytesPerSector;
     uint32_t capacity = img.get_capacity_lba();
 
     if (lba >= capacity)