def filled(self, params, ctx): reads = set() writes = set() values = dict() loads = [] for x in self.reads: if x.startswith("#"): assert(len(x) == 2) value = params[x[1]] operand = placeholders.get(x[1], value) if hasattr(operand, 'target'): reads.add('mem') reads |= regutil.splitRegister('HL') # TODO: XXX: bad else: reads |= regutil.splitRegister(operand.name) else: reads |= regutil.splitRegister(x) for x in self.writes: if x.startswith("#"): assert(len(x) == 2) value = params[x[1]] operand = placeholders.get(x[1], value) if hasattr(operand, 'target'): name = '['+operand.target.name+']' writes.add('mem') reads |= regutil.splitRegister('HL') # TODO: XXX: bad else: name = operand.name writes |= regutil.splitRegister(name) if x in self.values: e = expression.parse(self.values[x]) values[name] = e.optimizedWithContext(ctx) loads.append((name, values[name])) else: writes |= regutil.splitRegister(x) if x in self.values: e = expression.parse(self.values[x]) values[x] = e.optimizedWithContext(ctx) loads.append((x, values[x])) #values = dict() # TODO: XXX: #loads = [] return reads, writes, values, loads
def make_context(params, argument, next_addr): ctx = context.Context() if next_addr.bank() > 0: ctx.setValue('ROMBANK', operand.Constant(next_addr.bank())) ctx.setValue('v8', operand.Constant(argument)) ctx.setValue('FF00_v8', operand.Constant(0xFF00 + argument)) ctx.setValue('v16', operand.Constant(argument)) offset = argument if offset & 0x80: # convert to signed offset offset -= 0x100 ctx.setValue('v8_rel', operand.Constant(next_addr.offset(offset).virtual())) for p in params: value = placeholders.get(p, params[p]) ctx.setValue('#'+p, value) return ctx