shithub: psxe

Download patch

ref: 73749d1f4dcff1504b6ad9cac65075f2bcc30b8a
parent: 2938d7ff4aed900360df017dbad86f16d3db1610
author: allkern <lisandroaalarcon@gmail.com>
date: Tue Jun 27 14:32:19 EDT 2023

Tidy up, fix RFE inaccuracy

--- a/psx/cpu.c
+++ b/psx/cpu.c
@@ -50,7 +50,7 @@
     cpu->pc += 4;
 
     // Discard fetch cycles
-    psx_bus_get_access_cycles(cpu->bus);
+    cpu->last_cycles += psx_bus_get_access_cycles(cpu->bus);
 }
 
 void psx_cpu_init(psx_cpu_t* cpu, psx_bus_t* bus) {
@@ -339,7 +339,7 @@
     // If we're in a delay slot, set delay slot bit
     // on CAUSE
     if (cpu->delay_slot) {
-        cpu->cop0_epc = cpu->pc - 12;
+        cpu->cop0_epc = cpu->pc - 4;
         cpu->cop0_cause |= 0x80000000;
     } else {
         cpu->cop0_epc = cpu->pc - 8;
@@ -1096,7 +1096,7 @@
 
     DO_PENDING_LOAD;
 
-    uint32_t r = s - t;
+    int32_t r = s - t;
 
     // To-do: Check SUB overflow check
     uint32_t o = (s ^ t) & (t & r);
@@ -1249,9 +1249,9 @@
 
     DO_PENDING_LOAD;
 
-    uint32_t mode = cpu->cop0_sr & 0x3f;
+    uint32_t mode = cpu->cop0_sr & 0xf;
 
-    cpu->cop0_sr &= ~0x3f;
+    cpu->cop0_sr &= 0xfffffff0;
     cpu->cop0_sr |= mode >> 2;
 }
 
--- a/psx/dev/cdrom.c
+++ b/psx/dev/cdrom.c
@@ -32,6 +32,20 @@
 typedef uint8_t (*psx_cdrom_read_function_t)(psx_cdrom_t*);
 typedef void (*psx_cdrom_write_function_t)(psx_cdrom_t*, uint8_t);
 
+psx_cdrom_read_function_t g_psx_cdrom_read_table[] = {
+    cdrom_read_status, cdrom_read_rfifo, cdrom_read_dfifo, cdrom_read_ier,
+    cdrom_read_status, cdrom_read_rfifo, cdrom_read_dfifo, cdrom_read_ifr,
+    cdrom_read_status, cdrom_read_rfifo, cdrom_read_dfifo, cdrom_read_ier,
+    cdrom_read_status, cdrom_read_rfifo, cdrom_read_dfifo, cdrom_read_ifr
+};
+
+psx_cdrom_write_function_t g_psx_cdrom_write_table[] = {
+    cdrom_write_status, cdrom_write_cmd     , cdrom_write_pfifo   , cdrom_write_req     ,
+    cdrom_write_status, cdrom_write_smdout  , cdrom_write_ier     , cdrom_write_ifr     ,
+    cdrom_write_status, cdrom_write_sminfo  , cdrom_write_lcdlspuv, cdrom_write_lcdrspuv,
+    cdrom_write_status, cdrom_write_rcdrspuv, cdrom_write_rcdlspuv, cdrom_write_volume
+};
+
 uint8_t cdrom_read_status(psx_cdrom_t* cdrom) {
     log_fatal("    Status read %02x", cdrom->status);
 
@@ -179,19 +193,6 @@
     log_fatal("Volume registers unimplemented");
 }
 
-psx_cdrom_read_function_t g_psx_cdrom_read_table[] = {
-    cdrom_read_status, cdrom_read_rfifo, cdrom_read_dfifo, cdrom_read_ier,
-    cdrom_read_status, cdrom_read_rfifo, cdrom_read_dfifo, cdrom_read_ifr,
-    cdrom_read_status, cdrom_read_rfifo, cdrom_read_dfifo, cdrom_read_ier,
-    cdrom_read_status, cdrom_read_rfifo, cdrom_read_dfifo, cdrom_read_ifr
-};
-
-psx_cdrom_write_function_t g_psx_cdrom_write_table[] = {
-    cdrom_write_status, cdrom_write_cmd     , cdrom_write_pfifo   , cdrom_write_req     ,
-    cdrom_write_status, cdrom_write_smdout  , cdrom_write_ier     , cdrom_write_ifr     ,
-    cdrom_write_status, cdrom_write_sminfo  , cdrom_write_lcdlspuv, cdrom_write_lcdrspuv,
-    cdrom_write_status, cdrom_write_rcdrspuv, cdrom_write_rcdlspuv, cdrom_write_volume
-};
 
 psx_cdrom_t* psx_cdrom_create() {
     return (psx_cdrom_t*)malloc(sizeof(psx_cdrom_t));
--- a/psx/dev/gpu.c
+++ b/psx/dev/gpu.c
@@ -712,7 +712,7 @@
         gpu->line++;
 
         if (gpu->line == GPU_SCANS_PER_FRAME_NTSC) {
-            //psx_ic_irq(gpu->ic, IC_VBLANK);
+            psx_ic_irq(gpu->ic, IC_VBLANK);
 
             gpu->line = 0;
         } else {
--- a/psx/dev/timer.c
+++ b/psx/dev/timer.c
@@ -17,6 +17,17 @@
 }
 
 uint32_t psx_timer_read32(psx_timer_t* timer, uint32_t offset) {
+    int t = (offset >> 4) & 0x3;
+    int r = offset & 0xf;
+
+    if (r == 0) {
+        switch (t) {
+            case 0: return timer->t0_stub++;
+            case 1: return timer->t1_stub++;
+            case 2: return timer->t2_stub++;
+        }
+    }
+
     log_fatal("Unhandled 32-bit TIMER read at offset %08x", offset);
 
     return 0x0;
--- a/psx/dev/timer.h
+++ b/psx/dev/timer.h
@@ -9,6 +9,10 @@
 
 typedef struct {
     uint32_t io_base, io_size;
+
+    uint32_t t0_stub;
+    uint32_t t1_stub;
+    uint32_t t2_stub;
 } psx_timer_t;
 
 psx_timer_t* psx_timer_create();
--- a/psx/psx.c
+++ b/psx/psx.c
@@ -106,6 +106,7 @@
     psx_scratchpad_init(psx->scratchpad);
     psx_gpu_init(psx->gpu, psx->ic);
     psx_spu_init(psx->spu);
+    psx_cpu_init(psx->cpu, psx->bus);
     psx_timer_init(psx->timer);
     psx_cdrom_init(psx->cdrom, psx->ic);
     psx_pad_init(psx->pad);
@@ -112,7 +113,7 @@
 
     psx_bios_load(psx->bios, bios_path);
 
-    psx_cpu_init(psx->cpu, psx->bus);
+    psx_cpu_fetch(psx->cpu);
 }
 
 void psx_hard_reset(psx_t* psx) {
--