(&mut self)
| 28 | } |
| 29 | |
| 30 | pub fn execute(&mut self) -> ExitCode { |
| 31 | loop { |
| 32 | let (op,a,b,c) = self.fetch_inst(); |
| 33 | match op { |
| 34 | ADD => self.set(c, a + b), |
| 35 | MUL => self.set(c, a * b), |
| 36 | SLT => self.set(c, a < b), |
| 37 | SEQ => self.set(c, a == b), |
| 38 | BSE => self.rel_base += a, |
| 39 | JNZ => if a != 0 { self.pc = b }, |
| 40 | JZ => if a == 0 { self.pc = b }, |
| 41 | OUT => return ExitCode::Output(a), |
| 42 | HLT => return ExitCode::Halted, |
| 43 | IN => match self.input.pop_front() { |
| 44 | Some(i) => { |
| 45 | let a = self.fetch_write_adr(1); |
| 46 | self.set(a,i); |
| 47 | self.pc += 2; |
| 48 | } |
| 49 | None => return ExitCode::AwaitInput |
| 50 | } |
| 51 | _ => panic!("invalid opcode {}", op) |
| 52 | } |
| 53 | } |
| 54 | } |
| 55 | |
| 56 | pub fn execute_until_output(&mut self) -> i64 { |
| 57 | match self.execute() { |
no test coverage detected