def defs(self, start, end, sublengths): size = end - start items = [self.num_str(value or size, base=base) for value, base in sublengths] defs_dir = 'DEFS {}'.format(','.join(items)) if self.asm_lower: defs_dir = convert_case(defs_dir) return Instruction(start, defs_dir, self.snapshot[start:end])
def apply_case(self, addr_str, operation): if self.lower: addr_str = addr_str.lower() elif self.upper: addr_str = addr_str.upper() if self.lower or self.upper: operation = convert_case(operation, self.lower) if self.upper and not operation.startswith(('DEFB', 'DEFM', 'DEFS', 'DEFW')): operation = re.sub('(I[XY])H', r'\1h', operation) operation = re.sub('(I[XY])L', r'\1l', operation) return addr_str, operation
def defw_range(self, start, end, sublengths): if sublengths[0][0]: step = end - start else: step = self.defw_size sublengths = ((step, sublengths[0][1]),) instructions = [] for address in range(start, end, step): data = self.snapshot[address:address + step] defw_dir = 'DEFW {}'.format(self._defw_items(data, sublengths)) if self.asm_lower: defw_dir = convert_case(defw_dir) instructions.append(Instruction(address, defw_dir, data)) return instructions
def defs(self, start, end, sublengths): data = self.snapshot[start:end] values = set(data) if len(values) > 1: return self.defb_range(start, end, ((end - start, None),)) value = values.pop() size, base = sublengths[0] items = [self.num_str(size or end - start, base=base)] if len(sublengths) > 1: items.append(self.num_str(value, base=sublengths[1][1])) elif value: items.append(self.num_str(value)) defs_dir = 'DEFS {}'.format(','.join(items)) if self.asm_lower: defs_dir = convert_case(defs_dir) return [Instruction(start, defs_dir, data)]
def disassemble(self, start, end=65536, base=None): instructions = [] address = start while address < end: byte = self.snapshot[address] decoder, template = self.ops[byte] if template is None: operation, length = decoder(self, address, base) else: operation, length = decoder(self, template, address, base) if address + length <= 65536: if self.asm_lower: operation = convert_case(operation) instructions.append(Instruction(address, operation, self.snapshot[address:address + length])) else: instructions.append(self.defb_line(address, self.snapshot[address:65536])) address += length return instructions
def defm_range(self, start, end, sublengths): if sublengths[0][0]: data = self.snapshot[start:end] item_str = self.defb_items(data, sublengths, False) defm_dir = 'DEFM {}'.format(item_str) if self.asm_lower: defm_dir = convert_case(defm_dir) return [Instruction(start, defm_dir, data)] instructions = [] msg = [] for i in range(start, end): byte = self.snapshot[i] if 32 <= byte < 127 and byte not in (94, 96): msg.append(byte) else: if msg: instructions.extend(self.defm_lines(i - len(msg), msg)) msg[:] = [] instructions.append(self.defb_line(i, [byte])) if msg: instructions.extend(self.defm_lines(i - len(msg) + 1, msg)) return instructions
def defm_range(self, start, end, sublengths): if sublengths[0][0]: data = self.snapshot[start:end] item_str = self.defb_items(data, sublengths, False) defm_dir = 'DEFM {}'.format(item_str) if self.asm_lower: defm_dir = convert_case(defm_dir) return [Instruction(start, defm_dir, data)] instructions = [] msg = [] for i in range(start, end): byte = self.snapshot[i] if is_char(byte): msg.append(byte) else: if msg: instructions.extend(self.defm_lines(i - len(msg), msg)) msg[:] = [] instructions.append(self.defb_line(i, [byte])) if msg: instructions.extend(self.defm_lines(i - len(msg) + 1, msg)) return instructions
def defm_line(self, address, data): defm_dir = 'DEFM "{}"'.format(self.get_message(data)) if self.asm_lower: defm_dir = convert_case(defm_dir) return Instruction(address, defm_dir, data)
def defb_dir(self, data, sublengths=((None, None),)): defb_dir = 'DEFB {}'.format(self.defb_items(data, sublengths)) if self.asm_lower: defb_dir = convert_case(defb_dir) return defb_dir
def defm_line(self, address, data): defm_dir = 'DEFM {}'.format(self.get_message(data)) if self.asm_lower: defm_dir = convert_case(defm_dir) return Instruction(address, defm_dir, data)