commit 50e9877a99f750e157f402ab7cfefb35f06514a9
parent cae55a983faec0c7b20e685d5b6bb4fc3a58e88b
Author: Michail Konstantinos Dimopoulos <mk@mcdim.xyz>
Date: Wed, 26 Aug 2026 19:35:29 +0300
Von Neumann: Instructions in memoryspace
Diffstat:
| M | main.c | | | 63 | +++++++++++++++++++++++++++++++++++++++++++++++++-------------- |
1 file changed, 49 insertions(+), 14 deletions(-)
diff --git a/main.c b/main.c
@@ -177,6 +177,8 @@ void exec_itype(cpu_state_t *cpu, uint32_t inst, uint8_t *mem) {
}
printf("rd:%u\n", cpu->x[i.rd]);
+
+ cpu->pc += 4;
}
/*
@@ -281,6 +283,7 @@ void exec_rtype(cpu_state_t *cpu, uint32_t inst, uint8_t *mem) {
}
printf("rd:%u\n", cpu->x[r.rd]);
+ cpu->pc += 4;
}
/*
@@ -353,6 +356,7 @@ void exec_ltype(cpu_state_t *cpu, uint32_t inst, uint8_t *mem) {
if (i.rd != 0) {
cpu->x[i.rd] = x;
}
+ cpu->pc += 4;
printf("\nrd:%d\n", cpu->x[i.rd]);
printf("rd:%x\n", cpu->x[i.rd]);
@@ -432,6 +436,8 @@ void exec_stype(cpu_state_t *cpu, uint32_t inst, uint8_t *mem) {
fprintf(stderr, "Illegal funct3\n");
return;
}
+
+ cpu->pc += 4;
}
/*
@@ -492,11 +498,49 @@ void exec_btype(cpu_state_t *cpu, uint32_t inst, uint8_t *mem) {
return;
}
cpu->pc = target;
+ } else {
+ cpu->pc += 4;
}
}
}
+void
+load_program(uint8_t *mem)
+{
+ /* PROGRAM */
+ uint32_t arr[] = {
+ 0x500193, // addi x3, x0, 5
+ 0x600093, // addi x1, x0, 6
+ 0x118263, // beq x3, x1. +4
+ 0x728263 // beq x5, x7, +4
+ };
+ size_t len = sizeof(arr) / sizeof(arr[0]);
+
+ int b = 0; /*byte*/
+ for (int i=0; i<len; i++) {
+
+ mem[b+0] = (uint8_t)(arr[i] >> 0);
+ mem[b+1] = (uint8_t)(arr[i] >> 8);
+ mem[b+2] = (uint8_t)(arr[i] >> 16);
+ mem[b+3] = (uint8_t)(arr[i] >> 24);
+
+ b+=4;
+ }
+}
+
+static inline uint32_t
+make_instruction(uint8_t *mem, int index)
+{
+ uint32_t inst = 0;
+ inst |= (uint32_t)(mem[index+0]) << 0;
+ inst |= (uint32_t)(mem[index+1]) << 8;
+ inst |= (uint32_t)(mem[index+2]) << 16;
+ inst |= (uint32_t)(mem[index+3]) << 24;
+ return inst;
+
+}
+
/* Function pointer dispatch */
typedef void (*exec_fn)(cpu_state_t *, uint32_t inst, uint8_t *mem);
@@ -519,18 +563,10 @@ int main() {
cpu_state_t cpu = {0};
uint8_t mem[MEMSIZE] = {0};
-
- /* PROGRAM */
- uint32_t arr[] = {
- 0x500193,
- 0x600093,
- 0x118263,
- 0x728263
- };
- size_t len = sizeof(arr) / sizeof(arr[0]);
+ load_program(mem);
+
/* fetch & run */
- size_t i = 0;
while (1) {
printf("\n>");
@@ -544,11 +580,11 @@ int main() {
strncmp(line, "step", 4) == 0 ||
strncmp(line, "n", 1) == 0 ||
strncmp(line, "next", 4) == 0) {
- if (i >= len) return 0;
+ //if (i >= len) return 0;
- uint32_t inst = arr[i];
+ uint32_t inst = make_instruction(mem, cpu.pc);
- printf("------------INST%d------\n", i);
+ printf("------------INST------\n");
print_bin32(inst);
printf("\n");
@@ -567,7 +603,6 @@ int main() {
}
fn(&cpu,inst,mem);
- i++;
} else if (strncmp(line, "r", 1) == 0 ||
strncmp(line, "registers", 9) == 0) {