1use 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
13fn 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 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 let mut mars = MarsBuilder::new()
65 .build_and_load(vec![(4000, None, &imp)])
66 .unwrap();
67
68 display_mars_state(&mars, 5);
70
71 while !mars.halted() {
73 thread::sleep(time::Duration::from_millis(1000));
74 let _ = mars.step();
75 display_mars_state(&mars, 5);
76 }
77}
78