コード例 #1
0
ファイル: opcodeeffect.py プロジェクト: kholdfuzion/awake
    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
コード例 #2
0
ファイル: singledecoder.py プロジェクト: kholdfuzion/awake
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