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个指令 code_hex_str = 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 if cyc < len(code_hex_str): base_bin_data[addr] = code_hex_str[cyc] # 写入数据到 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)