summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Cargo.toml17
-rw-r--r--src/lib.rs46
2 files changed, 63 insertions, 0 deletions
diff --git a/Cargo.toml b/Cargo.toml
new file mode 100644
index 0000000..93c69b3
--- /dev/null
+++ b/Cargo.toml
@@ -0,0 +1,17 @@
+[package]
+
+name = "yaxpeax-pic24"
+version = "0.0.1"
+authors = [ "iximeow <me@iximeow.net>" ]
+license = "0BSD"
+repository = ""
+description = """
+A rust pic24 decoder
+"""
+
+[dependencies]
+yaxpeax-arch = { path = "../../yaxpeax-arch" }
+
+[[test]]
+name = "test"
+path = "test/test.rs"
diff --git a/src/lib.rs b/src/lib.rs
new file mode 100644
index 0000000..1ef6f13
--- /dev/null
+++ b/src/lib.rs
@@ -0,0 +1,46 @@
+extern crate yaxpeax_arch;
+
+use yaxpeax_arch::{Arch, Decodable, LengthedInstruction};
+
+#[derive(Debug)]
+pub enum Opcode {
+ NOP
+}
+
+#[derive(Debug)]
+pub struct Instruction {
+ pub opcode: Opcode
+}
+
+impl LengthedInstruction for Instruction {
+ type Unit = <PIC24 as Arch>::Address;
+ fn len(&self) -> Self::Unit {
+ 3 // ish
+ }
+}
+
+impl Decodable for Instruction {
+ fn decode<'a, T: IntoIterator<Item=&'a u8>>(bytes: T) -> Option<Self> {
+ let mut blank = Instruction { opcode: Opcode::NOP };
+ match blank.decode_into(bytes) {
+ Some(_) => Some(blank),
+ None => None
+ }
+ }
+ fn decode_into<'a, T: IntoIterator<Item=&'a u8>>(&mut self, bytes: T) -> Option<()> {
+ match bytes.into_iter().next() {
+ Some(0x00) => {
+ self.opcode = Opcode::NOP;
+ Some(())
+ },
+ _ => None
+ }
+ }
+}
+
+pub struct PIC24;
+impl Arch for PIC24 {
+ type Address = u32;
+ type Instruction = Instruction;
+ type Operand = ();
+}