📄 exp94.asm
字号:
CODE SEGMENT PARA
ASSUME CS:CODE,DS:CODE
NEW_INT1C PROC FAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
PUSH DI
PUSH BP
PUSH DS
PUSH ES
STI
JMP START
OLD_INT1C DD ?
COUNT DW ?
START: PUSH CS
POP DS
INC COUNT
CMP COUNT,18*4
JB RETURN
MOV COUNT,0
CALL BEEP1
RETURN: CLI
POP ES
POP DS
POP BP
POP DI
POP SI
POP DX
POP CX
POP BX
POP AX
IRET
NEW_INT1C ENDP
BEEP1 PROC NEAR
PUSH DS
MOV AX,0
MOV DS,AX
MOV CX,4
IN AL,61H
OR AL,3 ;SET PB0 & PB1
OUT 61H,AL
MAIN1: MOV BX,1000
CALL BEEP
MOV BX,1200
CALL BEEP
MOV BX,1400
CALL BEEP
LOOP MAIN1
IN AL,61H
XOR AL,3 ;CLEAR PB0 & PB1
OUT 61H,AL
POP DS
RET
BEEP1 ENDP
BEEP PROC
MOV AX,34DCH
MOV DX,12H ;1193180
DIV BX ;BX=1000,1200,1400
OUT 42H,AL ;TIMER2
MOV AL,AH
OUT 42H,AL ;WRITE 1 WORD
CALL WAITS
RET
BEEP ENDP
WAITS PROC NEAR
MOV DX,6
MOV BX,0
ADD DX,DS:[46CH] ;DS=0
ADC BX,DS:[46EH]
WAIT1:
MOV BP,DS:[46CH]
MOV AX,DS:[46EH]
SUB BP,DX
SBB AX,BX
JC WAIT1
RET
WAITS ENDP
H_LEN EQU $-NEW_INT1C
MAIN PROC FAR
MOV AX,CS
MOV DS,AX
MOV COUNT,0
MOV AH,35H
MOV AL,1CH ;GET INT 1Ch ADDR
INT 21H
MOV WORD PTR OLD_INT1C,BX
MOV WORD PTR OLD_INT1C+2,ES
MOV AH,25H
MOV AL,1CH
MOV DX,OFFSET NEW_INT1C ;DS=CS
INT 21H
MOV DX,(H_LEN+15)/16+10H
MOV AX,3100H
INT 21H
MAIN ENDP
CODE ENDS
END MAIN
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -