Expand description
This crate provides the InstructionSet
-trait and corresponding error types, as well as
a procedural macro automatically derive the trait for enum
s. 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 suitableenum
s by a procedual macro provided by this crate.