shithub: psxe

Download patch

ref: f0b4a61f4ec93f13e5b7d118499a2dcc06c95751
parent: 30783ba715c43fafb64aa40820b66730cec34e11
author: allkern <lisandroaalarcon@gmail.com>
date: Tue Sep 5 07:25:09 EDT 2023

Account for index 1 offset when loading CUE

--- a/psx/dev/cdrom.c
+++ b/psx/dev/cdrom.c
@@ -17,6 +17,10 @@
     return ((b >> 4) * 10) + (b & 0xf);
 }
 
+uint8_t cdrom_itob(int i) {
+    return i + (6 * (i / 10));
+}
+
 #define BTOI(b) cdrom_btoi(b)
 //#define BTOI(b) g_psx_cdrom_btoi_table[b]
 
@@ -463,9 +467,15 @@
 
             psx_disc_get_track_addr(cdrom->disc, &td, cdrom->gettd_track);
 
+            log_fatal("GetTD track=%u, addr=%02u:%02u (%02x:%02x)",
+                cdrom->gettd_track,
+                td.m, td.s,
+                cdrom_itob(td.m), cdrom_itob(td.s)
+            );
+
             SET_BITS(ifr, IFR_INT, IFR_INT3);
-            RESP_PUSH(td.m);
-            RESP_PUSH(td.s);
+            RESP_PUSH(cdrom_itob(td.s));
+            RESP_PUSH(cdrom_itob(td.m));
             RESP_PUSH(GETSTAT_MOTOR);
 
             cdrom->delayed_command = CDL_NONE;
--- a/psx/disc/cue.c
+++ b/psx/disc/cue.c
@@ -56,6 +56,26 @@
     if (cue_get_keyword(cue) != kw) \
         ERROR_OUT(PE_UNEXPECTED_TOKEN);
 
+void msf_adjust(msf_t* msf) {
+    if (msf->f > 75) {
+        int s = msf->f / CUE_SECTORS_PER_SECOND;
+
+        msf->s += s;
+        msf->f -= CUE_SECTORS_PER_SECOND * s;
+    }
+
+    if (msf->s > 60) {
+        int m = msf->s / 60;
+
+        msf->m += m;
+        msf->s -= 60 * m;
+    }
+}
+
+uint32_t msf_to_address(msf_t msf) {
+    return (((msf.m * 60) * 75) + (msf.s * 75) + msf.f) * CUE_SECTOR_SIZE;
+}
+
 void cue_add_track(psxd_cue_t* cue) {
     ++cue->num_tracks;
 
@@ -302,10 +322,13 @@
 
         FILE* file = fopen(track->filename, "rb");
 
+        uint32_t data_offset = msf_to_address(track->index[1]);
+
         // Get track size
         fseek(file, 0, SEEK_END);
 
-        track->size = ftell(file);
+        // Account for index 1 offset
+        track->size = ftell(file) - data_offset;
 
         cue->buf_size += track->size;
 
@@ -314,10 +337,13 @@
         track->disc_offset.s = track->disc_offset.f / CUE_SECTORS_PER_SECOND;
         track->disc_offset.m = track->disc_offset.s / 60;
         track->disc_offset.s -= track->disc_offset.m * 60;
+        track->disc_offset.s += 2;
 
+        msf_adjust(&track->disc_offset);
+
         cue->buf = cue_alloc_block(cue->buf, &offset, track->size);
 
-        fseek(file, 0, SEEK_SET);
+        fseek(file, data_offset, SEEK_SET);
         fread(cue->buf + (offset - track->size), 1, track->size, file);
 
         fclose(file);
@@ -328,7 +354,10 @@
     cue->end.m = cue->end.s / 60;
     cue->end.s -= cue->end.m * 60;
     cue->end.f -= ((cue->end.m * 60) + cue->end.s) * CUE_SECTORS_PER_SECOND;
+    cue->end.s += 2;
 
+    msf_adjust(&cue->end);
+
     log_fatal("Loaded CUE image, size=%08x, end=%02u:%02u:%02u",
         cue->buf_size,
         cue->end.m,
@@ -367,11 +396,18 @@
 int psxd_cue_get_track_addr(void* udata, msf_t* msf, int track) {
     psxd_cue_t* cue = udata;
 
+    if (!track) {
+        msf->m = cue->end.m;
+        msf->s = cue->end.s;
+
+        return 0;
+    }
+
     if (track > cue->num_tracks)
         return DISC_ERR_TRACK_OUT_OF_BOUNDS;
     
-    msf->m = cue->track[track]->disc_offset.m;
-    msf->s = cue->track[track]->disc_offset.s;
+    msf->m = cue->track[track - 1]->disc_offset.m;
+    msf->s = cue->track[track - 1]->disc_offset.s;
 
     return 0;
 }
--