This commit is contained in:
Richard 2025-08-26 10:50:05 +02:00
parent f74be7dbbf
commit 65598cf86e

View File

@ -33,6 +33,14 @@ impl Cpu {
}
}
fn gr(&self, r: u8) -> u32{
self.reg[r as usize]
}
fn sr(&mut self, r: u8, v:u32) {
self.reg[r as usize] = v
}
fn ins(&self) -> Result<Instruction,CpuError> {
if self.finger as usize >= self.arr[&0].len() {
return Err(CpuError::ProgramEnd);
@ -75,14 +83,23 @@ impl Cpu {
}
fn handle_ortho(&mut self, i:SpecialInstruction) -> Result<(), CpuError>{
self.reg[i.a as usize] = i.v as u32;
self.sr(i.a, i.v);
Ok(())
}
fn handle_cmov(&mut self, i:NormalInstruction) -> Result<(), CpuError>{
if self.gr(i.c) > 0 {
let v = self.gr(i.b);
self.sr(i.a, v);
}
Ok(())
}
fn exec(&mut self, instruction: Instruction)-> Result<(), CpuError>{
println!("{:?}", instruction);
//println!("{:?}", instruction);
match instruction {
Instruction::Ortho(i) => self.handle_ortho(i),
Instruction::ConditionalMove(i) => self.handle_cmov(i),
_ => Err(CpuError::InvalidInstruction)
}
}
@ -121,4 +138,46 @@ mod tests{
Ok(())
}
#[test]
fn test_cmov() -> Result<(), String> {
let pgm = vec!(
ezop(13, 1, 65535, 0),
ezop(13, 2, 1337, 0),
ezop(13, 3, 1, 0),
ezop(0, 1, 2, 3),
);
let mut c = Cpu::new(pgm);
_ = c.step();
_ = c.step();
_ = c.step();
let result = c.step();
assert!(matches!(result, Ok(_)));
assert_eq!(c.reg[0], 0);
assert_eq!(c.reg[3], 1);
assert_eq!(c.reg[2], 1337);
assert_eq!(c.reg[1], 1337);
Ok(())
}
#[test]
fn test_cmov_neg() -> Result<(), String> {
let pgm = vec!(
ezop(13, 1, 65535, 0),
ezop(13, 2, 1337, 0),
ezop(13, 3, 0, 0),
ezop(0, 1, 2, 3),
);
let mut c = Cpu::new(pgm);
_ = c.step();
_ = c.step();
_ = c.step();
let result = c.step();
assert!(matches!(result, Ok(_)));
assert_eq!(c.reg[0], 0);
assert_eq!(c.reg[3], 0);
assert_eq!(c.reg[2], 1337);
assert_eq!(c.reg[1], 65535);
Ok(())
}
}