提交 7138533a 创建 作者: 赵鹏翀's avatar 赵鹏翀

Merge branch 'update_reset' into 'master'

修改PC原理图的复位控制以及微指令 See merge request engintime/Dream-Logic/Intel-classic-chips/8086!7
没有这种文件类型的预览
这个 源代码变更 因为 太大 而不能显示。 你可以 浏览blob
...@@ -96,15 +96,15 @@ const char* shift_flag_keyword = "shift_flag"; ...@@ -96,15 +96,15 @@ const char* shift_flag_keyword = "shift_flag";
// 访问主存或外设的操作数 // 访问主存或外设的操作数
const char* pc_main_memory_keyword = "[pc]"; const char* pc_main_memory_keyword = "[pc]";
const char* jzpc_main_memory_keyword = "jz[pc]"; const char* jz_mar_keyword = "jz[mar]";
const char* jnzpc_main_memory_keyword = "jnz[pc]"; const char* jnz_mar_keyword = "jnz[mar]";
const char* jcpc_main_memory_keyword = "jc[pc]"; const char* jc_mar_keyword = "jc[mar]";
const char* japc_main_memory_keyword = "ja[pc]"; const char* ja_mar_keyword = "ja[mar]";
const char* jbpc_main_memory_keyword = "jb[pc]"; const char* jb_mar_keyword = "jb[mar]";
const char* jgpc_main_memory_keyword = "jg[pc]"; const char* jg_mar_keyword = "jg[mar]";
const char* jlpc_main_memory_keyword = "jl[pc]"; const char* jl_mar_keyword = "jl[mar]";
const char* jmppc_main_memory_keyword = "jmp[pc]"; const char* jmp_mar_keyword = "jmp[mar]";
const char* mar_main_memory_keyword = "[mar]"; const char* mar_main_memory_keyword = "[mar]";
const char* mar_extern_IO_keyword = "<mar>"; const char* mar_extern_IO_keyword = "<mar>";
const char* int_number_keyword = "inta"; const char* int_number_keyword = "inta";
...@@ -168,14 +168,14 @@ struct PATH_INSTRUCTION_OPERAND_ENTRY path_operand_table[] = ...@@ -168,14 +168,14 @@ struct PATH_INSTRUCTION_OPERAND_ENTRY path_operand_table[] =
,{ &pc_main_memory_keyword, &a_register_keyword, 0xffe147ff } // path [pc], a ,{ &pc_main_memory_keyword, &a_register_keyword, 0xffe147ff } // path [pc], a
,{ &pc_main_memory_keyword, &w_register_keyword, 0xffe347ff } // path [pc], w ,{ &pc_main_memory_keyword, &w_register_keyword, 0xffe347ff } // path [pc], w
,{ &jzpc_main_memory_keyword, &pc_register_keyword, 0xff1f46fd } // path jz[pc], pc ,{ &jz_mar_keyword, &pc_register_keyword, 0xff1f86fd } // path jz[mar], pc
,{ &jnzpc_main_memory_keyword, &pc_register_keyword, 0xff3f46fd } // path jnz[pc], pc ,{ &jnz_mar_keyword, &pc_register_keyword, 0xff3f86fd } // path jnz[mar], pc
,{ &jcpc_main_memory_keyword, &pc_register_keyword, 0xff5f46fd } // path jc[pc], pc ,{ &jc_mar_keyword, &pc_register_keyword, 0xff5f86fd } // path jc[mar], pc
,{ &japc_main_memory_keyword, &pc_register_keyword, 0xff7f46fd } // path ja[pc], pc ,{ &ja_mar_keyword, &pc_register_keyword, 0xff7f86fd } // path ja[mar], pc
,{ &jbpc_main_memory_keyword, &pc_register_keyword, 0xff9f46fd } // path jb[pc], pc ,{ &jb_mar_keyword, &pc_register_keyword, 0xff9f86fd } // path jb[mar], pc
,{ &jgpc_main_memory_keyword, &pc_register_keyword, 0xffbf46fd } // path jg[pc], pc ,{ &jg_mar_keyword, &pc_register_keyword, 0xffbf86fd } // path jg[mar], pc
,{ &jlpc_main_memory_keyword, &pc_register_keyword, 0xffdf46fd } // path jl[pc], pc ,{ &jl_mar_keyword, &pc_register_keyword, 0xffdf86fd } // path jl[mar], pc
,{ &jmppc_main_memory_keyword, &pc_register_keyword, 0xffff46fd } // path jmp[pc], pc ,{ &jmp_mar_keyword, &pc_register_keyword, 0xffff86fd } // path jmp[mar], pc
,{ &rs_register_keyword, &rd_register_keyword, 0xffe9c1ff } // path rs, rd ,{ &rs_register_keyword, &rd_register_keyword, 0xffe9c1ff } // path rs, rd
,{ &rs_register_keyword, &w_register_keyword, 0xffe3c1ff } // path rs, w ,{ &rs_register_keyword, &w_register_keyword, 0xffe3c1ff } // path rs, w
...@@ -194,6 +194,7 @@ struct PATH_INSTRUCTION_OPERAND_ENTRY path_operand_table[] = ...@@ -194,6 +194,7 @@ struct PATH_INSTRUCTION_OPERAND_ENTRY path_operand_table[] =
,{ &rd_register_keyword, &a_register_keyword, 0xffe1c1bf } // path rd, a ,{ &rd_register_keyword, &a_register_keyword, 0xffe1c1bf } // path rd, a
,{ &rd_register_keyword, &w_register_keyword, 0xffe3c1bf } // path rd, w ,{ &rd_register_keyword, &w_register_keyword, 0xffe3c1bf } // path rd, w
,{ &pc_register_keyword, &a_register_keyword, 0xffe1c5ff } // path pc, a ,{ &pc_register_keyword, &a_register_keyword, 0xffe1c5ff } // path pc, a
,{ &pc_register_keyword, &mar_register_keyword, 0xffe5c5ff } // path pc, mar
,{ &es_register_keyword, &a_register_keyword, 0xffe1c1ff } // path es, a ,{ &es_register_keyword, &a_register_keyword, 0xffe1c1ff } // path es, a
,{ &sp_register_keyword, &a_register_keyword, 0xffe1c1bf } // path sp, a ,{ &sp_register_keyword, &a_register_keyword, 0xffe1c1bf } // path sp, a
,{ &sp_register_keyword, &w_register_keyword, 0xffe3c1bf } // path sp, w ,{ &sp_register_keyword, &w_register_keyword, 0xffe3c1bf } // path sp, w
......
没有这种文件类型的预览
没有这种文件类型的预览
...@@ -612,347 +612,388 @@ ...@@ -612,347 +612,388 @@
0612 0612
0613 9FC FF FF FF FF dup 1, null 0613 9FC FF FF FF FF dup 1, null
0614 0614
0615 ;80. ja symbol 0615 ;=====================================================================
0616 A00 CB FF FF FF check irq 0616 ;80. ja symbol
0617 A04 FD FF FF FF inc pc 0617 A00 CB FF FF FF check irq
0618 A08 FD 46 7F FF path ja[pc], pc 0618 A04 FD FF FF FF inc pc
0619 A0C C3 FF FF FF reset upc 0619 A08 FF C5 E5 FF path pc, mar ;将PC值传送到地址寄存器mar中
0620 0620
0621 A10 FF FF FF FF dup 4, null 0621 ;若转移条件成立,则将地址寄存器mar指定存储单元的值作为跳转地址加载到pc中
0622 0622 ;若转移条件不成立,则PC加1,指向下一条指令
0623 ;81. jb symbol 0623 A0C FD 86 7F FF path ja[mar], pc
0624 A20 CB FF FF FF check irq 0624 A10 C3 FF FF FF reset upc
0625 A24 FD FF FF FF inc pc 0625
0626 A28 FD 46 9F FF path jb[pc], pc 0626 A14 FF FF FF FF dup 3, null
0627 A2C C3 FF FF FF reset upc 0627
0628 0628 ;=====================================================================
0629 A30 FF FF FF FF dup 4, null 0629 ;81. jb symbol
0630 0630 A20 CB FF FF FF check irq
0631 ;82. jg symbol 0631 A24 FD FF FF FF inc pc
0632 A40 CB FF FF FF check irq 0632 A28 FF C5 E5 FF path pc, mar
0633 A44 FD FF FF FF inc pc 0633
0634 A48 FD 46 BF FF path jg[pc], pc 0634 ;若转移条件成立,则将地址寄存器mar指定存储单元的值作为跳转地址加载到pc中
0635 A4C C3 FF FF FF reset upc 0635 ;若转移条件不成立,则PC加1,指向下一条指令
0636 0636 A2C FD 86 9F FF path jb[mar], pc
0637 A50 FF FF FF FF dup 4, null 0637 A30 C3 FF FF FF reset upc
0638 0638
0639 ;83. jl symbol 0639 A34 FF FF FF FF dup 3, null
0640 A60 CB FF FF FF check irq 0640
0641 A64 FD FF FF FF inc pc 0641 ;=====================================================================
0642 A68 FD 46 DF FF path jl[pc], pc 0642 ;82. jg symbol
0643 A6C C3 FF FF FF reset upc 0643 A40 CB FF FF FF check irq
0644 0644 A44 FD FF FF FF inc pc
0645 A70 FF FF FF FF dup 4, null 0645 A48 FF C5 E5 FF path pc, mar
0646 0646
0647 ;84. je symbol 0647 ;若转移条件成立,则将地址寄存器mar指定存储单元的值作为跳转地址加载到pc中
0648 A80 CB FF FF FF check irq 0648 ;若转移条件不成立,则PC加1,指向下一条指令
0649 A84 FD FF FF FF inc pc 0649 A4C FD 86 BF FF path jg[mar], pc
0650 A88 FD 46 1F FF path jz[pc], pc 0650 A50 C3 FF FF FF reset upc
0651 A8C C3 FF FF FF reset upc 0651
0652 0652 A54 FF FF FF FF dup 3, null
0653 A90 FF FF FF FF dup 4, null 0653
0654 0654 ;=====================================================================
0655 ;85. jne symbol 0655 ;83. jl symbol
0656 AA0 CB FF FF FF check irq 0656 A60 CB FF FF FF check irq
0657 AA4 FD FF FF FF inc pc 0657 A64 FD FF FF FF inc pc
0658 AA8 FD 46 3F FF path jnz[pc], pc 0658 A68 FF C5 E5 FF path pc, mar
0659 AAC C3 FF FF FF reset upc 0659
0660 0660 ;若转移条件成立,则将地址寄存器mar指定存储单元的值作为跳转地址加载到pc中
0661 AB0 FF FF FF FF dup 4, null 0661 ;若转移条件不成立,则PC加1,指向下一条指令
0662 0662 A6C FD 86 DF FF path jl[mar], pc
0663 ;86. jc symbol 0663 A70 C3 FF FF FF reset upc
0664 AC0 CB FF FF FF check irq 0664
0665 AC4 FD FF FF FF inc pc 0665 A74 FF FF FF FF dup 3, null
0666 AC8 FD 46 5F FF path jc[pc], pc 0666
0667 ACC C3 FF FF FF reset upc 0667 ;=====================================================================
0668 0668 ;84. je symbol
0669 AD0 FF FF FF FF dup 4, null 0669 A80 CB FF FF FF check irq
0670 0670 A84 FD FF FF FF inc pc
0671 ;87. jmp symbol 0671 A88 FF C5 E5 FF path pc, mar
0672 AE0 CB FF FF FF check irq 0672
0673 AE4 FD FF FF FF inc pc 0673 ;若转移条件成立,则将地址寄存器mar指定存储单元的值作为跳转地址加载到pc中
0674 AE8 FD 46 FF FF path jmp[pc], pc 0674 ;若转移条件不成立,则PC加1,指向下一条指令
0675 AEC C3 FF FF FF reset upc 0675 A8C FD 86 1F FF path jz[mar], pc
0676 0676 A90 C3 FF FF FF reset upc
0677 AF0 FF FF FF FF dup 4, null 0677
0678 0678 A94 FF FF FF FF dup 3, null
0679 ;88. loop symbol 将cl作为目的操作数减1,改变零标志,若zf = 1,则跳转 0679
0680 B00 FD FF FF FF inc pc 0680 ;=====================================================================
0681 B04 FF 47 EF FF path [pc], ir 0681 ;85. jne symbol
0682 B08 BF C1 E1 FF path rd, a 0682 AA0 CB FF FF FF check irq
0683 B0C FF D1 E9 DF path alu_dec, rd 0683 AA4 FD FF FF FF inc pc
0684 B10 FF CB EB FF path al_flag, flag 0684 AA8 FF C5 E5 FF path pc, mar
0685 B14 FD FF FF FF inc pc 0685
0686 B18 FD 46 FF FF path jmp[pc], pc 0686 ;若转移条件成立,则将地址寄存器mar指定存储单元的值作为跳转地址加载到pc中
0687 B1C CB FF FF FF check irq 0687 ;若转移条件不成立,则PC加1,指向下一条指令
0688 B20 C3 FF FF FF reset upc 0688 AAC FD 86 3F FF path jnz[mar], pc
0689 0689 AB0 C3 FF FF FF reset upc
0690 B24 FF FF FF FF dup 7, null 0690
0691 0691 AB4 FF FF FF FF dup 3, null
0692 ;==================================================================================================== 0692
0693 0693 ;=====================================================================
0694 ; 软中断,首先将标志寄存器入栈,清除中断标志IF,并将当前程序断点的地址入栈保护,从 0694 ;86. jc symbol
0695 ; 中断向量表中获取中断入口地址,CPU转向中断入口地址去执行相应的中断服务程序。 0695 AC0 CB FF FF FF check irq
0696 ; 中断向量表段地址保存在ES寄存器中 0696 AC4 FD FF FF FF inc pc
0697 ;90. int immediate 0697 AC8 FF C5 E5 FF path pc, mar
0698 ; 将标志寄存器入栈 0698
0699 B40 FD FF FF FF inc pc 0699 ;若转移条件成立,则将地址寄存器mar指定存储单元的值作为跳转地址加载到pc中
0700 B44 FF 47 EF FF path [pc], ir 0700 ;若转移条件不成立,则PC加1,指向下一条指令
0701 B48 BF C1 E1 FF path sp, a 0701 ACC FD 86 5F FF path jc[mar], pc
0702 B4C BF C1 E3 FF path sp, w 0702 AD0 C3 FF FF FF reset upc
0703 B50 FF D1 E9 DF path alu_dec, sp 0703
0704 B54 BF C1 E5 FF path sp, mar 0704 AD4 FF FF FF FF dup 3, null
0705 B58 FF 83 E7 FF path flag, [mar] 0705
0706 ; 关中断 0706 ;=====================================================================
0707 B5C D3 FF FF FF cli 0707 ;87. jmp symbol
0708 0708 AE0 CB FF FF FF check irq
0709 ; 更新栈顶 0709 AE4 FD FF FF FF inc pc
0710 B60 BF C1 E1 FF path sp, a 0710 AE8 FF C5 E5 FF path pc, mar
0711 B64 BF C1 E3 FF path sp, w 0711
0712 B68 FF D1 E9 DF path alu_dec, sp 0712 ;将地址寄存器mar指定存储单元的值作为跳转地址加载到pc中,无条件跳转
0713 0713 AEC FD 86 FF FF path jmp[mar], pc
0714 ; 计算中断服务程序入口地址 0714 AF0 C3 FF FF FF reset upc
0715 B6C FD FF FF FF inc pc 0715
0716 B70 FF 47 E5 FF path [pc], mar 0716 AF4 FF FF FF FF dup 3, null
0717 0717
0718 B74 FD FF FF FF inc pc ;下一条指令地址(中断返回地址)暂存到a 0718 ;=====================================================================
0719 B78 FF C5 E1 FF path pc, a 0719 ;88. loop symbol 将cl作为目的操作数减1,改变零标志,若zf = 1,则跳转
0720 0720 B00 FD FF FF FF inc pc
0721 ; 将中断服务程序入口地址置入pc,准备执行服务程序 0721 B04 FF 47 EF FF path [pc], ir
0722 B7C FF 86 FF FF path [mar], pc 0722 B08 BF C1 E1 FF path rd, a
0723 0723 B0C FF D1 E9 DF path alu_dec, rd
0724 ; 将a中的返回地址入栈 0724 B10 FF CB EB FF path al_flag, flag
0725 B80 BF C1 E5 FF path sp, mar 0725 B14 FD FF FF FF inc pc
0726 B84 FF 91 E7 FF path a, [mar] 0726 B18 FF C5 E5 FF path pc, mar
0727 B88 C3 FF FF FF reset upc 0727 B1C FD 86 FF FF path jmp[mar], pc
0728 0728 B20 CB FF FF FF check irq
0729 B8C FF FF FF FF dup 5, null 0729 B24 C3 FF FF FF reset upc
0730 0730
0731 ;==================================================================================================== 0731 B28 FF FF FF FF dup 6, null
0732 0732
0733 ;93. iret 0733 ;====================================================================================================
0734 ; 先恢复标志寄存器内容 0734
0735 BA0 FD FF FF FF inc pc 0735 ; 软中断,首先将标志寄存器入栈,清除中断标志IF,并将当前程序断点的地址入栈保护,从
0736 BA4 FF 47 EF FF path [pc], ir 0736 ; 中断向量表中获取中断入口地址,CPU转向中断入口地址去执行相应的中断服务程序。
0737 BA8 BF C1 E1 FF path sp, a 0737 ; 中断向量表段地址保存在ES寄存器中
0738 BAC FF D1 E5 D0 path alu_inc, mar 0738 ;90. int immediate
0739 BB0 FF 87 EB FF path [mar], flag 0739 ; 将标志寄存器入栈
0740 0740 B40 FD FF FF FF inc pc
0741 ; 恢复中断返回地址 0741 B44 FF 47 EF FF path [pc], ir
0742 BB4 BF C1 E5 FF path sp, mar 0742 B48 BF C1 E1 FF path sp, a
0743 BB8 FF 86 FF FF path [mar], pc 0743 B4C BF C1 E3 FF path sp, w
0744 0744 B50 FF D1 E9 DF path alu_dec, sp
0745 ; 计算新的栈顶 0745 B54 BF C1 E5 FF path sp, mar
0746 BBC BF C1 E1 FF path sp, a 0746 B58 FF 83 E7 FF path flag, [mar]
0747 BC0 FF D1 E1 D0 path alu_inc, a 0747 ; 关中断
0748 BC4 FF D1 E9 D0 path alu_inc, sp 0748 B5C D3 FF FF FF cli
0749 BC8 C3 FF FF FF reset upc 0749
0750 0750 ; 更新栈顶
0751 BCC FF FF FF FF dup 5, null 0751 B60 BF C1 E1 FF path sp, a
0752 0752 B64 BF C1 E3 FF path sp, w
0753 ;==================================================================================================== 0753 B68 FF D1 E9 DF path alu_dec, sp
0754 0754
0755 ;95. sal reg, reg 0755 ; 计算中断服务程序入口地址
0756 BE0 FD FF FF FF inc pc 0756 B6C FD FF FF FF inc pc
0757 BE4 FF 47 EF FF path [pc], ir 0757 B70 FF 47 E5 FF path [pc], mar
0758 BE8 FF C1 E3 FF path rs, w 0758
0759 BEC BF C1 E1 FF path rd, a 0759 B74 FD FF FF FF inc pc ;下一条指令地址(中断返回地址)暂存到a
0760 BF0 FF C9 E8 7F path alu_sal, rd 0760 B78 FF C5 E1 FF path pc, a
0761 BF4 FF D3 EB FF path shift_flag, flag 0761
0762 BF8 FD FF FF FF inc pc 0762 ; 将中断服务程序入口地址置入pc,准备执行服务程序
0763 BFC CB FF FF FF check irq 0763 B7C FF 86 FF FF path [mar], pc
0764 C00 C3 FF FF FF reset upc 0764
0765 0765 ; 将a中的返回地址入栈
0766 C04 FF FF FF FF dup 7, null 0766 B80 BF C1 E5 FF path sp, mar
0767 0767 B84 FF 91 E7 FF path a, [mar]
0768 ;97. sar reg, reg 0768 B88 C3 FF FF FF reset upc
0769 C20 FD FF FF FF inc pc 0769
0770 C24 FF 47 EF FF path [pc], ir 0770 B8C FF FF FF FF dup 5, null
0771 C28 FF C1 E3 FF path rs, w 0771
0772 C2C BF C1 E1 FF path rd, a 0772 ;====================================================================================================
0773 C30 FF C9 E9 7F path alu_sar, rd 0773
0774 C34 FF D3 EB FF path shift_flag, flag 0774 ;93. iret
0775 C38 FD FF FF FF inc pc 0775 ; 先恢复标志寄存器内容
0776 C3C CB FF FF FF check irq 0776 BA0 FD FF FF FF inc pc
0777 C40 C3 FF FF FF reset upc 0777 BA4 FF 47 EF FF path [pc], ir
0778 0778 BA8 BF C1 E1 FF path sp, a
0779 C44 FF FF FF FF dup 7, null 0779 BAC FF D1 E5 D0 path alu_inc, mar
0780 0780 BB0 FF 87 EB FF path [mar], flag
0781 ;99. shl reg, reg 0781
0782 C60 FD FF FF FF inc pc 0782 ; 恢复中断返回地址
0783 C64 FF 47 EF FF path [pc], ir 0783 BB4 BF C1 E5 FF path sp, mar
0784 C68 FF C1 E3 FF path rs, w 0784 BB8 FF 86 FF FF path [mar], pc
0785 C6C BF C1 E1 FF path rd, a 0785
0786 C70 FF C9 E8 3F path alu_shl, rd 0786 ; 计算新的栈顶
0787 C74 FF D3 EB FF path shift_flag, flag 0787 BBC BF C1 E1 FF path sp, a
0788 C78 FD FF FF FF inc pc 0788 BC0 FF D1 E1 D0 path alu_inc, a
0789 C7C CB FF FF FF check irq 0789 BC4 FF D1 E9 D0 path alu_inc, sp
0790 C80 C3 FF FF FF reset upc 0790 BC8 C3 FF FF FF reset upc
0791 0791
0792 C84 FF FF FF FF dup 7, null 0792 BCC FF FF FF FF dup 5, null
0793 0793
0794 ;101. shr reg, reg 0794 ;====================================================================================================
0795 CA0 FD FF FF FF inc pc 0795
0796 CA4 FF 47 EF FF path [pc], ir 0796 ;95. sal reg, reg
0797 CA8 FF C1 E3 FF path rs, w 0797 BE0 FD FF FF FF inc pc
0798 CAC BF C1 E1 FF path rd, a 0798 BE4 FF 47 EF FF path [pc], ir
0799 CB0 FF C9 E9 3F path alu_shr, rd 0799 BE8 FF C1 E3 FF path rs, w
0800 CB4 FF D3 EB FF path shift_flag, flag 0800 BEC BF C1 E1 FF path rd, a
0801 CB8 FD FF FF FF inc pc 0801 BF0 FF C9 E8 7F path alu_sal, rd
0802 CBC CB FF FF FF check irq 0802 BF4 FF D3 EB FF path shift_flag, flag
0803 CC0 C3 FF FF FF reset upc 0803 BF8 FD FF FF FF inc pc
0804 0804 BFC CB FF FF FF check irq
0805 CC4 FF FF FF FF dup 7, null 0805 C00 C3 FF FF FF reset upc
0806 0806
0807 ;103. rol reg, reg 0807 C04 FF FF FF FF dup 7, null
0808 CE0 FD FF FF FF inc pc 0808
0809 CE4 FF 47 EF FF path [pc], ir 0809 ;97. sar reg, reg
0810 CE8 FF C1 E3 FF path rs, w 0810 C20 FD FF FF FF inc pc
0811 CEC BF C1 E1 FF path rd, a 0811 C24 FF 47 EF FF path [pc], ir
0812 CF0 FF C9 E8 BF path alu_rol, rd 0812 C28 FF C1 E3 FF path rs, w
0813 CF4 FF D3 EB FF path shift_flag, flag 0813 C2C BF C1 E1 FF path rd, a
0814 CF8 FD FF FF FF inc pc 0814 C30 FF C9 E9 7F path alu_sar, rd
0815 CFC CB FF FF FF check irq 0815 C34 FF D3 EB FF path shift_flag, flag
0816 D00 C3 FF FF FF reset upc 0816 C38 FD FF FF FF inc pc
0817 0817 C3C CB FF FF FF check irq
0818 D04 FF FF FF FF dup 7, null 0818 C40 C3 FF FF FF reset upc
0819 0819
0820 ;105. ror reg, reg 0820 C44 FF FF FF FF dup 7, null
0821 D20 FD FF FF FF inc pc 0821
0822 D24 FF 47 EF FF path [pc], ir 0822 ;99. shl reg, reg
0823 D28 FF C1 E3 FF path rs, w 0823 C60 FD FF FF FF inc pc
0824 D2C BF C1 E1 FF path rd, a 0824 C64 FF 47 EF FF path [pc], ir
0825 D30 FF C9 E9 BF path alu_ror, rd 0825 C68 FF C1 E3 FF path rs, w
0826 D34 FF D3 EB FF path shift_flag, flag 0826 C6C BF C1 E1 FF path rd, a
0827 D38 FD FF FF FF inc pc 0827 C70 FF C9 E8 3F path alu_shl, rd
0828 D3C CB FF FF FF check irq 0828 C74 FF D3 EB FF path shift_flag, flag
0829 D40 C3 FF FF FF reset upc 0829 C78 FD FF FF FF inc pc
0830 0830 C7C CB FF FF FF check irq
0831 D44 FF FF FF FF dup 7, null 0831 C80 C3 FF FF FF reset upc
0832 0832
0833 ;107. rcl reg, reg 0833 C84 FF FF FF FF dup 7, null
0834 D60 FD FF FF FF inc pc 0834
0835 D64 FF 47 EF FF path [pc], ir 0835 ;101. shr reg, reg
0836 D68 FF C1 E3 FF path rs, w 0836 CA0 FD FF FF FF inc pc
0837 D6C BF C1 E1 FF path rd, a 0837 CA4 FF 47 EF FF path [pc], ir
0838 D70 FF C9 E8 FF path alu_rcl, rd 0838 CA8 FF C1 E3 FF path rs, w
0839 D74 FF D3 EB FF path shift_flag, flag 0839 CAC BF C1 E1 FF path rd, a
0840 D78 FD FF FF FF inc pc 0840 CB0 FF C9 E9 3F path alu_shr, rd
0841 D7C CB FF FF FF check irq 0841 CB4 FF D3 EB FF path shift_flag, flag
0842 D80 C3 FF FF FF reset upc 0842 CB8 FD FF FF FF inc pc
0843 0843 CBC CB FF FF FF check irq
0844 D84 FF FF FF FF dup 7, null 0844 CC0 C3 FF FF FF reset upc
0845 0845
0846 ;109. rcr reg, reg 0846 CC4 FF FF FF FF dup 7, null
0847 DA0 FD FF FF FF inc pc 0847
0848 DA4 FF 47 EF FF path [pc], ir 0848 ;103. rol reg, reg
0849 DA8 FF C1 E3 FF path rs, w 0849 CE0 FD FF FF FF inc pc
0850 DAC BF C1 E1 FF path rd, a 0850 CE4 FF 47 EF FF path [pc], ir
0851 DB0 FF C9 E9 FF path alu_rcr, rd 0851 CE8 FF C1 E3 FF path rs, w
0852 DB4 FF D3 EB FF path shift_flag, flag 0852 CEC BF C1 E1 FF path rd, a
0853 DB8 FD FF FF FF inc pc 0853 CF0 FF C9 E8 BF path alu_rol, rd
0854 DBC CB FF FF FF check irq 0854 CF4 FF D3 EB FF path shift_flag, flag
0855 DC0 C3 FF FF FF reset upc 0855 CF8 FD FF FF FF inc pc
0856 0856 CFC CB FF FF FF check irq
0857 DC4 FF FF FF FF dup 7, null 0857 D00 C3 FF FF FF reset upc
0858 0858
0859 ;111. nop 0859 D04 FF FF FF FF dup 7, null
0860 DE0 FD FF FF FF inc pc 0860
0861 DE4 C3 FF FF FF reset upc 0861 ;105. ror reg, reg
0862 0862 D20 FD FF FF FF inc pc
0863 DE8 FF FF FF FF dup 6, null 0863 D24 FF 47 EF FF path [pc], ir
0864 0864 D28 FF C1 E3 FF path rs, w
0865 ;112. hlt 0865 D2C BF C1 E1 FF path rd, a
0866 E00 C3 FF FF FF reset upc 0866 D30 FF C9 E9 BF path alu_ror, rd
0867 E04 FF FF FF FF dup 7, null 0867 D34 FF D3 EB FF path shift_flag, flag
0868 0868 D38 FD FF FF FF inc pc
0869 ;113. call symbol 0869 D3C CB FF FF FF check irq
0870 ; 计算新的栈顶 0870 D40 C3 FF FF FF reset upc
0871 E20 BF C1 E1 FF path sp, a 0871
0872 E24 BF C1 E3 FF path sp, w 0872 D44 FF FF FF FF dup 7, null
0873 E28 FF D1 E9 DF path alu_dec, sp 0873
0874 E2C BF C1 E5 FF path sp, mar 0874 ;107. rcl reg, reg
0875 0875 D60 FD FF FF FF inc pc
0876 ; 读出标号指定的跳转地址并暂存到寄存器a中 0876 D64 FF 47 EF FF path [pc], ir
0877 E30 FD FF FF FF inc pc 0877 D68 FF C1 E3 FF path rs, w
0878 E34 FF 47 E1 FF path [pc], a 0878 D6C BF C1 E1 FF path rd, a
0879 0879 D70 FF C9 E8 FF path alu_rcl, rd
0880 ; 将下一条指令地址(中断返回地址)入栈 0880 D74 FF D3 EB FF path shift_flag, flag
0881 E38 FD FF FF FF inc pc 0881 D78 FD FF FF FF inc pc
0882 E3C FF 85 E7 FF path pc, [mar] 0882 D7C CB FF FF FF check irq
0883 0883 D80 C3 FF FF FF reset upc
0884 ; 将a中暂存的跳转地址置入pc,实现调用 0884
0885 E40 FF D0 FF FF path a, pc 0885 D84 FF FF FF FF dup 7, null
0886 E44 CB FF FF FF check irq 0886
0887 E48 C3 FF FF FF reset upc 0887 ;109. rcr reg, reg
0888 0888 DA0 FD FF FF FF inc pc
0889 E4C FF FF FF FF dup 5, null 0889 DA4 FF 47 EF FF path [pc], ir
0890 0890 DA8 FF C1 E3 FF path rs, w
0891 ;115. ret 0891 DAC BF C1 E1 FF path rd, a
0892 E60 BF C1 E5 FF path sp, mar 0892 DB0 FF C9 E9 FF path alu_rcr, rd
0893 E64 FF 86 FF FF path [mar], pc 0893 DB4 FF D3 EB FF path shift_flag, flag
0894 E68 BF C1 E1 FF path sp, a 0894 DB8 FD FF FF FF inc pc
0895 E6C FF D1 E9 D0 path alu_inc, sp 0895 DBC CB FF FF FF check irq
0896 E70 C3 FF FF FF reset upc 0896 DC0 C3 FF FF FF reset upc
0897 0897
0898 E74 FF FF FF FF dup 3, null 0898 DC4 FF FF FF FF dup 7, null
0899 0899
0900 ;116. cli 0900 ;111. nop
0901 E80 D3 FF FF FF cli 0901 DE0 FD FF FF FF inc pc
0902 E84 FD FF FF FF inc pc 0902 DE4 C3 FF FF FF reset upc
0903 E88 C3 FF FF FF reset upc 0903
0904 0904 DE8 FF FF FF FF dup 6, null
0905 E8C FF FF FF FF dup 5, null 0905
0906 0906 ;112. hlt
0907 ;117. sti 0907 E00 C3 FF FF FF reset upc
0908 EA0 D7 FF FF FF sti 0908 E04 FF FF FF FF dup 7, null
0909 EA4 FD FF FF FF inc pc 0909
0910 EA8 C3 FF FF FF reset upc 0910 ;113. call symbol
0911 0911 ; 计算新的栈顶
0912 EAC FF FF FF FF dup 5, null 0912 E20 BF C1 E1 FF path sp, a
0913 0913 E24 BF C1 E3 FF path sp, w
0914 ;118. 硬中断处理微指令程序 0914 E28 FF D1 E9 DF path alu_dec, sp
0915 ; 标志寄存器和断点地址入栈 0915 E2C BF C1 E5 FF path sp, mar
0916 EC0 BF C1 E1 FF path sp, a 0916
0917 EC4 BF C1 E3 FF path sp, w 0917 ; 读出标号指定的跳转地址并暂存到寄存器a中
0918 EC8 FF D1 E9 DF path alu_dec, sp 0918 E30 FD FF FF FF inc pc
0919 ECC BF C1 E5 FF path sp, mar 0919 E34 FF 47 E1 FF path [pc], a
0920 ED0 FF 83 E7 FF path flag, [mar] 0920
0921 ED4 BF C1 E1 FF path sp, a 0921 ; 将下一条指令地址(中断返回地址)入栈
0922 ED8 FF D1 E9 DF path alu_dec, sp 0922 E38 FD FF FF FF inc pc
0923 EDC BF C1 E5 FF path sp, mar 0923 E3C FF 85 E7 FF path pc, [mar]
0924 EE0 FF 85 E7 FF path pc, [mar] 0924
0925 ; IF标志置位,开中断,允许中断嵌套 0925 ; 将a中暂存的跳转地址置入pc,实现调用
0926 EE4 D7 FF FF FF sti 0926 E40 FF D0 FF FF path a, pc
0927 ; 获取中断号中断服务程序入口地址 0927 E44 CB FF FF FF check irq
0928 EE8 CF FF FF FF inta 0928 E48 C3 FF FF FF reset upc
0929 EEC FF FF FF FF dup 1, null ;插入空闲周期 0929
0930 EF0 CE C7 E5 FF path inta, mar ;读取中断号并送入地址寄存器中 0930 E4C FF FF FF FF dup 5, null
0931 ; 转移到中断服务程序执行 0931
0932 EF4 FF 86 FF FF path [mar], pc 0932 ;115. ret
0933 EF8 C3 FF FF FF reset upc 0933 E60 BF C1 E5 FF path sp, mar
0934 0934 E64 FF 86 FF FF path [mar], pc
0935 EFC FF FF FF FF dup 1, null 0935 E68 BF C1 E1 FF path sp, a
0936 0936 E6C FF D1 E9 D0 path alu_inc, sp
0937 ;120. inc reg 0937 E70 C3 FF FF FF reset upc
0938 F00 FD FF FF FF inc pc 0938
0939 F04 FF 47 EF FF path [pc], ir 0939 E74 FF FF FF FF dup 3, null
0940 F08 BF C1 E1 FF path rd, a 0940
0941 F0C FF D1 E9 D0 path alu_inc, rd 0941 ;116. cli
0942 F10 FF CB EB FF path al_flag, flag 0942 E80 D3 FF FF FF cli
0943 F14 FD FF FF FF inc pc 0943 E84 FD FF FF FF inc pc
0944 F18 CB FF FF FF check irq 0944 E88 C3 FF FF FF reset upc
0945 F1C C3 FF FF FF reset upc 0945
0946 0946 E8C FF FF FF FF dup 5, null
0947 ;121. dec reg 0947
0948 F20 FD FF FF FF inc pc 0948 ;117. sti
0949 F24 FF 47 EF FF path [pc], ir 0949 EA0 D7 FF FF FF sti
0950 F28 BF C1 E1 FF path rd, a 0950 EA4 FD FF FF FF inc pc
0951 F2C BF C1 E3 FF path rd, w 0951 EA8 C3 FF FF FF reset upc
0952 F30 FF D1 E9 DF path alu_dec, rd 0952
0953 F34 FF CB EB FF path al_flag, flag 0953 EAC FF FF FF FF dup 5, null
0954 F38 FD FF FF FF inc pc 0954
0955 F3C CB FF FF FF check irq 0955 ;118. 硬中断处理微指令程序
0956 F40 C3 FF FF FF reset upc 0956 ; 标志寄存器和断点地址入栈
0957 0957 EC0 BF C1 E1 FF path sp, a
0958 F44 FF FF FF FF dup 7, null 0958 EC4 BF C1 E3 FF path sp, w
\ No newline at end of file 0959 EC8 FF D1 E9 DF path alu_dec, sp
0960 ECC BF C1 E5 FF path sp, mar
0961 ED0 FF 83 E7 FF path flag, [mar]
0962 ED4 BF C1 E1 FF path sp, a
0963 ED8 FF D1 E9 DF path alu_dec, sp
0964 EDC BF C1 E5 FF path sp, mar
0965 EE0 FF 85 E7 FF path pc, [mar]
0966 ; IF标志置位,开中断,允许中断嵌套
0967 EE4 D7 FF FF FF sti
0968 ; 获取中断号中断服务程序入口地址
0969 EE8 CF FF FF FF inta
0970 EEC FF FF FF FF dup 1, null ;插入空闲周期
0971 EF0 CE C7 E5 FF path inta, mar ;读取中断号并送入地址寄存器中
0972 ; 转移到中断服务程序执行
0973 EF4 FF 86 FF FF path [mar], pc
0974 EF8 C3 FF FF FF reset upc
0975
0976 EFC FF FF FF FF dup 1, null
0977
0978 ;120. inc reg
0979 F00 FD FF FF FF inc pc
0980 F04 FF 47 EF FF path [pc], ir
0981 F08 BF C1 E1 FF path rd, a
0982 F0C FF D1 E9 D0 path alu_inc, rd
0983 F10 FF CB EB FF path al_flag, flag
0984 F14 FD FF FF FF inc pc
0985 F18 CB FF FF FF check irq
0986 F1C C3 FF FF FF reset upc
0987
0988 ;121. dec reg
0989 F20 FD FF FF FF inc pc
0990 F24 FF 47 EF FF path [pc], ir
0991 F28 BF C1 E1 FF path rd, a
0992 F2C BF C1 E3 FF path rd, w
0993 F30 FF D1 E9 DF path alu_dec, rd
0994 F34 FF CB EB FF path al_flag, flag
0995 F38 FD FF FF FF inc pc
0996 F3C CB FF FF FF check irq
0997 F40 C3 FF FF FF reset upc
0998
0999 F44 FF FF FF FF dup 7, null
\ No newline at end of file
...@@ -612,70 +612,110 @@ reset upc ...@@ -612,70 +612,110 @@ reset upc
dup 1, null dup 1, null
;=====================================================================
;80. ja symbol ;80. ja symbol
check irq check irq
inc pc inc pc
path ja[pc], pc path pc, mar ;将PC值传送到地址寄存器mar中
;若转移条件成立,则将地址寄存器mar指定存储单元的值作为跳转地址加载到pc中
;若转移条件不成立,则PC加1,指向下一条指令
path ja[mar], pc
reset upc reset upc
dup 4, null dup 3, null
;=====================================================================
;81. jb symbol ;81. jb symbol
check irq check irq
inc pc inc pc
path jb[pc], pc path pc, mar
;若转移条件成立,则将地址寄存器mar指定存储单元的值作为跳转地址加载到pc中
;若转移条件不成立,则PC加1,指向下一条指令
path jb[mar], pc
reset upc reset upc
dup 4, null dup 3, null
;=====================================================================
;82. jg symbol ;82. jg symbol
check irq check irq
inc pc inc pc
path jg[pc], pc path pc, mar
;若转移条件成立,则将地址寄存器mar指定存储单元的值作为跳转地址加载到pc中
;若转移条件不成立,则PC加1,指向下一条指令
path jg[mar], pc
reset upc reset upc
dup 4, null dup 3, null
;=====================================================================
;83. jl symbol ;83. jl symbol
check irq check irq
inc pc inc pc
path jl[pc], pc path pc, mar
;若转移条件成立,则将地址寄存器mar指定存储单元的值作为跳转地址加载到pc中
;若转移条件不成立,则PC加1,指向下一条指令
path jl[mar], pc
reset upc reset upc
dup 4, null dup 3, null
;=====================================================================
;84. je symbol ;84. je symbol
check irq check irq
inc pc inc pc
path jz[pc], pc path pc, mar
;若转移条件成立,则将地址寄存器mar指定存储单元的值作为跳转地址加载到pc中
;若转移条件不成立,则PC加1,指向下一条指令
path jz[mar], pc
reset upc reset upc
dup 4, null dup 3, null
;=====================================================================
;85. jne symbol ;85. jne symbol
check irq check irq
inc pc inc pc
path jnz[pc], pc path pc, mar
;若转移条件成立,则将地址寄存器mar指定存储单元的值作为跳转地址加载到pc中
;若转移条件不成立,则PC加1,指向下一条指令
path jnz[mar], pc
reset upc reset upc
dup 4, null dup 3, null
;=====================================================================
;86. jc symbol ;86. jc symbol
check irq check irq
inc pc inc pc
path jc[pc], pc path pc, mar
;若转移条件成立,则将地址寄存器mar指定存储单元的值作为跳转地址加载到pc中
;若转移条件不成立,则PC加1,指向下一条指令
path jc[mar], pc
reset upc reset upc
dup 4, null dup 3, null
;=====================================================================
;87. jmp symbol ;87. jmp symbol
check irq check irq
inc pc inc pc
path jmp[pc], pc path pc, mar
;将地址寄存器mar指定存储单元的值作为跳转地址加载到pc中,无条件跳转
path jmp[mar], pc
reset upc reset upc
dup 4, null dup 3, null
;=====================================================================
;88. loop symbol 将cl作为目的操作数减1,改变零标志,若zf = 1,则跳转 ;88. loop symbol 将cl作为目的操作数减1,改变零标志,若zf = 1,则跳转
inc pc inc pc
path [pc], ir path [pc], ir
...@@ -683,11 +723,12 @@ path rd, a ...@@ -683,11 +723,12 @@ path rd, a
path alu_dec, rd path alu_dec, rd
path al_flag, flag path al_flag, flag
inc pc inc pc
path jmp[pc], pc path pc, mar
path jmp[mar], pc
check irq check irq
reset upc reset upc
dup 7, null dup 6, null
;==================================================================================================== ;====================================================================================================
......
GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG߿GGGGGGGGGGGGGGFFFFFF?F_FGFG߿GGGGG?G?GGGG߿G߿߿GG GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG߿GGGGGGGGGGGGGG?_GG߿GGGGG?G?GGGG߿G߿߿GG
\ No newline at end of file \ No newline at end of file
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论