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