aboutsummaryrefslogtreecommitdiff
path: root/triscv/src/mem.c
diff options
context:
space:
mode:
authorKimplul <kimi.h.kuparinen@gmail.com>2023-10-28 00:00:21 +0300
committerKimplul <kimi.h.kuparinen@gmail.com>2023-10-28 00:00:21 +0300
commitd96b8c7d12fc61ec609d6138627b9d6d18139a9a (patch)
tree82bc9a4c2b22de6c021097fb79a57b6d7756a127 /triscv/src/mem.c
downloadtri-d96b8c7d12fc61ec609d6138627b9d6d18139a9a.tar.gz
tri-d96b8c7d12fc61ec609d6138627b9d6d18139a9a.zip
move to monorepo
+ Will probably have to make some changes to dir layout to make things make more sense
Diffstat (limited to 'triscv/src/mem.c')
-rw-r--r--triscv/src/mem.c79
1 files changed, 79 insertions, 0 deletions
diff --git a/triscv/src/mem.c b/triscv/src/mem.c
new file mode 100644
index 0000000..5d70896
--- /dev/null
+++ b/triscv/src/mem.c
@@ -0,0 +1,79 @@
+#include <triscv/mem.h>
+#include <string.h>
+
+struct mem {
+ size_t size;
+ uint32_t buf[];
+};
+
+struct mem *mem_create(size_t size)
+{
+ struct mem *mem = calloc(1, sizeof(struct mem) + size * sizeof(mem->buf[0]));
+ mem->size = size;
+ return mem;
+}
+
+void mem_destroy(struct mem *mem)
+{
+ free(mem);
+}
+
+void mem_init(struct mem *mem, const void *buf, size_t len)
+{
+ assert((len * 3) < mem->size);
+ for (size_t i = 0; i < len * 3; i += 3) {
+ tri_t t = ((tri_t *)buf)[i / 3];
+ mem->buf[i + 0] = tri_mask(t, 9);
+ t = tri_sr(t, 9);
+
+ mem->buf[i + 1] = tri_mask(t, 9);
+ t = tri_sr(t, 9);
+
+ mem->buf[i + 2] = tri_mask(t, 9);
+ }
+}
+
+static void mem_write1(struct cpu *cpu, struct mem *mem, pm_t addr, tri_t t)
+{
+ (void)cpu;
+ (void)mem;
+ (void)addr;
+ (void)t;
+}
+
+static void mem_write3(struct cpu *cpu, struct mem *mem, pm_t addr, tri_t t)
+{
+ (void)cpu;
+ (void)mem;
+ (void)addr;
+ (void)t;
+}
+
+static tri_t mem_read1(struct cpu *cpu, struct mem *mem, pm_t addr)
+{
+ (void)cpu;
+ tri_t t = (tri_t)mem->buf[addr];
+ return tri_mask(t, 9);
+}
+
+static tri_t mem_read3(struct cpu *cpu, struct mem *mem, pm_t addr)
+{
+ (void)cpu;
+ /* not necessarily ideal, but I guess it works for now */
+ tri_t t0 = mem_read1(cpu, mem, addr + 0);
+ tri_t t1 = mem_read1(cpu, mem, addr + 1);
+ tri_t t2 = mem_read1(cpu, mem, addr + 2);
+ return t0 | tri_sl(t1, 9) | tri_sl(t2, 18);
+}
+
+struct dev mem_dev(struct mem *mem)
+{
+ return (struct dev){
+ .dev = mem,
+ .size = mem->size,
+ .write1 = (dev_write1_t)mem_write1,
+ .write3 = (dev_write3_t)mem_write3,
+ .read1 = (dev_read1_t)mem_read1,
+ .read3 = (dev_read3_t)mem_read3
+ };
+}