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