提交 68d72d17 创建 作者: 李川's avatar 李川

Merge branch 'iret' into 'master'

修改中断返回指令对应的微程序 See merge request engintime/Dream-Logic/Intel-classic-chips/8086!15
没有这种文件类型的预览
这个 源代码变更 因为 太大 而不能显示。 你可以 浏览blob
没有这种文件类型的预览
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<svg height="4370" version="1.1" width="6997" xmlns="http://www.w3.org/2000/svg">
<svg height="4433" version="1.1" width="6364" xmlns="http://www.w3.org/2000/svg">
<polygon fill="#ffff80" points="76 3320, 76 3295, 201 3295, 226 3320, 201 3345, 76 3345, 76 3320" stroke="#800000" stroke-width="1"/>
......@@ -679,7 +679,7 @@
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="15" font-weight="400" text-anchor="start" x="3736" y="2960">PC_ADD</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="15" font-weight="400" text-anchor="start" x="5606" y="3390">UPC_RESET_EN</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="15" font-weight="400" text-anchor="start" x="5526" y="3390">UPC_RESET_EN</text>
<polygon fill="#ffff80" points="76 3250, 76 3225, 201 3225, 226 3250, 201 3275, 76 3275, 76 3250" stroke="#800000" stroke-width="1"/>
......@@ -971,13 +971,13 @@
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="4506" y="2910">MIO</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="15" font-weight="400" text-anchor="start" x="5606" y="3420">IR_LOAD</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="15" font-weight="400" text-anchor="start" x="5526" y="3420">IR_LOAD</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="1236" y="1680">IR_LOAD</text>
<polygon fill="#ffff80" points="6486 2950, 6486 2925, 6711 2925, 6736 2950, 6711 2975, 6486 2975, 6486 2950" stroke="#800000" stroke-width="1"/>
<polygon fill="#ffff80" points="5786 3010, 5786 2985, 6011 2985, 6036 3010, 6011 3035, 5786 3035, 5786 3010" stroke="#800000" stroke-width="1"/>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="6486" y="2950">HLDA</text>
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="5786" y="3010">HLDA</text>
<polygon fill="#ffff80" points="4506 1400, 4506 1375, 4731 1375, 4756 1400, 4731 1425, 4506 1425, 4506 1400" stroke="#800000" stroke-width="1"/>
......@@ -1113,15 +1113,9 @@
<polyline fill="none" points="3656 2900, 4466 2900, 4466 2850, 4506 2850" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="5526 2190, 5776 2190" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="5576" y="2190">IR_EN</text>
<polyline fill="none" points="5526 3390, 5746 3390" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="5526 3450, 5746 3450" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="15" font-weight="400" text-anchor="start" x="5606" y="3450">CHECK_IRQ</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="15" font-weight="400" text-anchor="start" x="5526" y="3450">CHECK_IRQ</text>
<polygon fill="#ffff80" points="76 3860, 76 3835, 201 3835, 226 3860, 201 3885, 76 3885, 76 3860" stroke="#800000" stroke-width="1"/>
......@@ -1153,7 +1147,7 @@
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="5776" y="3480">INTA</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="15" font-weight="400" text-anchor="start" x="5606" y="3480">INTA</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="15" font-weight="400" text-anchor="start" x="5526" y="3480">INTA</text>
<polygon fill="#ffff80" points="5776 3510, 5776 3495, 5961 3495, 5976 3510, 5961 3525, 5776 3525, 5776 3510" stroke="#800000" stroke-width="1"/>
......@@ -1163,24 +1157,12 @@
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="5776" y="3540">STI</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="15" font-weight="400" text-anchor="start" x="5606" y="3510">CLI</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="15" font-weight="400" text-anchor="start" x="5526" y="3510">CLI</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="15" font-weight="400" text-anchor="start" x="5606" y="3540">STI</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="15" font-weight="400" text-anchor="start" x="5526" y="3540">STI</text>
<text alignment-baseline="after-edge" fill="#000080" font-family="宋体" font-size="25" font-weight="400" text-anchor="start" x="1256" y="1760">取指令</text>
<polyline fill="none" points="5276 2160, 5076 2160, 4346 2160, 4346 2660, 3656 2660" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="5076" x2="5076" y1="1860" y2="1910"/>
<polygon fill="#ffffff" fill-opacity="0.5" points="5076 1860, 5126 1810, 5026 1810, 5076 1860" stroke="#000000" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="Times New Roman" font-size="30" font-weight="700" text-anchor="start" x="5066" y="1850">1</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="5066" y="1780">U12</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="4986" y="1810">CONSTANT1</text>
<polyline fill="none" points="3656 2940, 4476 2940, 4476 2910, 4506 2910" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="5326" x2="5276" y1="3010" y2="3010"/>
......@@ -1295,8 +1277,6 @@
<polyline fill="none" points="3656 2860, 4446 2860, 4446 2690, 5276 2690" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="5276 2100, 5076 2100, 5076 1910" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="3656 2840, 4426 2840, 4426 2630, 4926 2630, 4926 3010, 5276 3010" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="5136" x2="5076" y1="2630" y2="2630"/>
......@@ -1533,20 +1513,18 @@
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="986" y="3910">INT_RESPOND</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1376" x2="1376" y1="230" y2="280"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1076" x2="1076" y1="240" y2="290"/>
<polygon fill="#ffffff" fill-opacity="0.5" points="1376 230, 1426 180, 1326 180, 1376 230" stroke="#000000" stroke-width="5"/>
<polygon fill="#ffffff" fill-opacity="0.5" points="1076 240, 1126 190, 1026 190, 1076 240" stroke="#000000" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="Times New Roman" font-size="30" font-weight="700" text-anchor="start" x="1366" y="220">1</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Times New Roman" font-size="30" font-weight="700" text-anchor="start" x="1066" y="230">1</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="1366" y="150">U14</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="1066" y="160">U14</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="1286" y="180">CONSTANT1</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="986" y="190">CONSTANT1</text>
<polyline fill="none" points="1626 170, 1576 170, 1576 290, 1626 290" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="1576 290, 1376 290, 1376 280" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="1626 560, 1526 560, 1526 980" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="1626 590, 1506 590, 1506 1010" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
......@@ -2517,9 +2495,7 @@
<text alignment-baseline="central" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="76" y="4240">HOLD</text>
<polyline fill="none" points="5526 3570, 5746 3570" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="15" font-weight="400" text-anchor="start" x="5606" y="3570">CHECK_HOLD</text>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="15" font-weight="400" text-anchor="start" x="5526" y="3570">CHECK_HOLD</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="336" x2="276" y1="4240" y2="4240"/>
......@@ -2537,7 +2513,7 @@
<polyline fill="none" points="476 4240, 636 4240" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="636 4290, 486 4290" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="636 4290, 486 4290, 486 4410, 5686 4410, 5686 3570, 5526 3570" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#800000" font-family="Times New Roman" font-size="25" font-weight="400" text-anchor="start" x="486" y="4290">CHECK_HOLD</text>
......@@ -2547,7 +2523,7 @@
<polyline fill="none" points="636 3880, 536 3880" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="636 3940, 486 3940" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="636 3940, 486 3940, 486 4060, 5736 4060, 5736 3450, 5526 3450" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="286 3860, 226 3860" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
......@@ -2585,23 +2561,19 @@
<text alignment-baseline="after-edge" fill="#000080" font-family="宋体" font-size="25" font-weight="400" text-anchor="start" x="16" y="4160">总线保持请求信号,高电平有效</text>
<text alignment-baseline="after-edge" fill="#000080" font-family="宋体" font-size="25" font-weight="400" text-anchor="start" x="6476" y="2900">总线保持响应信号,高电平有效</text>
<text alignment-baseline="after-edge" fill="#000080" font-family="宋体" font-size="25" font-weight="400" text-anchor="start" x="5746" y="3100">总线保持响应信号,高电平有效</text>
<polyline fill="none" points="5526 2950, 6186 2950" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="5646" x2="5586" y1="3010" y2="3010"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="6246" x2="6186" y1="2950" y2="2950"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="5726" x2="5786" y1="3010" y2="3010"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="6326" x2="6386" y1="2950" y2="2950"/>
<circle cx="5722" cy="3010" fill="none" r="5" stroke="#000000" stroke-width="5"/>
<circle cx="6322" cy="2950" fill="none" r="5" stroke="#000000" stroke-width="5"/>
<polygon fill="#ffffff" fill-opacity="0.5" points="5646 2960, 5646 3060, 5716 3010, 5646 2960" stroke="#000000" stroke-width="5"/>
<polygon fill="#ffffff" fill-opacity="0.5" points="6246 2900, 6246 3000, 6316 2950, 6246 2900" stroke="#000000" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="5666" y="2974">U8</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="6266" y="2914">U8</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="6246" y="3046">NOT</text>
<polyline fill="none" points="6386 2950, 6486 2950" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="5646" y="3106">NOT</text>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="1356" x2="1296" y1="3120" y2="3120"/>
......@@ -2625,6 +2597,30 @@
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="1366" y="3250">NAND3</text>
<polyline fill="none" points="1576 290, 1076 290" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="5046" x2="4986" y1="2100" y2="2100"/>
<line stroke="#000000" stroke-linecap="round" stroke-width="5" x1="5126" x2="5186" y1="2100" y2="2100"/>
<circle cx="5122" cy="2100" fill="none" r="5" stroke="#000000" stroke-width="5"/>
<polygon fill="#ffffff" fill-opacity="0.5" points="5046 2050, 5046 2150, 5116 2100, 5046 2050" stroke="#000000" stroke-width="5"/>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="5066" y="2064">U9</text>
<text alignment-baseline="after-edge" fill="#000000" font-family="Arial" font-size="25" font-weight="700" text-anchor="start" x="5046" y="2196">NOT</text>
<polyline fill="none" points="5276 2100, 5186 2100" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="3656 2660, 4346 2660, 4346 2100, 4986 2100" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="5526 2950, 5586 2950, 5586 3010" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="5526 3390, 5686 3390" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<polyline fill="none" points="5526 2190, 5686 2190" stroke="#0000ff" stroke-linecap="round" stroke-linejoin="round" stroke-width="5"/>
<circle cx="1576" cy="3780" fill="#0000ff" r="8" stroke="#0000ff" stroke-width="5"/>
<circle cx="2166" cy="320" fill="#0000ff" r="8" stroke="#0000ff" stroke-width="5"/>
......@@ -2659,8 +2655,6 @@
<circle cx="1526" cy="980" fill="#0000ff" r="8" stroke="#0000ff" stroke-width="5"/>
<circle cx="1576" cy="290" fill="#0000ff" r="8" stroke="#0000ff" stroke-width="5"/>
<circle cx="1576" cy="3700" fill="#0000ff" r="8" stroke="#0000ff" stroke-width="5"/>
<circle cx="4926" cy="2630" fill="#0000ff" r="8" stroke="#0000ff" stroke-width="5"/>
......@@ -2747,4 +2741,6 @@
<circle cx="1236" cy="3910" fill="#0000ff" r="8" stroke="#0000ff" stroke-width="5"/>
<circle cx="1576" cy="290" fill="#0000ff" r="8" stroke="#0000ff" stroke-width="5"/>
</svg>
没有这种文件类型的预览
......@@ -883,267 +883,271 @@
0883
0884
0885 ;====================================================================================================
0886 ; 硬中断返回指令,执行出栈操作
0886 ; 中断返回指令,执行出栈操作,后进先出
0887 ;93. iret
0888 ; 先恢复标志寄存器内容,即标志寄存器FLAG出栈
0889 BA0 FD FF FF FF inc pc
0890 BA4 FF 47 EF FF path [pc], ir
0891 BA8 BF C1 E1 FF path sp, a
0892 BAC FF D1 E5 D0 path alu_inc, mar
0893 BB0 FF 87 EB FF path [mar], flag
0888 BA0 FD FF FF FF inc pc
0889 BA4 FF 47 EF FF path [pc], ir
0890
0891 ; 恢复中断返回地址,即中断返回地址出栈
0892 BA8 BF C1 E5 FF path sp, mar
0893 BAC FF 86 FF FF path [mar], pc
0894
0895 ; 恢复中断返回地址,即中断返回地址出栈
0896 BB4 BF C1 E5 FF path sp, mar
0897 BB8 FF 86 FF FF path [mar], pc
0895 ; 出栈后栈顶指针寄存器sp加1,指向先于返回地址入栈的对象
0896 BB0 BF C1 E1 FF path sp, a
0897 BB4 FF D1 E9 D0 path alu_inc, sp
0898
0899 ; 更新栈顶
0900 BBC BF C1 E1 FF path sp, a
0901 BC0 FF D1 E1 D0 path alu_inc, a
0902 BC4 FF D1 E9 D0 path alu_inc, sp
0903 BC8 C3 FF FF FF reset upc
0904
0905 BCC FF FF FF FF dup 5, null
0906
0907
0908 ;====================================================================================================
0909
0910 ;95. sal rd, rs 算术左移指令
0911 BE0 FD FF FF FF inc pc
0912 BE4 FF 47 EF FF path [pc], ir
0913 BE8 FF C1 E3 FF path rs, w
0914 BEC BF C1 E1 FF path rd, a
0915 BF0 FF C9 E8 7F path alu_sal, rd
0916 BF4 FF D3 EB FF path shift_flag, flag
0917 BF8 FD FF FF FF inc pc
0918 BFC CB FF FF FF check irq
0919 C00 C3 FF FF FF reset upc
0920
0921 C04 FF FF FF FF dup 7, null
0922
0923
0924 ;===========================================================================
0925 ;97. sar rd, rs 算术右移指令
0926 C20 FD FF FF FF inc pc
0927 C24 FF 47 EF FF path [pc], ir
0928 C28 FF C1 E3 FF path rs, w
0929 C2C BF C1 E1 FF path rd, a
0930 C30 FF C9 E9 7F path alu_sar, rd
0931 C34 FF D3 EB FF path shift_flag, flag
0932 C38 FD FF FF FF inc pc
0933 C3C CB FF FF FF check irq
0934 C40 C3 FF FF FF reset upc
0935
0936 C44 FF FF FF FF dup 7, null
0937
0938
0939 ;===========================================================================
0940 ;99. shl rd, rs 逻辑左移指令
0941 C60 FD FF FF FF inc pc
0942 C64 FF 47 EF FF path [pc], ir
0943 C68 FF C1 E3 FF path rs, w
0944 C6C BF C1 E1 FF path rd, a
0945 C70 FF C9 E8 3F path alu_shl, rd
0946 C74 FF D3 EB FF path shift_flag, flag
0947 C78 FD FF FF FF inc pc
0948 C7C CB FF FF FF check irq
0949 C80 C3 FF FF FF reset upc
0950
0951 C84 FF FF FF FF dup 7, null
0952
0953
0954 ;===========================================================================
0955 ;101. shr rd, rs 逻辑右移指令
0956 CA0 FD FF FF FF inc pc
0957 CA4 FF 47 EF FF path [pc], ir
0958 CA8 FF C1 E3 FF path rs, w
0959 CAC BF C1 E1 FF path rd, a
0960 CB0 FF C9 E9 3F path alu_shr, rd
0961 CB4 FF D3 EB FF path shift_flag, flag
0962 CB8 FD FF FF FF inc pc
0963 CBC CB FF FF FF check irq
0964 CC0 C3 FF FF FF reset upc
0965
0966 CC4 FF FF FF FF dup 7, null
0967
0968
0969 ;===========================================================================
0970 ;103. rol rd, rs 不带进位的循环左移指令
0971 CE0 FD FF FF FF inc pc
0972 CE4 FF 47 EF FF path [pc], ir
0973 CE8 FF C1 E3 FF path rs, w
0974 CEC BF C1 E1 FF path rd, a
0975 CF0 FF C9 E8 BF path alu_rol, rd
0976 CF4 FF D3 EB FF path shift_flag, flag
0977 CF8 FD FF FF FF inc pc
0978 CFC CB FF FF FF check irq
0979 D00 C3 FF FF FF reset upc
0980
0981 D04 FF FF FF FF dup 7, null
0982
0983
0984 ;===========================================================================
0985 ;105. ror rd, rs 不带进位的循环右移指令
0986 D20 FD FF FF FF inc pc
0987 D24 FF 47 EF FF path [pc], ir
0988 D28 FF C1 E3 FF path rs, w
0989 D2C BF C1 E1 FF path rd, a
0990 D30 FF C9 E9 BF path alu_ror, rd
0991 D34 FF D3 EB FF path shift_flag, flag
0992 D38 FD FF FF FF inc pc
0993 D3C CB FF FF FF check irq
0994 D40 C3 FF FF FF reset upc
0995
0996 D44 FF FF FF FF dup 7, null
0997
0998
0999 ;===========================================================================
1000 ;107. rcl rd, rs 带进位的循环左移指令
1001 D60 FD FF FF FF inc pc
1002 D64 FF 47 EF FF path [pc], ir
1003 D68 FF C1 E3 FF path rs, w
1004 D6C BF C1 E1 FF path rd, a
1005 D70 FF C9 E8 FF path alu_rcl, rd
1006 D74 FF D3 EB FF path shift_flag, flag
1007 D78 FD FF FF FF inc pc
1008 D7C CB FF FF FF check irq
1009 D80 C3 FF FF FF reset upc
1010
1011 D84 FF FF FF FF dup 7, null
1012
1013
1014 ;===========================================================================
1015 ;109. rcr rd, rs 带进位的循环右移指令
1016 DA0 FD FF FF FF inc pc
1017 DA4 FF 47 EF FF path [pc], ir
1018 DA8 FF C1 E3 FF path rs, w
1019 DAC BF C1 E1 FF path rd, a
1020 DB0 FF C9 E9 FF path alu_rcr, rd
1021 DB4 FF D3 EB FF path shift_flag, flag
1022 DB8 FD FF FF FF inc pc
1023 DBC CB FF FF FF check irq
1024 DC0 C3 FF FF FF reset upc
1025
1026 DC4 FF FF FF FF dup 7, null
1027
1028 ;===========================================================================
1029 ;111. nop 空指令
1030 DE0 FD FF FF FF inc pc
1031 DE4 C3 FF FF FF reset upc
1032
1033 DE8 FF FF FF FF dup 6, null
1034
1035 ;===========================================================================
1036 ;112. hlt 停机
1037 E00 C3 FF FF FF reset upc
1038 E04 FF FF FF FF dup 7, null
1039
1040
1041 ;===========================================================================
1042 ;113. call symbol
1043 ; 更新栈顶
1044 E20 BF C1 E1 FF path sp, a
1045 E24 BF C1 E3 FF path sp, w
1046 E28 FF D1 E9 DF path alu_dec, sp ; sp = sp - 1
1047 E2C BF C1 E5 FF path sp, mar ; 将sp转移到mar中,为返回地址入栈做准备
1048
1049 ; 读出标号指定的跳转地址并暂存到寄存器a中
1050 E30 FD FF FF FF inc pc
1051 E34 FF 47 E1 FF path [pc], a
0899 ; 恢复标志寄存器内容,即标志寄存器FLAG出栈
0900 BB8 BF C1 E5 FF path sp, mar
0901 BBC FF 87 EB FF path [mar], flag
0902
0903 ; 出栈后栈顶指针寄存器sp加1,指向先于标志寄存器入栈的对象
0904 BC0 BF C1 E1 FF path sp, a
0905 BC4 FF D1 E9 D0 path alu_inc, sp
0906 BC8 CB FF FF FF check irq
0907 BCC C3 FF FF FF reset upc
0908
0909 BD0 FF FF FF FF dup 4, null
0910
0911
0912 ;====================================================================================================
0913
0914 ;95. sal rd, rs 算术左移指令
0915 BE0 FD FF FF FF inc pc
0916 BE4 FF 47 EF FF path [pc], ir
0917 BE8 FF C1 E3 FF path rs, w
0918 BEC BF C1 E1 FF path rd, a
0919 BF0 FF C9 E8 7F path alu_sal, rd
0920 BF4 FF D3 EB FF path shift_flag, flag
0921 BF8 FD FF FF FF inc pc
0922 BFC CB FF FF FF check irq
0923 C00 C3 FF FF FF reset upc
0924
0925 C04 FF FF FF FF dup 7, null
0926
0927
0928 ;===========================================================================
0929 ;97. sar rd, rs 算术右移指令
0930 C20 FD FF FF FF inc pc
0931 C24 FF 47 EF FF path [pc], ir
0932 C28 FF C1 E3 FF path rs, w
0933 C2C BF C1 E1 FF path rd, a
0934 C30 FF C9 E9 7F path alu_sar, rd
0935 C34 FF D3 EB FF path shift_flag, flag
0936 C38 FD FF FF FF inc pc
0937 C3C CB FF FF FF check irq
0938 C40 C3 FF FF FF reset upc
0939
0940 C44 FF FF FF FF dup 7, null
0941
0942
0943 ;===========================================================================
0944 ;99. shl rd, rs 逻辑左移指令
0945 C60 FD FF FF FF inc pc
0946 C64 FF 47 EF FF path [pc], ir
0947 C68 FF C1 E3 FF path rs, w
0948 C6C BF C1 E1 FF path rd, a
0949 C70 FF C9 E8 3F path alu_shl, rd
0950 C74 FF D3 EB FF path shift_flag, flag
0951 C78 FD FF FF FF inc pc
0952 C7C CB FF FF FF check irq
0953 C80 C3 FF FF FF reset upc
0954
0955 C84 FF FF FF FF dup 7, null
0956
0957
0958 ;===========================================================================
0959 ;101. shr rd, rs 逻辑右移指令
0960 CA0 FD FF FF FF inc pc
0961 CA4 FF 47 EF FF path [pc], ir
0962 CA8 FF C1 E3 FF path rs, w
0963 CAC BF C1 E1 FF path rd, a
0964 CB0 FF C9 E9 3F path alu_shr, rd
0965 CB4 FF D3 EB FF path shift_flag, flag
0966 CB8 FD FF FF FF inc pc
0967 CBC CB FF FF FF check irq
0968 CC0 C3 FF FF FF reset upc
0969
0970 CC4 FF FF FF FF dup 7, null
0971
0972
0973 ;===========================================================================
0974 ;103. rol rd, rs 不带进位的循环左移指令
0975 CE0 FD FF FF FF inc pc
0976 CE4 FF 47 EF FF path [pc], ir
0977 CE8 FF C1 E3 FF path rs, w
0978 CEC BF C1 E1 FF path rd, a
0979 CF0 FF C9 E8 BF path alu_rol, rd
0980 CF4 FF D3 EB FF path shift_flag, flag
0981 CF8 FD FF FF FF inc pc
0982 CFC CB FF FF FF check irq
0983 D00 C3 FF FF FF reset upc
0984
0985 D04 FF FF FF FF dup 7, null
0986
0987
0988 ;===========================================================================
0989 ;105. ror rd, rs 不带进位的循环右移指令
0990 D20 FD FF FF FF inc pc
0991 D24 FF 47 EF FF path [pc], ir
0992 D28 FF C1 E3 FF path rs, w
0993 D2C BF C1 E1 FF path rd, a
0994 D30 FF C9 E9 BF path alu_ror, rd
0995 D34 FF D3 EB FF path shift_flag, flag
0996 D38 FD FF FF FF inc pc
0997 D3C CB FF FF FF check irq
0998 D40 C3 FF FF FF reset upc
0999
1000 D44 FF FF FF FF dup 7, null
1001
1002
1003 ;===========================================================================
1004 ;107. rcl rd, rs 带进位的循环左移指令
1005 D60 FD FF FF FF inc pc
1006 D64 FF 47 EF FF path [pc], ir
1007 D68 FF C1 E3 FF path rs, w
1008 D6C BF C1 E1 FF path rd, a
1009 D70 FF C9 E8 FF path alu_rcl, rd
1010 D74 FF D3 EB FF path shift_flag, flag
1011 D78 FD FF FF FF inc pc
1012 D7C CB FF FF FF check irq
1013 D80 C3 FF FF FF reset upc
1014
1015 D84 FF FF FF FF dup 7, null
1016
1017
1018 ;===========================================================================
1019 ;109. rcr rd, rs 带进位的循环右移指令
1020 DA0 FD FF FF FF inc pc
1021 DA4 FF 47 EF FF path [pc], ir
1022 DA8 FF C1 E3 FF path rs, w
1023 DAC BF C1 E1 FF path rd, a
1024 DB0 FF C9 E9 FF path alu_rcr, rd
1025 DB4 FF D3 EB FF path shift_flag, flag
1026 DB8 FD FF FF FF inc pc
1027 DBC CB FF FF FF check irq
1028 DC0 C3 FF FF FF reset upc
1029
1030 DC4 FF FF FF FF dup 7, null
1031
1032 ;===========================================================================
1033 ;111. nop 空指令
1034 DE0 FD FF FF FF inc pc
1035 DE4 C3 FF FF FF reset upc
1036
1037 DE8 FF FF FF FF dup 6, null
1038
1039 ;===========================================================================
1040 ;112. hlt 停机
1041 E00 C3 FF FF FF reset upc
1042 E04 FF FF FF FF dup 7, null
1043
1044
1045 ;===========================================================================
1046 ;113. call symbol
1047 ; 更新栈顶
1048 E20 BF C1 E1 FF path sp, a
1049 E24 BF C1 E3 FF path sp, w
1050 E28 FF D1 E9 DF path alu_dec, sp ; sp = sp - 1
1051 E2C BF C1 E5 FF path sp, mar ; 将sp转移到mar中,为返回地址入栈做准备
1052
1053 ; 将下一条指令地址(中断返回地址)入栈
1054 E38 FD FF FF FF inc pc
1055 E3C FF 85 E7 FF path pc, [mar]
1053 ; 读出标号指定的跳转地址并暂存到寄存器a中
1054 E30 FD FF FF FF inc pc
1055 E34 FF 47 E1 FF path [pc], a
1056
1057 ; 将a中暂存的跳转地址置入pc,实现子程序调用
1058 E40 FF D0 FF FF path a, pc
1059 E44 CB FF FF FF check irq
1060 E48 C3 FF FF FF reset upc
1061
1062 E4C FF FF FF FF dup 5, null
1063
1064 ;===========================================================================
1065 ;115. ret 子程序调用返回指令
1066 E60 BF C1 E5 FF path sp, mar
1067 E64 FF 86 FF FF path [mar], pc ; 首先读出栈指针sp指向存储单元的内容,即返回地址,
1068 ; 将其加载到PC中,实现调用返回
1069
1070 E68 BF C1 E1 FF path sp, a
1071 E6C FF D1 E9 D0 path alu_inc, sp ; 然后将sp加1,sp指向新的栈顶,即出栈
1072 ; 出栈时,栈顶向高地址空间生长
1073 E70 C3 FF FF FF reset upc
1074
1075 E74 FF FF FF FF dup 3, null
1076
1077
1078 ;===========================================================================
1079 ;116. cli 关中断指令
1080 E80 D3 FF FF FF cli ; 清零中断标志允许位IF=0,禁止硬中断请求
1081 E84 FD FF FF FF inc pc
1082 E88 C3 FF FF FF reset upc
1083
1084 E8C FF FF FF FF dup 5, null
1085
1086 ;===========================================================================
1087 ;117. sti 开中断指令
1088 EA0 D7 FF FF FF sti ; 设置中断允许标志位IF=1,允许硬中断请求
1089 EA4 FD FF FF FF inc pc
1090 EA8 C3 FF FF FF reset upc
1091
1092 EAC FF FF FF FF dup 5, null
1093
1094
1095 ;===========================================================================
1096 ;118. 硬中断处理微指令程序
1097 ; 标志寄存器和断点地址入栈
1098 EC0 BF C1 E1 FF path sp, a
1099 EC4 BF C1 E3 FF path sp, w
1100 EC8 FF D1 E9 DF path alu_dec, sp ; sp减1,指向新的栈顶,为标志寄存器入栈做准备
1101 ECC BF C1 E5 FF path sp, mar
1102 ED0 FF 83 E7 FF path flag, [mar] ; 将标志寄存器入栈,入栈时,栈向低地址空间生长
1103 ED4 BF C1 E1 FF path sp, a
1104 ED8 FF D1 E9 DF path alu_dec, sp ; sp减1,为返回地址入栈做准备
1105 EDC BF C1 E5 FF path sp, mar
1106 EE0 FF 85 E7 FF path pc, [mar] ; 当前PC指向下一条指令,正是返回地址,将其入栈
1107
1108
1109 ; 从8259读取中断号,依据中断号得到对应中断向量
1110 EE4 CF FF FF FF inta ; cpu 发出第一个中断应答信号INTA
1111 EE8 FF FF FF FF dup 1, null ; 插入空闲周期,其目的是分开前后两次发出的中断应答信号,便于8259进行识别
1112 ; 使得INTA信号的变化情况为 低电平--高电平--低电平,其中低电平表示应答信号有效
1113 EEC CE C7 E5 FF path inta, mar ; cpu发出第二个中断应答信号INTA,读取中断向量并送入地址寄存器中
1114
1115
1116 ; 转移到中断服务程序执行
1117 EF0 FF 86 FF FF path [mar], pc ; 将mar中的中断向量指向存储单元的内容传送到PC中,
1118 ; 中断向量指向的存储单元实际存储的就是该中断服务程序的入口地址(首条指令地址)
1119 ; 于是,PC转去执行中断服务程序
1120 EF4 C3 FF FF FF reset upc
1121
1122 EF8 FF FF FF FF dup 2, null
1123
1124
1125 ;===========================================================================
1126 ;120. inc rd 自增
1127 F00 FD FF FF FF inc pc
1128 F04 FF 47 EF FF path [pc], ir
1129 F08 BF C1 E1 FF path rd, a
1130 F0C FF D1 E9 D0 path alu_inc, rd ; 将累加器a加1的结果写入目的寄存器rd中
1131 F10 FF CB EB FF path al_flag, flag
1132 F14 FD FF FF FF inc pc
1133 F18 CB FF FF FF check irq
1134 F1C C3 FF FF FF reset upc
1135
1136
1137 ;===========================================================================
1138 ;121. dec rd 自减
1139 F20 FD FF FF FF inc pc
1140 F24 FF 47 EF FF path [pc], ir
1141 F28 BF C1 E1 FF path rd, a
1142 F2C BF C1 E3 FF path rd, w
1143 F30 FF D1 E9 DF path alu_dec, rd ; 将累加器a减1的结果写入目的寄存器rd中
1144 F34 FF CB EB FF path al_flag, flag
1145 F38 FD FF FF FF inc pc
1146 F3C CB FF FF FF check irq
1147 F40 C3 FF FF FF reset upc
1148
1149 F44 FF FF FF FF dup 7, null
\ No newline at end of file
1057 ; 将下一条指令地址(中断返回地址)入栈
1058 E38 FD FF FF FF inc pc
1059 E3C FF 85 E7 FF path pc, [mar]
1060
1061 ; 将a中暂存的跳转地址置入pc,实现子程序调用
1062 E40 FF D0 FF FF path a, pc
1063 E44 CB FF FF FF check irq
1064 E48 C3 FF FF FF reset upc
1065
1066 E4C FF FF FF FF dup 5, null
1067
1068 ;===========================================================================
1069 ;115. ret 子程序调用返回指令
1070 E60 BF C1 E5 FF path sp, mar
1071 E64 FF 86 FF FF path [mar], pc ; 首先读出栈指针sp指向存储单元的内容,即返回地址,
1072 ; 将其加载到PC中,实现调用返回
1073
1074 E68 BF C1 E1 FF path sp, a
1075 E6C FF D1 E9 D0 path alu_inc, sp ; 然后将sp加1,sp指向新的栈顶,即出栈
1076 ; 出栈时,栈顶向高地址空间生长
1077 E70 C3 FF FF FF reset upc
1078
1079 E74 FF FF FF FF dup 3, null
1080
1081
1082 ;===========================================================================
1083 ;116. cli 关中断指令
1084 E80 D3 FF FF FF cli ; 清零中断标志允许位IF=0,禁止硬中断请求
1085 E84 FD FF FF FF inc pc
1086 E88 C3 FF FF FF reset upc
1087
1088 E8C FF FF FF FF dup 5, null
1089
1090 ;===========================================================================
1091 ;117. sti 开中断指令
1092 EA0 D7 FF FF FF sti ; 设置中断允许标志位IF=1,允许硬中断请求
1093 EA4 FD FF FF FF inc pc
1094 EA8 C3 FF FF FF reset upc
1095
1096 EAC FF FF FF FF dup 5, null
1097
1098
1099 ;===========================================================================
1100 ;118. 硬中断处理微指令程序
1101 ; 标志寄存器和断点地址入栈
1102 EC0 BF C1 E1 FF path sp, a
1103 EC4 BF C1 E3 FF path sp, w
1104 EC8 FF D1 E9 DF path alu_dec, sp ; sp减1,指向新的栈顶,为标志寄存器入栈做准备
1105 ECC BF C1 E5 FF path sp, mar
1106 ED0 FF 83 E7 FF path flag, [mar] ; 将标志寄存器入栈,入栈时,栈向低地址空间生长
1107 ED4 BF C1 E1 FF path sp, a
1108 ED8 FF D1 E9 DF path alu_dec, sp ; sp减1,为返回地址入栈做准备
1109 EDC BF C1 E5 FF path sp, mar
1110 EE0 FF 85 E7 FF path pc, [mar] ; 当前PC指向下一条指令,正是返回地址,将其入栈
1111
1112
1113 ; 从8259读取中断号,依据中断号得到对应中断向量
1114 EE4 CF FF FF FF inta ; cpu 发出第一个中断应答信号INTA
1115 EE8 FF FF FF FF dup 1, null ; 插入空闲周期,其目的是分开前后两次发出的中断应答信号,便于8259进行识别
1116 ; 使得INTA信号的变化情况为 低电平--高电平--低电平,其中低电平表示应答信号有效
1117 EEC CE C7 E5 FF path inta, mar ; cpu发出第二个中断应答信号INTA,读取中断向量并送入地址寄存器中
1118
1119
1120 ; 转移到中断服务程序执行
1121 EF0 FF 86 FF FF path [mar], pc ; 将mar中的中断向量指向存储单元的内容传送到PC中,
1122 ; 中断向量指向的存储单元实际存储的就是该中断服务程序的入口地址(首条指令地址)
1123 ; 于是,PC转去执行中断服务程序
1124 EF4 C3 FF FF FF reset upc
1125
1126 EF8 FF FF FF FF dup 2, null
1127
1128
1129 ;===========================================================================
1130 ;120. inc rd 自增
1131 F00 FD FF FF FF inc pc
1132 F04 FF 47 EF FF path [pc], ir
1133 F08 BF C1 E1 FF path rd, a
1134 F0C FF D1 E9 D0 path alu_inc, rd ; 将累加器a加1的结果写入目的寄存器rd中
1135 F10 FF CB EB FF path al_flag, flag
1136 F14 FD FF FF FF inc pc
1137 F18 CB FF FF FF check irq
1138 F1C C3 FF FF FF reset upc
1139
1140
1141 ;===========================================================================
1142 ;121. dec rd 自减
1143 F20 FD FF FF FF inc pc
1144 F24 FF 47 EF FF path [pc], ir
1145 F28 BF C1 E1 FF path rd, a
1146 F2C BF C1 E3 FF path rd, w
1147 F30 FF D1 E9 DF path alu_dec, rd ; 将累加器a减1的结果写入目的寄存器rd中
1148 F34 FF CB EB FF path al_flag, flag
1149 F38 FD FF FF FF inc pc
1150 F3C CB FF FF FF check irq
1151 F40 C3 FF FF FF reset upc
1152
1153 F44 FF FF FF FF dup 7, null
\ No newline at end of file
......@@ -883,26 +883,30 @@ dup 6, null
;====================================================================================================
; 硬中断返回指令,执行出栈操作
; 中断返回指令,执行出栈操作,后进先出
;93. iret
; 先恢复标志寄存器内容,即标志寄存器FLAG出栈
inc pc
path [pc], ir
path sp, a
path alu_inc, mar
path [mar], flag
; 恢复中断返回地址,即中断返回地址出栈
path sp, mar
path [mar], pc
; 更新栈顶
; 出栈后栈顶指针寄存器sp加1,指向先于返回地址入栈的对象
path sp, a
path alu_inc, a
path alu_inc, sp
; 恢复标志寄存器内容,即标志寄存器FLAG出栈
path sp, mar
path [mar], flag
; 出栈后栈顶指针寄存器sp加1,指向先于标志寄存器入栈的对象
path sp, a
path alu_inc, sp
check irq
reset upc
dup 5, null
dup 4, null
;====================================================================================================
......
GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG߿GGGGGGGGGGGGGG?_GG߿GGGGG?G?GGGG߿G߿߿GG
\ No newline at end of file
GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG߿GGGGGGGGGGGGGG?_GG߿GGпGGG?G?GGGG߿G߿߿GG
\ No newline at end of file
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论