Crate imperative_rs

Source
Expand description

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§

  • This type is returned by fn InstructionSet::decode(...) in case no instruction could be decoded.
  • This Type is returned by fn InstructionSet::encode(...) -> {...} when the instruction could not be encoded.

Traits§

  • 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.