from assembly import FETCH import pin META_DATA = "v3.0 hex words addressed\n" def chunk(l, n): for i in range(0, len(l), n): yield l[i:i + n] def get_hex_str(codes, width): width = int(width) data = [] for _code in codes: hex_str = hex(_code)[2:] zero_str = "" for _ in range(width - len(hex_str)): zero_str += "0" data.append(zero_str + hex_str) return data def save_hex_str(hex_str_lis, chunk_count: int): lines = [] for line in chunk(hex_str_lis, chunk_count): print(line) if __name__ == "__main__": data_width = 32 addr_width = 16 # 我们现在只支持16个指令 fetch_hex_str_lis = get_hex_str(FETCH, data_width / 4) base_bin_data = get_hex_str([pin.HLT for _ in range(1 << addr_width)], data_width / 4) for addr in range(1 << addr_width): ir = addr >> 8 psw = (addr >> 4) & 0xf cyc = addr & 0xf # 最大支持2的4次方个指令 # 取指令周期 if cyc < len(fetch_hex_str_lis): base_bin_data[addr] = fetch_hex_str_lis[cyc] continue # 处理IR寄存器的值 # 写入数据到 bin文件 addr_chunk = int(64 / (32 / 4)) # bin文件每行有多少个数据 lines = [META_DATA, ] idx = 0 for slice in chunk(base_bin_data, addr_chunk): hex_idx_str = hex(idx)[2:] zero_str = "" for _ in range(4 - len(hex_idx_str)): zero_str += "0" hex_idx_str = zero_str + hex_idx_str line = f"{hex_idx_str}:" for _ in slice: line += f" {_}" line += "\n" lines.append(line) idx += addr_chunk # 下一行的地址 with open("./ROM.bin", "w") as f: f.writelines(lines)