From d762e1449bd62c3c243864c1b6af07550ab48f9f Mon Sep 17 00:00:00 2001 From: Mwa Date: Thu, 12 Mar 2026 15:10:14 +0100 Subject: [PATCH] specifyng wrapping add --- asm/src/main.rs | 2 +- simu/src/cpu.rs | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/asm/src/main.rs b/asm/src/main.rs index 9cd1623..8845b0e 100644 --- a/asm/src/main.rs +++ b/asm/src/main.rs @@ -309,7 +309,7 @@ fn op2(s: &str, n: usize, l: &str) -> Op2 { "r15" => 15, _ => match parse_int::parse::(s) { Ok(v) => { - if -0xFFFF <= v && v <= 0xFFFF { + if -0x10000 <= v && v <= 0xFFFF { return Op2::Direct(v as i32); } else { println!("Error: constant {s} is too large to fit in {l} at line {n}"); diff --git a/simu/src/cpu.rs b/simu/src/cpu.rs index 688b1d3..bc81406 100644 --- a/simu/src/cpu.rs +++ b/simu/src/cpu.rs @@ -266,7 +266,7 @@ impl<'a, 'b> Computer<'a, 'b> { self.pc += 1 } Instruction::Store(reg, op2, reg1) => { - let addr = (self.rg_r(reg) + self.resolve(op2)) as usize; + let addr = (self.rg_r(reg).wrapping_add(self.resolve(op2))) as usize; if !addr.is_multiple_of(4) { iot(); } @@ -287,7 +287,7 @@ impl<'a, 'b> Computer<'a, 'b> { self.pc += 1; } Instruction::Load(reg, reg1, op2) => { - let addr = (self.rg_r(reg1) + self.resolve(op2)) as usize; + let addr = (self.rg_r(reg1).wrapping_add(self.resolve(op2))) as usize; if !addr.is_multiple_of(4) { iot(); } @@ -306,8 +306,10 @@ impl<'a, 'b> Computer<'a, 'b> { res } else if addr == 0x01200000 { self.key.load(std::sync::atomic::Ordering::Relaxed) - } else if addr == 0x01200004{ - time::Instant::now().duration_since(self.creation).as_millis() as u32 + } else if addr == 0x01200004 { + time::Instant::now() + .duration_since(self.creation) + .as_millis() as u32 } else { iot(); },