📄 8254.asm
字号:
;实时时钟实验
DATA SEGMENT
DISPLAY DB 'INPUT AS HH:MM:SS',0DH,0AH,'$'
STARTIME DB 11,11 DUP(?),'$'
X EQU 30
Y EQU 30
CURSOR DW ?
S1PERCENT DB 0
KEEP21H DB ?
PORT3 EQU 230H ;???
PORT0 EQU 233H ;???
ININUM EQU 00H
DATA ENDS
STACK SEGMENT
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:STACK
START: MOV AX,DATA
MOV DS,AX
MOV DX,OFFSET DISPLAY
MOV AH,09H
INT 21H
MOV DX,OFFSET STARTIME ;接收时钟初始值
MOV AH,0AH
INT 21H
CLI
MOV AH,35H
MOV AL,0BH ;IRQ3
INT 21H
PUSH BX
PUSH ES
PUSH DS
MOV AX,SEG INTPROC
MOV DS,AX
MOV DX,OFFSET INTPROC
MOV AH,25H
MOV AL,0BH
INT 21H
POP DS
IN AL,21H
MOV KEEP21H,AL
AND AL,11110111B ;IMRIRQ3
OUT 21H,AL
STI
MOV DX,PORT3
MOV AL,00010111B ;初始化8254,BCD式,方式3
OUT DX,AL
MOV DX,PORT0
MOV AL,ININUM ;计数初值
OUT DX,AL
MOV AH,03H ;保存光标位置
INT 10H
MOV CURSOR,DX
A00: MOV DH,Y ;置光标位置
MOV DL,X
MOV AH,02H
INT 10H
MOV DX,OFFSET STARTIME[2] ;显示时间
MOV AH,09H
INT 21H
MOV BL,STARTIME[9] ;移个位值到BL中
A11: CMP BL,STARTIME[9]
JNE A00
MOV AH,01H
INT 21H
JZ A11
MOV AH,00H
INT 21H
CMP AL,1AH ;ESC
JNZ A00
EXIT: MOV AL,KEEP21H
OUT 21H,AL
MOV DX,CURSOR ;恢复原光标位置
MOV AH,02H
INT 10H
POP ES
POP BX
MOV AH,25H
MOV AL,0BH
INT 21H
MOV AH,4CH
INT 21H
;用户中断服务程序
INTPROC PROC FAR
STI
PUSH AX
PUSH BX
PUSH DS
MOV AX,DATA
MOV DS,AX
INC S1PERCENT
CMP S1PERCENT,100
JNZ B00
MOV S1PERCENT,0
INC STARTIME[9] ;秒
CMP STARTIME[9],'9'
JBE B00
MOV STARTIME[9],30H
INC STARTIME[8]
CMP STARTIME[8],'6'
JB B00
MOV STARTIME[8],30H ;分
INC STARTIME[6]
CMP STARTIME[6],'9'
JBE B00
MOV STARTIME[6],30H
INC STARTIME[5]
CMP STARTIME[5],'6'
JB B00
MOV STARTIME[5],30H
INC STARTIME[3] ;时
CMP STARTIME[3],'9'
JA B11
CMP STARTIME[3],'3'
JNE B00
CMP STARTIME[2],'1'
JNE B00
MOV STARTIME[2],30H
MOV STARTIME[3],'1'
JMP B00
MOV STARTIME[2],30H
MOV STARTIME[3],31H
B11: MOV STARTIME[3],30H
INC STARTIME[2]
B00: MOV AL,20H
OUT 20H,AL
POP DS
POP BX
POP AX
IRET
INTPROC ENDP
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -