def translate(self): if not self.instruction.mode.ind: raise OperandTypeError( "Instruction [{}] does not support indexed addressing".format(self.instruction.mnemonic) ) raw_post_byte = 0x00 post_byte_choices = [] size = self.instruction.mode.ind_sz max_size = size additional = NoneValue() additional_needs_resolution = False # Determine register (if any) if "X" in self.right: raw_post_byte |= 0x00 if "Y" in self.right: raw_post_byte |= 0x20 if "U" in self.right: raw_post_byte |= 0x40 if "S" in self.right: raw_post_byte |= 0x60 if self.left == "": raw_post_byte |= 0x80 if "-" in self.right or "+" in self.right: if "+" in self.right: raw_post_byte |= 0x00 if "++" in self.right: raw_post_byte |= 0x01 if "-" in self.right: raw_post_byte |= 0x02 if "--" in self.right: raw_post_byte |= 0x03 else: raw_post_byte |= 0x04 elif self.left == "A" or self.left == "B" or self.left == "D": raw_post_byte |= 0x80 if self.left == "A": raw_post_byte |= 0x06 if self.left == "B": raw_post_byte |= 0x05 if self.left == "D": raw_post_byte |= 0x0B else: if "+" in self.right or "-" in self.right: raise OperandTypeError("[{}] invalid indexed expression".format(self.operand_string)) if self.left.is_address(): additional_needs_resolution = True self.left = NumericValue(self.left.int) if self.left.is_expression(): additional_needs_resolution = True if self.left.is_address_expression(): additional_needs_resolution = True additional = self.left if "PCR" in self.right: if additional_needs_resolution: raw_post_byte |= 0x00 post_byte_choices = [0x8C, 0x8D] max_size += 2 else: size += 2 if self.left.is_extended() else 1 max_size = size raw_post_byte |= 0x8D if self.left.is_extended() else 0x8C else: if additional.int <= 0x1F: raw_post_byte |= additional.int else: size += additional.byte_len() max_size = size raw_post_byte |= 0x89 if self.left.is_extended() else 0x88 return CodePackage( op_code=NumericValue(self.instruction.mode.ind), post_byte=NumericValue(raw_post_byte), additional=additional, size=size, additional_needs_resolution=additional_needs_resolution, post_byte_choices=post_byte_choices, max_size=max_size, )
def test_none_byte_len_works_correctly(self): result = NoneValue('"abc"') self.assertEqual(0, result.byte_len())
def translate(self): if not self.instruction.mode.ind: raise OperandTypeError( "Instruction [{}] does not support indexed addressing".format(self.instruction.mnemonic) ) size = self.instruction.mode.ind_sz if not type(self.value) == str and self.value.is_address(): size += 2 return CodePackage( op_code=NumericValue(self.instruction.mode.ind), post_byte=NumericValue(0x9F), additional=self.value, size=size, max_size=size, ) if not type(self.value) == str and self.value.is_numeric(): size += 2 return CodePackage( op_code=NumericValue(self.instruction.mode.ind), post_byte=NumericValue(0x9F), additional=self.value, size=size, max_size=size, ) raw_post_byte = 0x80 post_byte_choices = [] size = self.instruction.mode.ind_sz max_size = size additional = NoneValue() additional_needs_resolution = False if "X" in self.right: raw_post_byte |= 0x00 if "Y" in self.right: raw_post_byte |= 0x20 if "U" in self.right: raw_post_byte |= 0x40 if "S" in self.right: raw_post_byte |= 0x60 if self.left == "": if "-" in self.right or "+" in self.right: if self.right == "X+" or self.right == "Y+" or self.right == "U+" or self.right == "S+": raise OperandTypeError("[{}] not allowed as an extended indirect value".format(self.right)) if self.right == "-X" or self.right == "-Y" or self.right == "-U" or self.right == "-S": raise OperandTypeError("[{}] not allowed as an extended indirect value".format(self.right)) if "++" in self.right: raw_post_byte |= 0x11 if "--" in self.right: raw_post_byte |= 0x13 else: raw_post_byte |= 0x14 elif self.left == "A" or self.left == "B" or self.left == "D": if self.left == "A": raw_post_byte |= 0x16 if self.left == "B": raw_post_byte |= 0x15 if self.left == "D": raw_post_byte |= 0x1B else: if "+" in self.right or "-" in self.right: raise OperandTypeError("[{}] invalid indexed expression".format(self.operand_string)) if type(self.left) == str: self.left = Value.create_from_str(self.left) if self.left.is_address(): additional_needs_resolution = True self.left = NumericValue(self.left.int) if self.left.is_expression(): additional_needs_resolution = True if self.left.is_address_expression(): additional_needs_resolution = True additional = self.left if "PCR" in self.right: if additional_needs_resolution: raw_post_byte |= 0x00 post_byte_choices = [0x9C, 0x9D] max_size += 2 else: size += 2 if self.left.is_extended() else 1 max_size = size raw_post_byte |= 0x9D if self.left.is_extended() else 0x9C else: size += additional.byte_len() max_size = size raw_post_byte |= 0x99 if self.left.is_extended() else 0x98 return CodePackage( op_code=NumericValue(self.instruction.mode.ind), post_byte=NumericValue(raw_post_byte), post_byte_choices=post_byte_choices, additional=additional, size=size, max_size=max_size, additional_needs_resolution=additional_needs_resolution, )