shithub: psxe

Download patch

ref: 0117a772af8a27001190af2efed25fe38c2ee78b
parent: 567cb9cb4ed3855b637bee999b04aee683d50bff
author: allkern <lisandroaalarcon@gmail.com>
date: Sat Oct 28 10:36:44 EDT 2023

Various fixes

--- a/psx/cpu.c
+++ b/psx/cpu.c
@@ -705,7 +705,7 @@
     //         goto no_putchar;
 
     //     char buf[256];
-    
+
     //     sprintf(buf, g_psx_cpu_a_kcall_symtable[cpu->r[9]],
     //         cpu->r[4],
     //         cpu->r[5],
@@ -720,9 +720,9 @@
     if ((cpu->pc & 0x3fffffff) == 0x000000b4) {
         if (cpu->b_function_hook) cpu->b_function_hook(cpu);
 
-        if ((cpu->r[9] == 0x3b) || (cpu->r[9] == 0x3d) || (cpu->r[9] == 0x3f) || (cpu->r[9] == 0x0b))
-            goto no_putchar;
-        
+        // if ((cpu->r[9] == 0x3b) || (cpu->r[9] == 0x3d) || (cpu->r[9] == 0x3f) || (cpu->r[9] == 0x0b) || (cpu->r[9] == 0x17))
+        //     goto no_putchar;
+
         // char buf[256];
 
         // sprintf(buf, g_psx_cpu_b_kcall_symtable[cpu->r[9]],
--- a/psx/dev/cdrom.c
+++ b/psx/dev/cdrom.c
@@ -1317,7 +1317,7 @@
     cdrom->io_size = PSX_CDROM_SIZE;
 
     cdrom->ic = ic;
-    cdrom->status = STAT_PRMEMPT_MASK | STAT_PRMWRDY_MASK;
+    cdrom->status = STAT_PRMEMPT_MASK | STAT_PRMWRDY_MASK | STAT_RSLRRDY_MASK;
     cdrom->dfifo = malloc(CD_SECTOR_SIZE);
     cdrom->cdda_buf = malloc(CD_SECTOR_SIZE);
 }
@@ -1356,9 +1356,9 @@
     g_psx_cdrom_write_table[(STAT_INDEX << 2) | offset](cdrom, value);
 }
 
-void psx_cdrom_update(psx_cdrom_t* cdrom) {
+void psx_cdrom_update(psx_cdrom_t* cdrom, int cyc) {
     if (cdrom->irq_delay) {
-        cdrom->irq_delay -= 2;
+        cdrom->irq_delay -= cyc;
 
         if (cdrom->irq_delay <= 0) {
             if (cdrom->int_number) {
--- a/psx/dev/cdrom.h
+++ b/psx/dev/cdrom.h
@@ -215,7 +215,7 @@
 void psx_cdrom_write32(psx_cdrom_t*, uint32_t, uint32_t);
 void psx_cdrom_write16(psx_cdrom_t*, uint32_t, uint16_t);
 void psx_cdrom_write8(psx_cdrom_t*, uint32_t, uint8_t);
-void psx_cdrom_update(psx_cdrom_t*);
+void psx_cdrom_update(psx_cdrom_t*, int);
 void psx_cdrom_destroy(psx_cdrom_t*);
 void psx_cdrom_open(psx_cdrom_t*, const char*);
 void psx_cdrom_get_cdda_samples(psx_cdrom_t*, void*, int, psx_spu_t*);
--- a/psx/dev/dma.c
+++ b/psx/dev/dma.c
@@ -444,7 +444,7 @@
 
 void psx_dma_update(psx_dma_t* dma, int cyc) {
     if (dma->cdrom_irq_delay) {
-        dma->cdrom_irq_delay--;
+        dma->cdrom_irq_delay -= cyc;
 
         if ((dma->dicr & DICR_DMA3EN) && !dma->cdrom_irq_delay)
             dma->dicr |= DICR_DMA3FL;
@@ -451,15 +451,15 @@
     }
 
     if (dma->spu_irq_delay) {
-        dma->spu_irq_delay--;
+        dma->spu_irq_delay -= cyc;
 
-        if (!dma->spu_irq_delay)
+        if (dma->spu_irq_delay <= 0)
             if (dma->dicr & DICR_DMA4EN)
                 dma->dicr |= DICR_DMA4FL;
     }
 
     if (dma->gpu_irq_delay) {
-        dma->gpu_irq_delay--;
+        dma->gpu_irq_delay -= cyc;
 
         if (!dma->gpu_irq_delay)
             if (dma->dicr & DICR_DMA2EN)
@@ -467,7 +467,7 @@
     }
 
     if (dma->otc_irq_delay) {
-        dma->otc_irq_delay--;
+        dma->otc_irq_delay -= cyc;
 
         if (!dma->otc_irq_delay)
             if (dma->dicr & DICR_DMA6EN)
@@ -475,7 +475,7 @@
     }
 
     if (dma->mdec_in_irq_delay) {
-        dma->mdec_in_irq_delay--;
+        dma->mdec_in_irq_delay -= cyc;
 
         if (!dma->mdec_in_irq_delay)
             if (dma->dicr & DICR_DMA0EN)
@@ -483,7 +483,7 @@
     }
 
     if (dma->mdec_out_irq_delay) {
-        dma->mdec_out_irq_delay--;
+        dma->mdec_out_irq_delay -= cyc;
 
         if (!dma->mdec_out_irq_delay)
             if (dma->dicr & DICR_DMA1EN)
--- a/psx/dev/mdec.c
+++ b/psx/dev/mdec.c
@@ -285,6 +285,7 @@
             } else {
                 mdec->output_empty = 1;
                 mdec->output_index = 0;
+                mdec->output_request = 0;
 
                 return 0xaabbccdd;
             }
@@ -303,7 +304,7 @@
             status |= mdec->input_full       << 30;
             status |= mdec->output_empty     << 31;
 
-            return 0x00000000;
+            return status;
         } break;
     }
 
@@ -325,7 +326,7 @@
 void psx_mdec_write32(psx_mdec_t* mdec, uint32_t offset, uint32_t value) {
     switch (offset) {
         case 0: {
-            if (mdec->busy) {
+            if (mdec->words_remaining) {
                 mdec->input[mdec->input_index++] = value;
 
                 --mdec->words_remaining;
@@ -333,7 +334,9 @@
                 if (!mdec->words_remaining) {
                     mdec->output_empty = 0;
                     mdec->input_full = 1;
+                    mdec->input_request = 0;
                     mdec->busy = 0;
+                    mdec->output_request = mdec->enable_dma1;
 
                     g_mdec_cmd_table[mdec->cmd >> 29](mdec);
 
@@ -349,6 +352,7 @@
             mdec->output_signed = (value >> 26) & 1;
             mdec->output_depth = (value >> 27) & 3;
             mdec->input_index = 0;
+            mdec->input_full = 0;
             mdec->busy = 1;
 
             log_set_quiet(0);
@@ -391,6 +395,7 @@
             log_set_quiet(1);
 
             if (mdec->words_remaining) {
+                mdec->input_request = mdec->enable_dma0;
                 mdec->input_size = mdec->words_remaining * sizeof(uint32_t);
                 mdec->input_full = 0;
                 mdec->input_index = 0;
@@ -399,6 +404,9 @@
         } break;
 
         case 4: {
+            mdec->enable_dma0 = (value & 0x40000000) != 0;
+            mdec->enable_dma1 = (value & 0x20000000) != 0;
+
             // Reset
             if (value & 0x80000000) {
                 // status = 80040000h
@@ -414,9 +422,6 @@
                 mdec->output_empty    = 1;
                 mdec->current_block   = 4;
             }
-
-            mdec->output_request = (value & 0x20000000) != 0;
-            mdec->input_request = (value & 0x40000000) != 0;
         } break;
     }
 
--- a/psx/dev/mdec.h
+++ b/psx/dev/mdec.h
@@ -69,6 +69,9 @@
     int input_full;
     int output_empty;
 
+    int enable_dma0;
+    int enable_dma1;
+
     int recv_color;
     uint8_t uv_quant_table[MDEC_QUANT_TABLE_SIZE];
     uint8_t y_quant_table[MDEC_QUANT_TABLE_SIZE];
--- a/psx/psx.c
+++ b/psx/psx.c
@@ -26,7 +26,7 @@
 
 void psx_update(psx_t* psx) {
     psx_cpu_cycle(psx->cpu);
-    psx_cdrom_update(psx->cdrom);
+    psx_cdrom_update(psx->cdrom, psx->cpu->last_cycles);
     psx_gpu_update(psx->gpu, psx->cpu->last_cycles);
     psx_pad_update(psx->pad, psx->cpu->last_cycles);
     psx_timer_update(psx->timer, psx->cpu->last_cycles);
--