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.

430 lines
15 KiB
Python

import pin
# 一个指令周期
FETCH = [
# 把 pc(当前是0) 的值 输出到偏移地址寄存器中,
pin.PC_OUT | pin.MAR_IN,
# 内存根据上方修改后的偏移地址寄存器找到数据输出到总线上, IR 写入, 给PC 增加1
pin.RAM_OUT | pin.IR_IN | pin.PC_INC,
pin.PC_OUT | pin.MAR_IN,
pin.RAM_OUT | pin.DST_IN | pin.PC_INC,
pin.PC_OUT | pin.MAR_IN,
pin.RAM_OUT | pin.SRC_IN | pin.PC_INC,
]
MOV = 0 << pin.ADDR_2_SHIFT | pin.ADDR_2 # 左移 留出来操作数位 然后再加上 ADDR_2的标志
ADD = 1 << pin.ADDR_2_SHIFT | pin.ADDR_2
SUB = 2 << pin.ADDR_2_SHIFT | pin.ADDR_2
CMP = 3 << pin.ADDR_2_SHIFT | pin.ADDR_2
AND = 4 << pin.ADDR_2_SHIFT | pin.ADDR_2
OR = 5 << pin.ADDR_2_SHIFT | pin.ADDR_2
XOR = 6 << pin.ADDR_2_SHIFT | pin.ADDR_2
INC = 0 << pin.ADDR_1_SHIFT | pin.ADDR_1
DEC = 1 << pin.ADDR_1_SHIFT | pin.ADDR_1
NOT = 2 << pin.ADDR_1_SHIFT | pin.ADDR_1
JMP = 3 << pin.ADDR_1_SHIFT | pin.ADDR_1
JO = 4 << pin.ADDR_1_SHIFT | pin.ADDR_1 # 溢出跳转
JNO = 5 << pin.ADDR_1_SHIFT | pin.ADDR_1 # 不溢出跳转
JZ = 6 << pin.ADDR_1_SHIFT | pin.ADDR_1 # 如果为0跳转
JNZ = 7 << pin.ADDR_1_SHIFT | pin.ADDR_1 # 非0跳转
JP = 8 << pin.ADDR_1_SHIFT | pin.ADDR_1 # 奇数跳转
JNP = 9 << pin.ADDR_1_SHIFT | pin.ADDR_1 # 偶数跳转
5 months ago
PUSH = 10 << pin.ADDR_1_SHIFT | pin.ADDR_1
POP = 11 << pin.ADDR_1_SHIFT | pin.ADDR_1
CALL = 12 << pin.ADDR_1_SHIFT | pin.ADDR_1
5 months ago
INT = 13 << pin.ADDR_1_SHIFT | pin.ADDR_1 # 中断
NOP = 0b0
5 months ago
RET = 0b1 # 中断
IRET = 0b10 # 中断返回
STI = 0b11 # 打开中断
CLI = 0b100 # 关闭中断
HLT = 0b11_1111
INSTRUCTIONS = {
2: {
MOV: { # 0b10000000
# mov X任意寄存器, 5, 如果是mov a, 5 这个指令对应的前3个内存地址就是 1000_01_00 00000008(dst中保存的a寄存器编号是8) 00000101(src保存的数值是5, 等下SRC_OUT会输出到总线上)
(pin.AM_REG, pin.AM_INS): [ # 1000_01_00 这是IR寄存器上保存的指令
# 目的任意寄存器的控制线的编号X, 保存在了DST寄存器中中, 输出到读写控制器控制使X寄存器打开写
# 写入 SRC寄存器中保存的立即数
# 这是控制读写寄存器操作寄存器控制器的值
pin.DST_W | pin.SRC_OUT,
],
(pin.AM_REG, pin.AM_REG): [ # mov a, b
pin.DST_W | pin.SRC_R
# SRC_R 和 SRC_OUT的区别是:
# - SRC_R 是被读写控制器控制的表示, SRC_R内保存的值是一个寄存器编号, 此时把这个编号传到 寄存器控制器中然后把这个指定的寄存器数据传到总线上
# - SRC_OUT 是把直接SRC寄存器中的数据输出到总线
],
(pin.AM_REG, pin.AM_DIR): [ # mov a, [0x5]
pin.SRC_OUT | pin.MAR_IN, # 把0x5从src寄存器, 通过偏移地址寄存器传到 内存控制器中
pin.DST_W | pin.RAM_OUT # 把上面传到内存控制器中的地址, 输出到DST_W中的a寄存器中
],
(pin.AM_REG, pin.AM_RAM): [ # mov a, [b]
pin.SRC_R | pin.MAR_IN, # 把SRC_R中的b寄存器编号, 通过偏移地址寄存器MAR传到 内存控制器中
pin.DST_W | pin.RAM_OUT
],
(pin.AM_DIR, pin.AM_INS): [ # mov [0x2f], 5
pin.DST_OUT | pin.MAR_IN, # 把0x2f这个地址, 从dst寄存器, 通过偏移地址寄存器传到 内存控制器中
pin.SRC_OUT | pin.RAM_IN
],
(pin.AM_DIR, pin.AM_REG): [ # mov [0x0], a
pin.DST_OUT | pin.MAR_IN,
pin.SRC_R | pin.RAM_IN
],
(pin.AM_DIR, pin.AM_DIR): [ # mov [0x0], [0x2f]
pin.SRC_OUT | pin.MAR_IN,
pin.T1_IN | pin.RAM_OUT,
pin.DST_OUT | pin.MAR_IN,
pin.T1_OUT | pin.RAM_IN
],
(pin. AM_DIR, pin.AM_RAM): [ # mov [0x0], [a]
pin.SRC_R | pin.MAR_IN,
pin.T1_IN | pin.RAM_OUT,
pin.DST_OUT | pin.MAR_IN,
pin.T1_OUT | pin.RAM_IN
],
(pin.AM_RAM, pin.AM_INS): [ # mov [a], 0x5
pin.DST_R | pin.MAR_IN,
pin.SRC_OUT | pin.RAM_IN
],
(pin.AM_RAM, pin.AM_REG): [ # mov [a], c
pin.DST_R | pin.MAR_IN,
pin.SRC_R | pin.RAM_IN
],
(pin.AM_RAM, pin.AM_DIR): [ # mov [a], [0x5]
pin.SRC_OUT | pin.MAR_IN,
pin.T1_IN | pin.RAM_OUT,
pin.DST_R | pin.MAR_IN,
pin.T1_OUT | pin.RAM_IN
],
(pin.AM_RAM, pin.AM_RAM): [ # mov [a], [b]
pin.SRC_R | pin.MAR_IN,
pin.T1_IN | pin.RAM_OUT,
pin.DST_R | pin.MAR_IN,
pin.T1_OUT | pin.RAM_IN
],
},
ADD: {
(pin.AM_REG, pin.AM_INS): [ # add b, 5
pin.DST_R | pin.A_IN, # 将b寄存器内的值 转移到 A寄存器
pin.SRC_OUT | pin.B_IN, # 将 src中的值 转移到 b寄存器
pin.OP_ADD | pin.ALU_OUT | pin.DST_W | pin.ALU_PSW # 打开alu输出计算之后 写入到 DST中的编号为 b寄存器中, 并记录 psw
],
(pin.AM_REG, pin.AM_REG): [ # add a, b
pin.DST_R | pin.A_IN,
pin.SRC_R | pin.B_IN,
pin.OP_ADD | pin.ALU_OUT | pin.DST_W | pin.ALU_PSW
],
},
SUB: {
(pin.AM_REG, pin.AM_INS): [ # sub b, 5
pin.DST_R | pin.A_IN, # 将b寄存器内的值 转移到 A寄存器
pin.SRC_OUT | pin.B_IN, # 将 src中的值 转移到 b寄存器
pin.OP_SUB | pin.ALU_OUT | pin.DST_W | pin.ALU_PSW
],
(pin.AM_REG, pin.AM_REG): [ # sub a, b
pin.DST_R | pin.A_IN,
pin.SRC_R | pin.B_IN,
pin.OP_SUB | pin.ALU_OUT | pin.DST_W | pin.ALU_PSW
],
},
CMP: {
(pin.AM_REG, pin.AM_INS): [ # cmp b, 5
pin.DST_R | pin.A_IN, # 将b寄存器内的值 转移到 A寄存器
pin.SRC_OUT | pin.B_IN, # 将 src中的值 转移到 b寄存器
pin.OP_SUB | pin.ALU_PSW # 相减, 只更新状态字即可
],
(pin.AM_REG, pin.AM_REG): [ # cmp a, b
pin.DST_R | pin.A_IN,
pin.SRC_R | pin.B_IN,
pin.OP_SUB | pin.ALU_PSW
],
},
AND: {
(pin.AM_REG, pin.AM_INS): [ # and b, 5
pin.DST_R | pin.A_IN, # 将b寄存器内的值 转移到 A寄存器
pin.SRC_OUT | pin.B_IN, # 将 src中的值 转移到 b寄存器
pin.OP_AND | pin.ALU_OUT | pin.DST_W | pin.ALU_PSW
],
(pin.AM_REG, pin.AM_REG): [ # and a, b
pin.DST_R | pin.A_IN,
pin.SRC_R | pin.B_IN,
pin.OP_AND | pin.ALU_OUT | pin.DST_W | pin.ALU_PSW
],
},
OR: {
(pin.AM_REG, pin.AM_INS): [ # or b, 5
pin.DST_R | pin.A_IN, # 将b寄存器内的值 转移到 A寄存器
pin.SRC_OUT | pin.B_IN, # 将 src中的值 转移到 b寄存器
pin.OP_OR | pin.ALU_OUT | pin.DST_W | pin.ALU_PSW
],
(pin.AM_REG, pin.AM_REG): [ # or a, b
pin.DST_R | pin.A_IN,
pin.SRC_R | pin.B_IN,
pin.OP_OR | pin.ALU_OUT | pin.DST_W | pin.ALU_PSW
],
},
XOR: {
(pin.AM_REG, pin.AM_INS): [ # xor b, 5
pin.DST_R | pin.A_IN, # 将b寄存器内的值 转移到 A寄存器
pin.SRC_OUT | pin.B_IN, # 将 src中的值 转移到 b寄存器
pin.OP_XOR | pin.ALU_OUT | pin.DST_W | pin.ALU_PSW
],
(pin.AM_REG, pin.AM_REG): [ # xor a, b
pin.DST_R | pin.A_IN,
pin.SRC_R | pin.B_IN,
pin.OP_XOR | pin.ALU_OUT | pin.DST_W | pin.ALU_PSW
],
},
},
1: {
INC: {
pin.AM_REG: [ # inc b
pin.DST_R | pin.A_IN,
pin.OP_INC | pin.ALU_OUT | pin.DST_W | pin.ALU_PSW
],
},
DEC: {
pin.AM_REG: [ # dec b
pin.DST_R | pin.A_IN,
pin.OP_DEC | pin.ALU_OUT | pin.DST_W | pin.ALU_PSW
],
},
NOT: {
pin.AM_REG: [ # not b
pin.DST_R | pin.A_IN,
pin.OP_NOT | pin.ALU_OUT | pin.DST_W | pin.ALU_PSW
],
},
JMP: { # jmp 0x5 跳转到立即数的地址
pin.AM_INS: [
pin.DST_OUT | pin.PC_IN,
]
},
JO: {
pin.AM_INS: [
pin.DST_OUT | pin.PC_IN,
]
},
JNO: {
pin.AM_INS: [
pin.DST_OUT | pin.PC_IN,
]
},
JZ: {
pin.AM_INS: [
pin.DST_OUT | pin.PC_IN,
]
},
JNZ: {
pin.AM_INS: [
pin.DST_OUT | pin.PC_IN,
]
},
JP: {
pin.AM_INS: [
pin.DST_OUT | pin.PC_IN,
]
},
JNP: {
pin.AM_INS: [
pin.DST_OUT | pin.PC_IN,
]
},
5 months ago
PUSH: {
pin.AM_INS: [ # push 5
# 计算得到新的栈顶地址
pin.SP_OUT | pin.A_IN,
pin.OP_DEC | pin.ALU_OUT | pin.SP_IN, # 替换sp为新的sp
pin.SP_OUT | pin.MAR_IN, # 修改 mar偏移寄存器
# 修改 msr段地址寄存器
pin.SS_OUT | pin.MSR_IN,
# 根据 msr段地址 和mar偏移地址 控制内存写
pin.RAM_IN | pin.DST_OUT,
# 修改msr即可, mar会被pc修改
pin.MSR_IN | pin.CS_OUT,
],
pin.AM_REG: [ # push b
# 计算得到新的栈顶地址
pin.SP_OUT | pin.A_IN,
pin.OP_DEC | pin.ALU_OUT | pin.SP_IN, # 替换sp为新的sp
pin.SP_OUT | pin.MAR_IN, # 修改 mar偏移寄存器
# 修改 msr段地址寄存器
pin.SS_OUT | pin.MSR_IN,
# 根据 msr段地址 和mar偏移地址 控制内存写
pin.RAM_IN | pin.DST_R,
# 修改msr即可, mar会被pc修改
pin.MSR_IN | pin.CS_OUT,
]
},
POP: {
pin.AM_REG: [ # pop d
# 修改段地址和偏移地址
pin.SP_OUT | pin.MAR_IN,
pin.SS_OUT | pin.MSR_IN,
# 读出内存数据到 dst_w
pin.RAM_OUT | pin.DST_W,
# 对sp增加1
pin.SP_OUT | pin.A_IN,
pin.OP_INC | pin.ALU_OUT | pin.SP_IN,
# 恢复 msr
pin.CS_OUT | pin.MSR_IN,
]
},
CALL: {
pin.AM_INS: [ # call 0x5
# 先把当前pc压栈
pin.SP_OUT | pin.A_IN,
pin.OP_DEC | pin.ALU_OUT | pin.SP_IN, # sp减去1回写到sp
pin.SP_OUT | pin.MAR_IN, # 修改 mar偏移寄存器
# 修改 msr段地址寄存器
pin.SS_OUT | pin.MSR_IN,
# 根据 msr段地址 和mar偏移地址 控制内存写, 把当前PC 压栈
pin.RAM_IN | pin.PC_OUT,
# 修改PC为 DST
pin.DST_OUT | pin.PC_IN,
# 修改msr即可, mar会被pc修改
pin.MSR_IN | pin.CS_OUT,
],
pin.AM_REG: [ # call b
pin.SP_OUT | pin.A_IN,
pin.OP_DEC | pin.ALU_OUT | pin.SP_IN,
pin.SP_OUT | pin.MAR_IN,
# 修改 msr段地址寄存器
pin.SS_OUT | pin.MSR_IN,
# 当前pc压栈
pin.RAM_IN | pin.PC_OUT,
# 修改PC为 DST
pin.DST_R, pin.PC_IN,
5 months ago
pin.MSR_IN | pin.CS_OUT,
5 months ago
]
},
5 months ago
INT: {
pin.AM_INS: [ # int 0x5 触发5号中断
# 先把当前pc压栈
pin.SP_OUT | pin.A_IN,
pin.OP_DEC | pin.ALU_OUT | pin.SP_IN, # sp减去1回写到sp
pin.SP_OUT | pin.MAR_IN, # 修改 mar偏移寄存器
# 修改 msr段地址寄存器
pin.SS_OUT | pin.MSR_IN,
# 根据 msr段地址 和mar偏移地址 控制内存写, 把当前PC 压栈
pin.RAM_IN | pin.PC_OUT,
# 修改PC为 DST
pin.DST_OUT | pin.PC_IN,
# 修改msr即可, mar会被pc修改
pin.MSR_IN | pin.CS_OUT,
# 进入中断处理函数之前, 需要关闭中断
pin.ALU_PSW | pin.ALU_CLI
],
pin.AM_REG: [ # call b
pin.SP_OUT | pin.A_IN,
pin.OP_DEC | pin.ALU_OUT | pin.SP_IN,
pin.SP_OUT | pin.MAR_IN,
# 修改 msr段地址寄存器
pin.SS_OUT | pin.MSR_IN,
# 当前pc压栈
pin.RAM_IN | pin.PC_OUT,
# 修改PC为 DST
pin.DST_R, pin.PC_IN,
pin.MSR_IN | pin.CS_OUT,
# 进入中断处理函数之前, 需要关闭中断
pin.ALU_PSW | pin.ALU_CLI
]
},
},
0: {
NOP: [
pin.CYC,
],
HLT: [
pin.HLT,
],
RET: [
# 修改段地址和偏移地址
pin.SP_OUT | pin.MAR_IN,
pin.SS_OUT | pin.MSR_IN,
# 直接把栈顶的值读到PC(这个值保存的事call的时候, PC的值)
pin.RAM_OUT | pin.PC_IN,
# 对sp增加1
pin.SP_OUT | pin.A_IN,
pin.OP_INC | pin.ALU_OUT | pin.SP_IN,
# 恢复 msr
pin.CS_OUT | pin.MSR_IN,
5 months ago
],
IRET: [
# 修改段地址和偏移地址
pin.SP_OUT | pin.MAR_IN,
pin.SS_OUT | pin.MSR_IN,
# 直接把栈顶的值读到PC(这个值保存的事call的时候, PC的值)
pin.RAM_OUT | pin.PC_IN,
# 对sp增加1
pin.SP_OUT | pin.A_IN,
pin.OP_INC | pin.ALU_OUT | pin.SP_IN,
# 恢复 msr
pin.CS_OUT | pin.MSR_IN,
# 恢复中断
pin.ALU_PSW | pin.ALU_STI
],
STI: [
pin.ALU_PSW | pin.ALU_STI
],
CLI: [
pin.ALU_PSW | pin.ALU_CLI
]
}
}
if __name__ == "__main__":
print(FETCH)