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