Add print instruction to print the value of a register to the console

pull/1/head
trivernis 5 years ago
parent 4ae7eee80c
commit 5adb4296e5

@ -17,6 +17,7 @@ A virtual machine for controlling a wifi led strip.
| label <u32> | creates a label at the current position. | 0x07 | | label <u32> | creates a label at the current position. | 0x07 |
| goto (rgl) | goes to the label with name rgl | 0x08 | | goto (rgl) | goes to the label with name rgl | 0x08 |
| debug (*) | prints out the state for debug information | 0x09 | | debug (*) | prints out the state for debug information | 0x09 |
| print <rg> | prints the value of a register | 0x0A |
| add (rgd, rgi, rgo) | adds the value of rgi to the value of rgd and writes the result into rgo | 0x10 | | add (rgd, rgi, rgo) | adds the value of rgi to the value of rgd and writes the result into rgo | 0x10 |
| sub (rgd, rgi, rgo) | substracts rgi from rgd and writes the result into rgo | 0x11 | | sub (rgd, rgi, rgo) | substracts rgi from rgd and writes the result into rgo | 0x11 |
| mul (rgd, rgi, rgo) | multiplies rgd by rgi and writes the result to rgo | 0x12 | | mul (rgd, rgi, rgo) | multiplies rgd by rgi and writes the result to rgo | 0x12 |

@ -1,8 +1,8 @@
use ledstrip_vm::registers::get_register_code_by_name; use ledstrip_vm::registers::get_register_code_by_name;
use ledstrip_vm::tokens::{ use ledstrip_vm::tokens::{
AddToken, ClearToken, CmdToken, CopyToken, DebugToken, DivToken, ExitToken, GotoToken, JeToken, AddToken, ClearToken, CmdToken, CopyToken, DebugToken, DivToken, ExitToken, GotoToken, JeToken,
JgToken, JlToken, LabelToken, LoadToken, LshToken, ModToken, MulToken, PauseToken, RshToken, JgToken, JlToken, LabelToken, LoadToken, LshToken, ModToken, MulToken, PauseToken, PrintToken,
SendToken, SetToken, SubToken, Token, WriteToken, RshToken, SendToken, SetToken, SubToken, Token, WriteToken,
}; };
use std::fs::{read_to_string, File}; use std::fs::{read_to_string, File};
use std::io; use std::io;
@ -85,6 +85,9 @@ fn get_token(line: &str) -> Option<Box<dyn Token>> {
}), }),
"goto" => some_box!(GotoToken), "goto" => some_box!(GotoToken),
"debug" => some_box!(DebugToken), "debug" => some_box!(DebugToken),
"print" => some_box!(PrintToken {
register: get_register_code_by_name(instr_parts.next()?)?
}),
"add" => some_box!(AddToken), "add" => some_box!(AddToken),
"sub" => some_box!(SubToken), "sub" => some_box!(SubToken),
"mul" => some_box!(MulToken), "mul" => some_box!(MulToken),

@ -5,9 +5,9 @@ use crate::registers::{
use crate::tokens::{ use crate::tokens::{
AddToken, ClearToken, CmdToken, CopyToken, DebugToken, DivToken, ExitToken, FromBytecode, AddToken, ClearToken, CmdToken, CopyToken, DebugToken, DivToken, ExitToken, FromBytecode,
GotoToken, JeToken, JgToken, JlToken, LabelToken, LoadToken, LshToken, ModToken, MulToken, GotoToken, JeToken, JgToken, JlToken, LabelToken, LoadToken, LshToken, ModToken, MulToken,
PauseToken, RshToken, SendToken, SetToken, SubToken, Token, WriteToken, T_ADD, T_CLEAR, T_CMD, PauseToken, PrintToken, RshToken, SendToken, SetToken, SubToken, Token, WriteToken, T_ADD,
T_COPY, T_DEBUG, T_DIV, T_EXIT, T_GOTO, T_JE, T_JG, T_JL, T_LABEL, T_LOAD, T_LSH, T_MOD, T_MUL, T_CLEAR, T_CMD, T_COPY, T_DEBUG, T_DIV, T_EXIT, T_GOTO, T_JE, T_JG, T_JL, T_LABEL, T_LOAD,
T_PAUSE, T_RSH, T_SEND, T_SET, T_SUB, T_WRITE, T_LSH, T_MOD, T_MUL, T_PAUSE, T_PRINT, T_RSH, T_SEND, T_SET, T_SUB, T_WRITE,
}; };
use std::cell::RefCell; use std::cell::RefCell;
use std::collections::HashMap; use std::collections::HashMap;
@ -100,6 +100,10 @@ impl Runtime {
} }
T_GOTO => text.push(Box::new(GotoToken)), T_GOTO => text.push(Box::new(GotoToken)),
T_DEBUG => text.push(Box::new(DebugToken)), T_DEBUG => text.push(Box::new(DebugToken)),
T_PRINT => text.push(Box::new(PrintToken::from_bytecode(&[
instruction,
code_iter.next().unwrap(),
]))),
T_ADD => text.push(Box::new(AddToken)), T_ADD => text.push(Box::new(AddToken)),
T_SUB => text.push(Box::new(SubToken)), T_SUB => text.push(Box::new(SubToken)),
T_MUL => text.push(Box::new(MulToken)), T_MUL => text.push(Box::new(MulToken)),

@ -15,6 +15,7 @@ pub const T_WRITE: u8 = 0x06;
pub const T_LABEL: u8 = 0x07; pub const T_LABEL: u8 = 0x07;
pub const T_GOTO: u8 = 0x08; pub const T_GOTO: u8 = 0x08;
pub const T_DEBUG: u8 = 0x09; pub const T_DEBUG: u8 = 0x09;
pub const T_PRINT: u8 = 0x0A;
pub const T_ADD: u8 = 0x10; pub const T_ADD: u8 = 0x10;
pub const T_SUB: u8 = 0x11; pub const T_SUB: u8 = 0x11;
pub const T_MUL: u8 = 0x12; pub const T_MUL: u8 = 0x12;
@ -311,9 +312,36 @@ impl Token for DebugToken {
} }
} }
impl FromBytecode for GotoToken { #[derive(Debug, Clone)]
fn from_bytecode(_: &[&u8]) -> Self { pub struct PrintToken {
Self pub register: u8,
}
impl Token for PrintToken {
fn to_bytecode(&self) -> Vec<u8> {
vec![T_PRINT, self.register]
}
fn invoke(&self, runtime: &mut Runtime) -> io::Result<()> {
let mut value = if let Some(rg) = runtime.get_1byte_register(self.register) {
rg.get() as u32
} else if let Some(rg) = runtime.get_4byte_register(self.register) {
rg.get()
} else if self.register == RCS {
runtime.rcs.get() as u32
} else {
0
};
println!("{}", value);
Ok(())
}
}
impl FromBytecode for PrintToken {
fn from_bytecode(code: &[&u8]) -> Self {
Self { register: *code[1] }
} }
} }
@ -331,13 +359,6 @@ impl Token for AddToken {
Ok(()) Ok(())
} }
} }
impl FromBytecode for AddToken {
fn from_bytecode(_: &[&u8]) -> Self {
Self
}
}
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub struct SubToken; pub struct SubToken;
@ -353,12 +374,6 @@ impl Token for SubToken {
} }
} }
impl FromBytecode for SubToken {
fn from_bytecode(_: &[&u8]) -> Self {
Self
}
}
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub struct MulToken; pub struct MulToken;
@ -374,12 +389,6 @@ impl Token for MulToken {
} }
} }
impl FromBytecode for MulToken {
fn from_bytecode(_: &[&u8]) -> Self {
Self
}
}
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub struct DivToken; pub struct DivToken;
@ -395,12 +404,6 @@ impl Token for DivToken {
} }
} }
impl FromBytecode for DivToken {
fn from_bytecode(_: &[&u8]) -> Self {
Self
}
}
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub struct ModToken; pub struct ModToken;
@ -416,12 +419,6 @@ impl Token for ModToken {
} }
} }
impl FromBytecode for ModToken {
fn from_bytecode(_: &[&u8]) -> Self {
Self
}
}
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub struct LshToken; pub struct LshToken;
@ -437,12 +434,6 @@ impl Token for LshToken {
} }
} }
impl FromBytecode for LshToken {
fn from_bytecode(_: &[&u8]) -> Self {
Self
}
}
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub struct RshToken; pub struct RshToken;
@ -458,12 +449,6 @@ impl Token for RshToken {
} }
} }
impl FromBytecode for RshToken {
fn from_bytecode(_: &[&u8]) -> Self {
Self
}
}
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub struct JgToken; pub struct JgToken;
@ -481,12 +466,6 @@ impl Token for JgToken {
} }
} }
impl FromBytecode for JgToken {
fn from_bytecode(_: &[&u8]) -> Self {
Self
}
}
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub struct JlToken; pub struct JlToken;
@ -504,12 +483,6 @@ impl Token for JlToken {
} }
} }
impl FromBytecode for JlToken {
fn from_bytecode(_: &[&u8]) -> Self {
Self
}
}
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub struct JeToken; pub struct JeToken;
@ -527,12 +500,6 @@ impl Token for JeToken {
} }
} }
impl FromBytecode for JeToken {
fn from_bytecode(_: &[&u8]) -> Self {
Self
}
}
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub struct PauseToken; pub struct PauseToken;
@ -548,12 +515,6 @@ impl Token for PauseToken {
} }
} }
impl FromBytecode for PauseToken {
fn from_bytecode(_: &[&u8]) -> Self {
Self
}
}
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub struct CmdToken; pub struct CmdToken;
@ -569,12 +530,6 @@ impl Token for CmdToken {
} }
} }
impl FromBytecode for CmdToken {
fn from_bytecode(_: &[&u8]) -> Self {
Self
}
}
pub struct SendToken; pub struct SendToken;
impl Token for SendToken { impl Token for SendToken {

Loading…
Cancel
Save