summaryrefslogtreecommitdiff
path: root/src/core.rs
diff options
context:
space:
mode:
authorNathan Lee <me@nwlee.tech>2026-06-17 13:03:33 -0500
committerNathan Lee <me@nwlee.tech>2026-06-17 13:03:33 -0500
commit039afedbc80eea82266c324b6548d59dcd746098 (patch)
tree3f76854dfe171deb97c602b2ada63655b5b1cbe2 /src/core.rs
parent5ebbd6d53b6b4a21178e07fdaaeeeee40941c561 (diff)
fix memory issues and add basic device discovery
discuss: pci/dtb device discovery? now that the x0 issue is fixed it is entirely possible.
Diffstat (limited to 'src/core.rs')
-rw-r--r--src/core.rs28
1 files changed, 20 insertions, 8 deletions
diff --git a/src/core.rs b/src/core.rs
index 60d720b..6317c9e 100644
--- a/src/core.rs
+++ b/src/core.rs
@@ -168,7 +168,7 @@ pub fn lh(state: &mut CpuState, rd: usize, rs1: usize, imm: u32) {
}
pub fn lw(state: &mut CpuState, rd: usize, rs1: usize, imm: u32) {
- let addr = (state.registers[rs1] + imm) as usize;
+ let addr = (state.registers[rs1].wrapping_add(imm)) as usize;
let slice = state.memory.read_multiple_bytes(addr, 4, 99).unwrap();
let number = u32::from_le_bytes(slice[0..4].try_into().unwrap());
@@ -224,42 +224,54 @@ pub fn sw(state: &mut CpuState, rs1: usize, rs2: usize, imm: u32) {
pub fn beq(state: &mut CpuState, rs1: usize, rs2: usize, imm: u32) {
if state.registers[rs1] == state.registers[rs2] {
- state.pc += imm;
+ state.pc = state.pc.wrapping_add(imm);
+ } else {
+ state.pc += 4;
}
}
pub fn bne(state: &mut CpuState, rs1: usize, rs2: usize, imm: u32) {
if state.registers[rs1] != state.registers[rs2] {
- state.pc += imm;
+ state.pc = state.pc.wrapping_add(imm);
+ } else {
+ state.pc += 4;
}
}
pub fn blt(state: &mut CpuState, rs1: usize, rs2: usize, imm: u32) {
if (state.registers[rs1] as i32) < (state.registers[rs2] as i32) {
- state.pc += imm;
+ state.pc = state.pc.wrapping_add(imm);
+ } else {
+ state.pc += 4;
}
}
pub fn bge(state: &mut CpuState, rs1: usize, rs2: usize, imm: u32) {
if (state.registers[rs1] as i32) >= (state.registers[rs2] as i32) {
- state.pc += imm;
+ state.pc = state.pc.wrapping_add(imm);
+ } else {
+ state.pc += 4;
}
}
pub fn bltu(state: &mut CpuState, rs1: usize, rs2: usize, imm: u32) {
if state.registers[rs1] < state.registers[rs2] {
- state.pc += imm;
+ state.pc = state.pc.wrapping_add(imm);
+ } else {
+ state.pc += 4;
}
}
pub fn bgeu(state: &mut CpuState, rs1: usize, rs2: usize, imm: u32) {
if state.registers[rs1] >= state.registers[rs2] {
- state.pc += imm;
+ state.pc = state.pc.wrapping_add(imm);
+ } else {
+ state.pc += 4;
}
}
pub fn jal(state: &mut CpuState, rd: usize, imm: u32) {
state.registers[rd] = state.pc + 4;
- state.pc += imm;
+ state.pc = state.pc.wrapping_add(imm);
}
pub fn jalr(state: &mut CpuState, rd: usize, rs1: usize, imm: u32) {