imp/
imp.rs

1//! An example of running a core with the common warrior, the imp, loaded.
2
3use std::thread;
4use std::time;
5use std::fmt;
6
7extern crate libcw;
8use libcw::redcode::types::*;
9use libcw::redcode::Instruction;
10use libcw::redcode::traits;
11use libcw::simulation::{MarsBuilder, Mars};
12
13/// Display the state of the MARS on `stdout`
14///
15/// # Arguments
16/// * `mars`: pointer to `Mars`
17/// * `margin`: memory addresses before and after pc to display
18fn display_mars_state<T>(mars: &Mars<T>, margin: usize)
19    where T: traits::Instruction + fmt::Display
20{
21    let pc    = mars.pc() as usize;
22    let pid   = mars.pid();
23    let cycle = mars.cycle();
24    let size  = mars.size();
25
26    // print header
27    println!("| Cycle: {} | PC: {} | PID: {} |", cycle, pc, pid);
28
29    let min = if margin > pc {
30        size - (margin - pc) 
31    } else {
32        pc - margin
33    };
34
35    let iter = mars.memory().iter()
36        .enumerate()
37        .cycle()
38        .skip(min)
39        .take(margin*2 + 1);
40
41    for (addr, ins) in iter {
42        if addr == pc {
43            println!(">{}< {}", addr, ins);
44        } else {
45            println!("|{}| {}", addr, ins);
46        }
47    }
48}
49
50fn main()
51{
52    let imp = vec![
53        Instruction::new(
54            OpCode::Mov,
55            Modifier::I,
56            0,
57            AddressingMode::Direct,
58            1,
59            AddressingMode::Direct
60            )
61    ]; 
62
63    // create mars
64    let mut mars = MarsBuilder::new()
65        .build_and_load(vec![(4000, None, &imp)])
66        .unwrap();
67
68    // display initial state
69    display_mars_state(&mars, 5);
70
71    // run
72    while !mars.halted() {
73        thread::sleep(time::Duration::from_millis(1000));
74        let _ = mars.step(); 
75        display_mars_state(&mars, 5);
76    }
77}
78