由于实验用的电路板固定了8259A芯片的中断向量为0A,因此程序中只使用10号中断。 _i8259和_i8253分别是两个芯片的初始化自程序,_setint和_clrint是设置中断和清理中断的自程序,_iserv是10号中断使用的中断服务子程序,其算法是用来计算时间来实现电子时钟的功能。只负责计算不负责输入和输出。可以根据需要改写此中断服务子程序。 注意:芯片的初始化参数根据芯片引脚的连接方式而定。 .286public _iserv,_setint,_clrint,_i8253,_i8259extrn minute:byte,second:byte,chgflg:byte ;for iserv()dseg segment para public 'DATA'P8253_A equ 208hP8253_B equ 209hP8253_C equ 20ahP8253_CON equ 20bhold0a dd ?dseg endscseg segment para public 'CODE' assume cs:cseg,ds:dsegstart:_iserv proc ;void iserv() pusha ;{ push ds mov ax,dseg mov ds,axis_beg: cmp byte ptr chgflg,0h; if(!chgflg) goto is_exit //no change permitting je is_exit mov al,byte ptr second cmp al,59h ; if(second != 0x59) je is_min ; { add al,1 ; second += 1; clc daa ; _asm{daa second}; mov byte ptr second,al; goto is_exit; jmp is_exit ; }is_min: mov al,byte ptr minute; else cmp al,59h ; if(minute != 0x59) je is_hur ; { mov byte ptr second,0h; second = 0; add al,1 ; minute += 1; clc daa ; _asm{daa,minute}; mov byte ptr minute,al; goto is_exit jmp is_exit ; }is_hur: mov byte ptr minute,0h; else minute = 0;is_exit:mov al,20h ; //is_exit out 20h,al pop ds popa iret_iserv endp ;} _setint proc ;void setint(){ call _rd0a ; rd0a(); call _wr0a ; wr0a(); ret_setint endp ;} _rd0a proc ;void rd0a(){ mov ax,350ah int 21h mov word ptr old0a,bx mov word ptr old0a + 2,es ;//Save old ret_rd0a endp ;} _wr0a proc ;void wr0a(){ push ds mov ax,cseg mov ds,ax mov dx,offset _iserv; //write interrupt vector mov ax,250ah int 21h pop ds ret_wr0a endp ;} _clrint proc ;void clrint(){ push ds mov dx,word ptr old0a mov ds,word ptr old0a+2 mov ax,250ah int 21h ; //restore old vector pop ds in al,0a1h ; //disable interruption or al,00000010b out 0a1h,al ret_clrint endp ;} _i8253 proc ;void i8253(){ pusha mov dx,P8253_CON mov al,36h ; //mode 3 out dx,al mov ax,200 ; //count = 200h mov dx,P8253_A out dx,al mov ah,al out dx,al popa ret_i8253 endp ;} _i8259 proc ;void i8259(){ pusha in al,21h and al,11111011b ; //open mask of main 8259a out 21h,al in al,0a1h and al,11111101b ; //open mask of sub 8259a out 0a1h,al popa ret_i8259 endp ;}cseg ends end start

评论