From 039afedbc80eea82266c324b6548d59dcd746098 Mon Sep 17 00:00:00 2001 From: Nathan Lee Date: Wed, 17 Jun 2026 13:03:33 -0500 Subject: fix memory issues and add basic device discovery discuss: pci/dtb device discovery? now that the x0 issue is fixed it is entirely possible. --- src/core.rs | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) (limited to 'src/core.rs') 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) { -- cgit v1.2.3