Mercurial > lcfOS
view python/target/armtoken.py @ 341:4d204f6f7d4e devel
Rewrite of assembler parts
author | Windel Bouwman |
---|---|
date | Fri, 28 Feb 2014 18:07:14 +0100 |
parents | c7cc54c0dfdf |
children |
line wrap: on
line source
import struct def u16(h): return struct.pack('<H', h) def val2bit(v, bits): b = [] for i in range(bits): b.append(bool((1<<i) & v)) #b.reverse() return b def bit_range(b, e): getter = lambda s: s[b:e] def setter(s, v): s[b:e] = v return property(getter, setter) class Token: def set_bit(self, i, value): value = bool(value) assert i in range(0, 16) mask = 1 << i if value: self.bit_value |= mask else: self.bit_value &= (~mask) def __getitem__(self, key): return False def __setitem__(self, key, value): if type(key) is int: self.set_bit(key, value) elif type(key) is slice: assert key.step is None bits = key.stop - key.start value_bits = val2bit(value, bits) for i in range(key.start, key.stop): self.set_bit(i, value_bits[i - key.start]) else: raise KeyError() class ThumbToken(Token): def __init__(self): self.bit_value = 0 rd = bit_range(0, 3) def encode(self): return u16(self.bit_value) class ArmToken(Token): def __init__(self): self.bit_value = 0