use std::convert::From;
pub mod mnemonics;
pub mod long_mnemonics;
pub mod op_codes;
pub use self::op_codes::OpCode;
pub use self::mnemonics::Mnemonic;
pub use self::long_mnemonics::LongMnemonic;
#[derive(Debug, Clone, Copy)]
pub enum Instruction {
Nop = op_codes::NOP as isize,
Reset = op_codes::RESET as isize,
Halt = op_codes::HALT as isize,
In = op_codes::IN as isize,
Out = op_codes::OUT as isize,
Pop = op_codes::POP as isize,
Dup = op_codes::DUP as isize,
PushPc = op_codes::PUSHPC as isize,
PopPc = op_codes::POPPC as isize,
PopSp = op_codes::POPSP as isize,
SpTgt = op_codes::SPTGT as isize,
PushNz = op_codes::PUSHNZ as isize,
Swap = op_codes::SWAP as isize,
Push0 = op_codes::PUSH0 as isize,
Add = op_codes::ADD as isize,
Sub = op_codes::SUB as isize,
Inc = op_codes::INC as isize,
Dec = op_codes::DEC as isize,
Mul = op_codes::MUL as isize,
Div = op_codes::DIV as isize,
Xor = op_codes::XOR as isize,
And = op_codes::AND as isize,
Or = op_codes::OR as isize,
Shl = op_codes::SHL as isize,
Shr = op_codes::SHR as isize,
Not = op_codes::NOT as isize,
Bz = op_codes::BZ as isize,
Bnz = op_codes::BNZ as isize,
Beq = op_codes::BEQ as isize,
Bgt = op_codes::BGT as isize,
Blt = op_codes::BLT as isize,
Bge = op_codes::BGE as isize,
Loop = op_codes::LOOP as isize,
EndL = op_codes::ENDL as isize,
BraN = op_codes::BRAN as isize,
BraP = op_codes::BRAP as isize,
Target = op_codes::TARGET as isize,
Skip1 = op_codes::SKIP1 as isize,
Skip2 = op_codes::SKIP2 as isize,
Skip3 = op_codes::SKIP3 as isize,
Skip4 = op_codes::SKIP4 as isize,
Skip5 = op_codes::SKIP5 as isize,
Skip6 = op_codes::SKIP6 as isize,
Skip7 = op_codes::SKIP7 as isize,
Skip8 = op_codes::SKIP8 as isize,
Skip9 = op_codes::SKIP9 as isize,
}
use self::Instruction::*;
pub fn is_valid_op_code(op_code: OpCode) -> bool {
match op_code {
op_codes::NOP
| op_codes::RESET
| op_codes::HALT
| op_codes::IN
| op_codes::OUT
| op_codes::POP
| op_codes::DUP
| op_codes::PUSHPC
| op_codes::POPPC
| op_codes::POPSP
| op_codes::SPTGT
| op_codes::PUSHNZ
| op_codes::SWAP
| op_codes::PUSH0
| op_codes::ADD
| op_codes::SUB
| op_codes::INC
| op_codes::DEC
| op_codes::MUL
| op_codes::DIV
| op_codes::XOR
| op_codes::AND
| op_codes::OR
| op_codes::SHL
| op_codes::SHR
| op_codes::NOT
| op_codes::BZ
| op_codes::BNZ
| op_codes::BEQ
| op_codes::BGT
| op_codes::BLT
| op_codes::BGE
| op_codes::LOOP
| op_codes::ENDL
| op_codes::BRAN
| op_codes::BRAP
| op_codes::TARGET
| op_codes::SKIP1
| op_codes::SKIP2
| op_codes::SKIP3
| op_codes::SKIP4
| op_codes::SKIP5
| op_codes::SKIP6
| op_codes::SKIP7
| op_codes::SKIP8
| op_codes::SKIP9 => true,
_ => false
}
}
pub fn is_valid_mnemonic(mnemo: Mnemonic) -> bool {
match mnemo {
mnemonics::NOP
| mnemonics::RESET
| mnemonics::HALT
| mnemonics::IN
| mnemonics::OUT
| mnemonics::POP
| mnemonics::DUP
| mnemonics::PUSHPC
| mnemonics::POPPC
| mnemonics::POPSP
| mnemonics::SPTGT
| mnemonics::PUSHNZ
| mnemonics::SWAP
| mnemonics::PUSH0
| mnemonics::ADD
| mnemonics::SUB
| mnemonics::INC
| mnemonics::DEC
| mnemonics::MUL
| mnemonics::DIV
| mnemonics::XOR
| mnemonics::AND
| mnemonics::OR
| mnemonics::SHL
| mnemonics::SHR
| mnemonics::NOT
| mnemonics::BZ
| mnemonics::BNZ
| mnemonics::BEQ
| mnemonics::BGT
| mnemonics::BLT
| mnemonics::BGE
| mnemonics::LOOP
| mnemonics::ENDL
| mnemonics::BRAN
| mnemonics::BRAP
| mnemonics::TARGET
| mnemonics::SKIP1
| mnemonics::SKIP2
| mnemonics::SKIP3
| mnemonics::SKIP4
| mnemonics::SKIP5
| mnemonics::SKIP6
| mnemonics::SKIP7
| mnemonics::SKIP8
| mnemonics::SKIP9 => true,
_ => false
}
}
impl From<Mnemonic> for Instruction {
fn from(c: Mnemonic) -> Self {
match c {
mnemonics::RESET => Reset,
mnemonics::HALT => Halt,
mnemonics::IN => In,
mnemonics::OUT => Out,
mnemonics::POP => Pop,
mnemonics::DUP => Dup,
mnemonics::PUSHPC => PushPc,
mnemonics::POPPC => PopPc,
mnemonics::POPSP => PopSp,
mnemonics::SPTGT => SpTgt,
mnemonics::PUSHNZ => PushNz,
mnemonics::SWAP => Swap,
mnemonics::PUSH0 => Push0,
mnemonics::ADD => Add,
mnemonics::SUB => Sub,
mnemonics::INC => Inc,
mnemonics::DEC => Dec,
mnemonics::MUL => Mul,
mnemonics::DIV => Div,
mnemonics::XOR => Xor,
mnemonics::AND => And,
mnemonics::OR => Or,
mnemonics::SHL => Shl,
mnemonics::SHR => Shr,
mnemonics::NOT => Not,
mnemonics::BZ => Bz,
mnemonics::BNZ => Bnz,
mnemonics::BEQ => Beq,
mnemonics::BGT => Bgt,
mnemonics::BLT => Blt,
mnemonics::BGE => Bge,
mnemonics::LOOP => Loop,
mnemonics::ENDL => EndL,
mnemonics::BRAN => BraN,
mnemonics::BRAP => BraP,
mnemonics::TARGET => Target,
mnemonics::SKIP1 => Skip1,
mnemonics::SKIP2 => Skip2,
mnemonics::SKIP3 => Skip3,
mnemonics::SKIP4 => Skip4,
mnemonics::SKIP5 => Skip5,
mnemonics::SKIP6 => Skip6,
mnemonics::SKIP7 => Skip7,
mnemonics::SKIP8 => Skip8,
mnemonics::SKIP9 => Skip9,
mnemonics::NOP | _ => Nop,
}
}
}
impl From<Instruction> for Mnemonic {
fn from(i: Instruction) -> Self {
match i {
Nop => mnemonics::NOP,
Reset => mnemonics::RESET,
Halt => mnemonics::HALT,
In => mnemonics::IN,
Out => mnemonics::OUT,
Pop => mnemonics::POP,
Dup => mnemonics::DUP,
PushPc => mnemonics::PUSHPC,
PopPc => mnemonics::POPPC,
PopSp => mnemonics::POPSP,
SpTgt => mnemonics::SPTGT,
PushNz => mnemonics::PUSHNZ,
Swap => mnemonics::SWAP,
Push0 => mnemonics::PUSH0,
Add => mnemonics::ADD,
Sub => mnemonics::SUB,
Inc => mnemonics::INC,
Dec => mnemonics::DEC,
Mul => mnemonics::MUL,
Div => mnemonics::DIV,
Xor => mnemonics::XOR,
And => mnemonics::AND,
Or => mnemonics::OR,
Shl => mnemonics::SHL,
Shr => mnemonics::SHR,
Not => mnemonics::NOT,
Bz => mnemonics::BZ,
Bnz => mnemonics::BNZ,
Beq => mnemonics::BEQ,
Bgt => mnemonics::BGT,
Blt => mnemonics::BLT,
Bge => mnemonics::BGE,
Loop => mnemonics::LOOP,
EndL => mnemonics::ENDL,
BraN => mnemonics::BRAN,
BraP => mnemonics::BRAP,
Target => mnemonics::TARGET,
Skip1 => mnemonics::SKIP1,
Skip2 => mnemonics::SKIP2,
Skip3 => mnemonics::SKIP3,
Skip4 => mnemonics::SKIP4,
Skip5 => mnemonics::SKIP5,
Skip6 => mnemonics::SKIP6,
Skip7 => mnemonics::SKIP7,
Skip8 => mnemonics::SKIP8,
Skip9 => mnemonics::SKIP9,
}
}
}
impl From<OpCode> for Instruction {
fn from(c: OpCode) -> Self {
match c {
op_codes::RESET => Reset,
op_codes::HALT => Halt,
op_codes::IN => In,
op_codes::OUT => Out,
op_codes::POP => Pop,
op_codes::DUP => Dup,
op_codes::PUSHPC => PushPc,
op_codes::POPPC => PopPc,
op_codes::POPSP => PopSp,
op_codes::SPTGT => SpTgt,
op_codes::PUSHNZ => PushNz,
op_codes::SWAP => Swap,
op_codes::PUSH0 => Push0,
op_codes::ADD => Add,
op_codes::SUB => Sub,
op_codes::INC => Inc,
op_codes::DEC => Dec,
op_codes::MUL => Mul,
op_codes::DIV => Div,
op_codes::XOR => Xor,
op_codes::AND => And,
op_codes::OR => Or,
op_codes::SHL => Shl,
op_codes::SHR => Shr,
op_codes::NOT => Not,
op_codes::BZ => Bz,
op_codes::BNZ => Bnz,
op_codes::BEQ => Beq,
op_codes::BGT => Bgt,
op_codes::BLT => Blt,
op_codes::BGE => Bge,
op_codes::LOOP => Loop,
op_codes::ENDL => EndL,
op_codes::BRAN => BraN,
op_codes::BRAP => BraP,
op_codes::TARGET => Target,
op_codes::SKIP1 => Skip1,
op_codes::SKIP2 => Skip2,
op_codes::SKIP3 => Skip3,
op_codes::SKIP4 => Skip4,
op_codes::SKIP5 => Skip5,
op_codes::SKIP6 => Skip6,
op_codes::SKIP7 => Skip7,
op_codes::SKIP8 => Skip8,
op_codes::SKIP9 => Skip9,
op_codes::NOP | _ => Nop,
}
}
}
impl From<Instruction> for OpCode {
fn from(i: Instruction) -> Self {
i as OpCode
}
}
impl From<Instruction> for &'static str {
fn from(c: Instruction) -> Self {
match c {
Nop => long_mnemonics::NOP,
Reset => long_mnemonics::RESET,
Halt => long_mnemonics::HALT,
In => long_mnemonics::IN,
Out => long_mnemonics::OUT,
Pop => long_mnemonics::POP,
Dup => long_mnemonics::DUP,
PushPc => long_mnemonics::PUSHPC,
PopPc => long_mnemonics::POPPC,
PopSp => long_mnemonics::POPSP,
SpTgt => long_mnemonics::SPTGT,
PushNz => long_mnemonics::PUSHNZ,
Swap => long_mnemonics::SWAP,
Push0 => long_mnemonics::PUSH0,
Add => long_mnemonics::ADD,
Sub => long_mnemonics::SUB,
Inc => long_mnemonics::INC,
Dec => long_mnemonics::DEC,
Mul => long_mnemonics::MUL,
Div => long_mnemonics::DIV,
Xor => long_mnemonics::XOR,
And => long_mnemonics::AND,
Or => long_mnemonics::OR,
Shl => long_mnemonics::SHL,
Shr => long_mnemonics::SHR,
Not => long_mnemonics::NOT,
Bz => long_mnemonics::BZ,
Bnz => long_mnemonics::BNZ,
Beq => long_mnemonics::BEQ,
Bgt => long_mnemonics::BGT,
Blt => long_mnemonics::BLT,
Bge => long_mnemonics::BGE,
Loop => long_mnemonics::LOOP,
EndL => long_mnemonics::ENDL,
BraN => long_mnemonics::BRAN,
BraP => long_mnemonics::BRAP,
Target => long_mnemonics::TARGET,
Skip1 => long_mnemonics::SKIP1,
Skip2 => long_mnemonics::SKIP2,
Skip3 => long_mnemonics::SKIP3,
Skip4 => long_mnemonics::SKIP4,
Skip5 => long_mnemonics::SKIP5,
Skip6 => long_mnemonics::SKIP6,
Skip7 => long_mnemonics::SKIP7,
Skip8 => long_mnemonics::SKIP8,
Skip9 => long_mnemonics::SKIP9,
}
}
}