[][src]Crate imperative_rs

This crate provides the InstructionSet-trait and corresponding error types, as well as a procedural macro automatically derive the trait for enums. A type implementing InstructionSet provides fn InstructionSet::decode(...) -> {...} to decode instructions from a &[u8] and fn InstructionSet::encode(...) -> {...} to encode and write an instruction into a &[u8].

 use imperative_rs::InstructionSet;

#[derive(InstructionSet, PartialEq, Debug)]
enum Is {
    //constant opcode
    #[opcode = "0x0000"]
    Nop,
    //hex opcode with split variable x
    #[opcode = "0x1x0x"]
    Inc{x:u8},
    //hex opcode with three renamed variables
    #[ opcode = "0x2xxyyzz" ]
    Add{
        #[variable = "x"]
        reg:u8,
        #[variable = "y"]
        lhs:u8,
        #[variable = "z"]
        rhs:u8},
    //bin opcode with two variables and underscores for readability
    #[ opcode = "0b100000000_xxxxyyyy_xyxyxyxy" ]
    Mov{x:u8, y:i8},
}

fn main() {
    let mut mem = [0u8; 1024];
    let (num_bytes, instr) = Is::decode(&mem).unwrap();
    assert_eq!(num_bytes, 2);
    assert_eq!(instr, Is::Nop);
    let instruction = Is::Add{reg:0xab, lhs:0xcd, rhs:0xef};
    assert_eq!(4, instruction.encode(&mut mem[100..]).unwrap());
    assert_eq!([0x2a, 0xbc, 0xde, 0xf0], mem[100..104])
}

Enums

DecodeError

This type is returned by fn InstructionSet::decode(...) in case no instruction could be decoded.

EncodeError

This Type is returned by fn InstructionSet::encode(...) -> {...} when the instruction could not be encoded.

Traits

InstructionSet

This trait defines an instruction set. It provides functionality to decode from or encode to opcodes. It can be autoderived for suitable enums by a procedual macro provided by this crate.