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(¤t);
+
+ 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(¤t);
+ msf_to_bcd(¤t);
+
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;
}
--
⑨