def run(bytes, mode): data = Data(bytes[16:]) isdump = mode == MODE_DUMP offset = 0 text_bytes = bytes[16:] # テキストデータ vm = VM(text_bytes) # TODO:dumpとrunは分ける。 while data.has_more_elements(): pc = vm.pc() op = (text_bytes[pc+1] << 8) | text_bytes[pc] print("pc:", pc, hex(pc), "op:", op, oct(op), hex(op)) # ダンプ用 d = opcode.dispatch(op, data, MODE_DUMP, vm) print("dump:", d) # ダンプするとpcが書き換わるので、元に戻す vm.set_pc(pc) d = opcode.dispatch(op, data, mode, vm) vm.dump_reg()
def odump(data): def print_format(offset, bytes, dump): print("%4x:" % offset, end="") # オフセット xs = [] # 16進数で出力 for i in range(0, len(bytes), 2): x = (bytes[i+1] << 8) | bytes[i] xs.append(" %04x" % x) print("".join(xs).ljust(16), end="") d = list(map(str, dump)) if len(d) == 1: s = d[0] else: s = d[0] + " " + ", ".join(d[1:]) s = s.ljust(20) print(s, end="") ys = [] # 8進数で出力 for i in range(0, len(bytes), 2): x = (bytes[i+1] << 8) | bytes[i] ys.append(" %06o" % x) print("".join(ys)) pass offset = 0 while data.has_more_elements(): if offset >= _text_size: break data.marked() op = util.read2(data) d = opcode.dispatch(op, data, run.MODE_DUMP, None) eatbytes = data.get_readbytes_from_mark() # 読み込んだバイト配列 # ダンプ print_format(offset, eatbytes, d) # 読み込んだバイト分、オフセットを進める offset += len(data.get_readbytes_from_mark())