Browse Source

Command adjustments for MSF addressing.

saybur 2 năm trước cách đây
mục cha
commit
2293627145
1 tập tin đã thay đổi với 52 bổ sung17 xóa
  1. 52 17
      src/BlueSCSI_cdrom.cpp

+ 52 - 17
src/BlueSCSI_cdrom.cpp

@@ -1323,23 +1323,50 @@ static void doReadSubchannel(bool time, bool subq, uint8_t parameter, uint8_t tr
         *buf++ = 0; // Reserved
         *buf++ = audiostatus;
 
-        int len = 12;
-        *buf++ = 0;  // Subchannel data length (MSB)
-        *buf++ = len; // Subchannel data length (LSB)
-        *buf++ = 0x01; // Subchannel data format
-        *buf++ = (trackinfo.track_mode == CUETrack_AUDIO ? 0x10 : 0x14);
-        *buf++ = trackinfo.track_number;
-        *buf++ = (lba >= trackinfo.data_start) ? 1 : 0; // Index number (0 = pregap)
-        *buf++ = (lba >> 24) & 0xFF; // Absolute block address
-        *buf++ = (lba >> 16) & 0xFF;
-        *buf++ = (lba >>  8) & 0xFF;
-        *buf++ = (lba >>  0) & 0xFF;
-
-        uint32_t relpos = (uint32_t)((int32_t)lba - (int32_t)trackinfo.data_start);
-        *buf++ = (relpos >> 24) & 0xFF; // Track relative position (may be negative)
-        *buf++ = (relpos >> 16) & 0xFF;
-        *buf++ = (relpos >>  8) & 0xFF;
-        *buf++ = (relpos >>  0) & 0xFF;
+        int len;
+        if (subq)
+        {
+            len = 12;
+            *buf++ = 0;  // Subchannel data length (MSB)
+            *buf++ = len; // Subchannel data length (LSB)
+            *buf++ = 0x01; // Subchannel data format
+            *buf++ = (trackinfo.track_mode == CUETrack_AUDIO ? 0x10 : 0x14);
+            *buf++ = trackinfo.track_number;
+            *buf++ = (lba >= trackinfo.data_start) ? 1 : 0; // Index number (0 = pregap)
+            if (time)
+            {
+                LBA2MSF(lba, buf);
+                *buf += 4;
+            }
+            else
+            {
+                *buf++ = (lba >> 24) & 0xFF; // Absolute block address
+                *buf++ = (lba >> 16) & 0xFF;
+                *buf++ = (lba >>  8) & 0xFF;
+                *buf++ = (lba >>  0) & 0xFF;
+            }
+
+            uint32_t relpos = (uint32_t)((int32_t)lba - (int32_t)trackinfo.data_start);
+            if (time)
+            {
+                LBA2MSF(relpos, buf);
+                *buf += 4;
+            }
+            else
+            {
+                *buf++ = (relpos >> 24) & 0xFF; // Track relative position (may be negative)
+                *buf++ = (relpos >> 16) & 0xFF;
+                *buf++ = (relpos >>  8) & 0xFF;
+                *buf++ = (relpos >>  0) & 0xFF;
+            }
+        }
+        else
+        {
+            len = 0;
+            *buf++ = 0;
+            *buf++ = 0;
+        }
+        len += 4;
 
         if (len > allocation_length) len = allocation_length;
         scsiDev.dataLen = len;
@@ -1530,6 +1557,14 @@ extern "C" int scsiCDRomCommand()
         uint8_t main_channel = scsiDev.cdb[9];
         uint8_t sub_channel = scsiDev.cdb[10];
 
+        if (scsiDev.cdb[3] == 0xFF
+                && scsiDev.cdb[4] == 0xFF
+                && scsiDev.cdb[5] == 0xFF)
+        {
+            // resume from current position
+            start = 0xFFFFFFFF;
+        }
+
         doReadCD(start, end - start, sector_type, main_channel, sub_channel);
     }
     else if (command == 0x42)