MOV CX,4
AGA: ROL DX,4
MOV AL,DL AND AL,0FH CMP AL,10
JC NEXT2 ADD AL,7
NEXT2: ADD AL,30H
MOV AH,0EH
INT 10H LOOP AGA
RET
SHWORD ENDP CODE ENDS END START 六.收获体会。
本次试验中,对这次实验对中断特性和8259中断控制器的工作原理有了一定的理解,在实践操作中修改程序的时候没有把读入的扫描码AL传递到DL中,导致实验结果不对,最后在老师的指导下修改正确。对中断的理解在很多地方存在着认识不足,对于中断程序的设计还有待强化。希望可以加强对理论知识的认识逐步增强在这方面的实践能力。
实验七、PCI总线中断应用
一.实验内容 1.【示例】编写一实验程序,利用实验装置提供的中断源,完成每按动一次脉冲开关,产生一次中断,向显示器输出字符“7”。 2.修改示例程序,控制中断响应次数为10次,即当第11次以后按动脉冲开关,屏幕上不再显示“7”。 二. 分析设计思想
1.TD-PIT-B实验系统编程信息简要说明
(1).本实验的接口电路是在PD-PIT-B实验装置上搭接完成,而PC机作为主机控制该实验装置。二者之间通过PCI总线扩展卡及转接逻辑在PD-PIT-B实验装置上提供了一个仿真ISA的总线接口,用户可以基于该接口对常用接口芯片进行应用编程。TD-PIT-B实验系统的硬件环境,参见附录。
(2).要利用仿真ISA的总线接口资源,扩展接口电路,首先必须掌握实验装置获取的系统配置资源,即PCI总线资源配置的有关内容。
执行PCI_BIOS.EXE,获取实验用PCI总线扩展卡分配的地址空间及中断请求线。假设执行PCI_BIOS.EXE后屏幕显示:
25
从以上获取的信息可知道,本实验用的PCI总线扩展卡申请了: ? 4个I/O空间(最后一位为1来表示),其首地址分别是:0B800H,0BC00H,0C000H,
0C400H。 ? ?
一个存储器空间(最后一位为0来表示),其首地址是:5000000H。 一个中断请求IRQ9
(3).确定TD-PIT-B实验装置中各接口电路所使用的端口地址
本系统中PCI配置空间的首地址是PCI总线扩展卡申请的第一个I/O空间(即BASE 0)。所以PCI各控制寄存器的地址定义为:
BASE 0的首地址0B800H + 各控制寄存器的偏移地址
而I/O部分实验使用的是PCI总线扩展卡申请的第三个I/O空间(即BASE 2)。各I/O接口芯片的端口地址定义为:
BASE 2的首地址0C000H + 各端口的偏移地址 2.实验说明及处理流程
本实验使用实验装置提供的中断请求信号IRQ,利用KK1的负脉冲作为中断源,每按一次KK1,在中断处理中完成字符“7”的显示。
使用实验装置提供的IRQ信号,除了要操作PC机的8259寄存器,还需要操作TD-PIT-PCI总线扩展卡上的控制寄存器“INTCSR”和“IMB4”,才可以实现中断的初始化、清除等。
?
PCI_BIOS.EXE实验装置获取的系统配置资源,确定控制寄存器INTCSR(偏移38H~ 3BH)和IMB4寄存器(偏移1FH)的端口地址:
BASE 0的首地址0B800H + 各控制寄存器的偏移地址
及中断号IRQ9。
? 初始化PCI中断
(1) 初始化INTCSR:向INTCSR的端口写入003F1F00H,即0B838H写00H,0B839H
写1FH,0B83AH写3FH,0B83BH写00H。 (2) 初始化中断向量:在修改中断入口地址时,建议先保存原来的入口地址。查表
7-1获得IRQ9对应的中断向量号为71H,中断入口地址即为01C4H,并将该地址保存,替换为用户自己的中断服务程序入口地址。
(3) 设置PC机8259中断屏蔽寄存器,对应位为0,允许中断。21H中设置0~7号
屏蔽位,A1H中设置8~15号屏蔽位。同样保存原先的屏蔽位。IRQ9号中断须
?
将A1H中的位1置0。 清除实验用中断的中断源
(1) 清PCI板卡的中断标志:对IMB4寄存器的第3字节(IMB_BYTE3)做一读操
作,端口地址为0B81FH,然后向INTCSR第2字节(0B83AH)写入3FH。 (2) 清PC机8259中断标志:设置8259的OCW2,复位中断标志。(IRQ9中断向
A0H写入61H,向20H写入62H。)
(3) 退出程序返回DOS时恢复系统的初始化的设置:首先将保存的屏蔽命令字恢复
26
到屏蔽寄存器中,中断服务程序入口的段地址和偏移地址恢复到中断向量表中,
?
然后返回DOS。
参考实验流程如图12-1所示。
三.程序清单及相关注解
;先执行PCI_BIOS.EXE,获得PCI板卡申请的第一个I/O空间的首地址及 ;中断号,修改下面CPU访问PCI操作寄存器的端口地址。
;由中断号确定相应中断向量及OCW1、OCW2命令字。
INTCSR_BYTE0 EQU 9438H ;修改PCI操作寄存器的端口地址 INTCSR_BYTE1 EQU 9439H INTCSR_BYTE2 EQU 943AH INTCSR_BYTE3 EQU 943BH IMB4_BYTE3 EQU 941FH DATA SEGMENT CSBAK DW ? IPBAK DW ? MKBAK DB ? DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA START: CLI
MOV AX,DATA
MOV DS,AX ;初始化PCI寄存器 MOV DX,INTCSR_BYTE0 MOV AL,00H OUT DX,AL
MOV DX,INTCSR_BYTE1 MOV AL,1FH OUT DX,AL
27
MOV DX,INTCSR_BYTE2 MOV OUT MOV MOV
AL,3FH DX,AL
DX,INTCSR_BYTE3 AL,00H
OUT DX,AL ;保存和替换中断入口地址 MOV AX,0000H
MOV ES,AX
MOV DI,01CCH ;INT 73H,01CCH=73H*4,根据中断号修改 MOV AX,ES:[DI]
MOV IPBAK,AX ;IP MOV AX,OFFSET MYINT CLD STOSW
MOV AX,ES:[DI] ;CS MOV CSBAK,AX
MOV AX,SEG MYINT
STOSW ;保存中断屏蔽字寄存器内容 IN AL,0A1H
MOV MKBAK,AL
AND AL,0F7H ;打开中断屏蔽位,根据中断号修改 OUT 0A1H,AL
STI ;等待 A1: NOP
CALL BREAK JMP A1 ;========中断服务程序=========== MYINT: PUSH DS PUSH AX
PUSH DX ;清PCI板中断标志 MOV DX,IMB4_BYTE3 IN AL,DX
MOV DX,INTCSR_BYTE2 MOV AL,3FH
OUT DX,AL;清8259中断标志 MOV AL,63H ;根据中断号修改 OUT 0A0H,AL
MOV AL,62H
OUT 20H,AL ;显示字符‘7’ MOV AH,0EH MOV AL,37H
INT 10H POP DX POP AX
28