shithub: psxe

Download patch

ref: fb110f6a1ec0a0322c5ad8649d4069db0ab817b4
parent: 923f2f1b66a283986f09ce1f869f9d4957e1b8ab
author: allkern <lisandroaalarcon@gmail.com>
date: Sun Aug 6 06:58:19 EDT 2023

Start working on MDEC

--- a/psx/bus.c
+++ b/psx/bus.c
@@ -58,6 +58,7 @@
     HANDLE_READ(timer, 32);
     HANDLE_READ(cdrom, 32);
     HANDLE_READ(pad, 32);
+    HANDLE_READ(mdec, 32);
 
     log_warn("Unhandled 32-bit read from %08x:%08x", vaddr, addr);
 
@@ -89,6 +90,7 @@
     HANDLE_READ(timer, 16);
     HANDLE_READ(cdrom, 16);
     HANDLE_READ(pad, 16);
+    HANDLE_READ(mdec, 16);
 
     log_warn("Unhandled 16-bit read from %08x:%08x", vaddr, addr);
 
@@ -116,6 +118,7 @@
     HANDLE_READ(timer, 8);
     HANDLE_READ(cdrom, 8);
     HANDLE_READ(pad, 8);
+    HANDLE_READ(mdec, 8);
 
     log_warn("Unhandled 8-bit read from %08x:%08x", vaddr, addr);
 
@@ -147,6 +150,7 @@
     HANDLE_WRITE(timer, 32);
     HANDLE_WRITE(cdrom, 32);
     HANDLE_WRITE(pad, 32);
+    HANDLE_WRITE(mdec, 32);
 
     log_warn("Unhandled 32-bit write to %08x:%08x (%08x)", vaddr, addr, value);
 }
@@ -176,6 +180,7 @@
     HANDLE_WRITE(timer, 16);
     HANDLE_WRITE(cdrom, 16);
     HANDLE_WRITE(pad, 16);
+    HANDLE_WRITE(mdec, 16);
 
     log_warn("Unhandled 16-bit write to %08x:%08x (%04x)", vaddr, addr, value);
 }
@@ -201,6 +206,7 @@
     HANDLE_WRITE(timer, 8);
     HANDLE_WRITE(cdrom, 8);
     HANDLE_WRITE(pad, 8);
+    HANDLE_WRITE(mdec, 8);
 
     log_warn("Unhandled 8-bit write to %08x:%08x (%02x)", vaddr, addr, value);
 }
@@ -259,6 +265,10 @@
 
 void psx_bus_init_pad(psx_bus_t* bus, psx_pad_t* pad) {
     bus->pad = pad;
+}
+
+void psx_bus_init_pad(psx_bus_t* bus, psx_mdec_t* mdec) {
+    bus->mdec = mdec;
 }
 
 uint32_t psx_bus_get_access_cycles(psx_bus_t* bus) {
--- a/psx/bus_init.h
+++ b/psx/bus_init.h
@@ -15,6 +15,7 @@
 #include "dev/timer.h"
 #include "dev/cdrom.h"
 #include "dev/pad.h"
+#include "dev/mdec.h"
 
 struct psx_bus_t {
     psx_bios_t* bios;
@@ -31,6 +32,7 @@
     psx_timer_t* timer;
     psx_cdrom_t* cdrom;
     psx_pad_t* pad;
+    psx_mdec_t* mdec;
 
     uint32_t access_cycles;
 };
@@ -49,5 +51,6 @@
 void psx_bus_init_timer(psx_bus_t*, psx_timer_t*);
 void psx_bus_init_cdrom(psx_bus_t*, psx_cdrom_t*);
 void psx_bus_init_pad(psx_bus_t*, psx_pad_t*);
+void psx_bus_init_mdec(psx_bus_t*, psx_mdec_t*);
 
 #endif
\ No newline at end of file
--- /dev/null
+++ b/psx/dev/mdec.c
@@ -1,0 +1,53 @@
+#include "mdec.h"
+#include "../log.h"
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+psx_mdec_t* psx_mdec_create() {
+    return (psx_mdec_t*)malloc(sizeof(psx_mdec_t));
+}
+
+void psx_mdec_init(psx_mdec_t* mdec) {
+    memset(mdec, 0, sizeof(psx_mdec_t));
+
+    mdec->io_base = PSX_MDEC_BEGIN;
+    mdec->io_size = PSX_MDEC_SIZE;
+}
+
+uint32_t psx_mdec_read32(psx_mdec_t* mdec, uint32_t offset) {
+    log_fatal("32-bit MDEC read offset=%u", offset);
+}
+
+uint16_t psx_mdec_read16(psx_mdec_t* mdec, uint32_t offset) {
+    log_fatal("Unhandled 16-bit MDEC read offset=%u", offset);
+
+    exit(1);
+}
+
+uint8_t psx_mdec_read8(psx_mdec_t* mdec, uint32_t offset) {
+    log_fatal("Unhandled 8-bit MDEC read offset=%u", offset);
+
+    exit(1);
+}
+
+void psx_mdec_write32(psx_mdec_t* mdec, uint32_t offset, uint32_t value) {
+    log_fatal("32-bit MDEC write offset=%u, value=%08x", offset, value);
+}
+
+void psx_mdec_write16(psx_mdec_t* mdec, uint32_t offset, uint16_t value) {
+    log_fatal("Unhandled 16-bit MDEC write offset=%u, value=%04x", offset, value);
+
+    exit(1);
+}
+
+void psx_mdec_write8(psx_mdec_t* mdec, uint32_t offset, uint8_t value) {
+    log_fatal("Unhandled 8-bit MDEC write offset=%u, value=%02x", offset, value);
+
+    exit(1);
+}
+
+void psx_mdec_destroy(psx_mdec_t* mdec) {
+    free(mdec);
+}
\ No newline at end of file
--- /dev/null
+++ b/psx/dev/mdec.h
@@ -1,0 +1,26 @@
+#ifndef MDEC_H
+#define MDEC_H
+
+#include <stdint.h>
+
+#include "../log.h"
+
+#define PSX_MDEC_SIZE    0x8
+#define PSX_MDEC_BEGIN   0x1f801820
+#define PSX_MDEC_END     0x1f801827
+
+typedef struct {
+    uint32_t io_base, io_size;
+} psx_mdec_t;
+
+psx_mdec_t* psx_mdec_create();
+void psx_mdec_init(psx_mdec_t*);
+uint32_t psx_mdec_read32(psx_mdec_t*, uint32_t);
+uint16_t psx_mdec_read16(psx_mdec_t*, uint32_t);
+uint8_t psx_mdec_read8(psx_mdec_t*, uint32_t);
+void psx_mdec_write32(psx_mdec_t*, uint32_t, uint32_t);
+void psx_mdec_write16(psx_mdec_t*, uint32_t, uint16_t);
+void psx_mdec_write8(psx_mdec_t*, uint32_t, uint8_t);
+void psx_mdec_destroy(psx_mdec_t*);
+
+#endif
\ No newline at end of file
--- a/psx/psx.c
+++ b/psx/psx.c
@@ -91,6 +91,7 @@
     psx->timer = psx_timer_create();
     psx->cdrom = psx_cdrom_create();
     psx->pad = psx_pad_create();
+    psx->mdec = psx_mdec_create();
 
     psx_bus_init(psx->bus);
 
@@ -108,15 +109,17 @@
     psx_bus_init_timer(psx->bus, psx->timer);
     psx_bus_init_cdrom(psx->bus, psx->cdrom);
     psx_bus_init_pad(psx->bus, psx->pad);
+    psx_bus_init_mdec(psx->bus, psx->mdec);
 
     // Init devices
     psx_bios_init(psx->bios);
-    psx_ram_init(psx->ram, psx->mc2);
-    psx_dma_init(psx->dma, psx->bus, psx->ic);
-    psx_exp1_init(psx->exp1, psx->mc1);
+    psx_bios_load(psx->bios, bios_path);
     psx_mc1_init(psx->mc1);
     psx_mc2_init(psx->mc2);
     psx_mc3_init(psx->mc3);
+    psx_ram_init(psx->ram, psx->mc2);
+    psx_dma_init(psx->dma, psx->bus, psx->ic);
+    psx_exp1_init(psx->exp1, psx->mc1);
     psx_ic_init(psx->ic, psx->cpu);
     psx_scratchpad_init(psx->scratchpad);
     psx_gpu_init(psx->gpu, psx->ic);
@@ -124,7 +127,7 @@
     psx_timer_init(psx->timer, psx->ic);
     psx_cdrom_init(psx->cdrom, psx->ic);
     psx_pad_init(psx->pad, psx->ic);
-    psx_bios_load(psx->bios, bios_path);
+    psx_mdec_init(psx->mdec);
     psx_cpu_init(psx->cpu, psx->bus);
 }
 
@@ -162,6 +165,7 @@
     psx_timer_destroy(psx->timer);
     psx_cdrom_destroy(psx->cdrom);
     psx_pad_destroy(psx->pad);
+    psx_mdec_destroy(psx->mdec);
 
     free(psx);
 }
@@ -224,6 +228,10 @@
 
 psx_pad_t* psx_get_pad(psx_t* psx) {
     return psx->pad;
+}
+
+psx_mdec_t* psx_get_mdec(psx_t* psx) {
+    return psx->mdec;
 }
 
 psx_cpu_t* psx_get_cpu(psx_t* psx) {
--- a/psx/psx.h
+++ b/psx/psx.h
@@ -24,6 +24,7 @@
     psx_timer_t* timer;
     psx_cdrom_t* cdrom;
     psx_pad_t* pad;
+    psx_mdec_t* mdec;
 } psx_t;
 
 psx_t* psx_create();
@@ -57,6 +58,7 @@
 psx_timer_t* psx_get_timer(psx_t*);
 psx_cdrom_t* psx_get_cdrom(psx_t*);
 psx_pad_t* psx_get_pad(psx_t*);
+psx_mdec_t* psx_get_mdec(psx_t*);
 psx_cpu_t* psx_get_cpu(psx_t*);
 void psx_destroy(psx_t*);
 
--