commit 0cc9916509027b5af4690f39d4c1ba10f9b49d5e
parent a7e5dc83d3e11fd14bca2d5641d415ee1faba162
Author: Michail Konstantinos Dimopoulos <mk@mcdim.xyz>
Date: Sat, 5 Sep 2026 18:13:46 +0300
Fixed load/store signedness and cast-order bugs
Diffstat:
2 files changed, 10 insertions(+), 11 deletions(-)
diff --git a/exec.c b/exec.c
@@ -234,10 +234,9 @@ static void exec_itype_loads(cpu_state_t *cpu, uint32_t inst, uint8_t *mem) {
case 0x4:
x = (uint32_t)(uint8_t)mem[addr];
break;
-
case 0x5:
- int16_t uhalf = (int16_t)mem[addr] | ((int16_t)mem[addr+1] << 8);
- x = (uint32_t)(int32_t)uhalf;
+ uint16_t uhalf = (uint16_t)mem[addr] | ((uint16_t)mem[addr+1] << 8);
+ x = (uint32_t)uhalf;
break;
default:
raise_trap(cpu, TRAP_ILLEGAL_INSTRUCTION, inst);
@@ -269,7 +268,7 @@ static void exec_stype(cpu_state_t *cpu, uint32_t inst, uint8_t *mem) {
if (addr % 2 == 0) {
mem[addr] = (uint8_t)cpu->x[s.rs2];
- mem[addr+1] = (uint8_t)cpu->x[s.rs2] >> 8;
+ mem[addr+1] = (uint8_t)(cpu->x[s.rs2] >> 8);
}
break;
case 0x2:
@@ -279,9 +278,9 @@ static void exec_stype(cpu_state_t *cpu, uint32_t inst, uint8_t *mem) {
}
if (addr % 4 == 0) {
mem[addr] = (uint8_t)cpu->x[s.rs2];
- mem[addr+1] = (uint8_t)cpu->x[s.rs2] >> 8;
- mem[addr+2] = (uint8_t)cpu->x[s.rs2] >> 16;
- mem[addr+3] = (uint8_t)cpu->x[s.rs2] >> 24;
+ mem[addr+1] = (uint8_t)(cpu->x[s.rs2] >> 8);
+ mem[addr+2] = (uint8_t)(cpu->x[s.rs2] >> 16);
+ mem[addr+3] = (uint8_t)(cpu->x[s.rs2] >> 24);
}
break;
default:
diff --git a/main.c b/main.c
@@ -19,12 +19,14 @@ load_program(uint8_t *mem)
{
/* program */
uint32_t arr[] = {
+/*
0xfff00093, // addi x1, x0, -1
0xfff04113, // xori x2, x0, -1
0xfff06193, // ori x3, x0, -1
0xfff17213, // andi x4, x2, -1
0xfff02293, // slti x5, x0, -1
0xfff03313 // sltiu x6, x0, -1
+*/
/*
0xfff00093, // li ra,-1
0xfff04113, // not sp,zero
@@ -42,7 +44,6 @@ load_program(uint8_t *mem)
0xff750513, // addi x10, x10, -9
0x00100073 // ebreak
*/
-/*
0x10000593, //li a1,256
0xfff00513, //li a0,-1
0x00a58023, //sb a0,0(a1)
@@ -62,7 +63,6 @@ load_program(uint8_t *mem)
0x0085a503, //lw a0,8(a1)
0x00000593, //li a1,0
0x00100073 //ebreak
-*/
/*
0x00200093, // addi x1, x0, 2
0x00000113, // addi x2, x0, 0
@@ -146,12 +146,12 @@ debugger(cpu_state_t *cpu, uint8_t *mem)
strncmp(line, "registers", 9) == 0) {
printf("Registers:\n");
for (int i=0; i<32; i++) {
- printf("0x%x: 0x%x\n", i, cpu->x[i]);
+ printf("x%d: 0x%x\n", i, cpu->x[i]);
}
} else if (strncmp(line, "m", 1) == 0 ||
strncmp(line, "memory", 6) == 0) {
printf("Memory:\n");
- for (uint32_t i=0; i<128; i+=4) {
+ for (uint32_t i=0; i<0x110; i+=4) {
if (cpu->pc == i) {
printf("-> ");
} else {