函数实现,栈的实现

cpu · 04-03

由于寻址能力的限制于是通过编译器实现了标签,call,ret等指令

编译器:

import os
import re
import PIN
import FETCH

#指令集
cmds = {
    0:{
        'HTL':[FETCH.HTL],
        'NOP':[0]
    }
    ,
    1:{
        'JMP':{
            0:[FETCH.JMP|0],
            1:[FETCH.JMP|1],
            2:[FETCH.JMP|2]

        },
        'INC': {

            1: [FETCH.INC | 1],
            2: [FETCH.INC | 2],
            3: [FETCH.INC | 3]

        },
        'DSC': {
            1: [FETCH.DSC | 1],
            2: [FETCH.DSC | 2],
            3: [FETCH.DSC | 3]

        },
        'NOT': {
            1: [FETCH.NOT | 1],
            2: [FETCH.NOT | 2],
            3: [FETCH.NOT | 3]

        },
        'JZ':{

            0: [FETCH.JZ | 0],
            1: [FETCH.JZ | 1],
            3: [FETCH.JZ | 2]

        },
        'PUSH':{
            0: [FETCH.PUSH |0],
            1: [FETCH.PUSH |1],
            2: [FETCH.PUSH |2],
            3: [FETCH.PUSH |3]
        },
        'POP':{
            0:[FETCH.POP |0],
            1:[FETCH.POP |1],
            2:[FETCH.POP |2],
            3:[FETCH.POP |3]
        }
    }
    ,
    2:{
        'MOV':{
            (1,0):[FETCH.MOV|1<<2],
            (1,1):[FETCH.MOV|1<<2|1],
            (1,2):[FETCH.MOV|1<<2|1<<1],
            (1,3):[FETCH.MOV|1<<2|1<<1|1],
            (2, 0): [FETCH.MOV | 1 << 3],
            (2, 1): [FETCH.MOV | 1 << 3 | 1],
            (2, 2): [FETCH.MOV | 1 << 3 | 1 << 1],
            (2, 3): [FETCH.MOV | 1 << 3 | 1 << 1 | 1],
            (3, 0): [FETCH.MOV | 1 << 2| 1 << 3],
            (3, 1): [FETCH.MOV | 1 << 2 | 1 << 3| 1],
            (3, 2): [FETCH.MOV | 1 << 2 | 1 << 3| 1 << 1],
            (3, 3): [FETCH.MOV | 1 << 2 | 1 << 3| 1 << 1 | 1]

        },
        'ADD':{
            (1, 0): [FETCH.ADD | 1 << 2],
            (1, 1): [FETCH.ADD | 1 << 2 | 1],
            (1, 2): [FETCH.ADD | 1 << 2 | 1 << 1],
            (1, 3): [FETCH.ADD | 1 << 2 | 1 << 1 | 1],
            (2, 0): [FETCH.ADD | 1 << 3],
            (2, 1): [FETCH.ADD | 1 << 3 | 1],
            (2, 2): [FETCH.ADD | 1 << 3 | 1 << 1],
            (2, 3): [FETCH.ADD | 1 << 3 | 1 << 1 | 1],
            (3, 0): [FETCH.ADD | 1 << 2 | 1 << 3],
            (3, 1): [FETCH.ADD | 1 << 2 | 1 << 3 | 1],
            (3, 2): [FETCH.ADD | 1 << 2 | 1 << 3 | 1 << 1],
            (3, 3): [FETCH.ADD | 1 << 2 | 1 << 3 | 1 << 1 | 1]
        },
        'SUB':{
            (1, 0): [FETCH.SUB | 1 << 2],
            (1, 1): [FETCH.SUB | 1 << 2 | 1],
            (1, 2): [FETCH.SUB | 1 << 2 | 1 << 1],
            (1, 3): [FETCH.SUB | 1 << 2 | 1 << 1 | 1],
            (2, 0): [FETCH.SUB | 1 << 3],
            (2, 1): [FETCH.SUB | 1 << 3 | 1],
            (2, 2): [FETCH.SUB | 1 << 3 | 1 << 1],
            (2, 3): [FETCH.SUB | 1 << 3 | 1 << 1 | 1],
            (3, 0): [FETCH.SUB | 1 << 2 | 1 << 3],
            (3, 1): [FETCH.SUB | 1 << 2 | 1 << 3 | 1],
            (3, 2): [FETCH.SUB | 1 << 2 | 1 << 3 | 1 << 1],
            (3, 3): [FETCH.SUB | 1 << 2 | 1 << 3 | 1 << 1 | 1]
        },
        'AND': {
            (1, 0): [FETCH.AND | 1 << 2],
            (1, 1): [FETCH.AND | 1 << 2 | 1],
            (1, 2): [FETCH.AND | 1 << 2 | 1 << 1],
            (1, 3): [FETCH.AND | 1 << 2 | 1 << 1 | 1],
            (2, 0): [FETCH.AND | 1 << 3],
            (2, 1): [FETCH.AND | 1 << 3 | 1],
            (2, 2): [FETCH.AND | 1 << 3 | 1 << 1],
            (2, 3): [FETCH.AND | 1 << 3 | 1 << 1 | 1],
            (3, 0): [FETCH.AND | 1 << 2 | 1 << 3],
            (3, 1): [FETCH.AND | 1 << 2 | 1 << 3 | 1],
            (3, 2): [FETCH.AND | 1 << 2 | 1 << 3 | 1 << 1],
            (3, 3): [FETCH.AND | 1 << 2 | 1 << 3 | 1 << 1 | 1]
        },

        'XOR': {
            (1, 0): [FETCH.XOR | 1 << 2],
            (1, 1): [FETCH.XOR | 1 << 2 | 1],
            (1, 2): [FETCH.XOR | 1 << 2 | 1 << 1],
            (1, 3): [FETCH.XOR | 1 << 2 | 1 << 1 | 1],
            (2, 0): [FETCH.XOR | 1 << 3],
            (2, 1): [FETCH.XOR | 1 << 3 | 1],
            (2, 2): [FETCH.XOR | 1 << 3 | 1 << 1],
            (2, 3): [FETCH.XOR | 1 << 3 | 1 << 1 | 1],
            (3, 0): [FETCH.XOR | 1 << 2 | 1 << 3],
            (3, 1): [FETCH.XOR | 1 << 2 | 1 << 3 | 1],
            (3, 2): [FETCH.XOR | 1 << 2 | 1 << 3 | 1 << 1],
            (3, 3): [FETCH.XOR | 1 << 2 | 1 << 3 | 1 << 1 | 1]
        },

        'OR': {
            (1, 0): [FETCH.OR | 1 << 2],
            (1, 1): [FETCH.OR | 1 << 2 | 1],
            (1, 2): [FETCH.OR | 1 << 2 | 1 << 1],
            (1, 3): [FETCH.OR | 1 << 2 | 1 << 1 | 1],
            (2, 0): [FETCH.OR | 1 << 3],
            (2, 1): [FETCH.OR | 1 << 3 | 1],
            (2, 2): [FETCH.OR | 1 << 3 | 1 << 1],
            (2, 3): [FETCH.OR | 1 << 3 | 1 << 1 | 1],
            (3, 0): [FETCH.OR | 1 << 2 | 1 << 3],
            (3, 1): [FETCH.OR | 1 << 2 | 1 << 3 | 1],
            (3, 2): [FETCH.OR | 1 << 2 | 1 << 3 | 1 << 1],
            (3, 3): [FETCH.OR | 1 << 2 | 1 << 3 | 1 << 1 | 1]
        },
        'CMP':{
            (1, 0): [FETCH.CMP | 1 << 2],
            (1, 1): [FETCH.CMP | 1 << 2 | 1],
            (1, 2): [FETCH.CMP | 1 << 2 | 1 << 1],
            (1, 3): [FETCH.CMP | 1 << 2 | 1 << 1 | 1],
            (2, 0): [FETCH.CMP | 1 << 3],
            (2, 1): [FETCH.CMP | 1 << 3 | 1],
            (2, 2): [FETCH.CMP | 1 << 3 | 1 << 1],
            (2, 3): [FETCH.CMP | 1 << 3 | 1 << 1 | 1],
            (3, 0): [FETCH.CMP | 1 << 2 | 1 << 3],
            (3, 1): [FETCH.CMP | 1 << 2 | 1 << 3 | 1],
            (3, 2): [FETCH.CMP | 1 << 2 | 1 << 3 | 1 << 1],
            (3, 3): [FETCH.CMP | 1 << 2 | 1 << 3 | 1 << 1 | 1]
        }

    }
}
#操作数类型,寄存器或立即数
sdtype ={
    0:0,
    1:1,
    2:2,
    3:3


}
#寄存器内存位置
regist = {
    'MSR':PIN.MSR_R,'MAR':PIN.MAR_R,'MDR':PIN.MDR_R,'A':PIN.A_R,'B':PIN.B_R,'C':PIN.C_R,'D':PIN.D_R,'TM1':PIN.TM1_R,'TM2':PIN.TM2_R,'BP':PIN.BP_R,'SP':PIN.SP_R,'CS':PIN.CS_R,'DS':PIN.DS_R,'SS':PIN.SS_R,'ES':PIN.ES_R,'DI':PIN.DI_R,'SI':PIN.SI_R,'VEC':PIN.VEC_R

}

mt_lj = re.compile(r'\[(.*?)]')
#处理汇编源文件
class code :
    def __init__(self,source):
        self.source = source.upper()
        self.dst = None
        self.src = None
        self.src_type = None
        self.dst_type = None
        self.cmd = None
    #获取指令的操作数类型
    def get_sdtype(self):
        if self.src:
            if '[' in self.src:
                #print(self.src)
                self.src = mt_lj.match(self.src).group(1)

                if self.src in regist:
                    self.src_type = sdtype[3]
                else :
                    self.src_type = sdtype[1]


            else :
                if self.src in regist:
                    self.src_type = sdtype[2]
                else :
                    self.src_type = sdtype[0]
        if self.dst:
            if '[' in self.dst:
                self.dst = mt_lj.match(self.dst).group(1)
                if self.dst in regist:
                    self.dst_type = sdtype[3]
                    self.asmtobyte()
                    return
                else :

                    self.dst_type = sdtype[1]
                    self.asmtobyte()
                    return
            else :
                if self.dst in regist:
                    self.dst_type = sdtype[2]
                    self.asmtobyte()
                    return
                else :
                    self.dst_type = sdtype[0]
                    self.asmtobyte()
                    return

    #将汇编代码转换为机器码
    def asmtobyte(self):

        if self.dst:

            if self.src:

                cmd = cmds[2][self.op][(self.dst_type,self.src_type)]
                self.cmd = cmd[0]
                if self.dst in regist:
                    #print(self.dst)
                    self.dst = regist[self.dst]
                else :
                    self.dst = int(self.dst)
                if self.src in regist:
                    self.src = regist[self.src]
                else:
                    self.src = int(self.src)
                return
            cmd = cmds[1][self.op][self.dst_type]
            self.cmd = cmd[0]
            if self.dst in regist:
                #print(self.dst)
                self.dst = regist[self.dst]
            else:
                self.dst = int(self.dst)
            self.src = 0
            return

        else :
            self.cmd  =  cmds[0][self.op][0]
            self.src = 0
            self.dst = 0
            return

    def handle_source0(self):
        if '\n' in self.source:
            self.source = re.sub(r'\n','',self.source)

        self.op = list(filter(None, re.split(' +', self.source)))[0]
        self.asmtobyte()
        return

    #处理2地址指令
    def handle_source2(self):


        if '\n' in self.source.split(',')[1]:
            real = re.sub(r'\n','',self.source.split(',')[1])
            self.src = real
        else :
            self.src = self.source.split(',')[1]
        op_dst = list(filter(None,re.split(r' +',re.split(',',self.source)[0])))

        self.op = op_dst[0]

        self.dst = op_dst[1]


        self.get_sdtype()
        return
    def handle_source1(self):


        if '\n' in self.source:
            self.source = re.sub(r'\n','',self.source)

        op_dst = list(filter(None,re.split(' +',self.source)))

        self.op = op_dst[0]

        self.dst = op_dst[1]


        self.get_sdtype()
        return

    # 判断指令为几地址指令
    def get_src(self):
        result = self.source.split(',')
        length = len(result)

        if length >2:
            print('参数过长')
            return
        if length ==2:
            self.handle_source2()
            return self.cmd,self.dst,self.src

        if length ==1:
            ABC = list(filter(None,re.split(' +',self.source)))
            if len(ABC)==2:

                self.handle_source1()
                return self.cmd,self.dst,self.src
            else :
                self.handle_source0()
                return self.cmd, self.dst, self.src


#去除注释的正则匹配
commant = re.compile(r"(.*?) //")
filename = "source.txt"
pwd = os.getcwd()
file = os.path.join(pwd,filename)

#主函数
def main():
    result = [0 for i in range(2500)]#初始化数组
    cmdnum = 0  #记录指令总数
    with open(file,"r",encoding="utf-8") as f:
        lines = f.readlines()
        length = len(lines)
        line = 0
        while True :

            comants = commant.match(lines[line]) #去除注释
            if comants:
                lines[line] = comants.group(1)
            if "CALL" in lines[line].upper():
                fct_name = list(filter(None,re.split(' +',lines[line])))
                lines.insert(line,"MOV CS,MAR")
                lines.insert(line+1, "PUSH B")
                lines.insert(line+2, "ADD CS,25")
                lines.insert(line+3,"PUSH CS")
                lines.insert(line+4, "PUSH MAR")
                lines.insert(line+5,'PUSH SS')
                lines.insert(line+6,'PUSH SP')
                lines.insert(line+7,f'JMP {fct_name[1]}')
                lines.pop(line+8)
                line+=7

                continue
            if "RET" in lines[line].upper():


                lines.insert(line,"POP SP")
                lines.insert(line+1, "POP SS")
                lines.insert(line+2, "POP MAR")
                lines.insert(line+3, "POP CS")
                lines.insert(line+4,'POP B')
                lines.insert(line+5,'POP A')
                lines.insert(line+6,"JMP CS")

                lines.pop(line+7)
                line+=6
                continue
            line += 1
            try :
                if lines[line]:
                    continue

            except :
                break



    #print(lines)
    labels = {}

    for source in lines:
        source = source.upper()
        try :

            if ':' in source:
                source = re.match(r'(.*?):',source).group(1)
                labels[source] = cmdnum
                continue
            if source != '\n':
                cmdnum+=3
            else :
                continue
        except:
            print('error')
    #print(labels)
    cmdnum=0
    for source in lines:
        source = source.upper()
        try:
            for label in labels:
                if label in source:
                    source = source.replace(label, str(labels[label]))
                    break

            process = code(source)
            result[cmdnum], dst, src = process.get_src()
            result[cmdnum + 1] = dst
            result[cmdnum + 2] = src
            cmdnum += 3
        except:
            print('\n')
    print(lines)
    print(result)

    #将转换好的机器码存取进内存中
    with open('cmd.bin','wb') as f:
        for i in range(len(result)):
            result_byte = result[i].to_bytes(1,"little")
            f.write(result_byte)

if __name__ == "__main__":
    main()

译码器

import PIN
import FETCH


def handle_addr2(op,i,index):
    global MICCOR       #声明全局
    if (op) == 138:
        print(MICCOR[i])
    amd = (op>>2)&3     #获取目标类型
    #print(amd)
    ams = op&3          #获取数据源类型
    am = (amd,ams)
    op = op&0xf0


    if op in FETCH.Cmd_Center[2]:
        #print(op)
        try:
            indexs = len(FETCH.Cmd_Center[2][op][am]) #获取指令长度
            print(index)
        except:
            return
    else :
        return

    if index<indexs:

        MICCOR[i] = FETCH.Cmd_Center[2][op][am][index]#写指令
        print('ok')

        #print(MICCOR[i])
        #print(MICCOR[i])
    return
def handle_addr1(op,i,index,psw):
    global MICCOR       #声明全局


    ams = op&3          #获取数据类型

    op = op & 28
    #print(op)
    if op in FETCH.Cmd_Center[1]:

        try:

            indexs = len(FETCH.Cmd_Center[1][op][ams])  # 获取指令长度
            if op == 20 and (psw & 3 == 3):
                indexs = len(FETCH.Cmd_Center[1][op][ams + 5])

        except:
            return

    else :
        return

    #print(amd)
    if index<indexs:
        if op == 20 and (psw & 3 == 3):
            MICCOR[i] = FETCH.Cmd_Center[1][op][ams+5][index]
            return
        MICCOR[i] = FETCH.Cmd_Center[1][op][ams][index]#写指令
    return
def handle_addr0(op,i,index):
    global MICCOR       #声明全局


    if op in FETCH.Cmd_Center[0]:
        indexs = len(FETCH.Cmd_Center[0][op]) #获取指令长度

    else :
        return


    if index<indexs:
        MICCOR[i] = FETCH.Cmd_Center[0][op][index]#写指令

    return

MICCOR = [PIN.clean for _ in range(0x10000)]  #初始化数组为HTL
result = b""
for i in range(0x10000):
    op = i>>8

    psw = i>>4&0xf
    one = i&0xf
    if one <6:
        MICCOR[i] = FETCH.FETCH[one]
        continue

    addr1 = op&1<<3|op&1<<2|op&1<<4     #1地址指令
    addr2 = op&1<<7|op&1<<6|op&1<<5    #2地址指令
    print(addr2)
    index = one-6       #获取指令索引
    if addr2:
        #print(op)
        handle_addr2(op,i,index)
    elif addr1:

        handle_addr1(op,i,index,psw)

    else:
        handle_addr0(op,i,index)


for i in range(0x10000):
    result += MICCOR[i].to_bytes(4,"little")
#print(result)
with open("1.bin","wb") as f:
    f.write(result)

指令集

import PIN
import PIN as pin

FETCH = [
    pin.PC_READ|PIN.MAR_W,
    pin.MC_R|PIN.PC_NOMAL_WORK|PIN.IR_W,
    pin.PC_READ|PIN.MAR_W,
    pin.MC_R|PIN.PC_NOMAL_WORK|PIN.DST_W,
    pin.PC_READ|PIN.MAR_W,
    pin.MC_R|PIN.PC_NOMAL_WORK|PIN.SRC_W

]
dir = 0 #直接寻址                       MOV A,5
idt = 1#立即数寻址                       MOV A,[5]
reg = 2 #寄存器寻址                      MOV A,B
reg_indir = 3   #寄存器间接寻址            MOV A,[B]



MOV = 1<<7
ADD = 1<<6
SUB = 1<<5
OR  = 1<<5|1<<6
AND = 1<<7|1<<6|1<<5
XOR = 1<<7|1<<6
INC = 1<<3|1<<2
CMP = 1<<7|1<<5
DSC = 1<<2
NOT = 1<<4
JMP = 1<<3
HTL = 1
NOP = 0
JZ = 1<<4|1<<2
PUSH = 1<<4|1<<2|1<<3
POP = 1<<4|1<<3

Cmd_Center = {
    0:{
        NOP :[0],
        HTL:[PIN.HTL],

    },
    1:{
        JMP:{
            0:[PIN.DST_R|PIN.PC_SETAD],
            1:[PIN.DST_R|PIN.PC_SETAD],
            2:[PIN.DR|PIN.DST_W,PIN.DST_R|PIN.PC_SETAD],
            3:[]
        },
        INC: {
            0:[],
            1:[PIN.DST_R|PIN.MAR_W,PIN.MC_R|PIN.A_W,PIN.OP_INC|PIN.ALU_R|PIN.MC_W],
            2:[PIN.DR|PIN.A_W,PIN.ALU_R|PIN.DW|PIN.OP_INC],
            3:[PIN.DR|PIN.MAR_W,PIN.MC_R|PIN.A_W,PIN.OP_INC|PIN.ALU_R|PIN.MC_W]
        },
        DSC:{
            0: [],
            1: [PIN.DST_R | PIN.MAR_W, PIN.MC_R | PIN.A_W, PIN.OP_DSC | PIN.ALU_R | PIN.MC_W],
            2: [PIN.DR | PIN.A_W, PIN.ALU_R | PIN.DW | PIN.OP_DSC],
            3: [PIN.DR | PIN.MAR_W, PIN.MC_R | PIN.A_W, PIN.OP_DSC | PIN.ALU_R | PIN.MC_W]
        },
        NOT :{
            0: [],
            1: [PIN.DST_R | PIN.MAR_W, PIN.MC_R | PIN.A_W, PIN.OP_NOT | PIN.ALU_R | PIN.MC_W],
            2: [PIN.DR | PIN.A_W, PIN.ALU_R | PIN.DW | PIN.OP_NOT],
            3: [PIN.DR | PIN.MAR_W, PIN.MC_R | PIN.A_W, PIN.OP_NOT | PIN.ALU_R | PIN.MC_W]
        },
        JZ:{
            5: [PIN.DST_R | PIN.PC_SETAD],
            6: [PIN.DST_R | PIN.PC_SETAD],
            7: [PIN.DR | PIN.DST_W, PIN.DST_R | PIN.PC_SETAD],
            8: [],
            0: [],
            1: [],
            2: [],
            3: []
        },
        PUSH :{
            0:[PIN.SS_R|PIN.A_W,PIN.SP_R|PIN.B_W|PIN.OP_ADD,PIN.ALU_R|PIN.MAR_W,PIN.MC_W|PIN.DST_R,PIN.SP_R|PIN.A_W,PIN.ALU_R|PIN.SP_W|PIN.OP_DSC],
            1:[PIN.DST_R|PIN.MAR_W,PIN.MC_R|PIN.SRC_W,PIN.SS_R|PIN.A_W,PIN.SP_R|PIN.B_W|PIN.OP_ADD,PIN.ALU_R|PIN.MAR_W,PIN.MC_W|PIN.DST_R,PIN.SP_R|PIN.A_W,PIN.OP_DSC|PIN.ALU_R|PIN.SP_W],
            2:[PIN.SS_R|PIN.A_W,PIN.SP_R|PIN.B_W|PIN.OP_ADD,PIN.ALU_R|PIN.MAR_W,PIN.MC_W|PIN.DR,PIN.SP_R|PIN.A_W,PIN.OP_DSC|PIN.ALU_R|PIN.SP_W],
            3:[PIN.DST_R|PIN.MAR_W,PIN.MC_R|PIN.DST_W,PIN.SS_R|PIN.A_W,PIN.SP_R|PIN.B_W|PIN.OP_ADD,PIN.ALU_R|PIN.MAR_W,PIN.MC_W|PIN.DST_R,PIN.SP_R|PIN.A_W,PIN.ALU_R|PIN.SP_W|PIN.OP_DSC]
        },
        POP:{
            0:[],
            1:[],
            2:[PIN.SP_R|PIN.A_W,PIN.OP_INC|PIN.ALU_R|PIN.SP_W,PIN.SS_R|PIN.A_W,PIN.SP_R|PIN.B_W|PIN.OP_ADD,PIN.ALU_R|PIN.MAR_W,PIN.MC_R|PIN.DW],
            3:[]
        }
    },
    2:{
        MOV:{
            (1, 0):[PIN.DST_R|PIN.MAR_W,PIN.SRC_R|PIN.MC_W],
            (1, 1):[PIN.SRC_R|PIN.MAR_W,PIN.SRC_W|PIN.MC_R,PIN.DST_R|PIN.MAR_W,PIN.SRC_R|PIN.MC_W],
            (1, 2):[PIN.DST_R|PIN.MAR_W,PIN.SR|PIN.MC_W],
            (1, 3):[PIN.SR|PIN.MAR_W,PIN.SRC_W|PIN.MC_R,PIN.DST_R|PIN.MAR_W,PIN.SRC_R|PIN.MC_W],
            (2, 0):[PIN.DW|PIN.SRC_R],
            (2, 1):[PIN.SRC_R|PIN.MAR_W,PIN.MC_R|PIN.SRC_W,PIN.SRC_R|PIN.DW],
            (2, 2):[PIN.DW|PIN.SR],
            (2, 3):[PIN.SR|PIN.SRC_W,PIN.DW|PIN.SRC_R],
            (3, 0):[PIN.DR|PIN.MAR_W,PIN.SRC_R|PIN.MC_W],
            (3, 1):[PIN.SRC_R|PIN.MAR_W,PIN.MC_R|PIN.SRC_W,PIN.DR|PIN.MAR_W,PIN.SRC_R|PIN.MC_W],
            (3, 2):[PIN.DST_R|PIN.MAR_W,PIN.SR|PIN.MC_W],
            (3, 3):[PIN.SR|PIN.MAR_W,PIN.MC_R|PIN.SRC_W,PIN.DR|PIN.MAR_W,PIN.SRC_R|PIN.MC_W]

        },
        ADD:{
            (1, 0): [PIN.DST_R|PIN.MAR_W,PIN.MC_R|PIN.A_W,PIN.SRC_R|PIN.B_W|PIN.OP_ADD,PIN.ALU_R|PIN.MC_W],
            (1, 1): [PIN.MAR_W|PIN.SRC_R,PIN.MC_R|PIN.SRC_W,PIN.DST_R|PIN.MAR_W,PIN.MC_R|PIN.A_W,PIN.SRC_R|PIN.B_W|PIN.OP_ADD,PIN.ALU_R|PIN.MC_W],
            (1, 2): [PIN.DST_R|PIN.MAR_W,PIN.MC_R|PIN.A_W,PIN.SR|PIN.B_W|PIN.OP_ADD,PIN.ALU_R|PIN.MC_W],
            (1, 3): [PIN.SR|PIN.MAR_W,PIN.MC_R|PIN.SRC_W,PIN.DST_R|PIN.MAR_W,PIN.MC_R|PIN.A_W,PIN.SRC_R|PIN.B_W|PIN.OP_ADD,PIN.ALU_R|PIN.MC_W],
            (2, 0): [PIN.DR|PIN.A_W,PIN.SRC_R|PIN.B_W,PIN.OP_ADD|PIN.ALU_R|PIN.DW],
            (2, 1): [PIN.SRC_R|PIN.MAR_W,PIN.MC_R|PIN.SRC_W,PIN.DR|PIN.A_W,PIN.SRC_R|PIN.B_W,PIN.OP_ADD|PIN.ALU_R|PIN.DW],
            (2, 2): [PIN.DR|PIN.A_W,PIN.SR|PIN.B_W,PIN.OP_ADD|PIN.ALU_R|PIN.DW],
            (2, 3): [PIN.SR|PIN.MAR_W,PIN.MC_R|PIN.SRC_W,PIN.DR|PIN.A_W,PIN.SRC_R|PIN.B_W,PIN.OP_ADD|PIN.ALU_R|PIN.DW],
            (3, 0): [PIN.DR|PIN.MAR_W,PIN.MC_R|PIN.A_W,PIN.SRC_R|PIN.B_W,PIN.OP_ADD|PIN.ALU_R|PIN.MC_W],
            (3, 1): [PIN.SRC_R|PIN.MAR_W,PIN.MC_R|PIN.SRC_W,PIN.DR|PIN.MAR_W,PIN.MC_R|PIN.A_W,PIN.SRC_R|PIN.B_W,PIN.OP_ADD|PIN.ALU_R|PIN.MC_W],
            (3, 2): [PIN.DR|PIN.MAR_W,PIN.MC_R|PIN.A_W,PIN.SR|PIN.B_W,PIN.OP_ADD|PIN.ALU_R|PIN.MC_W],
            (3, 3): []
        },
        SUB:{
            (1, 0): [PIN.DST_R|PIN.MAR_W,PIN.MC_R|PIN.A_W,PIN.SRC_R|PIN.B_W|PIN.OP_SUB,PIN.ALU_R|PIN.MC_W],
            (1, 1): [PIN.MAR_W|PIN.SRC_R,PIN.MC_R|PIN.SRC_W,PIN.DST_R|PIN.MAR_W,PIN.MC_R|PIN.A_W,PIN.SRC_R|PIN.B_W|PIN.OP_SUB,PIN.ALU_R|PIN.MC_W],
            (1, 2): [PIN.DST_R|PIN.MAR_W,PIN.MC_R|PIN.A_W,PIN.SR|PIN.B_W|PIN.OP_SUB,PIN.ALU_R|PIN.MC_W],
            (1, 3): [PIN.SR|PIN.MAR_W,PIN.MC_R|PIN.SRC_W,PIN.DST_R|PIN.MAR_W,PIN.MC_R|PIN.A_W,PIN.SRC_R|PIN.B_W|PIN.OP_SUB,PIN.ALU_R|PIN.MC_W],
            (2, 0): [PIN.DR|PIN.A_W,PIN.SRC_R|PIN.B_W,PIN.OP_SUB|PIN.ALU_R|PIN.DW],
            (2, 1): [PIN.SRC_R|PIN.MAR_W,PIN.MC_R|PIN.SRC_W,PIN.DR|PIN.A_W,PIN.SRC_R|PIN.B_W,PIN.OP_SUB|PIN.ALU_R|PIN.DW],
            (2, 2): [PIN.DR|PIN.A_W,PIN.SR|PIN.B_W,PIN.OP_SUB|PIN.ALU_R|PIN.DW],
            (2, 3): [PIN.SR|PIN.MAR_W,PIN.MC_R|PIN.SRC_W,PIN.DR|PIN.A_W,PIN.SRC_R|PIN.B_W,PIN.OP_SUB|PIN.ALU_R|PIN.DW],
            (3, 0): [PIN.DR|PIN.MAR_W,PIN.MC_R|PIN.A_W,PIN.SRC_R|PIN.B_W,PIN.OP_SUB|PIN.ALU_R|PIN.MC_W],
            (3, 1): [PIN.SRC_R|PIN.MAR_W,PIN.MC_R|PIN.SRC_W,PIN.DR|PIN.MAR_W,PIN.MC_R|PIN.A_W,PIN.SRC_R|PIN.B_W,PIN.OP_SUB|PIN.ALU_R|PIN.MC_W],
            (3, 2): [PIN.DR|PIN.MAR_W,PIN.MC_R|PIN.A_W,PIN.SR|PIN.B_W,PIN.OP_SUB|PIN.ALU_R|PIN.MC_W],
            (3, 3): []
        },


        XOR:{
            (1, 0): [PIN.DST_R|PIN.MAR_W,PIN.MC_R|PIN.A_W,PIN.SRC_R|PIN.B_W|PIN.OP_XOR,PIN.ALU_R|PIN.MC_W],
            (1, 1): [PIN.MAR_W|PIN.SRC_R,PIN.MC_R|PIN.SRC_W,PIN.DST_R|PIN.MAR_W,PIN.MC_R|PIN.A_W,PIN.SRC_R|PIN.B_W|PIN.OP_XOR,PIN.ALU_R|PIN.MC_W],
            (1, 2): [PIN.DST_R|PIN.MAR_W,PIN.MC_R|PIN.A_W,PIN.SR|PIN.B_W|PIN.OP_XOR,PIN.ALU_R|PIN.MC_W],
            (1, 3): [PIN.SR|PIN.MAR_W,PIN.MC_R|PIN.SRC_W,PIN.DST_R|PIN.MAR_W,PIN.MC_R|PIN.A_W,PIN.SRC_R|PIN.B_W|PIN.OP_XOR,PIN.ALU_R|PIN.MC_W],
            (2, 0): [PIN.DR|PIN.A_W,PIN.SRC_R|PIN.B_W,PIN.OP_XOR|PIN.ALU_R|PIN.DW],
            (2, 1): [PIN.SRC_R|PIN.MAR_W,PIN.MC_R|PIN.SRC_W,PIN.DR|PIN.A_W,PIN.SRC_R|PIN.B_W,PIN.OP_XOR|PIN.ALU_R|PIN.DW],
            (2, 2): [PIN.DR|PIN.A_W,PIN.SR|PIN.B_W,PIN.OP_XOR|PIN.ALU_R|PIN.DW],
            (2, 3): [PIN.SR|PIN.MAR_W,PIN.MC_R|PIN.SRC_W,PIN.DR|PIN.A_W,PIN.SRC_R|PIN.B_W,PIN.OP_XOR|PIN.ALU_R|PIN.DW],
            (3, 0): [PIN.DR|PIN.MAR_W,PIN.MC_R|PIN.A_W,PIN.SRC_R|PIN.B_W,PIN.OP_XOR|PIN.ALU_R|PIN.MC_W],
            (3, 1): [PIN.SRC_R|PIN.MAR_W,PIN.MC_R|PIN.SRC_W,PIN.DR|PIN.MAR_W,PIN.MC_R|PIN.A_W,PIN.SRC_R|PIN.B_W,PIN.OP_XOR|PIN.ALU_R|PIN.MC_W],
            (3, 2): [PIN.DR|PIN.MAR_W,PIN.MC_R|PIN.A_W,PIN.SR|PIN.B_W,PIN.OP_XOR|PIN.ALU_R|PIN.MC_W],
            (3, 3): []
        },
        AND:{
            (1, 0): [PIN.DST_R|PIN.MAR_W,PIN.MC_R|PIN.A_W,PIN.SRC_R|PIN.B_W|PIN.OP_AND,PIN.ALU_R|PIN.MC_W],
            (1, 1): [PIN.MAR_W|PIN.SRC_R,PIN.MC_R|PIN.SRC_W,PIN.DST_R|PIN.MAR_W,PIN.MC_R|PIN.A_W,PIN.SRC_R|PIN.B_W|PIN.OP_AND,PIN.ALU_R|PIN.MC_W],
            (1, 2): [PIN.DST_R|PIN.MAR_W,PIN.MC_R|PIN.A_W,PIN.SR|PIN.B_W|PIN.OP_AND,PIN.ALU_R|PIN.MC_W],
            (1, 3): [PIN.SR|PIN.MAR_W,PIN.MC_R|PIN.SRC_W,PIN.DST_R|PIN.MAR_W,PIN.MC_R|PIN.A_W,PIN.SRC_R|PIN.B_W|PIN.OP_AND,PIN.ALU_R|PIN.MC_W],
            (2, 0): [PIN.DR|PIN.A_W,PIN.SRC_R|PIN.B_W,PIN.OP_AND|PIN.ALU_R|PIN.DW],
            (2, 1): [PIN.SRC_R|PIN.MAR_W,PIN.MC_R|PIN.SRC_W,PIN.DR|PIN.A_W,PIN.SRC_R|PIN.B_W,PIN.OP_AND|PIN.ALU_R|PIN.DW],
            (2, 2): [PIN.DR|PIN.A_W,PIN.SR|PIN.B_W,PIN.OP_AND|PIN.ALU_R|PIN.DW],
            (2, 3): [PIN.SR|PIN.MAR_W,PIN.MC_R|PIN.SRC_W,PIN.DR|PIN.A_W,PIN.SRC_R|PIN.B_W,PIN.OP_AND|PIN.ALU_R|PIN.DW],
            (3, 0): [PIN.DR|PIN.MAR_W,PIN.MC_R|PIN.A_W,PIN.SRC_R|PIN.B_W,PIN.OP_AND|PIN.ALU_R|PIN.MC_W],
            (3, 1): [PIN.SRC_R|PIN.MAR_W,PIN.MC_R|PIN.SRC_W,PIN.DR|PIN.MAR_W,PIN.MC_R|PIN.A_W,PIN.SRC_R|PIN.B_W,PIN.OP_AND|PIN.ALU_R|PIN.MC_W],
            (3, 2): [PIN.DR|PIN.MAR_W,PIN.MC_R|PIN.A_W,PIN.SR|PIN.B_W,PIN.OP_AND|PIN.ALU_R|PIN.MC_W],
            (3, 3): []
        },
        OR:{
            (1, 0): [PIN.DST_R|PIN.MAR_W,PIN.MC_R|PIN.A_W,PIN.SRC_R|PIN.B_W|PIN.OP_OR,PIN.ALU_R|PIN.MC_W],
            (1, 1): [PIN.MAR_W|PIN.SRC_R,PIN.MC_R|PIN.SRC_W,PIN.DST_R|PIN.MAR_W,PIN.MC_R|PIN.A_W,PIN.SRC_R|PIN.B_W|PIN.OP_OR,PIN.ALU_R|PIN.MC_W],
            (1, 2): [PIN.DST_R|PIN.MAR_W,PIN.MC_R|PIN.A_W,PIN.SR|PIN.B_W|PIN.OP_OR,PIN.ALU_R|PIN.MC_W],
            (1, 3): [PIN.SR|PIN.MAR_W,PIN.MC_R|PIN.SRC_W,PIN.DST_R|PIN.MAR_W,PIN.MC_R|PIN.A_W,PIN.SRC_R|PIN.B_W|PIN.OP_OR,PIN.ALU_R|PIN.MC_W],
            (2, 0): [PIN.DR|PIN.A_W,PIN.SRC_R|PIN.B_W,PIN.OP_OR|PIN.ALU_R|PIN.DW],
            (2, 1): [PIN.SRC_R|PIN.MAR_W,PIN.MC_R|PIN.SRC_W,PIN.DR|PIN.A_W,PIN.SRC_R|PIN.B_W,PIN.OP_OR|PIN.ALU_R|PIN.DW],
            (2, 2): [PIN.DR|PIN.A_W,PIN.SR|PIN.B_W,PIN.OP_OR|PIN.ALU_R|PIN.DW],
            (2, 3): [PIN.SR|PIN.MAR_W,PIN.MC_R|PIN.SRC_W,PIN.DR|PIN.A_W,PIN.SRC_R|PIN.B_W,PIN.OP_OR|PIN.ALU_R|PIN.DW],
            (3, 0): [PIN.DR|PIN.MAR_W,PIN.MC_R|PIN.A_W,PIN.SRC_R|PIN.B_W,PIN.OP_OR|PIN.ALU_R|PIN.MC_W],
            (3, 1): [PIN.SRC_R|PIN.MAR_W,PIN.MC_R|PIN.SRC_W,PIN.DR|PIN.MAR_W,PIN.MC_R|PIN.A_W,PIN.SRC_R|PIN.B_W,PIN.OP_OR|PIN.ALU_R|PIN.MC_W],
            (3, 2): [PIN.DR|PIN.MAR_W,PIN.MC_R|PIN.A_W,PIN.SR|PIN.B_W,PIN.OP_OR|PIN.ALU_R|PIN.MC_W],
            (3, 3): []
        },
        CMP:{
            (1, 0): [PIN.DST_R | PIN.MAR_W, PIN.MC_R | PIN.A_W, PIN.SRC_R | PIN.B_W | PIN.OP_SUB, PIN.ALU_R | PIN.MC_W],
            (1, 1): [PIN.MAR_W | PIN.SRC_R, PIN.MC_R | PIN.SRC_W, PIN.DST_R | PIN.MAR_W, PIN.MC_R | PIN.A_W,
                     PIN.SRC_R | PIN.B_W | PIN.OP_SUB, PIN.ALU_R | PIN.MC_W],
            (1, 2): [PIN.DST_R | PIN.MAR_W, PIN.MC_R | PIN.A_W, PIN.SR | PIN.B_W | PIN.OP_SUB, PIN.ALU_R | PIN.MC_W],
            (1, 3): [PIN.SR | PIN.MAR_W, PIN.MC_R | PIN.SRC_W, PIN.DST_R | PIN.MAR_W, PIN.MC_R | PIN.A_W,
                     PIN.SRC_R | PIN.B_W | PIN.OP_SUB, PIN.ALU_R | PIN.MC_W],
            (2, 0): [PIN.DR | PIN.A_W, PIN.SRC_R | PIN.B_W, PIN.OP_SUB | PIN.ALU_R | PIN.DW],
            (2, 1): [PIN.SRC_R | PIN.MAR_W, PIN.MC_R | PIN.SRC_W, PIN.DR | PIN.A_W, PIN.SRC_R | PIN.B_W,
                     PIN.OP_SUB | PIN.ALU_R | PIN.DW],
            (2, 2): [PIN.DR | PIN.A_W, PIN.SR | PIN.B_W, PIN.OP_SUB | PIN.ALU_R | PIN.DW],
            (2, 3): [PIN.SR | PIN.MAR_W, PIN.MC_R | PIN.SRC_W, PIN.DR | PIN.A_W, PIN.SRC_R | PIN.B_W,
                     PIN.OP_SUB | PIN.ALU_R | PIN.DW],
            (3, 0): [PIN.DR | PIN.MAR_W, PIN.MC_R | PIN.A_W, PIN.SRC_R | PIN.B_W, PIN.OP_SUB | PIN.ALU_R | PIN.MC_W],
            (3, 1): [PIN.SRC_R | PIN.MAR_W, PIN.MC_R | PIN.SRC_W, PIN.DR | PIN.MAR_W, PIN.MC_R | PIN.A_W,
                     PIN.SRC_R | PIN.B_W, PIN.OP_SUB | PIN.ALU_R | PIN.MC_W],
            (3, 2): [PIN.DR | PIN.MAR_W, PIN.MC_R | PIN.A_W, PIN.SR | PIN.B_W, PIN.OP_SUB | PIN.ALU_R | PIN.MC_W],
            (3, 3): []
        }


    }

}
  1. Read 04-05

    你好呀

Theme Jasmine by Kent Liao