diff options
author | iximeow <me@iximeow.net> | 2019-03-10 17:33:36 -0700 |
---|---|---|
committer | iximeow <me@iximeow.net> | 2020-01-12 17:14:56 -0800 |
commit | 09435a4fdbeb97df837c0e9050dbaa7330c15b56 (patch) | |
tree | 634990b4c50d1fea2bb91184f74420299e16ca8b /src | |
parent | ef683581fbf5e9aaa4b157acb72caf193cb64b08 (diff) |
update lifetimes due to yaxpeax-arch changes
Diffstat (limited to 'src')
-rw-r--r-- | src/lib.rs | 64 |
1 files changed, 34 insertions, 30 deletions
@@ -10,6 +10,7 @@ pub struct Instruction { pub operands: [Operand; 2] } +#[derive(Debug)] pub struct PIC17; impl Arch for PIC17 { type Address = u16; @@ -38,6 +39,9 @@ impl Display for Instruction { impl LengthedInstruction for Instruction { type Unit = <PIC17 as Arch>::Address; + fn min_size() -> Self::Unit { + 2 + } fn len(&self) -> Self::Unit { match self.opcode { _ => 2 @@ -259,24 +263,24 @@ impl Display for Operand { } impl Decodable for Instruction { - fn decode<'a, T: IntoIterator<Item=&'a u8>>(bytes: T) -> Option<Self> { + fn decode<T: IntoIterator<Item=u8>>(bytes: T) -> Option<Self> { let mut blank = Instruction::blank(); match blank.decode_into(bytes) { Some(_) => Some(blank), None => None } } - fn decode_into<'a, T: IntoIterator<Item=&'a u8>>(&mut self, bytes: T) -> Option<()> { + fn decode_into<T: IntoIterator<Item=u8>>(&mut self, bytes: T) -> Option<()> { let mut bytes_iter = bytes.into_iter(); - let word: Vec<&'a u8> = bytes_iter.by_ref().take(2).collect(); + let word: Vec<u8> = bytes_iter.by_ref().take(2).collect(); if word.len() != 2 { return None; } - match *word[1] { + match word[1] { 0x00 => { self.operands = [Operand::Nothing, Operand::Nothing]; - match *word[0] { + match word[0] { 0x00 => { self.opcode = Opcode::NOP; Some(()) @@ -298,14 +302,14 @@ impl Decodable for Instruction { Some(()) }, _ => { - self.opcode = Opcode::Invalid(*word[1], *word[0]); + self.opcode = Opcode::Invalid(word[1], word[0]); None } } }, 0x01 => { self.opcode = Opcode::MOVWF; - self.operands = [Operand::File(*word[0]), Operand::Nothing]; + self.operands = [Operand::File(word[0]), Operand::Nothing]; Some(()) }, x if x < 0x30 => { @@ -336,25 +340,25 @@ impl Decodable for Instruction { Opcode::NEGW, Opcode::DAW ][(x >> 1) as usize - 1]; - self.operands[0] = Operand::File(*word[0]); + self.operands[0] = Operand::File(word[0]); self.operands[1] = if d { - Operand::File(*word[0]) + Operand::File(word[0]) } else { Operand::W }; Some(()) }, x if x < 0x40 => { - self.operands = [Operand::File(*word[0]), Operand::Nothing]; - self.opcode = match *word[1] { + self.operands = [Operand::File(word[0]), Operand::Nothing]; + self.opcode = match word[1] { 0x30 => Opcode::CPFSLT, 0x31 => Opcode::CPFSEQ, 0x32 => Opcode::CPFSGT, 0x33 => Opcode::MULWF, 0x34 => Opcode::TSTFSZ, - 0x35 => { Opcode::Invalid(*word[1], *word[0]); return None }, - 0x36 => { Opcode::Invalid(*word[1], *word[0]); return None }, - 0x37 => { Opcode::Invalid(*word[1], *word[0]); return None }, + 0x35 => { Opcode::Invalid(word[1], word[0]); return None }, + 0x36 => { Opcode::Invalid(word[1], word[0]); return None }, + 0x37 => { Opcode::Invalid(word[1], word[0]); return None }, 0x38 => { self.operands[1] = Operand::ImmediateU8(0); Opcode::BTG }, 0x39 => { self.operands[1] = Operand::ImmediateU8(1); Opcode::BTG }, 0x3a => { self.operands[1] = Operand::ImmediateU8(2); Opcode::BTG }, @@ -369,14 +373,14 @@ impl Decodable for Instruction { }, x if x < 0x60 => { self.opcode = Opcode::MOVPF; - self.operands[0] = Operand::File((*word[1]) & 0x1f); - self.operands[1] = Operand::File(*word[0]); + self.operands[0] = Operand::File((word[1]) & 0x1f); + self.operands[1] = Operand::File(word[0]); Some(()) }, x if x < 0x80 => { self.opcode = Opcode::MOVFP; - self.operands[0] = Operand::File(*word[0]); - self.operands[1] = Operand::File((*word[1]) & 0x1f); + self.operands[0] = Operand::File(word[0]); + self.operands[1] = Operand::File((word[1]) & 0x1f); Some(()) }, x if x < 0xa0 => { @@ -385,9 +389,9 @@ impl Decodable for Instruction { Opcode::BCF, Opcode::BTFSS, Opcode::BTFSC, - ][(((*word[1]) >> 3) & 0x3) as usize]; - self.operands[0] = Operand::File(*word[0]); - self.operands[1] = Operand::ImmediateU8((*word[1]) & 0x7); + ][(((word[1]) >> 3) & 0x3) as usize]; + self.operands[0] = Operand::File(word[0]); + self.operands[1] = Operand::ImmediateU8((word[1]) & 0x7); Some(()) }, x if x < 0xb0 => { @@ -409,7 +413,7 @@ impl Decodable for Instruction { Opcode::TABLWTH, Opcode::TABLWTHI ][(x & 0x0f) as usize]; - self.operands = [Operand::File(*word[0]), Operand::Nothing]; + self.operands = [Operand::File(word[0]), Operand::Nothing]; Some(()) }, x if x < 0xc0 => { @@ -423,25 +427,25 @@ impl Decodable for Instruction { Opcode::RETLW, Opcode::LCALL, Opcode::MOVLB, // BSR only gets low four... - Opcode::Invalid(*word[1], *word[0]), + Opcode::Invalid(word[1], word[0]), Opcode::MOVLR, // These are weird ones. The Bank Select Opcode::MOVLR, // Register only gets the high four bits. Opcode::MULLW, - Opcode::Invalid(*word[1], *word[0]), - Opcode::Invalid(*word[1], *word[0]), - Opcode::Invalid(*word[1], *word[0]) - ][((*word[1]) & 0x0f) as usize]; - self.operands = [Operand::ImmediateU8(*word[0]), Operand::Nothing]; + Opcode::Invalid(word[1], word[0]), + Opcode::Invalid(word[1], word[0]), + Opcode::Invalid(word[1], word[0]) + ][((word[1]) & 0x0f) as usize]; + self.operands = [Operand::ImmediateU8(word[0]), Operand::Nothing]; Some(()) }, x if x < 0xe0 => { self.opcode = Opcode::GOTO; - self.operands = [Operand::ImmediateU32(*word[0] as u32 | (((*word[1] as u32) & 0x1f) << 8)), Operand::Nothing]; + self.operands = [Operand::ImmediateU32(word[0] as u32 | (((word[1] as u32) & 0x1f) << 8)), Operand::Nothing]; Some(()) }, _ => { self.opcode = Opcode::CALL; - self.operands = [Operand::ImmediateU32(*word[0] as u32 | (((*word[1] as u32) & 0x1f) << 8)), Operand::Nothing]; + self.operands = [Operand::ImmediateU32(word[0] as u32 | (((word[1] as u32) & 0x1f) << 8)), Operand::Nothing]; Some(()) } } |