提交 773e5b3c 创建 作者: 李川's avatar 李川 提交者: 李川

修改8086芯片

上级 8322ec68
没有这种文件类型的预览
这个 源代码变更 因为 太大 而不能显示。 你可以 浏览blob
没有这种文件类型的预览
这个 源代码变更 因为 太大 而不能显示。 你可以 浏览blob
# 说明
Intel 8086 处理器
# Datasheet
[8086.pdf](8086.pdf)
# 原理图
![8086](https://www.codecode.net/engintime/Dream-Logic/Intel-classic-chips/8086/raw/master/8086.dlsche.svg)
\ No newline at end of file
![raw svg](8086.dlsche.svg)
\ No newline at end of file
......@@ -94,6 +94,7 @@ const char* alu_not_keyword = "alu_not";
const char* al_flag_keyword = "al_flag";
const char* shift_flag_keyword = "shift_flag";
// 访问主存或外设的操作数
const char* pc_main_memory_keyword = "[pc]";
const char* jz_mar_keyword = "jz[mar]";
......@@ -319,6 +320,7 @@ struct KEYWORD_FUNCTION_ENTRY
// 指令名称
const char* fetch_instruction_keyword = "fetch";
const char* check_instruction_keyword = "check";
const char* hold_instruction_keyword = "hold";
const char* cli_instruction_keyword = "cli";
const char* sti_instruction_keyword = "sti";
const char* inta_instruction_keyword = "inta";
......@@ -398,7 +400,7 @@ void parse_fetch(int line_num)
}
// check
// check irq
void parse_check(int line_num)
{
unsigned long ul = 0xffffffcb;
......@@ -406,6 +408,14 @@ void parse_check(int line_num)
machine_code_address += 4;
}
// hold DMA
void parse_hold(int line_num)
{
unsigned long ul = 0xffffd5db;
memcpy(&machine_code[machine_code_address], &ul, 4);
machine_code_address += 4;
}
// cli
void parse_cli(int line_num)
{
......@@ -534,6 +544,7 @@ struct KEYWORD_FUNCTION_ENTRY keyword_function_table[] =
,{ &fetch_instruction_keyword, parse_fetch }
,{ &check_instruction_keyword, parse_check }
,{ &hold_instruction_keyword, parse_hold }
,{ &dup_instruction_keyword, parse_dup }
,{ &cli_instruction_keyword, parse_cli }
,{ &sti_instruction_keyword, parse_sti }
......
没有这种文件类型的预览
没有这种文件类型的预览
......@@ -14,7 +14,7 @@
0014 28 FD FF FF FF inc pc
0015 2C FF 47 E9 FF path [pc], rd
0016 30 FD FF FF FF inc pc
0017 34 CB FF FF FF check irq
0017 34 CB FF FF FF check irq ;查询硬中断
0018 38 C3 FF FF FF reset upc
0019
0020 3C FF FF FF FF dup 1, null
......@@ -306,7 +306,7 @@
0306
0307 4E8 FF FF FF FF dup 6, null
0308
0309 ;40.
0309 ;40.
0310 500 FF FF FF FF dup 8, null
0311
0312 ;41.
......@@ -542,438 +542,438 @@
0542 8F8 FF CB EB FF path al_flag, flag
0543 8FC FD FF FF FF inc pc
0544 900 CB FF FF FF check irq
0545 904 C3 FF FF FF reset upc
0546
0547 908 FF FF FF FF dup 6, null
0548
0549 ;73. cmp reg, reg
0550 920 FD FF FF FF inc pc
0551 924 FF 47 EF FF path [pc], ir
0552 928 BF C1 E1 FF path rd, a
0553 92C FF C1 E3 FF path rs, w
0554 930 FF D1 E1 D6 path alu_sub, a
0555 934 FF CB EB FF path al_flag, flag
0556 938 FD FF FF FF inc pc
0557 93C CB FF FF FF check irq
0558 940 C3 FF FF FF reset upc
0559
0560 944 FF FF FF FF dup 7, null
0561
0562 ;75. in al, imm
0563 960 FD FF FF FF inc pc
0564 964 FF 47 EF FF path [pc], ir
0565 968 FD FF FF FF inc pc
0566 96C FF 47 E5 FF path [pc], mar
0567 970 FE 87 E9 FF path <mar>, rd
0568 974 FD FF FF FF inc pc
0569 978 C3 FF FF FF reset upc
0570
0571 97C FF FF FF FF dup 1, null
0572
0573 ;76. in al, dl
0574 980 FD FF FF FF inc pc
0575 984 FF 47 EF FF path [pc], ir
0576 988 FF C1 E5 FF path rs, mar
0577 98C FE 87 E9 FF path <mar>, rd
0578 990 FD FF FF FF inc pc
0579 994 C3 FF FF FF reset upc
0580
0581 998 FF FF FF FF dup 2, null
0582
0583 ;77. out dl, al
0584 9A0 FD FF FF FF inc pc
0585 9A4 FF 47 EF FF path [pc], ir
0586 9A8 BF C1 E5 FF path rd, mar
0587 9AC FE 81 E7 FF path rs, <mar>
0588 9B0 FD FF FF FF inc pc
0589 9B4 C3 FF FF FF reset upc
0590
0591 9B8 FF FF FF FF dup 2, null
0592
0593 ;78. out imm, al
0594 9C0 FD FF FF FF inc pc
0595 9C4 FF 47 EF FF path [pc], ir
0596 9C8 FD FF FF FF inc pc
0597 9CC FF 47 E5 FF path [pc], mar
0598 9D0 FE 81 E7 FF path rs, <mar>
0599 9D4 FD FF FF FF inc pc
0600 9D8 C3 FF FF FF reset upc
0601
0602 9DC FF FF FF FF dup 1, null
0603
0604 ;79. lea reg, symbol
0605 9E0 FD FF FF FF inc pc
0606 9E4 FF 47 EF FF path [pc], ir
0607 9E8 FD FF FF FF inc pc
0608 9EC FF 47 E9 FF path [pc], rd
0609 9F0 FD FF FF FF inc pc
0610 9F4 CB FF FF FF check irq
0611 9F8 C3 FF FF FF reset upc
0612
0613 9FC FF FF FF FF dup 1, null
0614
0615 ;=====================================================================
0616 ;80. ja symbol
0617 A00 CB FF FF FF check irq
0618 A04 FD FF FF FF inc pc
0619 A08 FF C5 E5 FF path pc, mar ;将PC值传送到地址寄存器mar中
0620
0621 ;若转移条件成立,则将地址寄存器mar指定存储单元的值作为跳转地址加载到pc中
0622 ;若转移条件不成立,则PC加1,指向下一条指令
0623 A0C FD 86 7F FF path ja[mar], pc
0624 A10 C3 FF FF FF reset upc
0625
0626 A14 FF FF FF FF dup 3, null
0627
0628 ;=====================================================================
0629 ;81. jb symbol
0630 A20 CB FF FF FF check irq
0631 A24 FD FF FF FF inc pc
0632 A28 FF C5 E5 FF path pc, mar
0633
0634 ;若转移条件成立,则将地址寄存器mar指定存储单元的值作为跳转地址加载到pc中
0635 ;若转移条件不成立,则PC加1,指向下一条指令
0636 A2C FD 86 9F FF path jb[mar], pc
0637 A30 C3 FF FF FF reset upc
0638
0639 A34 FF FF FF FF dup 3, null
0640
0641 ;=====================================================================
0642 ;82. jg symbol
0643 A40 CB FF FF FF check irq
0644 A44 FD FF FF FF inc pc
0645 A48 FF C5 E5 FF path pc, mar
0646
0647 ;若转移条件成立,则将地址寄存器mar指定存储单元的值作为跳转地址加载到pc中
0648 ;若转移条件不成立,则PC加1,指向下一条指令
0649 A4C FD 86 BF FF path jg[mar], pc
0650 A50 C3 FF FF FF reset upc
0651
0652 A54 FF FF FF FF dup 3, null
0653
0654 ;=====================================================================
0655 ;83. jl symbol
0656 A60 CB FF FF FF check irq
0657 A64 FD FF FF FF inc pc
0658 A68 FF C5 E5 FF path pc, mar
0659
0660 ;若转移条件成立,则将地址寄存器mar指定存储单元的值作为跳转地址加载到pc中
0661 ;若转移条件不成立,则PC加1,指向下一条指令
0662 A6C FD 86 DF FF path jl[mar], pc
0663 A70 C3 FF FF FF reset upc
0664
0665 A74 FF FF FF FF dup 3, null
0666
0667 ;=====================================================================
0668 ;84. je symbol
0669 A80 CB FF FF FF check irq
0670 A84 FD FF FF FF inc pc
0671 A88 FF C5 E5 FF path pc, mar
0672
0673 ;若转移条件成立,则将地址寄存器mar指定存储单元的值作为跳转地址加载到pc中
0674 ;若转移条件不成立,则PC加1,指向下一条指令
0675 A8C FD 86 1F FF path jz[mar], pc
0676 A90 C3 FF FF FF reset upc
0677
0678 A94 FF FF FF FF dup 3, null
0679
0680 ;=====================================================================
0681 ;85. jne symbol
0682 AA0 CB FF FF FF check irq
0683 AA4 FD FF FF FF inc pc
0684 AA8 FF C5 E5 FF path pc, mar
0685
0686 ;若转移条件成立,则将地址寄存器mar指定存储单元的值作为跳转地址加载到pc中
0687 ;若转移条件不成立,则PC加1,指向下一条指令
0688 AAC FD 86 3F FF path jnz[mar], pc
0689 AB0 C3 FF FF FF reset upc
0690
0691 AB4 FF FF FF FF dup 3, null
0692
0693 ;=====================================================================
0694 ;86. jc symbol
0695 AC0 CB FF FF FF check irq
0696 AC4 FD FF FF FF inc pc
0697 AC8 FF C5 E5 FF path pc, mar
0698
0699 ;若转移条件成立,则将地址寄存器mar指定存储单元的值作为跳转地址加载到pc中
0700 ;若转移条件不成立,则PC加1,指向下一条指令
0701 ACC FD 86 5F FF path jc[mar], pc
0702 AD0 C3 FF FF FF reset upc
0703
0704 AD4 FF FF FF FF dup 3, null
0705
0706 ;=====================================================================
0707 ;87. jmp symbol
0708 AE0 CB FF FF FF check irq
0709 AE4 FD FF FF FF inc pc
0710 AE8 FF C5 E5 FF path pc, mar
0711
0712 ;将地址寄存器mar指定存储单元的值作为跳转地址加载到pc中,无条件跳转
0713 AEC FD 86 FF FF path jmp[mar], pc
0714 AF0 C3 FF FF FF reset upc
0715
0716 AF4 FF FF FF FF dup 3, null
0717
0718 ;=====================================================================
0719 ;88. loop symbol 将cl作为目的操作数减1,改变零标志,若zf = 1,则跳转
0720 B00 FD FF FF FF inc pc
0721 B04 FF 47 EF FF path [pc], ir
0722 B08 BF C1 E1 FF path rd, a
0723 B0C FF D1 E9 DF path alu_dec, rd
0724 B10 FF CB EB FF path al_flag, flag
0725 B14 FD FF FF FF inc pc
0726 B18 FF C5 E5 FF path pc, mar
0727 B1C FD 86 FF FF path jmp[mar], pc
0728 B20 CB FF FF FF check irq
0729 B24 C3 FF FF FF reset upc
0730
0731 B28 FF FF FF FF dup 6, null
0732
0733 ;====================================================================================================
0734
0735 ; 软中断,首先将标志寄存器入栈,清除中断标志IF,并将当前程序断点的地址入栈保护,从
0736 ; 中断向量表中获取中断入口地址,CPU转向中断入口地址去执行相应的中断服务程序。
0737 ; 中断向量表段地址保存在ES寄存器中
0738 ;90. int immediate
0739 ; 将标志寄存器入栈
0740 B40 FD FF FF FF inc pc
0741 B44 FF 47 EF FF path [pc], ir
0742 B48 BF C1 E1 FF path sp, a
0743 B4C BF C1 E3 FF path sp, w
0744 B50 FF D1 E9 DF path alu_dec, sp
0745 B54 BF C1 E5 FF path sp, mar
0746 B58 FF 83 E7 FF path flag, [mar]
0747 ; 关中断
0748 B5C D3 FF FF FF cli
0749
0750 ; 更新栈顶
0751 B60 BF C1 E1 FF path sp, a
0752 B64 BF C1 E3 FF path sp, w
0753 B68 FF D1 E9 DF path alu_dec, sp
0754
0755 ; 计算中断服务程序入口地址
0756 B6C FD FF FF FF inc pc
0757 B70 FF 47 E5 FF path [pc], mar
0758
0759 B74 FD FF FF FF inc pc ;下一条指令地址(中断返回地址)暂存到a
0760 B78 FF C5 E1 FF path pc, a
0761
0762 ; 将中断服务程序入口地址置入pc,准备执行服务程序
0763 B7C FF 86 FF FF path [mar], pc
0764
0765 ; 将a中的返回地址入栈
0766 B80 BF C1 E5 FF path sp, mar
0767 B84 FF 91 E7 FF path a, [mar]
0768 B88 C3 FF FF FF reset upc
0769
0770 B8C FF FF FF FF dup 5, null
0771
0772 ;====================================================================================================
0773
0774 ;93. iret
0775 ; 先恢复标志寄存器内容
0776 BA0 FD FF FF FF inc pc
0777 BA4 FF 47 EF FF path [pc], ir
0778 BA8 BF C1 E1 FF path sp, a
0779 BAC FF D1 E5 D0 path alu_inc, mar
0780 BB0 FF 87 EB FF path [mar], flag
0781
0782 ; 恢复中断返回地址
0783 BB4 BF C1 E5 FF path sp, mar
0784 BB8 FF 86 FF FF path [mar], pc
0785
0786 ; 计算新的栈顶
0787 BBC BF C1 E1 FF path sp, a
0788 BC0 FF D1 E1 D0 path alu_inc, a
0789 BC4 FF D1 E9 D0 path alu_inc, sp
0790 BC8 C3 FF FF FF reset upc
0791
0792 BCC FF FF FF FF dup 5, null
0793
0794 ;====================================================================================================
0795
0796 ;95. sal reg, reg
0797 BE0 FD FF FF FF inc pc
0798 BE4 FF 47 EF FF path [pc], ir
0799 BE8 FF C1 E3 FF path rs, w
0800 BEC BF C1 E1 FF path rd, a
0801 BF0 FF C9 E8 7F path alu_sal, rd
0802 BF4 FF D3 EB FF path shift_flag, flag
0803 BF8 FD FF FF FF inc pc
0804 BFC CB FF FF FF check irq
0805 C00 C3 FF FF FF reset upc
0806
0807 C04 FF FF FF FF dup 7, null
0808
0809 ;97. sar reg, reg
0810 C20 FD FF FF FF inc pc
0811 C24 FF 47 EF FF path [pc], ir
0812 C28 FF C1 E3 FF path rs, w
0813 C2C BF C1 E1 FF path rd, a
0814 C30 FF C9 E9 7F path alu_sar, rd
0815 C34 FF D3 EB FF path shift_flag, flag
0816 C38 FD FF FF FF inc pc
0817 C3C CB FF FF FF check irq
0818 C40 C3 FF FF FF reset upc
0819
0820 C44 FF FF FF FF dup 7, null
0821
0822 ;99. shl reg, reg
0823 C60 FD FF FF FF inc pc
0824 C64 FF 47 EF FF path [pc], ir
0825 C68 FF C1 E3 FF path rs, w
0826 C6C BF C1 E1 FF path rd, a
0827 C70 FF C9 E8 3F path alu_shl, rd
0828 C74 FF D3 EB FF path shift_flag, flag
0829 C78 FD FF FF FF inc pc
0830 C7C CB FF FF FF check irq
0831 C80 C3 FF FF FF reset upc
0832
0833 C84 FF FF FF FF dup 7, null
0834
0835 ;101. shr reg, reg
0836 CA0 FD FF FF FF inc pc
0837 CA4 FF 47 EF FF path [pc], ir
0838 CA8 FF C1 E3 FF path rs, w
0839 CAC BF C1 E1 FF path rd, a
0840 CB0 FF C9 E9 3F path alu_shr, rd
0841 CB4 FF D3 EB FF path shift_flag, flag
0842 CB8 FD FF FF FF inc pc
0843 CBC CB FF FF FF check irq
0844 CC0 C3 FF FF FF reset upc
0845
0846 CC4 FF FF FF FF dup 7, null
0847
0848 ;103. rol reg, reg
0849 CE0 FD FF FF FF inc pc
0850 CE4 FF 47 EF FF path [pc], ir
0851 CE8 FF C1 E3 FF path rs, w
0852 CEC BF C1 E1 FF path rd, a
0853 CF0 FF C9 E8 BF path alu_rol, rd
0854 CF4 FF D3 EB FF path shift_flag, flag
0855 CF8 FD FF FF FF inc pc
0856 CFC CB FF FF FF check irq
0857 D00 C3 FF FF FF reset upc
0858
0859 D04 FF FF FF FF dup 7, null
0860
0861 ;105. ror reg, reg
0862 D20 FD FF FF FF inc pc
0863 D24 FF 47 EF FF path [pc], ir
0864 D28 FF C1 E3 FF path rs, w
0865 D2C BF C1 E1 FF path rd, a
0866 D30 FF C9 E9 BF path alu_ror, rd
0867 D34 FF D3 EB FF path shift_flag, flag
0868 D38 FD FF FF FF inc pc
0869 D3C CB FF FF FF check irq
0870 D40 C3 FF FF FF reset upc
0871
0872 D44 FF FF FF FF dup 7, null
0873
0874 ;107. rcl reg, reg
0875 D60 FD FF FF FF inc pc
0876 D64 FF 47 EF FF path [pc], ir
0877 D68 FF C1 E3 FF path rs, w
0878 D6C BF C1 E1 FF path rd, a
0879 D70 FF C9 E8 FF path alu_rcl, rd
0880 D74 FF D3 EB FF path shift_flag, flag
0881 D78 FD FF FF FF inc pc
0882 D7C CB FF FF FF check irq
0883 D80 C3 FF FF FF reset upc
0884
0885 D84 FF FF FF FF dup 7, null
0886
0887 ;109. rcr reg, reg
0888 DA0 FD FF FF FF inc pc
0889 DA4 FF 47 EF FF path [pc], ir
0890 DA8 FF C1 E3 FF path rs, w
0891 DAC BF C1 E1 FF path rd, a
0892 DB0 FF C9 E9 FF path alu_rcr, rd
0893 DB4 FF D3 EB FF path shift_flag, flag
0894 DB8 FD FF FF FF inc pc
0895 DBC CB FF FF FF check irq
0896 DC0 C3 FF FF FF reset upc
0897
0898 DC4 FF FF FF FF dup 7, null
0899
0900 ;111. nop
0901 DE0 FD FF FF FF inc pc
0902 DE4 C3 FF FF FF reset upc
0903
0904 DE8 FF FF FF FF dup 6, null
0905
0906 ;112. hlt
0907 E00 C3 FF FF FF reset upc
0908 E04 FF FF FF FF dup 7, null
0909
0910 ;113. call symbol
0911 ; 计算新的栈顶
0912 E20 BF C1 E1 FF path sp, a
0913 E24 BF C1 E3 FF path sp, w
0914 E28 FF D1 E9 DF path alu_dec, sp
0915 E2C BF C1 E5 FF path sp, mar
0916
0917 ; 读出标号指定的跳转地址并暂存到寄存器a中
0918 E30 FD FF FF FF inc pc
0919 E34 FF 47 E1 FF path [pc], a
0920
0921 ; 将下一条指令地址(中断返回地址)入栈
0922 E38 FD FF FF FF inc pc
0923 E3C FF 85 E7 FF path pc, [mar]
0924
0925 ; 将a中暂存的跳转地址置入pc,实现调用
0926 E40 FF D0 FF FF path a, pc
0927 E44 CB FF FF FF check irq
0928 E48 C3 FF FF FF reset upc
0929
0930 E4C FF FF FF FF dup 5, null
0931
0932 ;115. ret
0933 E60 BF C1 E5 FF path sp, mar
0934 E64 FF 86 FF FF path [mar], pc
0935 E68 BF C1 E1 FF path sp, a
0936 E6C FF D1 E9 D0 path alu_inc, sp
0937 E70 C3 FF FF FF reset upc
0938
0939 E74 FF FF FF FF dup 3, null
0940
0941 ;116. cli
0942 E80 D3 FF FF FF cli
0943 E84 FD FF FF FF inc pc
0944 E88 C3 FF FF FF reset upc
0945
0946 E8C FF FF FF FF dup 5, null
0947
0948 ;117. sti
0949 EA0 D7 FF FF FF sti
0950 EA4 FD FF FF FF inc pc
0951 EA8 C3 FF FF FF reset upc
0952
0953 EAC FF FF FF FF dup 5, null
0954
0955 ;118. 硬中断处理微指令程序
0956 ; 标志寄存器和断点地址入栈
0957 EC0 BF C1 E1 FF path sp, a
0958 EC4 BF C1 E3 FF path sp, w
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
0545 904 DB D5 FF FF hold DMA ;查询DMA请求
0546 908 C3 FF FF FF reset upc
0547
0548 90C FF FF FF FF dup 5, null
0549
0550 ;73. cmp reg, reg
0551 920 FD FF FF FF inc pc
0552 924 FF 47 EF FF path [pc], ir
0553 928 BF C1 E1 FF path rd, a
0554 92C FF C1 E3 FF path rs, w
0555 930 FF D1 E1 D6 path alu_sub, a
0556 934 FF CB EB FF path al_flag, flag
0557 938 FD FF FF FF inc pc
0558 93C CB FF FF FF check irq
0559 940 C3 FF FF FF reset upc
0560
0561 944 FF FF FF FF dup 7, null
0562
0563 ;75. in al, imm
0564 960 FD FF FF FF inc pc
0565 964 FF 47 EF FF path [pc], ir
0566 968 FD FF FF FF inc pc
0567 96C FF 47 E5 FF path [pc], mar
0568 970 FE 87 E9 FF path <mar>, rd
0569 974 FD FF FF FF inc pc
0570 978 C3 FF FF FF reset upc
0571
0572 97C FF FF FF FF dup 1, null
0573
0574 ;76. in al, dl
0575 980 FD FF FF FF inc pc
0576 984 FF 47 EF FF path [pc], ir
0577 988 FF C1 E5 FF path rs, mar
0578 98C FE 87 E9 FF path <mar>, rd
0579 990 FD FF FF FF inc pc
0580 994 C3 FF FF FF reset upc
0581
0582 998 FF FF FF FF dup 2, null
0583
0584 ;77. out dl, al
0585 9A0 FD FF FF FF inc pc
0586 9A4 FF 47 EF FF path [pc], ir
0587 9A8 BF C1 E5 FF path rd, mar
0588 9AC FE 81 E7 FF path rs, <mar>
0589 9B0 FD FF FF FF inc pc
0590 9B4 C3 FF FF FF reset upc
0591
0592 9B8 FF FF FF FF dup 2, null
0593
0594 ;78. out imm, al
0595 9C0 FD FF FF FF inc pc
0596 9C4 FF 47 EF FF path [pc], ir
0597 9C8 FD FF FF FF inc pc
0598 9CC FF 47 E5 FF path [pc], mar
0599 9D0 FE 81 E7 FF path rs, <mar>
0600 9D4 FD FF FF FF inc pc
0601 9D8 C3 FF FF FF reset upc
0602
0603 9DC FF FF FF FF dup 1, null
0604
0605 ;79. lea reg, symbol
0606 9E0 FD FF FF FF inc pc
0607 9E4 FF 47 EF FF path [pc], ir
0608 9E8 FD FF FF FF inc pc
0609 9EC FF 47 E9 FF path [pc], rd
0610 9F0 FD FF FF FF inc pc
0611 9F4 CB FF FF FF check irq
0612 9F8 C3 FF FF FF reset upc
0613
0614 9FC FF FF FF FF dup 1, null
0615
0616 ;=====================================================================
0617 ;80. ja symbol
0618 A00 CB FF FF FF check irq
0619 A04 FD FF FF FF inc pc
0620 A08 FF C5 E5 FF path pc, mar ;将PC值传送到地址寄存器mar中
0621
0622 ;若转移条件成立,则将地址寄存器mar指定存储单元的值作为跳转地址加载到pc中
0623 ;若转移条件不成立,则PC加1,指向下一条指令
0624 A0C FD 86 7F FF path ja[mar], pc
0625 A10 C3 FF FF FF reset upc
0626
0627 A14 FF FF FF FF dup 3, null
0628
0629 ;=====================================================================
0630 ;81. jb symbol
0631 A20 CB FF FF FF check irq
0632 A24 FD FF FF FF inc pc
0633 A28 FF C5 E5 FF path pc, mar
0634
0635 ;若转移条件成立,则将地址寄存器mar指定存储单元的值作为跳转地址加载到pc中
0636 ;若转移条件不成立,则PC加1,指向下一条指令
0637 A2C FD 86 9F FF path jb[mar], pc
0638 A30 C3 FF FF FF reset upc
0639
0640 A34 FF FF FF FF dup 3, null
0641
0642 ;=====================================================================
0643 ;82. jg symbol
0644 A40 CB FF FF FF check irq
0645 A44 FD FF FF FF inc pc
0646 A48 FF C5 E5 FF path pc, mar
0647
0648 ;若转移条件成立,则将地址寄存器mar指定存储单元的值作为跳转地址加载到pc中
0649 ;若转移条件不成立,则PC加1,指向下一条指令
0650 A4C FD 86 BF FF path jg[mar], pc
0651 A50 C3 FF FF FF reset upc
0652
0653 A54 FF FF FF FF dup 3, null
0654
0655 ;=====================================================================
0656 ;83. jl symbol
0657 A60 CB FF FF FF check irq
0658 A64 FD FF FF FF inc pc
0659 A68 FF C5 E5 FF path pc, mar
0660
0661 ;若转移条件成立,则将地址寄存器mar指定存储单元的值作为跳转地址加载到pc中
0662 ;若转移条件不成立,则PC加1,指向下一条指令
0663 A6C FD 86 DF FF path jl[mar], pc
0664 A70 C3 FF FF FF reset upc
0665
0666 A74 FF FF FF FF dup 3, null
0667
0668 ;=====================================================================
0669 ;84. je symbol
0670 A80 CB FF FF FF check irq
0671 A84 FD FF FF FF inc pc
0672 A88 FF C5 E5 FF path pc, mar
0673
0674 ;若转移条件成立,则将地址寄存器mar指定存储单元的值作为跳转地址加载到pc中
0675 ;若转移条件不成立,则PC加1,指向下一条指令
0676 A8C FD 86 1F FF path jz[mar], pc
0677 A90 C3 FF FF FF reset upc
0678
0679 A94 FF FF FF FF dup 3, null
0680
0681 ;=====================================================================
0682 ;85. jne symbol
0683 AA0 CB FF FF FF check irq
0684 AA4 FD FF FF FF inc pc
0685 AA8 FF C5 E5 FF path pc, mar
0686
0687 ;若转移条件成立,则将地址寄存器mar指定存储单元的值作为跳转地址加载到pc中
0688 ;若转移条件不成立,则PC加1,指向下一条指令
0689 AAC FD 86 3F FF path jnz[mar], pc
0690 AB0 C3 FF FF FF reset upc
0691
0692 AB4 FF FF FF FF dup 3, null
0693
0694 ;=====================================================================
0695 ;86. jc symbol
0696 AC0 CB FF FF FF check irq
0697 AC4 FD FF FF FF inc pc
0698 AC8 FF C5 E5 FF path pc, mar
0699
0700 ;若转移条件成立,则将地址寄存器mar指定存储单元的值作为跳转地址加载到pc中
0701 ;若转移条件不成立,则PC加1,指向下一条指令
0702 ACC FD 86 5F FF path jc[mar], pc
0703 AD0 C3 FF FF FF reset upc
0704
0705 AD4 FF FF FF FF dup 3, null
0706
0707 ;=====================================================================
0708 ;87. jmp symbol
0709 AE0 CB FF FF FF check irq
0710 AE4 FD FF FF FF inc pc
0711 AE8 FF C5 E5 FF path pc, mar
0712
0713 ;将地址寄存器mar指定存储单元的值作为跳转地址加载到pc中,无条件跳转
0714 AEC FD 86 FF FF path jmp[mar], pc
0715 AF0 C3 FF FF FF reset upc
0716
0717 AF4 FF FF FF FF dup 3, null
0718
0719 ;=====================================================================
0720 ;88. loop symbol 将cl作为目的操作数减1,改变零标志,若zf = 1,则跳转
0721 B00 FD FF FF FF inc pc
0722 B04 FF 47 EF FF path [pc], ir
0723 B08 BF C1 E1 FF path rd, a
0724 B0C FF D1 E9 DF path alu_dec, rd
0725 B10 FF CB EB FF path al_flag, flag
0726 B14 FD FF FF FF inc pc
0727 B18 FF C5 E5 FF path pc, mar
0728 B1C FD 86 FF FF path jmp[mar], pc
0729 B20 CB FF FF FF check irq
0730 B24 C3 FF FF FF reset upc
0731
0732 B28 FF FF FF FF dup 6, null
0733
0734 ;====================================================================================================
0735
0736 ; 软中断,首先将标志寄存器入栈,清除中断标志IF,并将当前程序断点的地址入栈保护,从
0737 ; 中断向量表中获取中断入口地址,CPU转向中断入口地址去执行相应的中断服务程序。
0738 ; 中断向量表段地址保存在ES寄存器中
0739 ;90. int immediate
0740 ; 将标志寄存器入栈
0741 B40 FD FF FF FF inc pc
0742 B44 FF 47 EF FF path [pc], ir
0743 B48 BF C1 E1 FF path sp, a
0744 B4C BF C1 E3 FF path sp, w
0745 B50 FF D1 E9 DF path alu_dec, sp
0746 B54 BF C1 E5 FF path sp, mar
0747 B58 FF 83 E7 FF path flag, [mar]
0748 ; 关中断
0749 B5C D3 FF FF FF cli
0750
0751 ; 更新栈顶
0752 B60 BF C1 E1 FF path sp, a
0753 B64 BF C1 E3 FF path sp, w
0754 B68 FF D1 E9 DF path alu_dec, sp
0755
0756 ; 计算中断服务程序入口地址
0757 B6C FD FF FF FF inc pc
0758 B70 FF 47 E5 FF path [pc], mar
0759
0760 B74 FD FF FF FF inc pc ;下一条指令地址(中断返回地址)暂存到a
0761 B78 FF C5 E1 FF path pc, a
0762
0763 ; 将中断服务程序入口地址置入pc,准备执行服务程序
0764 B7C FF 86 FF FF path [mar], pc
0765
0766 ; 将a中的返回地址入栈
0767 B80 BF C1 E5 FF path sp, mar
0768 B84 FF 91 E7 FF path a, [mar]
0769 B88 C3 FF FF FF reset upc
0770
0771 B8C FF FF FF FF dup 5, null
0772
0773 ;====================================================================================================
0774
0775 ;93. iret
0776 ; 先恢复标志寄存器内容
0777 BA0 FD FF FF FF inc pc
0778 BA4 FF 47 EF FF path [pc], ir
0779 BA8 BF C1 E1 FF path sp, a
0780 BAC FF D1 E5 D0 path alu_inc, mar
0781 BB0 FF 87 EB FF path [mar], flag
0782
0783 ; 恢复中断返回地址
0784 BB4 BF C1 E5 FF path sp, mar
0785 BB8 FF 86 FF FF path [mar], pc
0786
0787 ; 计算新的栈顶
0788 BBC BF C1 E1 FF path sp, a
0789 BC0 FF D1 E1 D0 path alu_inc, a
0790 BC4 FF D1 E9 D0 path alu_inc, sp
0791 BC8 C3 FF FF FF reset upc
0792
0793 BCC FF FF FF FF dup 5, null
0794
0795 ;====================================================================================================
0796
0797 ;95. sal reg, reg
0798 BE0 FD FF FF FF inc pc
0799 BE4 FF 47 EF FF path [pc], ir
0800 BE8 FF C1 E3 FF path rs, w
0801 BEC BF C1 E1 FF path rd, a
0802 BF0 FF C9 E8 7F path alu_sal, rd
0803 BF4 FF D3 EB FF path shift_flag, flag
0804 BF8 FD FF FF FF inc pc
0805 BFC CB FF FF FF check irq
0806 C00 C3 FF FF FF reset upc
0807
0808 C04 FF FF FF FF dup 7, null
0809
0810 ;97. sar reg, reg
0811 C20 FD FF FF FF inc pc
0812 C24 FF 47 EF FF path [pc], ir
0813 C28 FF C1 E3 FF path rs, w
0814 C2C BF C1 E1 FF path rd, a
0815 C30 FF C9 E9 7F path alu_sar, rd
0816 C34 FF D3 EB FF path shift_flag, flag
0817 C38 FD FF FF FF inc pc
0818 C3C CB FF FF FF check irq
0819 C40 C3 FF FF FF reset upc
0820
0821 C44 FF FF FF FF dup 7, null
0822
0823 ;99. shl reg, reg
0824 C60 FD FF FF FF inc pc
0825 C64 FF 47 EF FF path [pc], ir
0826 C68 FF C1 E3 FF path rs, w
0827 C6C BF C1 E1 FF path rd, a
0828 C70 FF C9 E8 3F path alu_shl, rd
0829 C74 FF D3 EB FF path shift_flag, flag
0830 C78 FD FF FF FF inc pc
0831 C7C CB FF FF FF check irq
0832 C80 C3 FF FF FF reset upc
0833
0834 C84 FF FF FF FF dup 7, null
0835
0836 ;101. shr reg, reg
0837 CA0 FD FF FF FF inc pc
0838 CA4 FF 47 EF FF path [pc], ir
0839 CA8 FF C1 E3 FF path rs, w
0840 CAC BF C1 E1 FF path rd, a
0841 CB0 FF C9 E9 3F path alu_shr, rd
0842 CB4 FF D3 EB FF path shift_flag, flag
0843 CB8 FD FF FF FF inc pc
0844 CBC CB FF FF FF check irq
0845 CC0 C3 FF FF FF reset upc
0846
0847 CC4 FF FF FF FF dup 7, null
0848
0849 ;103. rol reg, reg
0850 CE0 FD FF FF FF inc pc
0851 CE4 FF 47 EF FF path [pc], ir
0852 CE8 FF C1 E3 FF path rs, w
0853 CEC BF C1 E1 FF path rd, a
0854 CF0 FF C9 E8 BF path alu_rol, rd
0855 CF4 FF D3 EB FF path shift_flag, flag
0856 CF8 FD FF FF FF inc pc
0857 CFC CB FF FF FF check irq
0858 D00 C3 FF FF FF reset upc
0859
0860 D04 FF FF FF FF dup 7, null
0861
0862 ;105. ror reg, reg
0863 D20 FD FF FF FF inc pc
0864 D24 FF 47 EF FF path [pc], ir
0865 D28 FF C1 E3 FF path rs, w
0866 D2C BF C1 E1 FF path rd, a
0867 D30 FF C9 E9 BF path alu_ror, rd
0868 D34 FF D3 EB FF path shift_flag, flag
0869 D38 FD FF FF FF inc pc
0870 D3C CB FF FF FF check irq
0871 D40 C3 FF FF FF reset upc
0872
0873 D44 FF FF FF FF dup 7, null
0874
0875 ;107. rcl reg, reg
0876 D60 FD FF FF FF inc pc
0877 D64 FF 47 EF FF path [pc], ir
0878 D68 FF C1 E3 FF path rs, w
0879 D6C BF C1 E1 FF path rd, a
0880 D70 FF C9 E8 FF path alu_rcl, rd
0881 D74 FF D3 EB FF path shift_flag, flag
0882 D78 FD FF FF FF inc pc
0883 D7C CB FF FF FF check irq
0884 D80 C3 FF FF FF reset upc
0885
0886 D84 FF FF FF FF dup 7, null
0887
0888 ;109. rcr reg, reg
0889 DA0 FD FF FF FF inc pc
0890 DA4 FF 47 EF FF path [pc], ir
0891 DA8 FF C1 E3 FF path rs, w
0892 DAC BF C1 E1 FF path rd, a
0893 DB0 FF C9 E9 FF path alu_rcr, rd
0894 DB4 FF D3 EB FF path shift_flag, flag
0895 DB8 FD FF FF FF inc pc
0896 DBC CB FF FF FF check irq
0897 DC0 C3 FF FF FF reset upc
0898
0899 DC4 FF FF FF FF dup 7, null
0900
0901 ;111. nop
0902 DE0 FD FF FF FF inc pc
0903 DE4 C3 FF FF FF reset upc
0904
0905 DE8 FF FF FF FF dup 6, null
0906
0907 ;112. hlt
0908 E00 C3 FF FF FF reset upc
0909 E04 FF FF FF FF dup 7, null
0910
0911 ;113. call symbol
0912 ; 计算新的栈顶
0913 E20 BF C1 E1 FF path sp, a
0914 E24 BF C1 E3 FF path sp, w
0915 E28 FF D1 E9 DF path alu_dec, sp
0916 E2C BF C1 E5 FF path sp, mar
0917
0918 ; 读出标号指定的跳转地址并暂存到寄存器a中
0919 E30 FD FF FF FF inc pc
0920 E34 FF 47 E1 FF path [pc], a
0921
0922 ; 将下一条指令地址(中断返回地址)入栈
0923 E38 FD FF FF FF inc pc
0924 E3C FF 85 E7 FF path pc, [mar]
0925
0926 ; 将a中暂存的跳转地址置入pc,实现调用
0927 E40 FF D0 FF FF path a, pc
0928 E44 CB FF FF FF check irq
0929 E48 C3 FF FF FF reset upc
0930
0931 E4C FF FF FF FF dup 5, null
0932
0933 ;115. ret
0934 E60 BF C1 E5 FF path sp, mar
0935 E64 FF 86 FF FF path [mar], pc
0936 E68 BF C1 E1 FF path sp, a
0937 E6C FF D1 E9 D0 path alu_inc, sp
0938 E70 C3 FF FF FF reset upc
0939
0940 E74 FF FF FF FF dup 3, null
0941
0942 ;116. cli
0943 E80 D3 FF FF FF cli
0944 E84 FD FF FF FF inc pc
0945 E88 C3 FF FF FF reset upc
0946
0947 E8C FF FF FF FF dup 5, null
0948
0949 ;117. sti
0950 EA0 D7 FF FF FF sti
0951 EA4 FD FF FF FF inc pc
0952 EA8 C3 FF FF FF reset upc
0953
0954 EAC FF FF FF FF dup 5, null
0955
0956 ;118. 硬中断处理微指令程序
0957 ; 标志寄存器和断点地址入栈
0958 EC0 BF C1 E1 FF path sp, a
0959 EC4 BF C1 E3 FF path sp, w
0960 EC8 FF D1 E9 DF path alu_dec, sp
0961 ECC BF C1 E5 FF path sp, mar
0962 ED0 FF 83 E7 FF path flag, [mar]
0963 ED4 BF C1 E1 FF path sp, a
0964 ED8 FF D1 E9 DF path alu_dec, sp
0965 EDC BF C1 E5 FF path sp, mar
0966 EE0 FF 85 E7 FF path pc, [mar]
0967
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 ;读取中断号并送入地址寄存器中
0969 EE4 CF FF FF FF inta
0970 EE8 FF FF FF FF dup 1, null ;插入空闲周期
0971 EEC 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
0973 EF0 FF 86 FF FF path [mar], pc
0974 EF4 C3 FF FF FF reset upc
0975
0976 EFC FF FF FF FF dup 1, null
0976 EF8 FF FF FF FF dup 2, null
0977
0978 ;120. inc reg
0979 F00 FD FF FF FF inc pc
......
......@@ -14,7 +14,7 @@ path [pc], ir
inc pc
path [pc], rd
inc pc
check irq
check irq ;查询硬中断
reset upc
dup 1, null
......@@ -306,7 +306,7 @@ reset upc
dup 6, null
;40.
;40.
dup 8, null
;41.
......@@ -542,9 +542,10 @@ path alu_sub, a
path al_flag, flag
inc pc
check irq
hold DMA ;查询DMA请求
reset upc
dup 6, null
dup 5, null
;73. cmp reg, reg
inc pc
......@@ -963,8 +964,7 @@ path sp, a
path alu_dec, sp
path sp, mar
path pc, [mar]
; IF标志置位,开中断,允许中断嵌套
sti
; 获取中断号中断服务程序入口地址
inta
dup 1, null ;插入空闲周期
......@@ -973,7 +973,7 @@ path inta, mar ;读取中断号并送入地址寄存器中
path [mar], pc
reset upc
dup 1, null
dup 2, null
;120. inc reg
inc pc
......
GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG߿GGGGGGGGGGGGGG?_GG߿GGGGG?G?GGGG߿G߿߿GG
\ No newline at end of file
GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG߿GGGGGGGGGGGGGG?_GG߿GGGGG?G?GGGG߿G߿߿GG
\ No newline at end of file
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论