shithub: psxe

Download patch

ref: 9857397eae26af09d2e85fb6b5af04121d149bdb
parent: 72ac93b384c6e6996085db4c80a70421c30ada41
author: allkern <lisandroaalarcon@gmail.com>
date: Mon Oct 9 20:06:07 EDT 2023

Implement relative CDDA position reporting

--- a/psx/dev/cdrom.c
+++ b/psx/dev/cdrom.c
@@ -1518,15 +1518,41 @@
 
     ++cdrom->cdda_sectors_played;
 
+    // Increment sector
+    msf_add_f(&msf, 1);
+    msf_to_bcd(&msf);
+    
+    // Assign to CDDA MSF
+    cdrom->cdda_msf = msf;
+
+    memcpy(buf, cdrom->cdda_buf, size);
+
+    // Handle report IRQ
     if (cdrom->cdda_sectors_played == CD_SECTORS_PS) {
         if (cdrom->mode & MODE_REPORT) {
             SET_BITS(ifr, IFR_INT, 1);
 
+            msf_t track, current = cdrom->cdda_msf;
+
+            msf_from_bcd(&current);
+
+            psx_disc_get_track_addr(cdrom->disc, &track, cdrom->cdda_track);
+
+            unsigned int track_s = (track.m * 60) + track.s;
+            unsigned int current_s = (current.m * 60) + current.s;
+            unsigned int diff = current_s - track_s;
+
+            current.s = diff;
+            current.m = 0;
+
+            msf_adjust(&current);
+            msf_to_bcd(&current);
+
             RESP_PUSH(0);
             RESP_PUSH(0);
             RESP_PUSH(cdrom->cdda_msf.f);
-            RESP_PUSH(cdrom->cdda_msf.s | 0x80);
-            RESP_PUSH(cdrom->cdda_msf.m);
+            RESP_PUSH(current.s | 0x80);
+            RESP_PUSH(current.m);
             RESP_PUSH(0);
             RESP_PUSH(cdrom->cdda_track);
             RESP_PUSH(GETSTAT_PLAY);
@@ -1536,15 +1562,6 @@
 
         cdrom->cdda_sectors_played = 0;
     }
-
-    // Increment sector
-    msf_add_f(&msf, 1);
-    msf_to_bcd(&msf);
-
-    // Assign to CDDA MSF
-    cdrom->cdda_msf = msf;
-
-    memcpy(buf, cdrom->cdda_buf, size);
 }
 
 void psx_cdrom_destroy(psx_cdrom_t* cdrom) {
--- a/psx/disc/cue.c
+++ b/psx/disc/cue.c
@@ -428,10 +428,12 @@
 int psxd_cue_get_track_addr(void* udata, msf_t* msf, int track) {
     psxd_cue_t* cue = udata;
 
-    if (!track) {
-        if (!msf)
-            return 0;
+    track = BTOI(track);
 
+    if (!msf)
+        return 0;
+
+    if (!track) {
         msf->m = cue->end.m;
         msf->s = cue->end.s;
 
@@ -440,9 +442,6 @@
 
     if (track > cue->num_tracks)
         return DISC_ERR_TRACK_OUT_OF_BOUNDS;
-
-    if (!msf)
-        return 0;
     
     msf->m = cue->track[track - 1]->disc_offset.m;
     msf->s = cue->track[track - 1]->disc_offset.s;
@@ -453,7 +452,7 @@
 int psxd_cue_get_track_count(void* udata, int* count) {
     psxd_cue_t* cue = udata;
 
-    *count = cue->num_tracks;
+    *count = ITOB(cue->num_tracks);
 
     return 0;
 }
--