rvemu

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

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:
Mmain.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) {