📄 daytime1.asm
字号:
PRINT MACRO X ;输出(不带换行)宏
PUSH AX
PUSH DX
MOV DL,X
MOV AH,2
INT 21H
POP DX
POP AX
ENDM
PRINT1 MACRO X ;输出(不带换行)宏
PUSH AX
PUSH DX
LEA DX,X
MOV AH,9
INT 21H
POP DX
POP AX
ENDM
STACK SEGMENT STACK
DW 200 DUP (?)
STACK ENDS
DATA SEGMENT
ERORRMES_1 DB 'WRONG SET!$'
RMES_1 DB 'OK!$'
SPACE DB 1000 DUP (' ')
PATTERN DB 6 DUP (' '),0C9H,26 DUP (0CDH),0BBH,6 DUP (' ')
DB 6 DUP (' '),0BAH,26 DUP (20H),0BAH,6 DUP (' ')
DB 6 DUP (' '),0C8H,26 DUP (0CDH),0BCH,6 DUP (' ')
DBUFFER DB 8 DUP (':'),12 DUP (' ')
COUNT DB $-DBUFFER
CLOCK_1 DB 8 DUP (':'),12 DUP (' ')
DBUFFER1 DB 20 DUP (' ')
YEAR DW 2008
MOnth DB 01
DAY DB 01
HOUR DB 0
MINUTE DB 0
SECD DB 0
STR DB 0DH,0AH, 'PLEASE INPUT DATE(D) OR TIME(T) OR QUIT(Q): $'
TEMP DW 4 DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK
START: MOV AX,DATA
MOV DS,AX
MOV ES,AX
MOV AX,0001H ;设置显示方式为40*25彩色文本方式
INT 10H
MOV AX,DATA
MOV DS,AX
MOV ES,AX
MOV BP,OFFSET SPACE
MOV DX,0B00H
MOV CX,1000
MOV BX,0040H
MOV AX,1300H
INT 10H
MOV BP,OFFSET PATTERN ;显示矩形条
MOV DX,0B00H
MOV CX,120
MOV BX,004EH
MOV AX,1301H
INT 10H
MOV AX,DATA
MOV DS,AX
MOV ES,AX
MES: LEA DX,STR ;显示提示信息
MOV AH,9
INT 21H
MOV AH,3
INT 10H
MOV TEMP,DX
MOV AH,1 ;从键盘输入单个字符
INT 21H
CMP AL,'M' ;AL='M'?
JNE A1
A: CALL DATE ;显示系统日期
JMP A1
A1: MOV AH,8
INT 21H
CMP AL,'M' ;AL='M'?
JNZ A2
CALL TIME ;显示时间
JMP A2
A2: MOV AH,8
INT 21H
CMP AL,'M'
JNZ A3
CALL CLOCK
JMP START
A3: CMP AL,51H ;AL='Q'?
JNE MES
MOV AH,4CH ;返回dos状态
INT 21H
DATE PROC NEAR ;显示日期子程序
DISPLAY:MOV AH,2AH ;取日期
INT 21H
MOV SI,0
MOV AX,CX
MOV BX,100
DIV BL
MOV BL,AH
CALL BCDASC1 ;日期数值转换成相应的ASCII码字符
MOV AL,BL
CALL BCDASC1
INC SI
MOV AL,DH
CALL BCDASC1
INC SI
MOV AL,DL
CALL BCDASC1
MOV BP,OFFSET DBUFFER1
MOV DX,0C0DH
MOV CX,20
MOV BX,004EH
MOV AX,1301H
INT 10H
MOV AH,02H ;设置光标位置
MOV DX,0300H
MOV BH,0
INT 10H
MOV AH,01H ;读键盘缓冲区字符到AL寄存器
INT 16H
JE DISPLAY
CMP AL,'A'
JNZ C1
CALL CHANGE
RET
C1: CMP AL,'M'
JNZ C4
RET
C4: JMP START
MOV AX,4C00H
INT 21H
RET
DATE ENDP
TIME PROC NEAR ;显示时间子程序
DISPLAY1:MOV SI,0
MOV BX,100
DIV BL
MOV AH,2CH ;取时间
INT 21H
MOV AL,CH
CALL BCDASC ;将时间数值转换成ASCII码字符
INC SI
MOV AL,CL
CALL BCDASC
INC SI
MOV AL,DH
CALL BCDASC
LEA SI,DBUFFER
LEA DI,CLOCK_1
MOV CH,0
MOV CL,COUNT
BLP: MOV BL,[SI]
CMP BL,[DI]
JNZ B1
INC DI
INC SI
LOOP BLP
CALL SOUND
B1: MOV BP,OFFSET DBUFFER
MOV DX,0C0DH
MOV CL,COUNT
MOV BX,004EH
MOV AX,1301H
INT 10H
MOV AH,02H
MOV DX,0300H
MOV BH,0
INT 10H
MOV AH,01H
INT 16H
JE DISPLAY1
CMP AL,'A'
JNZ C2
CALL CHANGE1
RET
C2: CMP AL,'M'
JNZ C3
RET
C3: JMP START
MOV AX,4C00H
INT 21H
RET
TIME ENDP
CLOCK PROC
DISPLAY2:LEA BP,CLOCK_1
MOV DX,0C0DH ;输出当前设置的闹铃时间
MOV CL,COUNT
MOV BX,004EH
MOV AX,1301H
INT 10H
MOV AH,02H ;设置光标
MOV DX,0300H
MOV BH,0
INT 10H
MOV AH,01H ;读取缓冲区,查看是否 有按键
INT 16H
JE DISPLAY2
CMP AL,'A'
JNZ C6
CALL CHANGE2 ;调用改变时间宏(不设定系统时间)
RET
C6: CMP AL,'M'
JNZ C5
RET
C5: JMP START
MOV AX,4C00H
INT 21H
RET
clock endp
;---------------------
BCDASC PROC NEAR ;时间数值转换成ASCII码字符子程序
PUSH BX
CBW
MOV BL,10
DIV BL
ADD AL,'0'
MOV DBUFFER[SI],AL
INC SI
ADD AH,'0'
MOV DBUFFER[SI],AH
INC SI
POP BX
RET
BCDASC ENDP
BCDASC1 PROC NEAR ;日期数值转换成ASCII码字符子程序
PUSH BX
CBW
MOV BL,10
DIV BL
ADD AL,30H
MOV DBUFFER1[SI],AL
INC SI
ADD AH,30H
MOV DBUFFER1[SI],AH
INC SI
POP BX
RET
BCDASC1 ENDP
;-------------------------------
CHANGE PROC
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
LEA SI,DBUFFER1
BB2: MOV DX,0C0DH ;设置光标
BB3: MOV AH,2
INT 10H
MOV AH,8
INT 21H
CMP AL,'I'
JNZ BB4
MOV BL,[SI]
CMP DL,12H
JNZ B_4
CMP BL,30H
JNA B_4
MOV BL,2FH
JMP BB5
B_4: CMP DL,15H
JNZ B_7
CMP BL,32H
JNA B_7
MOV BL,2FH
B_7: CMP BL,2FH ;<- 让输入的数在0~9之间
JNB B_5
MOV BL,2FH
B_5: CMP BL,39H
JB BB5
MOV BL,2FH ;->
BB5: INC BL
MOV [SI],BL
PRINT [SI]
JMP BB3
BB4: CMP AL,'Q'
JNZ BB1
exit_1: POP SI
POP DX
POP CX
POP BX
POP AX
RET
BB1: CMP AL,'A'
JNZ B_6
INC SI
MOV AH,3
INT 10H
INC DL
B_1: CMP DL,11H ;年与月之间的空格
JNZ B_2
INC DL
INC SI
JMP BB3
B_2: CMP DL,14H ;月与日之间的空格
JNZ B_3
INC DL
INC SI
JMP BB3
B_3: CMP DL,16H
JA BB2
JMP BB3
B_6: CMP AL,0DH
JNZ BB2
MOV DX,TEMP
MOV BX,004EH
MOV AH,2
INT 10H
CALL compute_1
JMP exit_1
CHANGE ENDP
COMPUTE_1 PROC
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
LEA SI,DBUFFER1
MOV BX,000AH
MOV DX,0
MOV AH,0
MOV CX,3
MOV AL,[SI]
SUB AL,30H
LP1: MUL BX
INC SI
MOV DL,[SI]
SUB DL,30H
ADD AX,DX
LOOP LP1
LP_1: MOV WORD PTR YEAR,AX
INC SI
INC SI
MOV CX,1
MOV AX,0
MOV AL,[SI]
SUB AL,30H
LP2: MUL BX
INC SI
MOV DL,[SI]
SUB DL,30H
ADD AX,DX
LOOP LP2
LP_2: MOV MONTH,AL
INC SI
INC SI
MOV CX,1
MOV AX,0
MOV AL,[SI]
SUB AL,30H
LP3: MUL BX
INC SI
MOV DL,[SI]
SUB DL,30H
ADD AX,DX
LOOP LP3
LP_3: MOV DAY,AL
MOV CX,YEAR
MOV DH,MONTH
MOV DL,DAY
MOV AH,2BH
INT 21H
CMP AL,0FFH
JNZ S_1
PRINT1 ERORRMES_1
JMP RET_1
S_1: CMP AL,0
JNZ RET_1
PRINT1 RMES_1
RET_1: MOV AH,1
INT 21H
POP SI
POP DX
POP CX
POP BX
POP AX
RET
COMPUTE_1 ENDP
;----------------------------------------
CHANGE1 PROC
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
LEA SI,DBUFFER
CB2: MOV DX,0C0DH ;设置光标
CB3: MOV AH,2
INT 10H
MOV AH,8
INT 21H
CMP AL,'I'
JNZ CB4
MOV BL,[SI]
CMP DL,0DH ;-> 小时的十位设置
JNZ C_4
CMP BL,31H
JNA C_4
MOV BL,2FH
JMP CB5
C_4: CMP DL,10H
JNZ C_7
CMP BL,34H
JNA C_7
MOV BL,2FH
C_7: CMP DL,13H
JNZ C_8
CMP BL,34H
JNA C_8
MOV BL,2FH
C_8: CMP BL,2FH ;<- 输入的数在0~9之间
JNB C_5
MOV BL,2FH
C_5: CMP BL,39H
JB CB5
MOV BL,2FH ;->
CB5: INC BL
MOV [SI],BL
PRINT [SI]
JMP CB3
CB4: CMP AL,'Q'
JNZ CB1
exit_2: POP SI
POP DX
POP CX
POP BX
POP AX
RET
CB6: JMP CB2
CB7: JMP CB3
CB1: CMP AL,'A'
JNZ C_6
INC SI
MOV AH,3
INT 10H
INC DL
C_1: CMP DL,0FH ;时与分之间的冒号
JNZ C_2
INC DL
INC SI
JMP CB7
C_2: CMP DL,12H ;分与秒之间的冒号
JNZ C_3
INC DL
INC SI
JMP CB7
C_3: CMP DL,14H
JA CB6
JMP CB7
C_6: CMP AL,0DH
JNZ CB6
MOV DX,TEMP
MOV BX,004EH
MOV AH,2
INT 10H
CALL compute_2
JMP exit_2
CHANGE1 ENDP
COMPUTE_2 PROC
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
LEA SI,DBUFFER-1
MOV BX,000AH
MOV DX,0
MOV AH,0
MOV CX,1
MOV AL,[SI]
SUB AL,30H
CP1: MUL BX
INC SI
MOV DL,[SI]
SUB DL,30H
ADD AX,DX
LOOP CP1
CP_1: MOV WORD PTR HOUR,AX
INC SI
INC SI
MOV CX,1
MOV AX,0
MOV AL,[SI]
SUB AL,30H
CP2: MUL BX
INC SI
MOV DL,[SI]
SUB DL,30H
ADD AX,DX
LOOP CP2
CP_2: MOV MINUTE,AL
INC SI
INC SI
MOV CX,1
MOV AX,0
MOV AL,[SI]
SUB AL,30H
CP3: MUL BX
INC SI
MOV DL,[SI]
SUB DL,30H
ADD AX,DX
LOOP CP3
CP_3: MOV SECD,AL
MOV CH,HOUR
MOV CL,MINUTE
MOV DH,SECD
;MOV DL,0
MOV AH,2DH
INT 21H
CMP AL,0FFH
JNZ V_1
PRINT1 ERORRMES_1
JMP RET_2
V_1: CMP AL,0
JNZ RET_2
PRINT1 RMES_1
RET_2: MOV AH,1
INT 21H
POP SI
POP DX
POP CX
POP BX
POP AX
RET
COMPUTE_2 ENDP
CHANGE2 PROC
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
LEA SI,CLOCK_1
DB2: MOV DX,0C0DH ;设置光标
DB3: MOV AH,2
INT 10H
MOV AH,8
INT 21H
CMP AL,'I'
JNZ DB4
MOV BL,[SI]
CMP DL,0DH ;-> 小时的十位设置
JNZ D_4
CMP BL,31H
JNA D_4
MOV BL,2FH
JMP DB5
D_4: CMP DL,10H
JNZ D_7
CMP BL,34H
JNA D_7
MOV BL,2FH
D_7: CMP DL,13H
JNZ D_8
CMP BL,34H
JNA D_8
MOV BL,2FH
D_8: CMP BL,2FH ;<- 输入的数在0~9之间
JNB D_5
MOV BL,2FH
D_5: CMP BL,39H
JB DB5
MOV BL,2FH ;->
DB5: INC BL
MOV [SI],BL
PRINT [SI]
JMP DB3
DB4: CMP AL,'Q'
JNZ DB1
exit_3: POP SI
POP DX
POP CX
POP BX
POP AX
RET
DB6: JMP DB2
DB7: JMP DB3
DB1: CMP AL,'A'
JNZ D_6
INC SI
MOV AH,3
INT 10H
INC DL
D_1: CMP DL,0FH ;时与分之间的冒号
JNZ D_2
INC DL
INC SI
JMP DB7
D_2: CMP DL,12H ;分与秒之间的冒号
JNZ D_3
INC DL
INC SI
JMP DB7
D_3: CMP DL,14H
JA DB6
JMP DB7
D_6: CMP AL,0DH
JNZ DB6
MOV DX,TEMP
MOV BX,004EH
MOV AH,2
INT 10H
JMP exit_3
CHANGE2 ENDP
SOUND PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
IN AL,61H ;读取扬声器状态 ,防止输入的第一个音符不发声,所以先开扬声器再置初值
MOV AH,AL ;保存扬声器状态
OR AL,3 ;打开扬声器
OUT 61H,AL
PUSH AX
MOV AL,0B7H ; 设置8253控制字(通道2#)10110111
OUT 43H,AL
MOV AX,4553
OUT 42H,AL
MOV AL,AH
OUT 42H,AL
MOV DX,200
WAIT1: MOV CX,8FF0H
BL1: LOOP BL1
DEC DX
JNZ WAIT1
POP AX
MOV AH,AL
OUT 61H,AL
POP DX
POP CX
POP BX
POP AX
RET
SOUND ENDP
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -