📄 backup.asm
字号:
DSEG SEGMENT
COUNT DW 18
KEY DB ? ;记录用户按下的键
FLAG DB 0 ;标识位
MEMORY DB 50 DUP(0) ;用来记成绩
NUM DB 0 ;已记录的成绩个数
VAL DB 0 ;用来在显示成绩时,计数用户按'M'键的次数
N DB 0 ;用来在发送数据时计数
SEGTAB DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,40H
BUFFER DB 10,10,0,0,10,0 ;--00-0
KEYTAB DW 06FEH,06FDH,06FBH,06F7H,06EFH,06DFH,06BFH,067FH
DW 05FEH,05FDH,05FBH,05F7H,05EFH,05DFH,05BFH,057FH
DW 03EFH,03DFH,03BFH,037FH
KEYASC DB'CDEFBA98'
DB'45673210'
DB'RPMG'
MENU DB '*******MENU*******',0DH,0AH
DB ' G.START ',0DH,0AH
DB ' M.SAVE ',0DH,0AH
DB ' P.SHOW ',0DH,0AH
DB ' A.CLEAR ',0DH,0AH
DB ' R.EXIT ',0DH,0AH
DB 'CHOOSE: ',0DH,0AH
DB '$'
DSEG ENDS
STACK1 SEGMENT PARA STACK
DB 200 DUP(0)
STACK1 ENDS
CSEG SEGMENT
MAIN PROC FAR
ASSUME CS:CSEG,DS:DSEG,ES:DSEG,SS:STACK1
START: MOV AX,DSEG
MOV DS,AX
MOV ES,AX
;8253初始化
;---------
mov al,36h
out 43h,al
mov ax,1193
out 40h,al
mov al,ah
out 40h,al
;---------
MOV AL,08H
MOV AH,35H
INT 21H
PUSH ES
PUSH BX
PUSH DS
MOV DX,OFFSET RING
MOV AX,SEG RING
MOV DS,AX
MOV AL,08H
MOV AH,25H
INT 21H
POP DS
IN AL,21H
AND AL,11111110B ;关IR0中断请求
OUT 21H,AL
STI
;判断按键部分{{
CALL MENUSHOW
CD:
CALL KEYFIND ;接收用户按键
CMP KEY,'G'
JNZ PM ;转去判断'M'
TEST FLAG,01H
JNZ CD
MOV NUM,0 ;记录个数清零
MOV VAL,0
MOV BUFFER[0],10 ;第一位置'-'符
MOV BUFFER[2],0 ;其它位清零
MOV BUFFER[3],0
MOV BUFFER[5],0
OR FLAG,00000101B ;设置比赛开始标识D0
JMP CD
PM: ;判断是否'M',是则记录一个成绩
CMP KEY,'M'
JNZ PP ;转去判断'P'
;TO DO:在此添加一个记录到MEMORY
TEST FLAG,00000100B ;判断是否可以保存成绩
JZ CD ;当前不可保存转到cd
CMP NUM,8 ;判断是否有8个记录了
JZ STOP ;已有8个记录则清比赛和可存储标志,且num置0
CALL SAVE ;调用保存函数
OR FLAG,02H ;置有记录标志
JMP CD
PP: ;判断是否'p'键,是则显示成绩
CMP KEY,'P'
JNZ PE ;不是'P'键转去判断'E'
TEST FLAG,00000010B ;测试是否有记录保存在存储区中
JZ CD ;如果没有则继续等待用户按键
CALL SHOW ;调用显示函数
JMP CD
PE: ;发送数据到显示器
CMP KEY,'E'
JNZ PA
TEST FLAG,00000010B
JZ CD
CALL SEND
JMP CD
PA: ;结束比赛
CMP KEY,'A'
JNZ PR
;TO DO:比赛结束
STOP: AND FLAG,11111010B ;清比赛和可存储标志位
;MOV NUM,0 ;请记录个数为0
;MOV VAL,0
MOV BUFFER[0],10 ;第一位置'-'符
MOV BUFFER[2],0 ;显示缓冲清零
MOV BUFFER[3],0
MOV BUFFER[5],0
JMP CD
PR: ;返回DOS
CMP KEY,'R'
JNZ CD
;}}end.
CLI
POP DX
POP DS
MOV AL,08H
MOV AH,25H
INT 21H
MOV AH,4CH
INT 21H
MAIN ENDP
INIT8251 PROC ;8251初始化
PUSH DX
PUSH CX
PUSH BX
PUSH AX
MOV CX,3
MOV AL,0
MOV DX, 219H
Y: OUT DX,AL
CALL DELAY
LOOP Y
MOV AL,40H
OUT DX,AL
CALL DELAY
MOV AL,4EH
OUT DX,AL
CALL DELAY
MOV AL,27H
OUT DX,AL
CALL DELAY
POP AX
POP BX
POP CX
POP DX
RET
DELAY:
PUSH CX
MOV CX,20
GG: LOOP GG
POP Cx
RET
INIT8251 ENDP
INIT8253 PROC
PUSH DX
PUSH CX
PUSH BX
PUSH AX
MOV DX,0
MOV AX,250
MOV BX,1000
MUL BX
MOV BX,1200*16
DIV BX
MOV BX,AX
MOV DX,203H
MOV AL,036H
OUT DX,AL
MOV DX,200H
MOV AX,BX
OUT DX,AL
MOV AL,AH
OUT DX,AL
POP AX
POP BX
POP CX
POP DX
RET
INIT8253 ENDP
SEND PROC
PUSH DS
PUSH ES
PUSH DX
PUSH CX
PUSH BX
PUSH AX
PUSH DI
PUSH SI
MOV AX,DSEG
MOV DS,AX
MOV ES,AX
CALL INIT8253
CALL INIT8251
;-----------------
; MOV CL,1
MOV SI,OFFSET MEMORY
M0: MOV AL,[SI]
OR AL,30H
INC SI
INC N
MOV BL,AL
MOV DX,219H
M1: IN AL,DX
TEST AL,01H
JZ M1
MOV DX,218H
MOV AL,BL
OUT DX,AL
call delay
LOOP3: MOV DX,219H
IN AL,DX
TEST AL,02H
JZ LOOP3
MOV DX,218H
IN AL,DX
MOV DL,AL
MOV AH,02H
INT 21H
MOV AL,NUM
MOV BL,6
MUL BL
PUSH AX
MOV AL,N
MOV AH,0
MOV BL,6
DIV BL
CMP AH,0
JNZ LL
;INC CL
;cmp CL,7
;JNZ LL
mov dl,0dh
mov ah,2
int 21h
mov dl,0ah
mov ah,2
int 21h
; MOV CL,1
LL: POP AX
CMP N,AL
JB M0
;-----------------
POP SI
POP DI
POP AX
POP BX
POP CX
POP DX
POP ES
POP DS
SEND ENDP
MENUSHOW PROC
PUSH AX
MOV DX,OFFSET MENU
MOV AH,9
INT 21H
POP AX
RET
MENUSHOW ENDP
SAVE PROC ;保存8个记录的函数
PUSH DS
PUSH ES
PUSH DX
PUSH CX
PUSH BX
PUSH AX
PUSH DI
PUSH SI
MOV AX,DSEG
MOV DS,AX
MOV ES,AX
CMP BUFFER+2,6 ;判断记录是否大于一分钟,大于不保存成绩
JZ EXIT
MOV CX,5
CLD
MOV AL,NUM
MOV BL,6
MUL BL ;计算下一个记录存放的首地址偏移量(相对于MEMORY)
INC NUM ;记录个数加1
MOV SI,OFFSET BUFFER
MOV DI,OFFSET MEMORY
ADD DI,AX
MOV AL,NUM ;保存名次
MOV [DI],AL
LOOP1:
INC SI
INC DI
MOV AX,[SI] ;循环将buffer中的内容送至保存区中
MOV [DI],AX
LOOP LOOP1
;debug{{
mov bx,[di-5]
or bl,30h
mov dl,bl
mov ah,2
int 21h
mov dl,'-'
mov ah,2
int 21h
mov bx,[di-3]
or bl,30h
mov dl,bl
mov ah,2
int 21h
mov bx,[di-2]
or bl,30h
mov dl,bl
mov ah,2
int 21h
mov dl,'-'
mov ah,2
int 21h
mov bx,[di-0]
or bl,30h
mov dl,bl
mov ah,2
int 21h
mov dl,0dh
mov ah,2
int 21h
mov dl,0ah
mov ah,2
int 21h
;}}end.
EXIT:
POP SI
POP DI
POP AX
POP BX
POP CX
POP DX
POP ES
POP DS
RET
SAVE ENDP
SHOW PROC ;显示成绩函数
PUSH DS
PUSH ES
PUSH DX
PUSH CX
PUSH BX
PUSH AX
PUSH DI
PUSH SI
MOV AX,DSEG
MOV DS,AX
MOV ES,AX
;-----------------------
MOV AL,NUM
CMP VAL,AL ;比较显示记录是否超出保存的范围
JNZ Z
MOV VAL,0
Z: MOV CX,6
MOV AL,VAL
MOV BL,6
MUL BL
MOV DI,OFFSET BUFFER
MOV SI,OFFSET MEMORY
ADD SI,AX
Z1: MOV AX,[SI]
MOV [DI],AX
INC SI
INC DI
LOOP Z1
INC VAL ;准备显示下一记录
;-----------------------
POP SI
POP DI
POP AX
POP BX
POP CX
POP DX
POP ES
POP DS
RET
SHOW ENDP
KEYFIND PROC
PUSH DS
PUSH ES
PUSH DX
PUSH CX
PUSH BX
PUSH AX
PUSH DI
PUSH SI
MOV AX,DSEG
MOV DS,AX
MOV ES,AX
A1: mov dx,20bh
mov al,10000010b
wait1:out dx,al
mov al,0
mov dx,208h
out dx,al
mov dx,209h
in al,dx
and al,07h
cmp al,07h
jz wait1
push ax
push ax
mov cx,6000h
LOOP2:loop LOOP2
mov dx,20bh
mov al,10010000b
out dx,al
pop ax
mov dx,209h
out dx,al
mov dx,208h
in al,dx
pop bx
mov ah,bl
lea di,keytab
cld
mov cx,20
repnz scasw
jnz A1
mov ax,19
sub ax,cx
lea bx,KEYASC
xlat
MOV BL,AL
;PUSH AX
;MOV Dx,ax
MOV KEY,AL ;保存用户按键
;MOV DL,KEY
;MOV AH,02H ;在命令提示符中显示用户按键,测试用
;INT 21H
MOV AL,82H
MOV DX,20bH
OUT DX,AL
A2: MOV AL,0
MOV DX,208H
OUT DX,AL
MOV DX,209H
IN AL,DX
AND AL,07H
CMP AL,07H
JNZ A2
;PUSH AX
MOV CX,6000H
L1: LOOP L1
;JMP A1
POP SI
POP DI
POP AX
POP BX
POP CX
POP DX
POP ES
POP DS
RET
KEYFIND ENDP
RING PROC
PUSH DS
PUSH ES
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH DI
PUSH SI
MOV AX,DSEG
MOV DS,AX
MOV ES,AX
TEST FLAG,01H
JZ AB1
STI
DEC COUNT
JNZ AB1
MOV COUNT,18
;毫秒{{
INC BUFFER+5
CMP BUFFER+5,10
JNZ AB1
MOV BUFFER+5,0
;}}end
;秒个位{{
INC BUFFER+3
CMP BUFFER+3,10
JNZ AB1
MOV BUFFER+3,0
;}}end
;秒十位{{
INC BUFFER+2
CMP BUFFER+2,6
JNZ AB1
MOV BUFFER+2,0
;}}end
AB1: LEA SI,BUFFER
LEA BX,SEGTAB
MOV CL,01H
ab2: MOV AL,[SI]
XLAT
MOV DX,211H
OUT DX,AL
MOV AL,CL
DEC DX
OUT DX,AL
PUSH CX
MOV CX,9000h
AB: LOOP AB
POP CX
INC SI
SHL CL,1
CMP CL,40H
JNZ AB2
mov al,0
out dx,al
mov al,20h
out 20h,al
CLI
NEXT:
POP SI
POP DI
POP DX
POP CX
POP BX
POP AX
POP ES
POP DS
IRET
RING ENDP
CSEG ENDS
END MAIN
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -