def translate(self): code_pkg = CodePackage() code_pkg.op_code = NumericValue(self.instruction.mode.rel) if self.value.is_type(ValueType.ADDRESS): code_pkg.additional = self.value code_pkg.size = self.instruction.mode.rel_sz return code_pkg
def translate(self): code_pkg = CodePackage() code_pkg.op_code = NumericValue(self.instruction.mode.imm) code_pkg.size = self.instruction.mode.imm_sz code_pkg.post_byte = 0x00 if self.instruction.mnemonic == "PSHS" or self.instruction.mnemonic == "PULS": if not self.operand_string: raise ValueError("one or more registers must be specified") registers = self.operand_string.split(",") for register in registers: if register not in REGISTERS: raise ValueError("[{}] unknown register".format(register)) code_pkg.post_byte |= 0x06 if register == "D" else 0x00 code_pkg.post_byte |= 0x01 if register == "CC" else 0x00 code_pkg.post_byte |= 0x02 if register == "A" else 0x00 code_pkg.post_byte |= 0x04 if register == "B" else 0x00 code_pkg.post_byte |= 0x08 if register == "DP" else 0x00 code_pkg.post_byte |= 0x10 if register == "X" else 0x00 code_pkg.post_byte |= 0x20 if register == "Y" else 0x00 code_pkg.post_byte |= 0x40 if register == "U" else 0x00 code_pkg.post_byte |= 0x80 if register == "PC" else 0x00 if self.instruction.mnemonic == "EXG" or self.instruction.mnemonic == "TFR": registers = self.operand_string.split(",") if len(registers) != 2: raise ValueError("[{}] requires exactly 2 registers".format( self.instruction.mnemonic)) if registers[0] not in REGISTERS: raise ValueError("[{}] unknown register".format(registers[0])) if registers[1] not in REGISTERS: raise ValueError("[{}] unknown register".format(registers[1])) code_pkg.post_byte |= 0x00 if registers[0] == "D" else 0x00 code_pkg.post_byte |= 0x00 if registers[1] == "D" else 0x00 code_pkg.post_byte |= 0x10 if registers[0] == "X" else 0x00 code_pkg.post_byte |= 0x01 if registers[1] == "X" else 0x00 code_pkg.post_byte |= 0x20 if registers[0] == "Y" else 0x00 code_pkg.post_byte |= 0x02 if registers[1] == "Y" else 0x00 code_pkg.post_byte |= 0x30 if registers[0] == "U" else 0x00 code_pkg.post_byte |= 0x03 if registers[1] == "U" else 0x00 code_pkg.post_byte |= 0x40 if registers[0] == "S" else 0x00 code_pkg.post_byte |= 0x04 if registers[1] == "S" else 0x00 code_pkg.post_byte |= 0x50 if registers[0] == "PC" else 0x00 code_pkg.post_byte |= 0x05 if registers[1] == "PC" else 0x00 code_pkg.post_byte |= 0x80 if registers[0] == "A" else 0x00 code_pkg.post_byte |= 0x08 if registers[1] == "A" else 0x00 code_pkg.post_byte |= 0x90 if registers[0] == "B" else 0x00 code_pkg.post_byte |= 0x09 if registers[1] == "B" else 0x00 code_pkg.post_byte |= 0xA0 if registers[0] == "CC" else 0x00 code_pkg.post_byte |= 0x0A if registers[1] == "CC" else 0x00 code_pkg.post_byte |= 0xB0 if registers[0] == "DP" else 0x00 code_pkg.post_byte |= 0x0B if registers[1] == "DP" else 0x00 if code_pkg.post_byte not in \ [ 0x01, 0x10, 0x02, 0x20, 0x03, 0x30, 0x04, 0x40, 0x05, 0x50, 0x12, 0x21, 0x13, 0x31, 0x14, 0x41, 0x15, 0x51, 0x23, 0x32, 0x24, 0x42, 0x25, 0x52, 0x34, 0x43, 0x35, 0x53, 0x45, 0x54, 0x89, 0x98, 0x8A, 0xA8, 0x8B, 0xB8, 0x9A, 0xA9, 0x9B, 0xB9, 0xAB, 0xBA, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x88, 0x99, 0xAA, 0xBB ]: raise ValueError("[{}] of [{}] to [{}] not allowed".format( self.instruction.mnemonic, registers[0], registers[1])) code_pkg.post_byte = NumericValue(code_pkg.post_byte) return code_pkg