|  | @@ -173,15 +173,6 @@ static const uint8_t FullTOC[] =
 | 
											
												
													
														|  |      0x00  // 69: PFRAME
 |  |      0x00  // 69: PFRAME
 | 
											
												
													
														|  |  };
 |  |  };
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -static uint8_t SimpleHeader[] =
 |  | 
 | 
											
												
													
														|  | -{
 |  | 
 | 
											
												
													
														|  | -    0x01, // 2048byte user data, L-EC in 288 byte aux field.
 |  | 
 | 
											
												
													
														|  | -    0x00, // reserved
 |  | 
 | 
											
												
													
														|  | -    0x00, // reserved
 |  | 
 | 
											
												
													
														|  | -    0x00, // reserved
 |  | 
 | 
											
												
													
														|  | -    0x00,0x00,0x00,0x00 // Track start sector (LBA or MSF)
 |  | 
 | 
											
												
													
														|  | -};
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  |  static const uint8_t DiscInformation[] =
 |  |  static const uint8_t DiscInformation[] =
 | 
											
												
													
														|  |  {
 |  |  {
 | 
											
												
													
														|  |      0x00,   //  0: disc info length, MSB
 |  |      0x00,   //  0: disc info length, MSB
 | 
											
										
											
												
													
														|  | @@ -385,18 +376,6 @@ static void doReadFullTOCSimple(int convertBCD, uint8_t session, uint16_t alloca
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -void doReadHeaderSimple(bool MSF, uint32_t lba, uint16_t allocationLength)
 |  | 
 | 
											
												
													
														|  | -{
 |  | 
 | 
											
												
													
														|  | -    uint32_t len = sizeof(SimpleHeader);
 |  | 
 | 
											
												
													
														|  | -    memcpy(scsiDev.data, SimpleHeader, len);
 |  | 
 | 
											
												
													
														|  | -    if (len > allocationLength)
 |  | 
 | 
											
												
													
														|  | -    {
 |  | 
 | 
											
												
													
														|  | -        len = allocationLength;
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -    scsiDev.dataLen = len;
 |  | 
 | 
											
												
													
														|  | -    scsiDev.phase = DATA_IN;
 |  | 
 | 
											
												
													
														|  | -}
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  |  void doReadDiscInformationSimple(uint16_t allocationLength)
 |  |  void doReadDiscInformationSimple(uint16_t allocationLength)
 | 
											
												
													
														|  |  {
 |  |  {
 | 
											
												
													
														|  |      uint32_t len = sizeof(DiscInformation);
 |  |      uint32_t len = sizeof(DiscInformation);
 | 
											
										
											
												
													
														|  | @@ -680,6 +659,9 @@ static void doReadFullTOC(int convertBCD, uint8_t session, uint16_t allocationLe
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  // SCSI-3 MMC Read Header command, seems to be deprecated in later standards.
 |  |  // SCSI-3 MMC Read Header command, seems to be deprecated in later standards.
 | 
											
												
													
														|  |  // Refer to ANSI X3.304-1997
 |  |  // Refer to ANSI X3.304-1997
 | 
											
												
													
														|  | 
 |  | +// The spec is vague, but based on experimentation with a Matshita drive this
 | 
											
												
													
														|  | 
 |  | +// command should return the sector header absolute time (see ECMA-130 21).
 | 
											
												
													
														|  | 
 |  | +// Given 2048-byte block sizes this effectively is 1:1 with the provided LBA.
 | 
											
												
													
														|  |  void doReadHeader(bool MSF, uint32_t lba, uint16_t allocationLength)
 |  |  void doReadHeader(bool MSF, uint32_t lba, uint16_t allocationLength)
 | 
											
												
													
														|  |  {
 |  |  {
 | 
											
												
													
														|  |      image_config_t &img = *(image_config_t*)scsiDev.target->cfg;
 |  |      image_config_t &img = *(image_config_t*)scsiDev.target->cfg;
 | 
											
										
											
												
													
														|  | @@ -689,41 +671,41 @@ void doReadHeader(bool MSF, uint32_t lba, uint16_t allocationLength)
 | 
											
												
													
														|  |      audio_stop(img.scsiId & 7);
 |  |      audio_stop(img.scsiId & 7);
 | 
											
												
													
														|  |  #endif
 |  |  #endif
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | 
 |  | +    uint8_t mode = 1;
 | 
											
												
													
														|  |      CUEParser parser;
 |  |      CUEParser parser;
 | 
											
												
													
														|  | -    if (!loadCueSheet(img, parser))
 |  | 
 | 
											
												
													
														|  | 
 |  | +    if (loadCueSheet(img, parser))
 | 
											
												
													
														|  |      {
 |  |      {
 | 
											
												
													
														|  | -        // No CUE sheet, use hardcoded data
 |  | 
 | 
											
												
													
														|  | -        return doReadHeaderSimple(MSF, lba, allocationLength);
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -    // Take the hardcoded header as base
 |  | 
 | 
											
												
													
														|  | -    uint32_t len = sizeof(SimpleHeader);
 |  | 
 | 
											
												
													
														|  | -    memcpy(scsiDev.data, SimpleHeader, len);
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -    // Search the track with the requested LBA
 |  | 
 | 
											
												
													
														|  | -    CUETrackInfo trackinfo = {};
 |  | 
 | 
											
												
													
														|  | -    getTrackFromLBA(parser, lba, &trackinfo);
 |  | 
 | 
											
												
													
														|  | 
 |  | +        // Search the track with the requested LBA
 | 
											
												
													
														|  | 
 |  | +        CUETrackInfo trackinfo = {};
 | 
											
												
													
														|  | 
 |  | +        getTrackFromLBA(parser, lba, &trackinfo);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    // Track mode (audio / data)
 |  | 
 | 
											
												
													
														|  | -    if (trackinfo.track_mode == CUETrack_AUDIO)
 |  | 
 | 
											
												
													
														|  | -    {
 |  | 
 | 
											
												
													
														|  | -        scsiDev.data[0] = 0;
 |  | 
 | 
											
												
													
														|  | 
 |  | +        // Track mode (audio / data)
 | 
											
												
													
														|  | 
 |  | +        if (trackinfo.track_mode == CUETrack_AUDIO)
 | 
											
												
													
														|  | 
 |  | +        {
 | 
											
												
													
														|  | 
 |  | +            scsiDev.data[0] = 0;
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | 
 |  | +    scsiDev.data[0] = mode;
 | 
											
												
													
														|  | 
 |  | +    scsiDev.data[1] = 0; // reserved
 | 
											
												
													
														|  | 
 |  | +    scsiDev.data[2] = 0; // reserved
 | 
											
												
													
														|  | 
 |  | +    scsiDev.data[3] = 0; // reserved
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  |      // Track start
 |  |      // Track start
 | 
											
												
													
														|  |      if (MSF)
 |  |      if (MSF)
 | 
											
												
													
														|  |      {
 |  |      {
 | 
											
												
													
														|  |          scsiDev.data[4] = 0;
 |  |          scsiDev.data[4] = 0;
 | 
											
												
													
														|  | -        LBA2MSF(trackinfo.data_start, &scsiDev.data[5]);
 |  | 
 | 
											
												
													
														|  | 
 |  | +        LBA2MSF(lba, &scsiDev.data[5]);
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  |      else
 |  |      else
 | 
											
												
													
														|  |      {
 |  |      {
 | 
											
												
													
														|  | -        scsiDev.data[4] = (trackinfo.data_start >> 24) & 0xFF;
 |  | 
 | 
											
												
													
														|  | -        scsiDev.data[5] = (trackinfo.data_start >> 16) & 0xFF;
 |  | 
 | 
											
												
													
														|  | -        scsiDev.data[6] = (trackinfo.data_start >>  8) & 0xFF;
 |  | 
 | 
											
												
													
														|  | -        scsiDev.data[7] = (trackinfo.data_start >>  0) & 0xFF;
 |  | 
 | 
											
												
													
														|  | 
 |  | +        scsiDev.data[4] = (lba >> 24) & 0xFF;
 | 
											
												
													
														|  | 
 |  | +        scsiDev.data[5] = (lba >> 16) & 0xFF;
 | 
											
												
													
														|  | 
 |  | +        scsiDev.data[6] = (lba >>  8) & 0xFF;
 | 
											
												
													
														|  | 
 |  | +        scsiDev.data[7] = (lba >>  0) & 0xFF;
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | 
 |  | +    uint8_t len = 8;
 | 
											
												
													
														|  |      if (len > allocationLength)
 |  |      if (len > allocationLength)
 | 
											
												
													
														|  |      {
 |  |      {
 | 
											
												
													
														|  |          len = allocationLength;
 |  |          len = allocationLength;
 |