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.
65 lines
1.6 KiB
Python
65 lines
1.6 KiB
Python
5 months ago
|
|
||
|
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)
|
||
|
|
||
|
|
||
|
|