📄 typer.asm
字号:
DSEG SEGMENT
DSEG ENDS
CSEG SEGMENT
ASSUME CS:CSEG,DS:CSEG
MESS DB 'Continue? y/n$'
MESS1 DB 'TIME:$'
FNAME DB 'TEST.TXT',0
MESS0 DB 'FILE NOT FOUND$'
FBUFF DB ?
BUFF DB 128 DUP(0)
COUNT DW 0
MIN DB 0
SEC DB 0
MSEC DW 0
INCTIME:CLI
PUSH DS
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
PUSH DI
PUSH BP
PUSH SP ;PROTECT
PUSH CS
POP DS
PUSH DS
POP ES
MOV AX,55
ADD MSEC,AX
CMP MSEC,1000
JAE INCSEC
JMP INTEND
INCSEC: MOV MSEC,0
INC SEC
CMP SEC,60
JE INCMIN
JMP INTEND
INCMIN: MOV SEC,0
INC MIN
INTEND: POP SP
POP BP
POP DI
POP SI
POP DX
POP CX
POP BX
POP AX
POP DS
STI
IRET
;-------------------
;-------------------
SHOW PROC
;IN:AL
;OUT:NULL
MOV CX,2
MOV DL,10
DISP1: DIV DL
XCHG AH,AL
ADD AL,'0'
PUSH AX
XCHG AH,AL
MOV AH,0
LOOP DISP1
MOV CX,2
DISP2: POP DX
MOV AH,2
INT 21H
LOOP DISP2
RET
SHOW ENDP
;-----------------
SHOWSIGN PROC FAR
;SHOW':'
PUSH AX
PUSH DX
MOV DL,':'
MOV AH,2
INT 21H
POP DX
POP AX
RET
SHOWSIGN ENDP
;------------------
SHOWTIME PROC
CALL NEWLINE
MOV DX,OFFSET MESS1
CALL DISPMESS
MOV AL,MIN
XOR AH,AH
CALL SHOW
CALL SHOWSIGN
MOV AL,SEC
XOR AH,AH
CALL SHOW
CALL SHOWSIGN
MOV AX,MSEC
MOV BL,10
DIV BL
XOR AH,AH
CALL SHOW
RET
SHOWTIME ENDP
;-------------------
NEWLINE PROC
;IN:NULL
PUSH AX
PUSH DX
MOV DL,0DH
MOV AH,2
INT 21H
MOV DL,0AH
MOV AH,2
INT 21H
POP DX
POP DX
RET
NEWLINE ENDP
;--------------------
DISPMESS PROC
;IN:DX
PUSH AX
MOV AH,9
INT 21H
POP AX
RET
DISPMESS ENDP
;------------------
READCH PROC
;IN:NULL
;OUT:AL
PUSH CX
PUSH DX
MOV CX,1
MOV DX,OFFSET FBUFF
MOV AH,3FH
INT 21H
JC READCH1
CMP AX,CX
MOV AL,1AH
JB READCH1
MOV AL,FBUFF
READCH1:POP DX
POP CX
RET
READCH ENDP
;---------------------
STOBUFF PROC
;IN:SI,AL
PUSH DX
MOV DL,AL
MOV AH,2
INT 21H
MOV BYTE PTR [SI],AL
INC COUNT
INC SI
POP DX
RET
STOBUFF ENDP
;-------------------
CHECK PROC
;IN:SI,
PUSH AX
PUSH BX
PUSH DX
MOV SI,OFFSET BUFF
MOV CX,0
NEXTCHEC:MOV BL,BYTE PTR [SI]
IN AL,21H
AND AL,11111110B
OUT 21H,AL ;OPEN INT
STI
NEXTCH: MOV AH,1
INT 16H
JZ NEXTCH
MOV AH,0
INT 16H
CMP AL,1BH
JE OVER1
CMP AL,1fH
JB NEXTCH
CMP AL,BL ;判断是否正确
PUSH BX
PUSH CX
PUSH DX ;PROTECT
JE RIGHT
WRONG: MOV BH,0
MOV BL,47H
MOV CX,1
MOV AH,9
INT 10H
RIGHT: MOV DL,AL
MOV AH,2
INT 21H
POP DX
POP CX
POP BX
INC CX
INC SI
CMP CX,COUNT
JAE DISPTIME
JMP NEXTCHEC
DISPTIME:CLI
IN AL,21H
OR AL,00000001B
OUT 21H,AL ;CLOSE INT
CALL SHOWTIME
MOV MIN,0
MOV SEC,0
MOV MSEC,0
MOV COUNT,0
POP DX
POP BX
POP AX
RET
CHECK ENDP
;-------------------
START: PUSH CS
POP DS
MOV DX,OFFSET INCTIME
MOV AX,251CH
INT 21H
CLI
IN AL,21H
OR AL,00000001B
OUT 21H,AL ;CLOSE INT
MOV DX,OFFSET FNAME ;FILE
MOV AX,3D00H
INT 21H
JNC OPEN_OK
MOV DX,OFFSET MESS0
CALL DISPMESS
JMP OVER
OPEN_OK:MOV BX,AX
NLINE: MOV SI,OFFSET BUFF
STO_NEXT:
CALL READCH
CMP AL,1AH
JZ LASTCHECK
CMP AL,0DH
JZ NEXTLINE
CALL STOBUFF
JMP STO_NEXT
NEXTLINE: CALL READCH ;读取换行符
CMP AL,1AH
JZ OVER
CALL NEWLINE
MOV SI,OFFSET BUFF
CALL CHECK
CALL NEWLINE
JMP NLINE
LASTCHECK:
CALL NEWLINE
MOV SI,OFFSET BUFF
CALL CHECK
OVER: call newline
MOV DX,OFFSET MESS
CALL DISPMESS
CALL NEWLINE
NEXTIN: MOV AH,8
INT 21H ;CONTINUE???
CMP AL,'Y'
JE START
CMP AL,'y'
JE START
CMP AL,0dh
JE START
CMP AL,'N'
JE OVER1
CMP AL,'n'
JE OVER1
JMP NEXTIN
over1: MOV AH,3EH
INT 21H
MOV AH,4CH
INT 21H
CSEG ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -