diff options
Diffstat (limited to 'xv/util.py')
-rw-r--r-- | xv/util.py | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/xv/util.py b/xv/util.py new file mode 100644 index 0000000..0b3f2e6 --- /dev/null +++ b/xv/util.py @@ -0,0 +1,90 @@ +# Part of the Fifteen-Thieves Project +# Chris Xiong 2020 +# License: Expat (MIT) + +def roland_checksum(payload): + return (0x80 - sum(payload) % 0x80) % 0x80 + +def check_roland_checksum(msg): + return (0x80 - sum(msg[6:-2]) % 0x80) % 0x80 == msg[-2] + +def int2belist(x): + ret = [] + while x > 0: + ret = [x & 0xff] + ret + x >>= 8 + return ret + +def belist2int(x): + ret = 0 + for i in x: + ret <<= 8 + ret |= i + return ret + +def int2b7belist(x): + ret = [] + while x > 0: + ret = [x & 0x7f] + ret + x >>= 7 + return ret + +def strb7list(x): + return ' '.join([format(a, "02x") for a in x]) + +def b7belist2int(x): + ret = 0 + for i in x: + ret <<= 7 + ret |= i + return ret + +def hexrep2b7val(x): + ret = 0 + b = 0 + while x > 0: + if x & 0xff > 0x7f: + raise ValueError("invalid value") + ret |= (x & 0xff) << (7 * b) + b += 1 + x >>= 8 + return ret + +def padbelist(x, l=4): + return ([0]*(l-len(x))) + x + +def int2packetint(x): + ret = [] + while x > 0: + ret = [x & 0x0f] + ret + x >>= 4 + return ret + +def packetint2int(x): + ret = 0 + for i in x: + ret <<= 4 + ret |= i + return ret + +def load_memoryregion(fn): + ret = [] + with open(fn, "rb") as f: + while True: + addr = list(f.read(4)) + if len(addr) < 4: + break + l = belist2int(list(f.read(4))) + data = list(f.read(l)) + ret.append( (addr, data) ) + return ret + +def write_memoryregion(fn, mr): + with open(fn, "wb") as f: + for addr, data in mr: + l = padbelist(int2belist(len(data))) + f.write(bytearray(addr)) + f.write(bytearray(l)) + f.write(bytearray(data)) + +# vim: expandtab shiftwidth=4 tabstop=4 |