make exec speed configurable
This commit is contained in:
@@ -16,11 +16,6 @@ impl RunThread {
|
|||||||
|
|
||||||
trace!("### {:04} : {:?}", state.frame.pc.0, op);
|
trace!("### {:04} : {:?}", state.frame.pc.0, op);
|
||||||
|
|
||||||
/* Operations can be given different execution times when run in slow mode. */
|
op.execute(info, state)
|
||||||
/* Presently, all that do anything use 1 cycle. */
|
|
||||||
|
|
||||||
let rv = op.execute(info, state);
|
|
||||||
trace!("-> {:?}", rv);
|
|
||||||
rv
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -63,6 +63,10 @@ impl RunThread {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn set_speed(&mut self, cycle_time : Duration) {
|
||||||
|
self.info.cycle_time = cycle_time;
|
||||||
|
}
|
||||||
|
|
||||||
pub fn start(self) -> JoinHandle<()> {
|
pub fn start(self) -> JoinHandle<()> {
|
||||||
std::thread::spawn(move || {
|
std::thread::spawn(move || {
|
||||||
self.run();
|
self.run();
|
||||||
|
|||||||
@@ -48,6 +48,10 @@ impl OpTrait for StackOp {
|
|||||||
let obj: &mut Stacks = state.ext_mut();
|
let obj: &mut Stacks = state.ext_mut();
|
||||||
let val = obj.stacks[stack_num as usize].pop_back();
|
let val = obj.stacks[stack_num as usize].pop_back();
|
||||||
|
|
||||||
|
if obj.stacks[stack_num as usize].is_empty() {
|
||||||
|
state.frame.status.zero = true;
|
||||||
|
}
|
||||||
|
|
||||||
let val = match val {
|
let val = match val {
|
||||||
None => {
|
None => {
|
||||||
state.frame.status.overflow = true;
|
state.frame.status.overflow = true;
|
||||||
|
|||||||
+13
-3
@@ -8,6 +8,7 @@ use crsn::asm::data::literal::Addr;
|
|||||||
use crsn::runtime::run_thread::{RunThread, ThreadToken};
|
use crsn::runtime::run_thread::{RunThread, ThreadToken};
|
||||||
use crsn_arith::ArithOps;
|
use crsn_arith::ArithOps;
|
||||||
use crsn_stacks::StackOps;
|
use crsn_stacks::StackOps;
|
||||||
|
use std::time::Duration;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
SimpleLogger::new().init().unwrap();
|
SimpleLogger::new().init().unwrap();
|
||||||
@@ -71,12 +72,19 @@ fn main() {
|
|||||||
(main
|
(main
|
||||||
(push 0 10)
|
(push 0 10)
|
||||||
(push 0 20)
|
(push 0 20)
|
||||||
|
(call emptystack 0)
|
||||||
(push 0 30)
|
(push 0 30)
|
||||||
(pop r0 0)
|
(pop r0 0)
|
||||||
(pop r0 0)
|
(pop r0 0)
|
||||||
(pop r0 0)
|
(pop r0 0)
|
||||||
(halt)
|
(halt)
|
||||||
)
|
)
|
||||||
|
(emptystack
|
||||||
|
(:again)
|
||||||
|
(pop _ arg0 (z? (ret)))
|
||||||
|
(j :again)
|
||||||
|
(ret)
|
||||||
|
)
|
||||||
)
|
)
|
||||||
";
|
";
|
||||||
|
|
||||||
@@ -87,12 +95,14 @@ fn main() {
|
|||||||
|
|
||||||
let parsed = crsn::asm::assemble(program, parsers.as_slice()).unwrap();
|
let parsed = crsn::asm::assemble(program, parsers.as_slice()).unwrap();
|
||||||
|
|
||||||
let thread1 = RunThread::new(ThreadToken(0), parsed.clone(), Addr(0), &[]);
|
let mut thread1 = RunThread::new(ThreadToken(0), parsed.clone(), Addr(0), &[]);
|
||||||
|
thread1.set_speed(Duration::from_millis(1000));
|
||||||
|
|
||||||
let thread2 = RunThread::new(ThreadToken(1), parsed.clone(), Addr(0), &[]);
|
let thread2 = RunThread::new(ThreadToken(1), parsed.clone(), Addr(0), &[]);
|
||||||
|
|
||||||
let a = thread1.start();
|
let a = thread1.start();
|
||||||
let b = thread2.start();
|
//let b = thread2.start();
|
||||||
|
|
||||||
a.join().unwrap();
|
a.join().unwrap();
|
||||||
b.join().unwrap();
|
//b.join().unwrap();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user