;8254的编址空间起点是0600H
IOYO EQU 0600H
A8254 EQU IOYO+00H*2
B8254 EQU IOYO+01H*2
C8254 EQU IOYO+02H*2
CON8254 EQU IOYO+03H*2
SSTACK SEGMENT STACK
DW 32 DUP(?)
SSTACK ENDS
CODE SEGMENT
ASSUME CS:CODE, SS:SSTACK
START: PUSH DS
MOV AX,0000H
MOV DS,AX
MOV AX,OFFSET IRQ7
MOV SI,003CH
MOV [SI],AX
MOV AX,CS
MOV SI,003EH
MOV [SI],AX
CLI
POP DS
;初始化主片8259
MOV AL,11H ;初始化ICW1
OUT 20H,AL
MOV AL,08H ;初始化ICW2
OUT 21H,AL
MOV AL,04H ;初始化ICW3
OUT 21H,AL
MOV AL,01H ;初始化ICW4
OUT 21H,AL
MOV AL,6FH ;初始化OCW1
OUT 21H,AL
;初始化8254
MOV DX,CON8254
MOV AL,10H;方式控制字 00010000
OUT DX,AL
MOV DX,A8254
MOV AL,04H;把计数初值4送入计数器A,每5次,送4
OUT DX,AL
STI
AA1: JMP AA1
IRQ7:
;执行一次中断后,原来8254A计数器的初值为0,为了重复该中断,需要再输入一次计数初值
MOV DX,A8254
MOV AL,04H
OUT DX,AL
MOV AX,014DH ;字符M
INT 10H
MOV AX,0120H ; 空格;8254的编址空间起点是0600H IOYO EQU 0600H A8254 EQU IOYO+00H*2 B8254 EQU IOYO+01H*2 C8254 EQU IOYO+02H*2 CON8254 EQU IOYO+03H*2 SSTACK SEGMENT STACK DW 32 DUP(?) SSTACK ENDS CODE SEGMENT ASSUME CS:CODE, SS:SSTACK START: PUSH DS MOV AX,0000H MOV DS,AX MOV AX,OFFSET IRQ7 MOV SI,003CH MOV [SI],AX MOV AX,CS MOV SI,003EH MOV [SI],AX CLI POP DS ;初始化主片8259 MOV AL,11H ;初始化ICW1 OUT 20H,AL MOV AL,08H ;初始化ICW2 OUT 21H,AL MOV AL,04H ;初始化ICW3 OUT 21H,AL MOV AL,01H ;初始化ICW4 OUT 21H,AL MOV AL,6FH ;初始化OCW1 OUT 21H,AL ;初始化8254 MOV DX,CON8254 MOV AL,10H;方式控制字 00010000 OUT DX,AL MOV DX,A8254 MOV AL,04H;把计数初值4送入计数器A,每5次,送4 OUT DX,AL STI AA1: JMP AA1 IRQ7: ;执行一次中断后,原来8254A计数器的初值为0,为了重复该中断,需要再输入一次计数初值 MOV DX,A8254 MOV AL,04H OUT DX,AL MOV AX,014DH ;字符M INT 10H MOV AX,0120H ; 空格 INT 10H ;中断结束命令 往地址20H送入20H MOV AL,20H OUT 20H,AL IRET ;返回中断 CODE ENDS END START
INT 10H
;中断结束命令 往地址20H送入20H
MOV AL,20H
OUT 20H,AL
IRET ;返回中断
CODE ENDS
END START