Example #1
0
 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])
Example #2
0
 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])
Example #3
0
 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
Example #4
0
 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
Example #5
0
 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
Example #6
0
 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
Example #7
0
 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)]
Example #8
0
 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
Example #9
0
 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
Example #10
0
 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
Example #11
0
 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
Example #12
0
 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)
Example #13
0
 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
Example #14
0
 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)
Example #15
0
 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