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

Initial commit

上级
*.cir
*.xml
*.bak
/.vs
\ No newline at end of file
添加文件
这个 源代码变更 因为 太大 而不能显示。 你可以 浏览blob 。
添加文件
这个 源代码变更 因为 太大 而不能显示。 你可以 浏览blob 。
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<project id="1066ea9b-8510-4194-ab6e-5b2e2c42f996" name="Hardware-IRQ" version="1">
<files>
<filefolder id="a9f57fc8-c239-4574-a5da-f8fa2760024b" name="子模块">
<file relativepath="ALU.dlsche"/>
<file relativepath="PC.dlsche"/>
<file relativepath="REG.dlsche"/>
<file relativepath="CU.dlsche"/>
<file relativepath="MEM.dlsche"/>
<file relativepath="uPC_NEXT.dlsche"/>
<file relativepath="IRR.dlsche"/>
<file relativepath="IRQ.dlsche"/>
<file relativepath="PR.dlsche"/>
<file relativepath="ISR.dlsche"/>
</filefolder>
<filefolder id="80f1035e-e898-408b-bb0c-e69c72ad13b4" name="汇编源程序">
<file relativepath="ram.asm"/>
<file relativepath="ram.bat"/>
</filefolder>
<filefolder id="03f70f98-2bea-4829-91ee-a9e5f6ee0c87" name="微指令源程序">
<file relativepath="rom.masm"/>
<file relativepath="rom.bat"/>
</filefolder>
<filefolder id="be71b6f0-d920-4758-8b3a-3a343b490c2e" name="存储器映射文件">
<file relativepath="ram.rxm"/>
<file relativepath="rom.rxm"/>
</filefolder>
<file relativepath="Hardware-IRQ.dlsche"/>
</files>
</project>
这个 源代码变更 因为 太大 而不能显示。 你可以 浏览blob 。
添加文件
差异被折叠。
添加文件
差异被折叠。
添加文件
这个 源代码变更 因为 太大 而不能显示。 你可以 浏览blob 。
添加文件
差异被折叠。
添加文件
差异被折叠。
添加文件
差异被折叠。
添加文件
这个 源代码变更 因为 太大 而不能显示。 你可以 浏览blob 。
差异被折叠。
添加文件
差异被折叠。
添加文件
; 示例程序
.text
mov sp, 0xf8 ;初始化栈指针寄存器
;=======================================================
;安装中断向量,安装中断的过程是将各个中断服务程序的入口地址(首地址)保存到对应中断向量指向的存储单元中。
;中断向量本身是一个地址,它指向一个存储单元,该存储单元保存的就是某个中断服务程序的入口地址(起始地址)
;设中断向量列表的首地址为0xf8,即第一个中断向量是存储单元0xf8
;安装0号中断向量0xf8,0xf8中保存0号中断服务程序的入口地址
lea a, int_0
mov r0, 0xf8
mov [r0], a
;安装3号中断向量0xfb,0xfb中保存3号中断服务程序的入口地址
lea a, int_3
mov r0, 0xfb
mov [r0], a
;安装5号中断向量0xfd,0xfd中保存5号中断服务程序的入口地址
lea a, int_5
mov r0, 0xfd
mov [r0], a
;=======================================================
;主程序代码
mov a, -1
LOOPC:
mov r0, 1
add a, r0
jmp LOOPC
;=======================================================
;中断服务程序
;0号中断的服务程序
int_0:
mov a, 0x10
adc a, -1
iret
;3号中断的服务程序
int_3:
mov a, 0x13
or a, [r0]
sbb a, -1
iret
;5号中断的服务程序
int_5:
mov r2, 3
mov a, 1
and a, r2
iret
@echo off
dmasm.exe ram.asm -o ram.rxm -l ram.lst -g ram.dbg
pause
添加文件
0001 ; 示例程序
0002
0003 .text
0004
0005 00 9C F8 mov sp, 0xf8 ;初始化栈指针寄存器
0006
0007 ;=======================================================
0008 ;安装中断向量,安装中断的过程是将各个中断服务程序的入口地址(首地址)保存到对应中断向量指向的存储单元中。
0009 ;中断向量本身是一个地址,它指向一个存储单元,该存储单元保存的就是某个中断服务程序的入口地址(起始地址)
0010 ;设中断向量列表的首地址为0xf8,即第一个中断向量是存储单元0xf8
0011
0012 ;安装0号中断向量0xf8,0xf8中保存0号中断服务程序的入口地址
0013 02 98 18 lea a, int_0
0014 04 8C F8 mov r0, 0xf8
0015 06 84 mov [r0], a
0016
0017
0018 ;安装3号中断向量0xfb,0xfb中保存3号中断服务程序的入口地址
0019 07 98 1D lea a, int_3
0020 09 8C FB mov r0, 0xfb
0021 0B 84 mov [r0], a
0022
0023
0024 ;安装5号中断向量0xfd,0xfd中保存5号中断服务程序的入口地址
0025 0C 98 23 lea a, int_5
0026 0E 8C FD mov r0, 0xfd
0027 10 84 mov [r0], a
0028
0029
0030 ;=======================================================
0031 ;主程序代码
0032
0033 11 7C FF mov a, -1
0034
0035 LOOPC:
0036 13 8C 01 mov r0, 1
0037 15 10 add a, r0
0038
0039 16 AC 13 jmp LOOPC
0040
0041
0042 ;=======================================================
0043 ;中断服务程序
0044 ;0号中断的服务程序
0045 int_0:
0046 18 7C 10 mov a, 0x10
0047 1A 2C FF adc a, -1
0048 1C F8 iret
0049
0050
0051 ;3号中断的服务程序
0052 int_3:
0053 1D 7C 13 mov a, 0x13
0054 1F 64 or a, [r0]
0055 20 4C FF sbb a, -1
0056 22 F8 iret
0057
0058
0059 ;5号中断的服务程序
0060 int_5:
0061 23 8E 03 mov r2, 3
0062 25 7C 01 mov a, 1
0063 27 52 and a, r2
0064 28 F8 iret
0065
添加文件
# 说明
基于 DM1000 的硬中断实现
# 原理图
![raw svg](Hardware-IRQ.dlsche.svg)
\ No newline at end of file
@echo off
microasm.exe rom.masm -o rom.rxm -l rom.lst -g rom.dbg
pause
\ No newline at end of file
添加文件
差异被折叠。
; 所有指令的第一条微指令地址必须是8的倍数
; 取指微指令,所有指令的第一步均为取指操作,都要执行该条微指令
path [pc], ir
; 填充空白指令 01-1f
dup 31, null
; add a, rx
path rx, w
path alu_add, a
inc pc
;查询硬中断请求,将低3位中断号与高5位中断向量基地址组合,得到8位中断向量(8位地址)
;该中断向量指向一个存储单元,该存储单元保存的就是中断服务程序的入口地址
;若允许中断且有中断请求,则微程序跳转到硬中断处理处执行
ask_for_int
reset upc
dup 3, null
; add a, [rx]
path rx, mar
path [mar], w
path alu_add, a
inc pc
ask_for_int
reset upc
dup 2, null
; add a, symbol
inc pc
path [pc], mar
path [mar], w
path alu_add, a
inc pc
ask_for_int
reset upc
dup 1, null
; add a, immediate
inc pc
path [pc], w
path alu_add, a
inc pc
ask_for_int ;查询硬中断请求,若有请求,则转去执行硬中断预处理微程序
reset upc
dup 2, null
; adc a, rx
path rx, w
path alu_adc, a
inc pc
ask_for_int
reset upc
dup 3, null
; adc a, [rx]
path rx, mar
path [mar], w
path alu_adc, a
inc pc
ask_for_int
reset upc
dup 2, null
; adc a, symbol
inc pc
path [pc], mar
path [mar], w
path alu_adc, a
inc pc
ask_for_int
reset upc
dup 1, null
; adc a, immediate
inc pc
path [pc], w
path alu_adc, a
inc pc
ask_for_int
reset upc
dup 2, null
; sub a, rx
path rx, w
path alu_sub, a
inc pc
ask_for_int
reset upc
dup 3, null
; sub a, [rx]
path rx, mar
path [mar], w
path alu_sub, a
inc pc
ask_for_int
reset upc
dup 2, null
; sub a, symbol
inc pc
path [pc], mar
path [mar], w
path alu_sub, a
inc pc
ask_for_int
reset upc
dup 1, null
; sub a, immediate
inc pc
path [pc], w
path alu_sub, a
inc pc
ask_for_int
reset upc
dup 2, null
; sbb a, rx
path rx, w
path alu_sbb, a
inc pc
ask_for_int
reset upc
dup 3, null
; sbb a, [rx]
path rx, mar
path [mar], w
path alu_sbb, a
inc pc
ask_for_int
reset upc
dup 2, null
; sbb a, symbol
inc pc
path [pc], mar
path [mar], w
path alu_sbb, a
inc pc
ask_for_int
reset upc
dup 1, null
; sbb a, immediate
inc pc
path [pc], w
path alu_sbb, a
inc pc
ask_for_int
reset upc
dup 2, null
; and a, rx
path rx, w
path alu_and a
inc pc
ask_for_int
reset upc
dup 3, null
; and a, [rx]
path rx, mar
path [mar], w
path alu_and, a
inc pc
ask_for_int
reset upc
dup 2, null
; and a, symbol
inc pc
path [pc], mar
path [mar], w
path alu_and, a
inc pc
ask_for_int
reset upc
dup 1, null
; and a, immediate
inc pc
path [pc], w
path alu_and, a
inc pc
ask_for_int
reset upc
dup 2, null
; or a, rx
path rx, w
path alu_or a
inc pc
ask_for_int
reset upc
dup 3, null
; or a, [rx]
path rx, mar
path [mar], w
path alu_or, a
inc pc
ask_for_int
reset upc
dup 2, null
; or a, symbol
inc pc
path [pc], mar
path [mar], w
path alu_or, a
inc pc
ask_for_int
reset upc
dup 1, null
; or a, immediate
inc pc
path [pc], w
path alu_or, a
inc pc
ask_for_int
reset upc
dup 2, null
; mov a, rx
path rx, a
inc pc
ask_for_int
reset upc
dup 4, null
; mov a, [rx]
path rx, mar
path [mar], a
inc pc
ask_for_int
reset upc
dup 3, null
; mov a, symbol
inc pc
path [pc], mar
path [mar], a
inc pc
ask_for_int
reset upc
dup 2, null
; mov a, immediate
inc pc
path [pc], a
inc pc
ask_for_int
reset upc
dup 3, null
; mov rx, a
path a, rx
inc pc
ask_for_int
reset upc
dup 4, null
; mov [rx], a
path rx, mar
path a, [mar]
inc pc
ask_for_int
reset upc
dup 3, null
; mov symbol, a
inc pc
path [pc], mar
path a, [mar]
inc pc
ask_for_int
reset upc
dup 2, null
; mov rx, immediate
inc pc
path [pc], rx
inc pc
ask_for_int
reset upc
dup 3, null
; 空白存储块
dup 16, null
; lea a, symbol
inc pc
path [pc], a
inc pc
ask_for_int
reset upc
dup 3, null
;mov sp, immediate
inc pc
path [pc], sp
inc pc
ask_for_int
reset upc
dup 3, null
; jc symbol
inc pc
path [pc], pc
ask_for_int
reset upc
dup 4, null
; jz symbol
inc pc
path [pc], pc
ask_for_int
reset upc
dup 4, null
; 填充空白指令
dup 8, null
; jmp symbol
inc pc
path [pc], pc
ask_for_int
reset upc
dup 4, null
; in
path rin, a
inc pc
ask_for_int
reset upc
dup 4, null
; out
path a, rout
inc pc
ask_for_int
reset upc
dup 4, null
; int immediate
inc pc
path [pc], ia
path sp, csp
path sp_inc, csp
path csp, sp
path sp, mar
inc pc
path pc, [mar]
path ia, mar
path [mar], pc
reset upc
dup 5, null
;
dup 16, null
;=====================================================================
;子程序调用返回指令
; ret
path sp, mar ;将堆栈指针(栈顶地址)传送到 MAR
path sp, csp ;
path sp_inc, csp ;
path csp, sp ;SP = SP + 1,出栈,更新栈顶
path [mar], pc ;将调用返回地址加载到PC,转移到调用处的下一条指令继续执行
reset upc
dup 2, null
;=====================================================================
; 填充空白指令
dup 8, null
; shr a
path alu_shr, a
inc pc
ask_for_int
reset upc
dup 4, null
; shl a
path alu_shl, a
inc pc
ask_for_int
reset upc
dup 4, null
; rcr a
path alu_rcr, a
inc pc
ask_for_int
reset upc
dup 4, null
; rcl a
path alu_rcl, a
inc pc
ask_for_int
reset upc
dup 4, null
; nop
inc pc
reset upc
dup 6, null
; not a
path alu_not, a
inc pc
ask_for_int
reset upc
dup 4, null
; call symbol
inc pc
path [pc], asr
path sp, csp
path sp_dec, csp
path csp, sp
path sp, mar
inc pc
path pc, [mar]
path asr, pc
ask_for_int
reset upc
dup 5, null
;======================================================================
; 硬中断处理微程序。
; 硬中断处理完成返回地址入栈,然后加载中断服务程序入口地址到PC的工作。
; 中断返回地址是下一条指令的地址,这是因为当前指令已经执行完毕,是在该指令执行完成后才查询到中断请求的,
; 因此,中断返回后应该从当前指令的下一条指令开始执行
; sp减1,指向新的栈顶,为入栈对象分配一个存储单元。入栈时,栈顶向地址方向生长
path sp, csp ;将栈指针寄存器sp的值传送到csp计数器
path sp_dec, csp ;计数器csp减1
path csp, sp ;将减计数结果写回sp,完成栈指针sp-1操作,为返回地址入栈做准备
; 中断返回地址入栈
path sp, mar ;sp栈指针寄存器内容传送到地址寄存器mar
path pc, [mar] ;将返回地址PC入栈
; 根据中断号获取中断服务程序入口地址
inta1 ;发出第一个中断应答信号,中断控制器保存最高优先级中断请求对应的编号(0~7)
inta2 ;发出第二个中断应答信号,将响应中断的终端号读入IA寄存器中,并清除响应的中断请求,避免重复响应
; 由中断号(中断向量偏移地址)与中断向量基地址0xf8相加得到当前响应的中断向量
path int_ia, mar ;将中断向量(ia寄存器的内容)传入mar
path [mar], pc ;读出中断向量中的内容(中断服务程序入口地址),将其加载到PC,转去执行中断服务程序
reset upc
dup 6, null
;======================================================================
;中断返回指令
; iret
;中断返回就是出栈过程,将栈顶指针sp指向的存储单元内的返回地址加载到PC,实现中断返回
;与此同时,sp加1,指向新的栈顶
; 后进先出
; 中断返回地址出栈,将sp指向存储单元保存的返回地址加载到PC中
path sp, mar
path [mar], pc
; 出栈时,sp加1,栈顶向高地址方向生长
path sp, csp ;sp传入csp计数器
path sp_inc, csp ;csp计数器加1
path csp, sp ;将csp加1后的结果写入sp,sp指向新的栈顶
;发出中断返回命令,清除已经服务完的硬中断标志
eoi
; 查询中断请求,若存在,则继续响应中断
ask_for_int
reset upc
添加文件
添加文件
差异被折叠。
您添加了 0 人 到此讨论。请谨慎行事。
请先完成此评论的编辑!
请 注册 或者 后发表评论