]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Added 2052 and 2340 CD sector size support.
authorToni Wilen <twilen@winuae.net>
Sun, 1 Jun 2025 08:54:12 +0000 (11:54 +0300)
committerToni Wilen <twilen@winuae.net>
Sun, 1 Jun 2025 08:54:12 +0000 (11:54 +0300)
blkdev_cdimage.cpp

index 11ff9305c86ec0a5960afc5427e7e018f91b8355..b0bc752376fb77d6994bd09a6062b4422d57a88e 100644 (file)
@@ -940,6 +940,20 @@ static int command_rawread (int unitnum, uae_u8 *data, int sector, int size, int
                                        memcpy(data - SUBQ_SIZE, subs + SUBQ_SIZE, SUBQ_SIZE);
 }
                        }
+               } else if (sectorsize == 2340 && t->size == 2336) {
+                       // 2336 -> 2340
+                       while (size-- > 0) {
+                               int address = asector + 150;
+                               data[0] = tobcd((uae_u8)(address / (60 * 75)));
+                               data[1] = tobcd((uae_u8)((address / 75) % 60));
+                               data[2] = tobcd((uae_u8)(address % 75));
+                               data[3] = 2; /* MODE2 */
+                               do_read(cdu, t, data + 4, sector, 0, t->size, false);
+                               sector++;
+                               asector++;
+                               data += sectorsize;
+                               ret += sectorsize;
+                       }
                } else if ((sectorsize == 2352 || sectorsize == 2368 || sectorsize == 2448) && t->size == 2048) {
                        // 2048 -> 2352
                        while (size-- > 0) {
@@ -960,12 +974,42 @@ static int command_rawread (int unitnum, uae_u8 *data, int sector, int size, int
                                        memcpy(data - SUBQ_SIZE, subs + SUBQ_SIZE, SUBQ_SIZE);
                                }
                        }
+               } else if (sectorsize == 2052 && t->size == 2048) {
+                       // 2048 -> 2052
+                       while (size-- > 0) {
+                               int address = asector + 150;
+                               data[0] = tobcd((uae_u8)(address / (60 * 75)));
+                               data[1] = tobcd((uae_u8)((address / 75) % 60));
+                               data[2] = tobcd((uae_u8)(address % 75));
+                               data[3] = 0; /* MODE1 */
+                               do_read(cdu, t, data + 4, sector, 0, sectorsize - 4, false);
+                               sector++;
+                               asector++;
+                               data += sectorsize;
+                               ret += sectorsize;
+                       }
                } else if (sectorsize == 2048 && t->size == 2352) {
                        // 2352 -> 2048
                        while (size-- > 0) {
                                uae_u8 b = 0;
-                               do_read (cdu, t, &b, sector, 15, 1, false);
-                               do_read (cdu, t, data, sector, b == 2 ? 24 : 16, sectorsize, false);
+                               do_read(cdu, t, &b, sector, 15, 1, false);
+                               do_read(cdu, t, data, sector, b == 2 ? 24 : 16, sectorsize, false);
+                               sector++;
+                               asector++;
+                               data += sectorsize;
+                               ret += sectorsize;
+                       }
+               } else if (sectorsize == 2052 && t->size == 2352) {
+                       // 2352 -> 2052
+                       while (size-- > 0) {
+                               uae_u8 b = 0;
+                               do_read(cdu, t, &b, sector, 15, 1, false);
+                               int address = asector + 150;
+                               data[0] = tobcd((uae_u8)(address / (60 * 75)));
+                               data[1] = tobcd((uae_u8)((address / 75) % 60));
+                               data[2] = tobcd((uae_u8)(address % 75));
+                               data[3] = b;
+                               do_read(cdu, t, data + 4, sector, b == 2 ? 24 : 16, sectorsize - 4, false);
                                sector++;
                                asector++;
                                data += sectorsize;
@@ -975,10 +1019,28 @@ static int command_rawread (int unitnum, uae_u8 *data, int sector, int size, int
                        // 2352 -> 2336
                        while (size-- > 0) {
                                uae_u8 b = 0;
-                               do_read (cdu, t, &b, sector, 15, 1, false);
+                               do_read(cdu, t, &b, sector, 15, 1, false);
                                if (b != 2 && b != 0) // MODE0 or MODE2 only allowed
                                        return 0;
-                               do_read (cdu, t, data, sector, 16, sectorsize, false);
+                               do_read(cdu, t, data, sector, 16, sectorsize, false);
+                               sector++;
+                               asector++;
+                               data += sectorsize;
+                               ret += sectorsize;
+                       }
+               } else if (sectorsize == 2340 && t->size == 2352) {
+                       // 2352 -> 2340
+                       while (size-- > 0) {
+                               uae_u8 b = 0;
+                               do_read(cdu, t, &b, sector, 15, 1, false);
+                               if (b != 2 && b != 0) // MODE0 or MODE2 only allowed
+                                       return 0;
+                               int address = asector + 150;
+                               data[0] = tobcd((uae_u8)(address / (60 * 75)));
+                               data[1] = tobcd((uae_u8)((address / 75) % 60));
+                               data[2] = tobcd((uae_u8)(address % 75));
+                               data[3] = b;
+                               do_read(cdu, t, data + 4, sector, 16, sectorsize - 4, false);
                                sector++;
                                asector++;
                                data += sectorsize;