You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

74 lines
1.8 KiB
Python

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)