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
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)
|
|
|
|
|
|
|