shithub: psxe

Download patch

ref: eac209e87ad4d1ad323c9302cb5493498cc61fca
parent: 643a196441b37b1c3dcb0a33645294b3840d0f35
author: allkern <lisandroaalarcon@gmail.com>
date: Sat Sep 2 19:50:08 EDT 2023

Start reimplementing CDROM backend

--- a/frontend/main.c
+++ b/frontend/main.c
@@ -73,8 +73,8 @@
     log_fatal("pc=%08x hi=%08x lo=%08x ep=%08x", cpu->pc, cpu->hi, cpu->lo, cpu->cop0_r[COP0_EPC]);
 
     if (cfg->cd_path)
-        psx_cdrom_close(cdrom);
-
+        psx_cdrom_destroy(cdrom);
+    
     psx_input_destroy(input);
     psx_destroy(psx);
     psxi_sda_destroy(controller);
--- a/psx/dev/cdrom.c
+++ b/psx/dev/cdrom.c
@@ -163,8 +163,6 @@
             SET_BITS(ifr, IFR_INT, IFR_INT3);
             RESP_PUSH(GETSTAT_MOTOR);
 
-            fseek(cdrom->disc, cdrom->seek_offset, 0);
-
             int double_speed = cdrom->mode & MODE_SPEED;
 
             cdrom->irq_delay = double_speed ? READ_DOUBLE_DELAY : READ_SINGLE_DELAY;
@@ -184,14 +182,18 @@
 
             SET_BITS(ifr, IFR_INT, IFR_INT1);
             RESP_PUSH(GETSTAT_MOTOR | GETSTAT_READ);
-
             
             // 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;
+            msf_t msf;
 
+            log_fatal("CDROM seek %02x:%02x:%02x", cdrom->seek_mm, cdrom->seek_ss, cdrom->seek_ff);
+
+            msf.m = BTOI(cdrom->seek_mm);
+            msf.s = BTOI(cdrom->seek_ss);
+            msf.f = BTOI(cdrom->seek_ff);
+
+            psx_disc_seek(cdrom->disc, msf);
+
             // 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)
@@ -199,8 +201,7 @@
 
             cdrom->dfifo_index = 0;
 
-            fseek(cdrom->disc, t * CD_SECTOR_SIZE, SEEK_SET);
-            fread(cdrom->dfifo, 1, CD_SECTOR_SIZE, cdrom->disc);
+            psx_disc_read_sector(cdrom->disc, cdrom->dfifo);
 
             cdrom->seek_ff++;
 
@@ -409,8 +410,12 @@
         } break;
 
         case CD_STATE_SEND_RESP1: {
+            int tn;
+
+            psx_disc_get_track_count(cdrom->disc, &tn);
+
             SET_BITS(ifr, IFR_INT, IFR_INT3);
-            RESP_PUSH(0x14);
+            RESP_PUSH(tn);
             RESP_PUSH(0x01);
             RESP_PUSH(GETSTAT_MOTOR);
 
@@ -436,7 +441,7 @@
                 return;
             }
 
-            int track = PFIFO_POP;
+            cdrom->gettd_track = PFIFO_POP;
 
             cdrom->irq_delay = DELAY_1MS;
             cdrom->delayed_command = CDL_GETTD;
@@ -444,9 +449,13 @@
         } break;
 
         case CD_STATE_SEND_RESP1: {
+            msf_t td;
+
+            psx_disc_get_track_addr(cdrom->disc, &td, cdrom->gettd_track);
+
             SET_BITS(ifr, IFR_INT, IFR_INT3);
-            RESP_PUSH(0x00);
-            RESP_PUSH(0x00);
+            RESP_PUSH(td.m);
+            RESP_PUSH(td.s);
             RESP_PUSH(GETSTAT_MOTOR);
 
             cdrom->delayed_command = CDL_NONE;
@@ -462,10 +471,6 @@
             cdrom->irq_delay = DELAY_1MS;
             cdrom->state = CD_STATE_SEND_RESP1;
             cdrom->delayed_command = CDL_SEEKL;
-
-            log_fatal("seekl: Seeking to address %08x", cdrom->seek_offset);
-
-            fseek(cdrom->disc, cdrom->seek_offset, 0);
         } break;
 
         case CD_STATE_SEND_RESP1: {
@@ -593,6 +598,10 @@
     }
 }
 void cdrom_cmd_reads(psx_cdrom_t* cdrom) {
+    log_fatal("reads: Unimplemented");
+
+    exit(1);
+
     cdrom->delayed_command = CDL_NONE;
 
     switch (cdrom->state) {
@@ -609,8 +618,6 @@
             SET_BITS(ifr, IFR_INT, 3);
             RESP_PUSH(GETSTAT_MOTOR);
 
-            fseek(cdrom->disc, cdrom->seek_offset, 0);
-
             int double_speed = cdrom->mode & MODE_SPEED;
 
             cdrom->irq_delay = double_speed ? READ_DOUBLE_DELAY : READ_SINGLE_DELAY;
@@ -629,10 +636,10 @@
             SET_BITS(ifr, IFR_INT, 1);
             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_ff,
-                cdrom->seek_offset, ftell(cdrom->disc)
-            );
+            // 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;
 
@@ -774,7 +781,7 @@
 }
 
 void cdrom_write_cmd(psx_cdrom_t* cdrom, uint8_t value) {
-    log_set_quiet(0);
+    //log_set_quiet(0);
     log_fatal("%s(%02x) %u params=[%02x, %02x, %02x, %02x, %02x, %02x]",
         g_psx_cdrom_command_names[value],
         value,
@@ -786,7 +793,7 @@
         cdrom->pfifo[4],
         cdrom->pfifo[5]
     );
-    log_set_quiet(1);
+    //log_set_quiet(1);
 
     cdrom->command = value;
     cdrom->state = CD_STATE_RECV_CMD;
@@ -981,7 +988,8 @@
 }
 
 void psx_cdrom_destroy(psx_cdrom_t* cdrom) {
-    psx_disc_destroy(cdrom->disc);
+    if (cdrom->disc)
+        psx_disc_destroy(cdrom->disc);
 
     free(cdrom);
 }
\ No newline at end of file
--- a/psx/dev/cdrom.h
+++ b/psx/dev/cdrom.h
@@ -184,6 +184,7 @@
     uint8_t error;
     uint8_t error_flags;
     int read_ongoing;
+    int gettd_track;
 
     const char* path;
     psx_disc_t* disc;
--- a/psx/dev/dma.c
+++ b/psx/dev/dma.c
@@ -369,14 +369,14 @@
 void psx_dma_do_otc(psx_dma_t* dma) {
     if ((!(dma->dpcr & DPCR_DMA6EN)) || (!CHCR_TRIG(otc)) || (!CHCR_BUSY(otc)))
         return;
-    
-    log_fatal("OTC DMA transfer: madr=%08x, dir=%s, sync=%s, step=%s, size=%x",
-        dma->otc.madr,
-        CHCR_TDIR(otc) ? "to device" : "to RAM",
-        CHCR_SYNC(otc) ? "other" : "burst",
-        CHCR_STEP(otc) ? "decrementing" : "incrementing",
-        BCR_SIZE(otc)
-    );
+
+    // log_fatal("OTC DMA transfer: madr=%08x, dir=%s, sync=%s, step=%s, size=%x",
+    //     dma->otc.madr,
+    //     CHCR_TDIR(otc) ? "to device" : "to RAM",
+    //     CHCR_SYNC(otc) ? "other" : "burst",
+    //     CHCR_STEP(otc) ? "decrementing" : "incrementing",
+    //     BCR_SIZE(otc)
+    // );
 
     uint32_t size = BCR_SIZE(otc);
 
--- a/psx/disc.c
+++ b/psx/disc.c
@@ -6,6 +6,7 @@
 
 #include "disc.h"
 
+
 #include <stdint.h>
 #include <stdlib.h>
 #include <stdio.h>
@@ -24,6 +25,7 @@
 }
 
 int psx_disc_seek(psx_disc_t* disc, msf_t msf) {
+    log_fatal("DISC seek %02u:%02u:%02u", msf.m, msf.s, msf.f);
     return disc->seek_func(disc->udata, msf);
 }
 
--- a/psx/disc.h
+++ b/psx/disc.h
@@ -11,6 +11,8 @@
 #include <stdlib.h>
 #include <stdio.h>
 
+#include "log.h"
+
 enum {
     DISC_ERR_TRACK_OUT_OF_BOUNDS = 1,
     DISC_ERR_ADDR_OUT_OF_BOUNDS
--- a/psx/disc/cue.c
+++ b/psx/disc/cue.c
@@ -296,6 +296,8 @@
 //        the CUE struct.
 
 void psxd_cue_load(psxd_cue_t* cue) {
+    log_fatal("Loading CD image...");
+
     size_t offset = 0;
 
     void* buf = NULL;
@@ -310,6 +312,8 @@
 
         track->size = ftell(file);
 
+        cue->buf_size += track->size;
+
         // Calculate track MS(F)
         track->disc_offset.f = offset / CUE_SECTOR_SIZE;
         track->disc_offset.s = track->disc_offset.f / CUE_SECTORS_PER_SECOND;
@@ -328,15 +332,24 @@
     cue->end.s = cue->end.f / CUE_SECTORS_PER_SECOND;
     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.f -= ((cue->end.m * 60) + cue->end.s) * CUE_SECTORS_PER_SECOND;
+
+    log_fatal("Loaded CUE image, size=%08x, end=%02u:%02u:%02u",
+        cue->buf_size,
+        cue->end.m,
+        cue->end.s,
+        cue->end.f
+    );
 }
 
 int psxd_cue_seek(void* udata, msf_t msf) {
     psxd_cue_t* cue = udata;
 
+    log_fatal("CUE seek to %02u:%02u:%02u", msf.m, msf.s, msf.f);
+
     // To-do: Check for OOB seeks
 
-    uint32_t sectors = (((msf.m * 60) + msf.s) * CUE_SECTORS_PER_SECOND) + msf.f;
+    uint32_t sectors = (((msf.m * 60) + (msf.s - 2)) * CUE_SECTORS_PER_SECOND) + msf.f;
 
     cue->seek_offset = sectors * CUE_SECTOR_SIZE;
 
@@ -346,7 +359,7 @@
 int psxd_cue_read_sector(void* udata, void* buf) {
     psxd_cue_t* cue = udata;
 
-    memcpy(buf, &cue->buf[cue->seek_offset], CUE_SECTOR_SIZE);
+    memcpy(buf, cue->buf + cue->seek_offset, CUE_SECTOR_SIZE);
 
     return 0;
 }
--- a/psx/disc/cue.h
+++ b/psx/disc/cue.h
@@ -78,6 +78,7 @@
     cue_track_t** track;
     char* current_file;
     uint32_t seek_offset;
+    uint32_t buf_size;
     msf_t end;
 } psxd_cue_t;
 
--