提交 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 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论