📄 ok8.asm
字号:
.MODEL SMALL
.DATA
KEY DB 0
COUNT DB 0
NUM DB 0 ;名次
MMM DB 0 ;记录数
HJJ DW BUF1
FLAG DB 0
NNN DB 0
KEY_TABLE DW 06FEH,06FDH,06FBH,06F7H,06EFH,06DFH,06BFH,067FH
DW 05FEH,05FDH,05FBH,05F7H,05EFH,05DFH,05BFH,057FH
DW 03EFH,03DFH,03BFH,037FH
KEYTB DB 'CDEFBA98'
DB '45673210'
DB 'RPMG'
BUFFER DB 10,10,0,0,10,0 ;LED
SCREE DB 3FH,06H,5BH,4FH,66H,6DH
DB 7DH,07H,7FH,6FH,40H
BUF1 DB 1,10,0,0,10,0
BUF2 DB 2,10,0,0,10,0
BUF3 DB 3,10,0,0,10,0
BUF4 DB 4,10,0,0,10,0
BUF5 DB 5,10,0,0,10,0
BUF6 DB 6,10,0,0,10,0
BUF7 DB 7,10,0,0,10,0
BUF8 DB 8,10,0,0,10,0
MESS DB '已记录',0DH,0AH,'$'
.CODE
.STARTUP
MOV AX,@DATA
MOV ES,AX
MOV AL,00110110B ;8253初始化
OUT 43H,AL
MOV AX,11930
OUT 40H,AL
MOV AL,AH
OUT 40H,AL
MOV AL,08H ;保存原来的8号中断矢量
MOV AH,35H
INT 21H
PUSH ES
PUSH BX
PUSH DS
MOV DX,OFFSET INTP
MOV AX,SEG INTP
MOV DS,AX
MOV AL,08H ;设置新的中断矢量
MOV AH,25H
INT 21H
POP DS
IN AL,21H
AND AL,11111110B ;关IRO
OUT 21H,AL
STI
START:
CALL START1
KEYTEST:CMP AL,'G' ;判所按是何键
JZ G_KEY
CMP AL,'M'
JZ M_KEY
CMP AL,'A'
JZ A_KEY
CMP AL,'P'
JZ P_KEY
CMP AL,'R'
JZ R_KEY
CMP AL,'S'
JZ S_KEY
JMP START
.EXIT 0
INTP:
PUSH DS
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH DI
PUSH SI
PUSH ES
MOV AX,@DATA
MOV DS,AX
MOV ES,AX
TEST FLAG,01H ;测试D0位
JZ DISP
INC COUNT
CMP COUNT,10
JNZ DISP
MOV COUNT, 0
INC BUFFER+5
CMP BUFFER+5,10
JNZ DISP
MOV BUFFER+5,0
INC BUFFER+3
CMP BUFFER+3,10
JNZ DISP
MOV BUFFER+3,0
INC BUFFER+2
CMP BUFFER+2,6
JNZ DISP
MOV BUFFER+2,0
DISP:
LEA BX,SCREE
LEA SI,BUFFER
MOV AH,1
AGAIN:
MOV AL,[SI]
XLAT
MOV DX,211H
OUT DX,AL
MOV AL,AH
DEC DX
OUT DX,AL
MOV CX,60000
LOOP $
INC SI
ROL AH,1
CMP AH,40H ;01000000
JNZ AGAIN
MOV AL,20H
OUT 20H,AL
POP ES ;现场恢复
POP SI
POP DI
POP DX
POP CX
POP BX
POP AX
POP DS
IRET
START1:
MOV DX,@DATA
MOV ES,DX
AB1: MOV DX,21BH
MOV AL,10000010B ;设置PA口输出 PB 口输入
OUT DX,AL
MOV AL,0
MOV DX,218H
OUT DX,AL
MOV DX,219H
IN AL,DX
AND AL,07H
CMP AL,07H
JZ AB1
MOV CX,6000H
LOOP $
PUSH AX
PUSH AX
MOV DX,21BH
MOV AL,10010000B ;设置PA口输入 PB 口输出
OUT DX, AL
POP AX
MOV DX,219H
OUT DX, AL
MOV DX,218H
IN AL,DX
POP BX
MOV AH,BL
LEA DI,KEY_TABLE
MOV CX,24
CLD
REPNZ SCASW
JNZ AB1
MOV AX,23
SUB AX,CX
LEA BX,KEYTB
XLAT
PUSH AX
MOV DL,AL
MOV AH,2
INT 21H
MOV DX,21BH
MOV AL,10000010B
OUT DX,AL
MOV AL,0
MOV DX,218H
OUT DX,AL
AB2: MOV DX,219H
IN AL,DX
AND AL,07H
CMP AL,07H
JNZ AB2
MOV CX,60000
LOOP $
POP AX
RET
G_KEY: ;小键盘有G键按下比赛开始
MOV BUFFER,10
MOV BUFFER+2,0
MOV BUFFER+3,0
MOV BUFFER+5,0
MOV COUNT,0
MOV NUM,0
OR FLAG,00000101B
JMP START
A_KEY: ;小键盘有A键按下比赛结束
AND FLAG,11111010B ;清比赛和可存储标志位
MOV BUFFER,10
MOV BUFFER+2,0
MOV BUFFER+3,0
MOV BUFFER+5,0
MOV HJJ,SI
JMP START
R_KEY: ;小键盘有R键按下就返回DOS
CLI
POP DX
POP DS
MOV AH,25H
MOV AL,08H
INT 21H
.EXIT 0
M_KEY: ;小键盘有M键按下保存成绩
TEST FLAG,04H
JZ START
MOV SI,HJJ
MOV AL,BUFFER+2
MOV [SI+2],AL
MOV AL,BUFFER+3
MOV [SI+3],AL
MOV AL,BUFFER+5
MOV [SI+5],AL
ADD HJJ,6
MOV AL,FLAG
OR AL, 02H
MOV FLAG,AL
INC NUM
CMP NUM,8
JNZ START
MOV AL,FLAG
AND AL,0FBH
MOV FLAG,AL
LEA SI,BUF1
MOV HJJ,SI
JMP A_KEY
P_KEY: ;小键盘有p键按下显示成绩
TEST FLAG,00000010B
JZ START
MOV SI,HJJ
MOV AL,[SI]
MOV BUFFER,AL
ADD AL,30H ;转换成ASCII码
MOV DL,AL
MOV AH,2 ;2号调用显示
INT 21H
MOV DX,'-' ;显示 -
MOV AH,2
INT 21H
MOV AL,[SI+2]
MOV BUFFER+2,AL
ADD AL,30H
MOV DL,AL
MOV AH,2
INT 21H
MOV AL,[SI+3]
MOV BUFFER+3,AL
ADD AL,30H
MOV DL,AL
MOV AH,2
INT 21H
MOV DX,'-'
MOV AH,2
INT 21H
MOV AL,[SI+5]
MOV BUFFER+5,AL
ADD AL,30H
MOV DL,AL
MOV AH,2
INT 21H
ADD HJJ,6
ADD MMM,1
CMP MMM,8
JNZ START
MOV NUM,0
AND FLAG,11111101B
JMP A_KEY
S_KEY: MOV DX,203H ;8251初始化
MOV AL,10110110B
OUT DX, AL
MOV DX,250
MOV AX,1000
MUL DX
MOV BX,1200*16
DIV BX
MOV DX,202H
OUT DX,AL
MOV AL,AH
OUT DX,AL
INT: XOR AX,AX
MOV CX,3 ;往8251的控制端口209H送3个00
MOV DX,209H
OUT1: CALL DELAY
LOOP OUT1
MOV AL,40H ;往控制端口送40H,软件复位
CALL DELAY
MOV AL,4EH ;波特率因子为16,8位数据 1位停止位
CALL DELAY
MOV AL,15H ;向控制端口写控制字
CALL DELAY ;使发送器和接受器启动
MOV CX,8
LEA SI,BUF1
MOV HJJ,SI ;?
JMP JJ
NEXT: ADD HJJ,6
JJ: MOV DX, 209H
IN AL, DX
AND AL, 01H
JZ JJ
MOV SI, HJJ ;将BUF1的首地址给SI
MOV AL, [SI] ;显示LED第一位
ADD AL, 30H
CALL MOVE
MOV DX,'-' ;显示 -
CALL MOVE
MOV AL,[SI+2] ;显示LED第3位
ADD AL,30H
CALL MOVE
MOV AL,[SI+3] ;显示LED第4位
ADD AL, 30H
CALL MOVE
MOV DX,'-'
CALL MOVE
MOV AL,[SI+5] ;显示LED第6位
ADD AL, 30H
CALL MOVE
LOOP NEXT ;显示下一个
JNZ START
MOVE: MOV DX, 208H
OUT DX, AL
CALL DELAY
INC DX
HH: IN AL, DX
TEST AL, 02H
JZ HH
DEC DX
IN AL, DX
MOV AH,2
MOV DL, AL
INT 21H
RET
DELAY:OUT DX,AL ;用与将AL中的内容输出到DX指出的端口
PUSH CX
MOV CX,2000
LOOP $
POP CX
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -