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;
}
--
⑨