From 6c5e0a9054973490edd8e6f0cd792f3188abf43d Mon Sep 17 00:00:00 2001 From: Sergiy Dvodnenko Date: Tue, 19 Aug 2025 21:23:33 +0300 Subject: [PATCH] Saturn: fix sector data transfer for Mode 2. (#1024) --- support/saturn/saturn.h | 2 +- support/saturn/saturncdd.cpp | 27 ++++++++++++++++++--------- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/support/saturn/saturn.h b/support/saturn/saturn.h index fd12613..2fe1a72 100644 --- a/support/saturn/saturn.h +++ b/support/saturn/saturn.h @@ -100,7 +100,7 @@ private: void ReadData(uint8_t *buf); int ReadCDDA(uint8_t *buf, int first); void MakeSecureRingData(uint8_t *buf); - uint32_t DataSectorCalcCRC(uint8_t* buf); + uint32_t DataSectorCalcCRC(uint8_t* buf, int len); int DataSectorSend(uint8_t* header, int speed); int AudioSectorSend(int first); int RingDataSend(uint8_t* header, int speed); diff --git a/support/saturn/saturncdd.cpp b/support/saturn/saturncdd.cpp index 8072e44..352af57 100644 --- a/support/saturn/saturncdd.cpp +++ b/support/saturn/saturncdd.cpp @@ -608,6 +608,7 @@ void satcdd_t::CommandExec() { case SATURN_COMM_PAUSE: this->pause_pend = true; + this->seek_pend = false; this->read_pend = false; #ifdef SATURN_DEBUG @@ -1144,7 +1145,7 @@ void satcdd_t::MakeSecureRingData(uint8_t *buf) { } } -uint32_t satcdd_t::DataSectorCalcCRC(uint8_t* buf) +uint32_t satcdd_t::DataSectorCalcCRC(uint8_t* buf, int len) { static uint32_t crc_tab[256]; for (int i = 0; i < 256; i++) @@ -1158,7 +1159,7 @@ uint32_t satcdd_t::DataSectorCalcCRC(uint8_t* buf) } uint32_t crc = 0; - for (int i = 0; i < 2064; i++) + for (int i = 0; i < len; i++) { crc ^= buf[i]; crc = (crc >> 8) ^ crc_tab[crc & 0xFF]; @@ -1259,14 +1260,22 @@ int satcdd_t::DataSectorSend(uint8_t* header, int speed) if (header) { memcpy(data_ptr, header, 16); } + uint8_t sec_mode = data_ptr[15]; - uint32_t crc = DataSectorCalcCRC(data_ptr); - data_ptr[2064] = crc >> 0; - data_ptr[2065] = crc >> 8; - data_ptr[2066] = crc >> 16; - data_ptr[2067] = crc >> 24; - - memset(data_ptr + 2068, 0, 2352-2068); + uint32_t crc = DataSectorCalcCRC(data_ptr, (sec_mode == 2 ? 2348 : 2064)); + if (sec_mode == 0x02) { + /*data_ptr[2348] = crc >> 0; + data_ptr[2349] = crc >> 8; + data_ptr[2350] = crc >> 16; + data_ptr[2351] = crc >> 24;*/ + } + else { + data_ptr[2064] = crc >> 0; + data_ptr[2065] = crc >> 8; + data_ptr[2066] = crc >> 16; + data_ptr[2067] = crc >> 24; + memset(data_ptr + 2068, 0, 2352 - 2068); + } int boot = (data_ptr[12] == 0x00 && data_ptr[13] == 0x02 && data_ptr[14] == 0x00 && data_ptr[15] == 0x01); shmem_unmap(shmem_ptr, 4096 * 4);