shithub: psxe

Download patch

ref: d8352d0c7951373a05c0189c1f379d2e6558c7f7
parent: a5ddf8b475ef7641da4929a829422a0685d6567d
author: allkern <lisandroaalarcon@gmail.com>
date: Mon Aug 28 19:54:43 EDT 2023

Still working on CUE and CD

--- a/psx/dev/cdrom.c
+++ b/psx/dev/cdrom.c
@@ -12,11 +12,13 @@
 #define PFIFO_POP (cdrom->pfifo[--cdrom->pfifo_index])
 
 uint8_t cdrom_btoi(uint8_t b) {
+    if ((b >> 4) > 0x9) { log_set_quiet(0); log_fatal("BCD high nibble > 9"); log_set_quiet(1); }
+    if ((b & 0xf) > 0x9) { log_set_quiet(0); log_fatal("BCD low  nibble > 9"); log_set_quiet(1); }
     return ((b >> 4) * 10) + (b & 0xf);
 }
 
-// #define BTOI(b) cdrom_btoi(b)
-#define BTOI(b) g_psx_cdrom_btoi_table[b]
+#define BTOI(b) cdrom_btoi(b)
+//#define BTOI(b) g_psx_cdrom_btoi_table[b]
 
 static const uint8_t g_psx_cdrom_btoi_table[] = {
     0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
@@ -122,20 +124,14 @@
                 cdrom->state = CD_STATE_SEND_RESP1;
             }
 
-            cdrom->seek_sect = BTOI(PFIFO_POP);
-            cdrom->seek_ss = BTOI(PFIFO_POP);
-            cdrom->seek_mm = BTOI(PFIFO_POP);
+            cdrom->seek_ff = PFIFO_POP;
+            cdrom->seek_ss = PFIFO_POP;
+            cdrom->seek_mm = PFIFO_POP;
 
-            // Account for 2 second gap
-            uint32_t seconds = (cdrom->seek_mm * 60) + cdrom->seek_ss - 2;
-            uint32_t sectors = (seconds * CD_SECTORS_PER_SECOND) + cdrom->seek_sect;
-
-            cdrom->seek_offset = sectors * CD_SECTOR_SIZE;
-
             log_fatal("setloc: %02u:%02u:%02u (%08x)",
                 cdrom->seek_mm,
                 cdrom->seek_ss,
-                cdrom->seek_sect,
+                cdrom->seek_ff,
                 cdrom->seek_offset
             );
         } break;
@@ -189,15 +185,31 @@
             SET_BITS(ifr, IFR_INT, IFR_INT1);
             RESP_PUSH(GETSTAT_MOTOR | GETSTAT_READ);
 
-            log_fatal("Reading data from disc. offset=%02x:%02x:%02x (%08x, tellg=%08x)",
-                cdrom->seek_mm, cdrom->seek_ss, cdrom->seek_sect,
-                cdrom->seek_offset, ftell(cdrom->disc)
-            );
+            
+            // Account for 2 second gap
+            uint16_t m = BTOI(cdrom->seek_mm) * 60 * 75;
+            uint16_t s = BTOI(cdrom->seek_ss) * 75;
+            uint16_t f = BTOI(cdrom->seek_ff);
+            uint32_t t = m + s + f - 150;
 
+            // log_fatal("Reading data from disc. offset=%02x:%02x:%02x (%08x, tellg=%08x)",
+            //     cdrom->seek_mm, cdrom->seek_ss, cdrom->seek_ff,
+            //     cdrom->seek_offset, ftell(cdrom->disc)
+            // );
+
             cdrom->dfifo_index = 0;
 
+            fseek(cdrom->disc, t * CD_SECTOR_SIZE, SEEK_SET);
             fread(cdrom->dfifo, 1, CD_SECTOR_SIZE, cdrom->disc);
 
+            cdrom->seek_ff++;
+
+            if ((cdrom->seek_ff & 0xF) == 10) { cdrom->seek_ff += 0x10; cdrom->seek_ff &= 0xF0; }
+            if (cdrom->seek_ff == 0x75) { cdrom->seek_ss++; cdrom->seek_ff = 0; }
+            if ((cdrom->seek_ss & 0xF) == 10) { cdrom->seek_ss += 0x10; cdrom->seek_ss &= 0xF0; }
+            if (cdrom->seek_ss == 0x60) { cdrom->seek_mm++; cdrom->seek_ss = 0; }
+            if ((cdrom->seek_mm & 0xF) == 10) { cdrom->seek_mm += 0x10; cdrom->seek_mm &= 0xF0; }
+
             int double_speed = cdrom->mode & MODE_SPEED;
 
             cdrom->irq_delay = double_speed ? READ_DOUBLE_DELAY : READ_SINGLE_DELAY;
@@ -225,7 +237,7 @@
 
             int double_speed = cdrom->mode & MODE_SPEED;
 
-            cdrom->irq_delay = DELAY_1MS * (double_speed ? 70 : 35);
+            cdrom->irq_delay = DELAY_1MS * (double_speed ? 70 : 65);
             cdrom->state = CD_STATE_SEND_RESP2;
             cdrom->delayed_command = CDL_PAUSE;
         } break;
@@ -433,8 +445,8 @@
 
         case CD_STATE_SEND_RESP1: {
             SET_BITS(ifr, IFR_INT, IFR_INT3);
-            RESP_PUSH(0x14);
-            RESP_PUSH(0x01);
+            RESP_PUSH(0x00);
+            RESP_PUSH(0x00);
             RESP_PUSH(GETSTAT_MOTOR);
 
             cdrom->delayed_command = CDL_NONE;
@@ -618,13 +630,13 @@
             RESP_PUSH(GETSTAT_MOTOR | GETSTAT_READ);
 
             log_fatal("Reading data from disc. offset=%02x:%02x:%02x (%08x, tellg=%08x)",
-                cdrom->seek_mm, cdrom->seek_ss, cdrom->seek_sect,
+                cdrom->seek_mm, cdrom->seek_ss, cdrom->seek_ff,
                 cdrom->seek_offset, ftell(cdrom->disc)
             );
 
             cdrom->dfifo_index = 0;
 
-            fread(cdrom->dfifo, 1, CD_SECTOR_SIZE, cdrom->disc);
+            //fread(cdrom->dfifo, 1, CD_SECTOR_SIZE, cdrom->disc);
 
             int double_speed = cdrom->mode & MODE_SPEED;
 
@@ -762,6 +774,7 @@
 }
 
 void cdrom_write_cmd(psx_cdrom_t* cdrom, uint8_t value) {
+    log_set_quiet(0);
     log_fatal("%s(%02x) %u params=[%02x, %02x, %02x, %02x, %02x, %02x]",
         g_psx_cdrom_command_names[value],
         value,
@@ -773,6 +786,7 @@
         cdrom->pfifo[4],
         cdrom->pfifo[5]
     );
+    log_set_quiet(1);
 
     cdrom->command = value;
     cdrom->state = CD_STATE_RECV_CMD;
--- a/psx/dev/cdrom.h
+++ b/psx/dev/cdrom.h
@@ -166,7 +166,7 @@
     int tray_open;
 
     // Setloc
-    uint8_t seek_ss, seek_mm, seek_sect;
+    uint8_t seek_ss, seek_mm, seek_ff;
     uint32_t seek_offset;
 
     // Setmode
--- a/psx/disc/cue.c
+++ b/psx/disc/cue.c
@@ -65,6 +65,15 @@
     memset(cue->track[cue->num_tracks - 1], 0, sizeof(cue_track_t));
 }
 
+void* cue_alloc_block(void* buf, size_t* block_size, size_t ext) {
+    *block_size += ext;
+
+    if (!buf)
+        return malloc(*block_size);
+    
+    return realloc(buf, *block_size);
+}
+
 void cue_ignore_whitespace(psxd_cue_t* cue) {
     while (isspace(cue->c))
         cue->c = fgetc(cue->file);
@@ -280,7 +289,17 @@
     }
 }
 
+// To-do: Rework CUE loader
+//        I want to put every track one after the other
+//        on a big buffer for absolute MSF addressing.
+//        We should also save metadata about the tracks on
+//        the CUE struct.
+
 void psxd_cue_load(psxd_cue_t* cue) {
+    size_t offset = 0;
+
+    uint8_t* buf = NULL;
+
     for (int i = 0; i < cue->num_tracks; i++) {
         cue_track_t* track = cue->track[i];
 
@@ -290,17 +309,12 @@
 
         track->size = ftell(file);
 
+        buf = cue_alloc_block(buf, offset, track->size);
+
         fseek(file, 0, SEEK_SET);
+        fread(buf + (offset - track->size), 1, track->size, file);
 
-        if (cue->preload) {
-            track->buf = malloc(track->size);
-
-            fread(track->buf, 1, track->size, file);
-
-            fclose(file);
-        } else {
-            track->buf = file;
-        }
+        fclose(file);
     }
 }
 
@@ -320,7 +334,6 @@
 }
 
 int psxd_cue_get_track(void* udata, msf_t* msf, int track) {
-
 }
 
 void psxd_cue_init_disc(psxd_cue_t* cue, psx_disc_t* disc) {
--