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

1135 lines
47 KiB

8 months ago
# -*- encoding: utf-8 -*-
"""
@File : execute_instruction.py
@License : (C)Copyright 2021-2023
@Modify Time @Author @Version @Description
------------ ------- -------- -----------
2023/11/10 17:14 zart20 1.0 None
"""
import re
import time
from tkinter import filedialog
from gui import *
inscode_map = {
'取数': '000001', '存数': '000010', '加法': '000011', '减法': '000111',
'乘法': '000100', '除法': '001000', '打印': '000101', '停机': '000110',
'跳转': '001001'
}
class ExecInstructWithText:
def __init__(self):
self.wait_time = 0.1 # 节拍计时
self.gui = GUISim() # 主界面显示
self.alu = self.gui.alu # alu实例化
self.memo = self.gui.memo # memo 实例化
self.sing = self.gui.sigctrl # 信号实例化
self.textbox = self.gui.textbox # 信息输入框实例化
self.regs = {"R1": self.alu.r1, "R2": self.alu.r2, "R3": self.alu.r3, "R4": self.alu.r4} # 寄存器值槽
self.sing_times1 = 0 # 取数指令的节拍计数变量
self.sing_times2 = 0 # 存数指令的节拍
self.menu_test()
self.show_msg() # 显示消息框
self.manual_opera_step = 0
self.entry_replace(self.sing.pc_reg, f"{0:016b}")
self.ctrl_stop = False
self.register_mapping = {
"01": (self.alu.r2, "mco-r2"),
"10": (self.alu.r3, "mco-r3"),
"11": (self.alu.r4, "mco-r4"),
"00": (self.alu.r1, "mco-r1"),
}
# self.textbox.msg_box("kkxs")
def reset(self):
self.__init__()
self.textbox.clear()
def stop_exec(self):
if self.ctrl_stop == True:
self.ctrl_stop = False
self.ctrl_exec.config(text="暂停执行")
self.exec_auto()
else:
self.ctrl_stop = True
self.ctrl_exec.config(text="继续执行")
def show_msg(self):
"""显示固定信息"""
self.textbox.reset_button.configure(command=self.reset)
self.textbox.canvas.delete("button")
self.textbox.main_msg_box("系统控制", 0, 0)
self.textbox.create_button("自动执行指令", x=1, y=0, command=self.exec_auto)
self.ctrl_exec = self.textbox.create_button("暂停执行", x=1, y=1, command=self.stop_exec)
self.prev_button = self.textbox.create_button("上一步", x=2, y=0, command=self.prev)
self.next_button = self.textbox.create_button("下一步", x=2, y=1, command=self.exec_next)
page2 = self.textbox.page2
self.textbox.main_msg_box("运算器控制", 0, 0, page2)
self.textbox.create_button("更改运算", x=1, y=0, frame=page2, command=self.manual_opera_io)
self.textbox.create_button("更改输入输出", x=1, y=1, frame=page2, command=self.manual_opera_io)
self.textbox.create_button("更改R1-R4", x=3, y=1, frame=page2, command=self.manual_reg)
self.alu_reg = self.textbox.create_combobox(x=3, y=0, frame=page2, values=["R1", "R2", "R3", "R4"])
self.alu_reg_value = self.textbox.create_entry(x=2, y=0, frame=page2)
page3 = self.textbox.page3
self.textbox.main_msg_box("信号控制", 0, 0, page3)
self.textbox.create_button("自动连续执行", x=1, y=0, frame=page3, command=self.exec_auto)
self.textbox.create_button("单指令执行", x=2, y=0, frame=page3, command=self.one_instruct)
self.textbox.create_button("更改信号", x=3, y=0, frame=page3, command=self.modify_sing)
self.textbox.create_button("更改REG", x=1, y=1, frame=page3, command=self.modify_ctrl_reg)
sing_obj = ['->R1', '->R2', '->R3', '->R4', '->IR', '->ALU', '->PC+1', '->Memory']
self.sing_single = self.textbox.create_combobox(x=3, y=1, frame=page3, values=list(sing_obj))
sing_inscode = inscode_map.keys() # 获取指令
self.sing_instruct = self.textbox.create_combobox(x=2, y=1, frame=page3, values=list(sing_inscode))
page4 = self.textbox.page4
self.textbox.main_msg_box("内存控制", 0, 0, page4)
self.textbox.create_button("更改内存REG", x=1, y=0, frame=page4, command=self.modify_memo_reg)
self.textbox.create_button("更改部分储存", x=1, y=1, frame=page4, command=self.manual_input)
self.textbox.create_button("装载一段程序", x=2, y=0, frame=page4, command=self.read_file)
self.textbox.create_button("装载一批数据", x=2, y=1, frame=page4, command=self.load_many_data)
def one_instruct(self):
inscode = self.sing_instruct.get()
inscode = inscode_map[inscode]
self.exe_one_instruct(inscode)
def modify_sing(self):
sing = self.sing_single.get()
cpu_data.SigObj[sing][1] = True
self.sing.show_singe()
print(sing)
def manual_reg(self): # 手动更改寄存器
reg = self.alu_reg.get()
value = self.alu_reg_value.get()
self.entry_replace(self.regs[reg], value)
self.textbox.send_msg("更改成功")
def modify_memo_reg(self): # 更改控制器寄存器
def n_mco_button():
value = self.n_mco.get()
self.entry_replace(self.memo.mco, value)
self.textbox.send_msg("更改成功")
def n_mad_button():
value = self.n_mad.get()
self.memo.show_maddr(value)
self.textbox.send_msg("更改成功")
top = tk.Toplevel()
top.title("内存寄存器修改")
# top.geometry(f"{460}x{200}")
tk.Label(top, text="新Mcontent值", font=('微软雅黑', 16)).grid(row=0, column=0, padx=5, pady=5, sticky="e")
self.n_mco = tk.Entry(top, font=('微软雅黑', 12), width=16)
self.n_mco.grid(row=0, column=1, padx=5, pady=5)
tk.Button(top, text="确定", font=('微软雅黑', 12), width=10, bg="white", command=n_mco_button) \
.grid(row=0, column=2, padx=5, pady=5)
tk.Label(top, text="新Maddr值", font=('微软雅黑', 16)).grid(row=1, column=0, padx=5, pady=5, sticky="e")
self.n_mad = tk.Entry(top, font=('微软雅黑', 12), width=16)
self.n_mad.grid(row=1, column=1, padx=5, pady=5)
tk.Button(top, text="确定", font=('微软雅黑', 12), width=10, bg="white", command=n_mad_button) \
.grid(row=1, column=2, padx=5, pady=5)
def load_many_data(self): # 更改控制器寄存器
def load_memo_finish():
start = self.memo_addr.get()
start = int(start, 16)
data = self.memo_text.get("1.0", "end")
data = data.split("\n")
for index, line in enumerate(data):
line = line.replace("\n", "")
if index+start < 20 and re.match("^[01]{16}$", line):
self.memo.mem_save(index+start, line, load=True)
self.textbox.send_msg(f"{index+start:02X}】数据装载完成")
else:
if index+start > 19:
break
elif line == "":
self.textbox.send_msg(f"{index+start:02X}】数据异常请检查")
top = tk.Toplevel()
top.title("装载一批数据")
top.geometry(f"{245}x{330}")
tk.Label(top, text="起始地址:", font=('微软雅黑', 16)).grid(row=0, column=0, padx=5, pady=5, sticky="e")
self.memo_addr = ttk.Combobox(top, values=[f"{i:02X}" for i in range(20)], width=10, font=('微软雅黑', 12))
self.memo_addr.grid(row=0, column=1, padx=5, pady=5)
self.memo_text = tk.Text(top, font=('微软雅黑', 12), width=16, height=10)
self.memo_text.grid(row=1, column=0, columnspan=2, padx=5, pady=5)
tk.Button(top, text="确定", font=('微软雅黑', 12), width=10, bg="white", command=load_memo_finish) \
.grid(row=2, column=1, padx=5, pady=5)
def modify_ctrl_reg(self): # 更改控制器寄存器
def n_pc_button():
value = self.n_pc.get()
self.entry_replace(self.sing.pc_reg, value)
self.textbox.send_msg("更改成功")
def n_ir_button():
value = self.n_ir.get()
self.entry_replace(self.sing.ir_reg, value)
self.sing.ir_reg_value() # 更新IR的值
self.textbox.send_msg("更改成功")
def n_clock_button():
value = self.n_clock.get()
self.sing.clo_mark(int(value) - 1)
self.textbox.send_msg("更改成功")
def n_inscode_button():
value = self.n_inscode.get()
self.entry_replace(self.sing.ins, value)
self.textbox.send_msg("更改成功")
top = tk.Toplevel()
top.title("控制器控制")
top.geometry(f"{450}x{200}")
tk.Label(top, text="新PC值", font=('微软雅黑', 16)).grid(row=0, column=0, padx=5, pady=5, sticky="e")
self.n_pc = tk.Entry(top, font=('微软雅黑', 12), width=16)
self.n_pc.grid(row=0, column=1, padx=5, pady=5)
tk.Button(top, text="确定", font=('微软雅黑', 12), width=10, bg="white", command=n_pc_button) \
.grid(row=0, column=2, padx=5, pady=5)
tk.Label(top, text="新IR值", font=('微软雅黑', 16)).grid(row=1, column=0, padx=5, pady=5, sticky="e")
self.n_ir = tk.Entry(top, font=('微软雅黑', 12), width=16)
self.n_ir.grid(row=1, column=1, padx=5, pady=5)
tk.Button(top, text="确定", font=('微软雅黑', 12), width=10, bg="white", command=n_ir_button) \
.grid(row=1, column=2, padx=5, pady=5)
tk.Label(top, text="新Clock值", font=('微软雅黑', 16)).grid(row=2, column=0, padx=5, pady=5, sticky="e")
self.n_clock = tk.Entry(top, font=('微软雅黑', 12), width=16)
self.n_clock.grid(row=2, column=1, padx=5, pady=5)
tk.Button(top, text="确定", font=('微软雅黑', 12), width=10, bg="white", command=n_clock_button) \
.grid(row=2, column=2, padx=5, pady=5)
tk.Label(top, text="新Inscode值", font=('微软雅黑', 16)).grid(row=3, column=0, padx=5, pady=5, sticky="e")
self.n_inscode = tk.Entry(top, font=('微软雅黑', 12), width=16)
self.n_inscode.grid(row=3, column=1, padx=5, pady=5)
tk.Button(top, text="确定", font=('微软雅黑', 12), width=10, bg="white", command=n_inscode_button) \
.grid(row=3, column=2, padx=5, pady=5)
def manual_opera_io(self): # 手动更改运算
values = list(cpu_data.ALUio.keys())
def ok():
in1_val = self.in1.get()
in2_val = self.in2.get()
out_val = self.out.get()
opera_val = self.opera_op.get()
for io in cpu_data.ALUio:
cpu_data.ALUio[io] = False # 重置所有输入输出
cpu_data.ALUio[in1_val] = True
cpu_data.ALUio[in2_val] = True
cpu_data.ALUio[out_val] = True
self.alu.show_alu_line(cpu_data.ALUio) # 显示数据控制线
for op in cpu_data.ALUop:
cpu_data.ALUop[op] = False # 重置所有操作
cpu_data.ALUop[opera_val] = True
self.alu.alu_operation()
top = tk.Toplevel()
top.title("运算器控制")
top.geometry(f"{360}x{180}")
tk.Label(top, text="ALU输入", font=('微软雅黑', 16)).grid(row=0, column=0, padx=5, pady=5)
tk.Label(top, text="ALU输出", font=('微软雅黑', 16)).grid(row=1, column=0, padx=5, pady=5)
tk.Label(top, text="运算符", font=('微软雅黑', 16)).grid(row=2, column=0, padx=5, pady=5)
self.in1 = ttk.Combobox(top, values=values, width=10, font=('微软雅黑', 12))
self.in1.set(values[0]) # 设置默认选项
self.in1.grid(row=0, column=1, padx=5, pady=5)
self.in2 = ttk.Combobox(top, values=values, width=10, font=('微软雅黑', 12))
self.in2.set(values[0]) # 设置默认选项
self.in2.grid(row=0, column=2, padx=5, pady=5)
self.out = ttk.Combobox(top, values=values, width=10, font=('微软雅黑', 12))
self.out.set(values[0]) # 设置默认选项
self.out.grid(row=1, column=1, padx=5, pady=5)
self.opera_op = ttk.Combobox(top, values=["+", "-", "x", "÷"], width=10, font=('微软雅黑', 12))
self.opera_op.set("+") # 设置默认选项
self.opera_op.grid(row=2, column=1, padx=5, pady=5)
tk.Button(top, text="确定", font=('微软雅黑', 12), width=10, bg="white", command=ok) \
.grid(row=8, column=1, padx=5, pady=5)
def menu_test(self):
menu_bar = tk.Menu(root)
root.config(menu=menu_bar)
font = ("son", 12)
lode_menu = tk.Menu(menu_bar, tearoff=0)
menu_bar.add_cascade(label="装载程序", menu=lode_menu, font=font)
lode_menu.add_command(label="从文件装载", command=self.read_file, font=font)
lode_menu.add_command(label="手动输入", command=self.manual_input, font=font)
file_menu = tk.Menu(menu_bar, tearoff=0)
menu_bar.add_cascade(label="单指令执行", menu=file_menu)
file_menu.add_command(label="取数", command=lambda: self.exe_one_instruct("000001"))
file_menu.add_command(label="存数", command=lambda: self.exe_one_instruct("000010"))
file_menu.add_command(label="加法", command=lambda: self.exe_one_instruct("000011"))
file_menu.add_command(label="减法", command=lambda: self.exe_one_instruct("000111"))
file_menu.add_command(label="乘法", command=lambda: self.exe_one_instruct("000100"))
file_menu.add_command(label="除法", command=lambda: self.exe_one_instruct("001000"))
file_menu.add_command(label="打印", command=lambda: self.exe_one_instruct("000101"))
file_menu.add_command(label="停机", command=lambda: self.exe_one_instruct("000110"))
file_menu.add_command(label="顺序执行", command=lambda: self.exec_auto())
def entry_replace(self, entry: tk.Entry, value):
entry.delete(0, tk.END)
entry.insert(0, value)
def binary_addition(self, num1, num2):
result = bin_to_dec(num1) + bin_to_dec(num2) # 转为10进制的加
result_binary = dec_to_bin(result)
return result_binary
def binary_subtraction(self, num1, num2):
result = bin_to_dec(num1) - bin_to_dec(num2) # 转为10进制的减
result_binary = dec_to_bin(result)
return result_binary
def binary_multiplication(self, num1, num2):
result = bin_to_dec(num1) * bin_to_dec(num2) # 转为10进制的加
result_binary = dec_to_bin(result)
return result_binary
def binary_division(self, dividend, divisor):
quotient = bin_to_dec(dividend) // bin_to_dec(divisor)
result_binary = dec_to_bin(quotient)
return result_binary
# remainder = bin(int(dividend, 2) % int(divisor, 2))[2:]
def reg_enhance_display(self, rx):
"""强化显示R1-R4"""
self.alu.canvas.delete("reg")
for i in range(4):
if rx == f"R{i + 1}":
self.alu.canvas.create_line(365, 120 + i * 90, 513, 120 + i * 90, width=8, fill="#00FF00", tag="reg")
self.alu.canvas.create_line(365, 75 + i * 90, 513, 75 + i * 90, width=8, fill="#00FF00", tag="reg")
def gen_opera(self, rx=None, ry=None, op=None, sing_num=None): # 一般计算规则
"""
rx为小号寄存器ry为大号寄存器
寄存器字母一定要填大写
"""
for io in cpu_data.ALUio:
cpu_data.ALUio[io] = False # 清空ALU的数据线
if op is not None:
cpu_data.ALUop[op] = True # 设置ALU的操作
rt1, rt2 = None, None # 用于存储寄存器的实体框
for reg, entry in self.regs.items(): # 遍历寄存器编号和寄存器实体框
entry.config(bg=WHITE) # 寄存器恢复
if reg == rx:
rt1 = entry
if sing_num == 4:
cpu_data.ALUio[f"{rx}_ALU_1"] = True
if reg == ry:
rt2 = entry
if sing_num == 4:
cpu_data.ALUio[f"{ry}_ALU_2"] = True
if rx is not None and ry is not None:
v1 = rt1.get() # 获取R1的值
v2 = rt2.get() # 获取R2的值
if sing_num == 4:
self.alu.show_alu_line(cpu_data.ALUio) # 节拍5时显示寄存器到ALU的路线
self.alu.alu_operation() # 显示符号
rt1.config(bg=RED)
rt2.config(bg=RED)
if sing_num == 5:
if op == "+":
v = self.binary_addition(v1, v2) # 二进制加
elif op == "-":
v = self.binary_subtraction(v1, v2) # 二进制减法
elif op == "x":
v = self.binary_multiplication(v1, v2) # 二进制乘法
elif op == "÷":
v = self.binary_division(v1, v2) # 二进制除法
else:
v = None
# alu_line.append(f"ALU_{rx}") # 用于显示ALU的数据线
cpu_data.ALUio[f"ALU_{rx}"] = True
self.alu.alu_operation() # 显示符号
self.alu.show_alu_line(cpu_data.ALUio) # 显示数据控制线
self.entry_replace(rt1, f"{v}") # 替换R1中的值
rt1.config(bg=RED)
def pc_add_one(self, b16):
v = int(b16, 2)
return f"{v + 1:016b}"
def reg_update(self):
self.sing.pc_reg.config(bg=WHITE) # 更新PC寄存器的背景显示
self.sing.ins.config(bg=WHITE) # 更新ins背景
self.sing.ir_reg.config(bg=WHITE) # 更新IR的颜色
self.alu.r1.config(bg=WHITE)
self.alu.r2.config(bg=WHITE)
self.alu.r3.config(bg=WHITE)
self.alu.r4.config(bg=WHITE)
# 储存寄存器在储存类中已经处理,这里不再重复处理
def read_file(self):
filename = filedialog.askopenfilename(title="选择文件", filetypes=[("TXT文件", "*.txt")])
if filename:
with open(filename, "r", encoding="utf8") as f:
memo_line = f.readlines() # 按行读取文件信息
for index, line in enumerate(memo_line):
line = line.replace("\n", "") # 去掉换行符
if index < 20 and re.match("^[01]{16}$", line):
self.memo.mem_save(index, line, load=True)
else:
self.textbox.send_msg(f"{index:02X}】数据异常请检查")
if index > 19:
break
self.textbox.send_msg("装载完成")
self.entry_replace(self.sing.pc_reg, f"{0:016b}")
def on_inscode_select(self, event):
# 获取选择的值
selected_value = self.inscode_input.get()
inscode = inscode_map.get(selected_value)
self.inscode_input.set(inscode)
print(selected_value)
def load_finish(self):
self.child_window.destroy()
self.entry_replace(self.sing.pc_reg, f"{0:016b}")
self.textbox.send_msg("装载完成")
def on_offset_select(self, event):
ox16 = self.o_value_input.get()
value = int(ox16, 16)
self.o_value_input.set(f"{value:010b}")
def data_to_mome(self, offset_input):
data_input = self.d_value.get()
if offset_input and data_input:
offset = int(offset_input, 16)
if re.match("^-?[01]{16}$", data_input):
self.memo.mem_save(offset, data_input, load=True)
self.textbox.send_msg("数据装载完成\n" + f"{offset:02X}{data_input}")
elif re.match("^-?\d+$", data_input) and len(data_input) < 7: # 如果是10进制数不可能多于7位
# data_input = f"{int(data_input):016b}"
data_input = cpu_data.dec_to_bin(int(data_input))
self.memo.mem_save(offset, data_input, load=True)
self.textbox.send_msg("数据装载完成\n" + f"{offset:02X}{data_input}")
else:
if len(data_input) > 16:
self.textbox.send_msg(f"{data_input}不是16位数。")
else:
self.textbox.send_msg(f"{data_input}不是规范的二进制数。")
def save_to_mome(self, offset):
inscode = self.inscode_input.get()
value = self.o_value_input.get()
if offset:
offset = int(offset, 16)
if inscode and value:
value = inscode + value
self.memo.mem_save(offset, value, load=True)
self.textbox.send_msg(f"指令装载完成\n{offset:02X}{value}")
def manual_input(self):
self.child_window = tk.Toplevel(root)
self.child_window.title("手动输入程序")
self.child_window.geometry("350x360")
fram_down = tk.Frame(self.child_window)
tk.Label(fram_down, text="指令输入", font=("微软雅黑", 16, "bold")).grid(row=0, column=0, columnspan=3)
fram_down.place(x=0, y=0, width=350, height=360)
offset_label = tk.Label(fram_down, text="地址", font=("微软雅黑", 16))
offset_label.grid(row=1, column=0, sticky="nsew")
inscode_label = tk.Label(fram_down, text="指令", font=("微软雅黑", 16))
inscode_label.grid(row=1, column=1, sticky="nsew")
o_value_label = tk.Label(fram_down, text="寻址地址", font=("微软雅黑", 16))
o_value_label.grid(row=1, column=2, sticky="nsew")
hex_options = [f"{i:02X}" for i in range(20)] # 生成00-13的16进制选项
offset_input = ttk.Combobox(fram_down, values=hex_options, font=("微软雅黑", 12), width=1)
offset_input.grid(row=2, column=0, sticky="nsew", padx=5)
inscode_options = list(inscode_map.keys())
self.inscode_input = ttk.Combobox(fram_down, values=inscode_options, font=("微软雅黑", 12), width=6)
self.inscode_input.grid(row=2, column=1, sticky="nsew", padx=5)
self.inscode_input.bind("<<ComboboxSelected>>", self.on_inscode_select)
bin_options = [f"{i:02X}" for i in range(20)] # 生成00-13的16进制选项
self.o_value_input = ttk.Combobox(fram_down, values=bin_options, font=("微软雅黑", 12), width=10)
self.o_value_input.grid(row=2, column=2, sticky="nsew", padx=5)
self.o_value_input.bind("<<ComboboxSelected>>", self.on_offset_select)
save_b = tk.Button(fram_down, text="确认", bg=RED, font=("微软雅黑", 12),
command=lambda: self.save_to_mome(offset_input.get()))
save_b.grid(row=3, column=0, columnspan=3, sticky="nsew", padx=10, pady=4)
tk.Label(fram_down, text="*" * 300, font=("微软雅黑", 16)).grid(row=4, column=0, columnspan=3)
tk.Label(fram_down, text="数据输入", font=("微软雅黑", 16, "bold")).grid(row=5, column=0, columnspan=3)
d_off = tk.Label(fram_down, text="地址", font=("微软雅黑", 16))
d_off.grid(row=6, column=0, sticky="nsew")
d_value_lb = tk.Label(fram_down, text="数据", font=("微软雅黑", 16))
d_value_lb.grid(row=6, column=1, columnspan=2, sticky="nsew")
hex_options = [f"{i:02X}" for i in range(20)] # 生成00-13的16进制选项
d_off_in = ttk.Combobox(fram_down, values=hex_options, font=("微软雅黑", 12), width=1)
d_off_in.grid(row=7, column=0, sticky="nsew", padx=5)
self.d_value = tk.Entry(fram_down, font=("微软雅黑", 12))
self.d_value.grid(row=7, column=1, columnspan=2, sticky="nsew")
self.d_value.insert(0, "支持10进制和16位进制")
d_save = tk.Button(fram_down, text="确认", bg=RED, font=("微软雅黑", 12),
command=lambda: self.data_to_mome(d_off_in.get()))
d_save.grid(row=8, column=0, columnspan=3, sticky="nsew", padx=10, pady=4)
# 配置列权重,使它们按比例占据整个宽度
fram_down.columnconfigure(0, weight=2)
fram_down.columnconfigure(1, weight=6)
fram_down.columnconfigure(2, weight=10)
finish = tk.Button(fram_down, text="装载完成", bg=GOLD, font=("微软雅黑", 12), command=self.load_finish)
finish.grid(row=9, column=2, sticky="nsew", padx=10)
def SimGet(self, sing_num, reg_code=None):
"""取数指令"""
self.textbox.send_instr("取数")
if sing_num == 3:
self.textbox.send_msg(f"======Step{sing_num + 1}======")
self.reg_update() # 恢复寄存器
self.sing.clo_mark(sing_num) # 显示节拍
cpu_data.SigObj['->Memory'][1] = True
self.sing.show_singe() # 显示控制器信号
self.gui.addr_line() # 更新地址线
self.alu.show_alu_line() # 更新alu的数据线
self.memo.mad_to_memo(1) # 更新mad-mome的地址线,参数为真则显示
cpu_data.SigObj['Memory->Mcontent'][1] = True
self.gui.singe_ctrl_line() # 显示控制线
if reg_code in self.register_mapping: # 选择寄存器
register, data_line = self.register_mapping[reg_code]
self.gui.data_line(data_line)
self.entry_replace(register, self.memo.mco.get())
register.config(bg=RED)
canvas.update()
def SimPut(self, sing_num, reg_code=None):
"""存数指令"""
self.textbox.send_instr("存数")
if sing_num == 3:
self.textbox.send_msg(f"======Step{sing_num + 1}======")
if reg_code in self.register_mapping: # 选择寄存器
register, data_line = self.register_mapping[reg_code]
mco, reg = data_line.split("-")
self.reg_update() # 恢复寄存器
self.sing.clo_mark(sing_num)
cpu_data.SigObj['->Memory'][1] = True
self.sing.show_singe() # 显示控制器信号
cpu_data.SigObj['Mcontent->Memory'][1] = True
self.gui.singe_ctrl_line()
self.gui.addr_line()
# self.gui.data_line("r1-mco")
self.alu.show_alu_line() # 更新alu的数据线
# self.memo.mad_to_memo() # 更新mad-mome的地址线,参数为真则显示
self.memo.mco_to_memo() # 更新储存的显示显示
self.gui.data_line(f"{reg}-{mco}") # 重构参数
self.entry_replace(self.memo.mco, register.get())
register.config(bg=RED)
self.memo.mco_to_memo() # 显示
canvas.update()
def SimAddr(self, sing_num, reg_code=None):
"""加法指令"""
self.textbox.send_instr("加法")
if sing_num == 3:
self.textbox.send_msg(f"======Step{sing_num + 1}======")
if reg_code in self.register_mapping: # 选择寄存器
register, data_line = self.register_mapping[reg_code]
mco, reg = data_line.split("-")
reg = int(reg[-1]) + 1
self.reg_update()
self.sing.clo_mark(sing_num) # 显示节拍
cpu_data.SigObj['->Memory'][1] = True
self.sing.show_singe() # 显示控制器信号
cpu_data.SigObj[f'Mcontent->R{reg}'][1] = True
cpu_data.SigObj[f'->R{reg}'][1] = True
self.gui.singe_ctrl_line() # 显示控制线
self.gui.addr_line() # 更新地址线
self.memo.mad_to_memo(1) # 更新mad-mome的地址线,参数为真则显示
self.gui.data_line(f"mco-r{reg}") # 更新数据线
self.alu.show_alu_line() # 更新alu的数据线
# self.memo.mad_to_memo() # 显示memo动画
self.entry_replace(eval(f'self.alu.r{reg}'), self.memo.mco.get()) # 更新显示R1中的值
canvas.update()
if sing_num == 4:
self.textbox.send_msg(f"======Step{sing_num + 1}======")
if reg_code in self.register_mapping: # 选择寄存器
register, data_line = self.register_mapping[reg_code]
mco, reg = data_line.split("-")
reg = int(reg[-1]) + 1
self.reg_update()
self.sing.clo_mark(sing_num) # 显示节拍
cpu_data.SigObj['->ALU'][1] = True
self.sing.show_singe() # 显示控制器信号
cpu_data.SigObj['->ALU'][1] = True
self.gui.singe_ctrl_line() # 显示控制线
self.gui.addr_line() # 更新地址线
self.gui.data_line() # 更新数据线
self.memo.mad_to_memo() # 更新mad-mome的地址线,参数为真则显示
self.alu.show_alu_line() # 更新alu的数据线
self.gen_opera(f"R{reg - 1}", f"R{reg}", "+", sing_num)
canvas.update()
if sing_num == 5:
self.textbox.send_msg(f"======Step{sing_num + 1}======")
if reg_code in self.register_mapping: # 查找寄存器
register, data_line = self.register_mapping[reg_code]
mco, reg = data_line.split("-")
reg = int(reg[-1]) + 1
self.reg_update()
self.sing.clo_mark(sing_num) # 显示节拍
self.sing.show_singe() # 显示控制器信号
self.gui.singe_ctrl_line() # 显示控制线
self.gui.addr_line() # 更新地址线
self.gui.data_line() # 更新数据线
self.memo.mad_to_memo() # 更新mad-mome的地址线,参数为真则显示
self.alu.show_alu_line() # 更新alu的数据线
self.gen_opera(f"R{reg - 1}", f"R{reg}", "+", sing_num)
canvas.update()
def SimMinus(self, sing_num, reg_code):
"""减法指令"""
self.textbox.send_instr(f"减法")
register, data_line = self.register_mapping[reg_code]
mco, reg = data_line.split("-")
reg = int(reg[-1]) + 1
if sing_num == 3:
self.textbox.send_msg(f"======Step{sing_num + 1}======")
self.reg_update()
self.sing.clo_mark(sing_num) # 显示节拍
cpu_data.SigObj['->Memory'][1] = True
self.sing.show_singe() # 显示控制器信号
cpu_data.SigObj[f'Mcontent->R{reg}'][1] = True
cpu_data.SigObj[f'->R{reg}'][1] = True
self.gui.singe_ctrl_line() # 显示控制线
self.gui.addr_line() # 更新地址线
self.memo.mad_to_memo(1) # 更新mad-mome的地址线,参数为真则显示
self.gui.data_line(f"mco-r{reg}") # 更新数据线
self.alu.show_alu_line() # 更新alu的数据线
self.entry_replace(eval(f"self.alu.r{reg}"), self.memo.mco.get()) # 更新显示R2中的值
canvas.update()
if sing_num == 4:
self.textbox.send_msg(f"======Step{sing_num + 1}======")
self.reg_update()
self.sing.clo_mark(sing_num) # 显示节拍
cpu_data.SigObj['->ALU'][1] = True
self.sing.show_singe() # 显示控制器信号
cpu_data.SigObj['->ALU'][1] = True
self.gui.singe_ctrl_line() # 显示控制线
self.gui.addr_line() # 更新地址线
self.gui.data_line() # 更新数据线
self.memo.mad_to_memo() # 更新mad-mome的地址线,参数为真则显示
self.alu.show_alu_line() # 更新alu的数据线
self.gen_opera(f"R{reg - 1}", f"R{reg}", "-", sing_num)
canvas.update()
if sing_num == 5:
self.textbox.send_msg(f"======Step{sing_num + 1}======")
self.reg_update()
self.sing.clo_mark(sing_num) # 显示节拍
self.sing.show_singe() # 显示控制器信号
self.gui.singe_ctrl_line() # 显示控制线
self.gui.addr_line() # 更新地址线
self.gui.data_line() # 更新数据线
self.memo.mad_to_memo() # 更新mad-mome的地址线,参数为真则显示
self.alu.show_alu_line() # 更新alu的数据线
self.gen_opera(f"R{reg - 1}", f"R{reg}", "-", sing_num)
canvas.update()
def SimProduct(self, sing_num, reg_code):
"""乘法指令"""
self.textbox.send_instr(f"乘法")
register, data_line = self.register_mapping[reg_code]
mco, reg = data_line.split("-")
reg = int(reg[-1]) + 1
if sing_num == 3:
self.textbox.send_msg(f"======Step{sing_num + 1}======")
self.reg_update()
self.sing.clo_mark(sing_num) # 显示节拍
cpu_data.SigObj['->Memory'][1] = True
self.sing.show_singe() # 显示控制器信号
cpu_data.SigObj[f'Mcontent->R{reg}'][1] = True
cpu_data.SigObj[f'->R{reg}'][1] = True
self.gui.singe_ctrl_line() # 显示控制线
self.gui.addr_line() # 更新地址线
self.memo.mad_to_memo(1) # 更新mad-mome的地址线,参数为真则显示
self.gui.data_line(f"mco-r{reg}") # 更新数据线
self.alu.show_alu_line() # 更新alu的数据线
self.entry_replace(eval(f"self.alu.r{reg}"), self.memo.mco.get()) # 更新显示R2中的值
canvas.update()
if sing_num == 4:
self.textbox.send_msg(f"======Step{sing_num + 1}======")
self.reg_update()
self.sing.clo_mark(sing_num) # 显示节拍
cpu_data.SigObj['->ALU'][1] = True
self.sing.show_singe() # 显示控制器信号
cpu_data.SigObj['->ALU'][1] = True
self.gui.singe_ctrl_line() # 显示控制线
self.gui.addr_line() # 更新地址线
self.gui.data_line() # 更新数据线
self.memo.mad_to_memo() # 更新mad-mome的地址线,参数为真则显示
self.alu.show_alu_line() # 更新alu的数据线
self.gen_opera(f"R{reg - 1}", f"R{reg}", "x", sing_num)
canvas.update()
if sing_num == 5:
self.textbox.send_msg(f"======Step{sing_num + 1}======")
self.reg_update()
self.sing.clo_mark(sing_num) # 显示节拍
self.sing.show_singe() # 显示控制器信号
self.gui.singe_ctrl_line() # 显示控制线
self.gui.addr_line() # 更新地址线
self.gui.data_line() # 更新数据线
self.memo.mad_to_memo() # 更新mad-mome的地址线,参数为真则显示
self.alu.show_alu_line() # 更新alu的数据线
self.gen_opera(f"R{reg - 1}", f"R{reg}", "x", sing_num)
canvas.update()
def SimDiv(self, sing_num, reg_code):
"""除法指令"""
self.textbox.send_instr(f"除法")
register, data_line = self.register_mapping[reg_code]
mco, reg = data_line.split("-")
reg = int(reg[-1]) + 1
if sing_num == 3:
self.textbox.send_msg(f"======Step{sing_num + 1}======")
self.reg_update()
self.sing.clo_mark(sing_num) # 显示节拍
cpu_data.SigObj['->Memory'][1] = True
self.sing.show_singe() # 显示控制器信号
cpu_data.SigObj[f'Mcontent->R{reg}'][1] = True
cpu_data.SigObj[f'->R{reg}'][1] = True
self.gui.singe_ctrl_line() # 显示控制线
self.gui.addr_line() # 更新地址线
self.memo.mad_to_memo(1) # 更新mad-mome的地址线,参数为真则显示
self.gui.data_line(f"mco-r{reg}") # 更新数据线
self.alu.show_alu_line() # 更新alu的数据线
self.entry_replace(eval(f"self.alu.r{reg}"), self.memo.mco.get()) # 更新显示R2中的值
canvas.update()
if sing_num == 4:
self.textbox.send_msg(f"======Step{sing_num + 1}======")
self.reg_update()
self.sing.clo_mark(sing_num) # 显示节拍
cpu_data.SigObj['->ALU'][1] = True
self.sing.show_singe() # 显示控制器信号
cpu_data.SigObj['->ALU'][1] = True
self.gui.singe_ctrl_line() # 显示控制线
self.gui.addr_line() # 更新地址线
self.gui.data_line() # 更新数据线
self.memo.mad_to_memo() # 更新mad-mome的地址线,参数为真则显示
self.alu.show_alu_line() # 更新alu的数据线
self.gen_opera(f"R{reg - 1}", f"R{reg}", "÷", sing_num)
canvas.update()
if sing_num == 5:
self.textbox.send_msg(f"======Step{sing_num + 1}======")
self.reg_update()
self.sing.clo_mark(sing_num) # 显示节拍
self.sing.show_singe() # 显示控制器信号
self.gui.singe_ctrl_line() # 显示控制线
self.gui.addr_line() # 更新地址线
self.gui.data_line() # 更新数据线
self.memo.mad_to_memo() # 更新mad-mome的地址线,参数为真则显示
self.alu.show_alu_line() # 更新alu的数据线0.
self.gen_opera(f"R{reg - 1}", f"R{reg}", "÷", sing_num)
canvas.update()
def SimPrint(self, sing_num):
self.textbox.send_instr("打印")
if sing_num == 3:
self.textbox.send_msg(f"======Step{sing_num + 1}======")
self.reg_update()
self.sing.clo_mark(sing_num) # 显示节拍
cpu_data.SigObj['->Memory'][1] = True
self.sing.show_singe() # 显示控制器信号
cpu_data.SigObj['->R1'][1] = True
cpu_data.SigObj['Mcontent->R1'][1] = True
self.gui.singe_ctrl_line() # 显示控制线
self.gui.addr_line() # 更新地址线
self.memo.mad_to_memo(1) # 更新mad-mome的地址线,参数为真则显示
self.gui.data_line("mco-r1") # 更新数据线
self.alu.show_alu_line() # 更新alu的数据线
self.entry_replace(self.alu.r1, self.memo.mco.get()) # 更新显示R2中的值
canvas.update()
if sing_num == 4:
self.textbox.send_msg(f"======Step{sing_num + 1}======")
self.reg_update()
self.sing.clo_mark(sing_num) # 显示节拍
cpu_data.SigObj['->R1'][1] = True # 更新R1的值
self.sing.show_singe() # 显示控制器信号
cpu_data.SigObj['->R1'][1] = True # 更新R1的值
self.gui.singe_ctrl_line() # 显示控制线
self.gui.addr_line() # 更新地址线
self.gui.data_line() # 更新数据线
self.memo.mad_to_memo() # 更新mad-mome的地址线,参数为真则显示
self.alu.show_alu_line() # 更新alu的数据线
val = self.alu.r1.get()
self.textbox.send_msg(f"打印输出:\n'{val}'")
binary_string = bin_to_dec(val)
self.textbox.send_msg(f"10进制转换'{binary_string}'")
canvas.update()
# print(self.alu.r1.get())
def SimStop(self, sing_num):
self.textbox.send_instr("停机")
if sing_num == 3:
self.textbox.send_msg(f"======Step{sing_num + 1}======")
self.reg_update()
self.sing.clo_mark(sing_num) # 显示节拍
cpu_data.SigObj['->PC+1'][1] = True # 更新PC+1的值
self.sing.show_singe() # 显示控制器信号
cpu_data.SigObj['->PC+1'][1] = True # 更新PC+1的值
self.gui.singe_ctrl_line() # 显示控制线
self.gui.addr_line() # 更新地址线
self.gui.data_line() # 更新数据线
self.memo.mad_to_memo() # 更新mad-mome的地址线,参数为真则显示
self.alu.show_alu_line() # 更新alu的数据线
self.sing.pc_value = f"{0:016b}" # PC 置0
self.sing.pc_reg_value()
self.textbox.send_msg("PC = 0")
self.sing.pc_reg.config(bg=RED)
self.sing.ins.config(bg=RED)
canvas.update()
if sing_num == 4:
self.textbox.send_msg(f"======Step{sing_num + 1}======")
self.reg_update()
self.sing.clo_mark() # 显示节拍
self.sing.show_singe() # 显示控制器信号
self.gui.singe_ctrl_line() # 显示控制线
self.gui.addr_line() # 更新地址线
self.gui.data_line() # 更新数据线
self.memo.mad_to_memo() # 更新mad-mome的地址线,参数为真则显示
self.alu.show_alu_line() # 更新alu的数据线
self.textbox.send_msg("系统停机")
canvas.update()
def SimGoto(self, sing_num):
self.textbox.send_instr("跳转")
if sing_num == 3:
self.textbox.send_msg(f"======Step{sing_num + 1}======")
self.reg_update()
self.sing.clo_mark(sing_num) # 显示节拍
cpu_data.SigObj['->Memory'][1] = True # 更新Memory的值
self.sing.show_singe() # 显示控制器信号
cpu_data.SigObj['PC->Maddr'][1] = True
cpu_data.SigObj['Mcontent->PC'][1] = True
cpu_data.SigObj["->PC+1"][1] = True
self.gui.singe_ctrl_line() # 显示控制线
self.gui.addr_line() # 更新地址线
self.memo.mad_to_memo(1) # 更新mad-mome的地址线,参数为真则显示
self.gui.data_line("mco-pc") # 更新数据线
self.alu.show_alu_line() # 更新alu的数据线
mco_value = self.memo.mco.get()
self.entry_replace(self.sing.pc_reg, mco_value)
self.memo.mco.config(bg=RED)
self.sing.pc_reg.config(bg=RED)
canvas.update()
def lw_(self, one_inscode=None, is_meter=None, step=None):
'''
取指令
:param one_inscode: 执行模式,分单指令自动执行和分节拍手动执行
:param is_meter: 控制是否为分节拍模式 True则表示分节拍执行
:param step: 节拍步骤
:return: 停机指令
'''
self.alu.show_alu_line(None) # 更新ALU的数据线
if step <= 2: # 前三节拍都更新取指令,后面的节拍更新其他指令
self.textbox.send_instr("取指令")
if step == 0:
self.textbox.send_msg(f"\n\n\n======Step{step + 1}======")
self.reg_update() # 更新各个寄存器颜色为白色
self.sing.clo_mark(step) # 显示节拍
cpu_data.SigObj['->Memory'][1] = True # 更新Memory的值
self.sing.show_singe() # 显示控制器信号
cpu_data.SigObj['PC->Maddr'][1] = True # 更新PC->Maddr的值
self.gui.singe_ctrl_line() # 显示信号控制线
cpu_data.SigObj['PC->Maddr'][1] = True # 更新PC->Maddr的值
self.gui.addr_line() # 显示地址线
self.gui.data_line() # 更新数据线
self.memo.mad_to_memo() # 更新mad-mome的地址线
self.alu.alu_operation() # 更新alu的符号
canvas.update() # 刷新显示
maddr = self.sing.pc_reg.get() # 获取pc寄存器的值
self.sing.pc_reg.config(bg=RED) # 更新PC寄存器的背景显示
self.memo.show_maddr(maddr, 1) # 更新maddr的显示和值
self.alu.show_alu_line(None) # 显示ALU的数据线
if step == 1:
self.textbox.send_msg(f"======Step{step + 1}======")
self.reg_update() # 更新各个寄存器颜色为白色
self.sing.clo_mark(step) # 显示节拍
cpu_data.SigObj['->IR'][1] = True
self.sing.show_singe() # 显示控制器信号
cpu_data.SigObj['->IR'][1] = True
self.gui.singe_ctrl_line() # 显示控制线
self.gui.addr_line() # 更新显示地址线
self.memo.mad_to_memo(1) # 更新mad-mome的地址线,参数为真则显示
self.gui.data_line("mco-ir") # 更新数据线
data = self.memo.mco.get() # 取得mco中的值
self.sing.ir_value = data # 更新 ir的值
self.sing.ir_reg_value() # 显示IR
self.sing.ir_reg.config(bg=RED) # 更新IR的颜色
canvas.update() # 刷新显示
if step >= 2:
global inscode
if step == 2:
self.textbox.send_msg(f"======Step{step + 1}======")
self.reg_update() # 更新各个寄存器颜色为白色
self.sing.clo_mark(step) # 显示节拍
cpu_data.SigObj['->PC+1'][1] = True # 更新PC+1的值
cpu_data.SigObj['->IR'][1] = True # 更新IR的值
self.sing.show_singe() # 显示控制器信号
cpu_data.SigObj['->PC+1'][1] = True # 更新PC+1的值
cpu_data.SigObj['->IR'][1] = True # 更新IR的值
self.gui.singe_ctrl_line() # 显示控制线
cpu_data.SigObj['IR->Maddr'][1] = True # 更新IR->Maddr的值
self.gui.addr_line() # 更新地址线
self.gui.data_line() # 更新数据线
self.memo.mad_to_memo() # 更新mad-mome的地址线,参数为真则显示
self.sing.pc_value = self.sing.pc_reg.get()
self.sing.pc_value = self.pc_add_one(self.sing.pc_value) # pc+1
self.sing.pc_reg_value() # 更新PC显示
self.sing.pc_reg.config(bg=RED) # 更新PC背景
inscode, addr = self.sing.ir_value[:6], self.sing.ir_value[6:] # 拆分操作码和指令地址
self.sing.ir_reg.config(bg=RED) # 更新IR背景
self.entry_replace(self.sing.ins, inscode) # 更新 inscode值
self.sing.ins.config(bg=RED) # 更新insCode背景
self.memo.mad_value = f"{int(addr, 2):016b}" # 更新 maddr值
self.memo.show_maddr(self.memo.mad_value, 1) # 显示maddr值
canvas.update() # 刷新显示
if is_meter is None:
time.sleep(self.wait_time)
if one_inscode is not None: # 如果有单指令,直接执行指令
self.instruct(one_inscode)
else: # 如果没有单指令,执行读取到的指令
if is_meter: # 如果是分节拍执行。
stop_tag = self.instruct(inscode, step) # 加入步骤参数
return stop_tag
else: # 不分节拍执行
stop_tag = self.instruct(inscode) # 不加步骤参数
if stop_tag == "stop": return "stop"
if is_meter is None and step < 2: # 不分节拍执行时,增加等待时间
time.sleep(self.wait_time)
def instruct(self, inscode, step=None):
com_code = inscode[2:]
reg_code = inscode[:2]
if com_code == '0001': # 取数指令
if step is not None: # 当有手动指令时执行手动指令
self.SimGet(step, reg_code)
if step >= 3:
return "end"
else:
for i in range(3, 4):
self.SimGet(i, reg_code)
time.sleep(self.wait_time)
if com_code == "0010": # 存数指令
if step is not None:
self.SimPut(step, reg_code)
if step >= 3:
return "end"
else:
for i in range(3, 4):
self.SimPut(i, reg_code)
time.sleep(self.wait_time)
if com_code == "0011":
if reg_code != "11": # 加法指令
if step is not None:
self.SimAddr(step, reg_code)
if step >= 5:
return "end"
else:
for i in range(3, 6):
self.SimAddr(i, reg_code)
time.sleep(self.wait_time)
else:
self.textbox.send_msg("寄存器超限!!!", fg="#FF0000")
if com_code == "0111": # 减法指令
if reg_code != "11": # 加法指令
if step is not None:
self.SimMinus(step, reg_code)
if step >= 5:
return "end"
else:
for i in range(3, 6):
self.SimMinus(i, reg_code)
time.sleep(self.wait_time)
else:
self.textbox.send_msg("寄存器超限!!!", fg="#FF0000")
if com_code == "0100": # 乘法指令
if reg_code != "11":
if step is not None:
self.SimProduct(step, reg_code)
if step >= 5:
return "end"
else:
for i in range(3, 6):
self.SimProduct(i, reg_code)
time.sleep(self.wait_time)
else:
self.textbox.send_msg("寄存器超限!!!", fg="#FF0000")
if com_code == "1000": # 除法指令
if reg_code != "11":
if step is not None:
self.SimDiv(step, reg_code)
if step >= 5:
return "end"
else:
for i in range(3, 6):
self.SimDiv(i, reg_code)
time.sleep(self.wait_time)
else:
self.textbox.send_msg("寄存器超限!!!", fg="#FF0000")
if com_code == "1001": # 跳转指令
if step is not None:
self.SimGoto(step)
if step >= 3:
return "end"
else:
for i in range(3, 4):
self.SimGoto(i)
time.sleep(self.wait_time)
if com_code == "0101": # 打印指令
if step is not None:
self.SimPrint(step)
if step >= 4:
return "end"
else:
for i in range(3, 5):
self.SimPrint(i)
time.sleep(self.wait_time)
if com_code == "0110": # 停机指令
if step is not None:
self.SimStop(step)
if step >= 4:
return "stop"
else:
for i in range(3, 5):
self.SimStop(i)
time.sleep(self.wait_time)
if i >= 4:
return "stop" # 停机标志
def exe_one_instruct(self, inscode):
"""单指令执行"""
for i in range(3):
self.lw_(inscode, step=i)
def exec_auto(self): # 自动执行储存程序
while True:
instr_stute = None # 指令状态为"stop"时退出循环。
if self.ctrl_stop:
break
for i in range(3):
instr_stute = self.lw_(step=i)
if instr_stute == "stop":
break
def exec_next(self): # 执行下一步
statu = self.lw_(is_meter=True, step=self.manual_opera_step) # 执行指令
self.manual_opera_step += 1
if statu == "end" or self.manual_opera_step > 5: # 指令结束或者节拍序号大于5都将节拍重置鱼0
self.manual_opera_step = 0
elif statu == "stop": # 若上一条指令返回停机指令则disable下一步按键
self.next_button.config(state=tk.DISABLED)
if self.manual_opera_step > 0:
self.prev_button.config(state=tk.NORMAL)
def prev(self): # 执行上一步
self.next_button.config(state=tk.NORMAL)
if self.manual_opera_step > 0:
self.manual_opera_step -= 1
self.lw_(is_meter=True, step=self.manual_opera_step)
else:
self.prev_button.config(state=tk.DISABLED)
def exec_manual_operation(self):
'''分节拍顺序执行'''
self.lw_(is_meter=True, step=self.manual_opera_step)
def main():
SimMem[0] = f"0000010000001010" # SimMem[10] => r1
SimMem[1] = f"0000110000001011" # r1+SimMem[11] => r1
SimMem[2] = f"0001000000001100" # r1*SimMem[12] => r1
SimMem[3] = f"0010000000001101" # r1//SimMem[13] => r1
SimMem[4] = f"0001110000001110" # r1-SimMem[14] => r1
SimMem[5] = f"0000100000001111" # 存数到15地址 r1 => SimMem[15]
SimMem[6] = f"0001010000001111" # 打印 SimMem[15]
SimMem[7] = f"0001100000000000" # 停机
SimMem[10] = dec_to_bin(9) # 10 地址数据
SimMem[11] = dec_to_bin(11) # 11 地址数据
SimMem[12] = dec_to_bin(5) # 12 地址数据
SimMem[13] = dec_to_bin(10) # 13 号位的值
SimMem[14] = dec_to_bin(11) # 14 地址数据
exe = ExecInstructWithText()
root.mainloop()
if __name__ == '__main__':
main()