算数运算指令完成

main
阳光少年 5 months ago
parent b3a2852228
commit c0e095e30a

4352
ROM.bin

File diff suppressed because it is too large Load Diff

Binary file not shown.

@ -14,6 +14,11 @@ FETCH = [
MOV = 0 << pin.ADDR_2_SHIFT | pin.ADDR_2 # 左移 留出来操作数位 然后再加上 ADDR_2的标志 MOV = 0 << pin.ADDR_2_SHIFT | pin.ADDR_2 # 左移 留出来操作数位 然后再加上 ADDR_2的标志
ADD = 1 << pin.ADDR_2_SHIFT | pin.ADDR_2 ADD = 1 << pin.ADDR_2_SHIFT | pin.ADDR_2
SUB = 2 << 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
NOP = 0b0 NOP = 0b0
HLT = 0b11_1111 HLT = 0b11_1111
@ -89,9 +94,45 @@ INSTRUCTIONS = {
pin.DST_R | pin.MAR_IN, pin.DST_R | pin.MAR_IN,
pin.T1_OUT | pin.RAM_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): [ # add 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
],
},
}, },
1: { 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: [ # inc b
pin.DST_R | pin.A_IN,
pin.OP_DEC | pin.ALU_OUT | pin.DST_W | pin.ALU_PSW
],
}
}, },
0: { 0: {

@ -1,3 +1,4 @@
#
import os import os
import re import re
import pin import pin
@ -14,9 +15,14 @@ ALLOW_REGISTER_MAP = {
OP2_STR_MAP = { OP2_STR_MAP = {
"mov": ASM.MOV, "mov": ASM.MOV,
"add": ASM.ADD,
"sub": ASM.SUB,
} }
OP1_STR_MAP = { OP1_STR_MAP = {
"inc": ASM.INC,
"dec": ASM.DEC,
} }
OP0_STR_MAP = { OP0_STR_MAP = {
@ -48,7 +54,7 @@ class Code:
if len(tup) == 2: if len(tup) == 2:
self._src = tup[1].strip() self._src = tup[1].strip()
tup = re.split(r" +", tup[0]) tup = re.split(r" +", tup[0].strip())
if len(tup) > 2: if len(tup) > 2:
raise Exception("指令格式错误") raise Exception("指令格式错误")
@ -102,8 +108,10 @@ class Code:
elif src is None and dst is None and self.op not in ASM.INSTRUCTIONS[0]: elif src is None and dst is None and self.op not in ASM.INSTRUCTIONS[0]:
raise Exception(f"操作数 地址错误: {self}") raise Exception(f"操作数 地址错误: {self}")
if not src and not dst: amd = amd or 0
amd = dst = ams = src = 0 dst = dst or 0
ams = ams or 0
src = src or 0
# 根据op, 构建 ir寄存器 # 根据op, 构建 ir寄存器
if self.op in OP2_VALUE_SET: if self.op in OP2_VALUE_SET:
@ -117,7 +125,7 @@ class Code:
def compile_program(input_file: str): def compile_program(input_file: str):
codes = [] codes = []
with open(input_file, "r") as f: with open(input_file, "r", encoding="utf8") as f:
lines = f.readlines() lines = f.readlines()
for idx, line in enumerate(lines): for idx, line in enumerate(lines):
source = line.strip().split(";")[0] # 去掉空格和注释 source = line.strip().split(";")[0] # 去掉空格和注释

@ -78,7 +78,27 @@ def compile_addr2(addr, ir, psw, idx):
def compile_addr1(addr, ir, psw, idx): def compile_addr1(addr, ir, psw, idx):
# 01xxxx[aa] # 01xxxx[aa]
pass global base_bin_data
op = ir & 0b1111_1100 # 需要进行的操作
amd = ir & 0b0000_0011 # 目的操作数 也是就是 aa
INST = INSTRUCTIONS[1]
if op not in INST:
base_bin_data[addr] = pin.CYC
return
if amd not in INST[op]:
base_bin_data[addr] = pin.CYC
return
EXEC = INST[op][amd]
# 当前指令周期 长度塞不下了
if idx < len(EXEC):
# print(f"{hex(addr)} 写入指令: {bin(EXEC[idx])}")
base_bin_data[addr] = EXEC[idx]
else: # 这个指令周期放不下了
base_bin_data[addr] = pin.CYC # 当前指令周期清零, 执行下个指令周期吧
return
def compile_addr0(addr, ir, psw, idx): def compile_addr0(addr, ir, psw, idx):

3173
cpu.circ

File diff suppressed because it is too large Load Diff

@ -86,6 +86,21 @@ PC_OUT = PC_CS
PC_IN = PC_CS | PC_WE PC_IN = PC_CS | PC_WE
PC_INC = PC_CS | PC_WE | PC_EN PC_INC = PC_CS | PC_WE | PC_EN
_OP_SHIFT = 17
OP_ADD = 0 << _OP_SHIFT
OP_SUB = 1 << _OP_SHIFT
OP_INC = 2 << _OP_SHIFT
OP_DEC = 3 << _OP_SHIFT
OP_AND = 4 << _OP_SHIFT
OP_OR = 5 << _OP_SHIFT
OP_XOR = 6 << _OP_SHIFT
OP_NOT = 7 << _OP_SHIFT
ALU_OUT = 1 << 20
ALU_PSW = 1 << 21
CYC = 1 << 30 # 当前指令周期 清零, 执行下一个指令周期 CYC = 1 << 30 # 当前指令周期 清零, 执行下一个指令周期
HLT = 1 << 31 # 停止 HLT = 1 << 31 # 停止

@ -0,0 +1,17 @@
v3.0 hex words addressed
0000: 84 08 fd 41 08 00 41 08
0008: 00 41 08 00 45 08 00 45
0010: 08 00 45 08 00 45 08 00
0018: 45 08 00 45 08 00 45 08
0020: 00 3f 00 00 84 09 05 94
0028: 09 03 85 08 09 95 08 09
0030: 94 08 fa 84 08 00 84 09
0038: 00 95 08 09 84 08 05 84
0040: 09 02 a5 08 09 a4 08 04
0048: 84 08 04 84 09 02 a5 08
0050: 09 3f 00 00 88 33 99 86
0058: 08 33 89 2f 08 84 08 2f
0060: 8b 00 08 84 08 00 8c 08
0068: 05 84 08 01 8e 08 00 84
0070: 09 02 84 0b 00 8f 09 0b
0078: 3f 00 00

@ -12,6 +12,41 @@
;mov [0x0], a ;mov [0x0], a
; 加减法测试
mov a, 253
inc a
inc a
inc a
dec a ; a: 0xff, psw: 101
dec a
dec a
dec a
dec a
dec a
dec a
hlt
; 加减法测试
mov b, 5
add b, 3 ; b:8
mov a, b ; a: 8
add a, b ; a: 10
add a, 250
mov a, 0
mov b, 0
add a, b
mov a, 5
mov b, 2
sub a, b
sub a, 4
mov a, 4
mov b, 2
sub a, b ; a: 2
hlt
; mov 指令测试
mov [0x33], 0x99 mov [0x33], 0x99
mov a, [0x33] mov a, [0x33]
mov [0x2f], a mov [0x2f], a

Loading…
Cancel
Save