📄 8254-2.asm
字号:
MY8254_COUNT0 EQU 9C40H
MY8254_COUNT1 EQU 9C41H
MY8254_COUNT2 EQU 9C42H
MY8254_MODE EQU 9C43H
INTCSR_BYTE0 EQU 9438H
INTCSR_BYTE1 EQU 9439H
INTCSR_BYTE2 EQU 943AH
INTCSR_BYTE3 EQU 943BH
IMB4_BYTE3 EQU 941FH
DATA SEGMENT
CSBAK DW ?
IPBAK DW ?
MKBAK DB ?
SEC1 DB 30H
SEC0 DB 31H
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: CLI
MOV AX,DATA
MOV DS,AX
MOV DX,INTCSR_BYTE0
MOV AL,00H
OUT DX,AL
MOV DX,INTCSR_BYTE1
MOV AL,1FH
OUT DX,AL
MOV DX,INTCSR_BYTE2
MOV AL,3FH
OUT DX,AL
MOV DX,INTCSR_BYTE3
MOV 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
MOV AX,0E30H
INT 10H
MOV AX,0E30H
INT 10H
MOV AX,0E0DH
INT 10H
MOV DX,MY8254_MODE ;CLK=10K
MOV AL,35H
OUT DX,AL
MOV DX,MY8254_COUNT0
MOV AL,0
OUT DX,AL
OUT DX,AL
STI
A1: NOP
CALL BREAK
JMP A1
MYINT: PUSH DS
PUSH AX
PUSH DX
MOV AX,DATA
MOV DS,AX
MOV DX,IMB4_BYTE3
IN AL,DX
MOV DX,INTCSR_BYTE2
MOV AL,3FH
OUT DX,AL
MOV AL,63H
OUT 0A0H,AL
MOV AL,62H
OUT 20H,AL
MOV AH,0EH
MOV AL,SEC1
INT 10H
MOV AH,0EH
MOV AL,SEC0
INT 10H
MOV AX,0E0DH
INT 10H
INC SEC0
CMP SEC0,3AH
JZ B3
JMP B1
B3: INC SEC1
MOV SEC0,30H
CMP SEC1,36H
JZ B4
JMP B1
B4: MOV SEC1,30H
B1: POP DX
POP AX
POP DS
IRET
BREAK PROC NEAR
PUSH DS
MOV AH,06H
MOV DL,0FFH
INT 21H
JE RETURN
POP DS
CLI
MOV AL,MKBAK
OUT 0A1H,AL
MOV AX,0000H
MOV ES,AX
MOV DI,01CCH ;INT 73H,01CCH=73H*4
MOV AX,IPBAK
CLD
STOSW
MOV AX,CSBAK
STOSW
MOV DX,INTCSR_BYTE1
MOV AL,00H
OUT DX,AL
STI
MOV AX,4C00H
INT 21H
RETURN:POP DS
RET
BREAK ENDP
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -