summaryrefslogtreecommitdiff
path: root/src/core.rs
diff options
context:
space:
mode:
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) {