⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dazi1.asm

📁 汇编语言的另一个打字游戏 比较好 测试通过masm6.0
💻 ASM
📖 第 1 页 / 共 2 页
字号:
  INT 10H
  MOV AL, ':'
  MOV BH, 7D
  MOV CX, 01H
  MOV BL, 0EH
  MOV AH, 09H
  INT 10H
  MOV AX, 0
  MOV AL, MINUTE
  MOV DI, OFFSET TEMP
  INC DI
  MOV DX, 0
  MOV BX, 10D
  DIV BX
  XCHG AX, DX
  ADD AL, 30H
  MOV [DI], AL
  DEC DI
  ADD DL, 30H
  MOV [DI], DL
  MOV BP, OFFSET TEMP
  MOV BH, 7
  MOV CX, 2
  MOV DH, 16D
  MOV DL, 21D
  MOV AL, 01H
  MOV AH, 13H
  MOV BL, 0EH
  INT 10H
  MOV AL, ':'
  MOV BH, 7D
  MOV CX, 01H
  MOV BL, 0EH
  MOV AH, 09H
  INT 10H
  MOV AX, 0
  MOV AL, SECOND
  MOV DI, OFFSET TEMP
  INC DI
  MOV DX, 0
  MOV BX, 10D
  DIV BX
  XCHG AX, DX
  ADD AL, 30H
  MOV [DI], AL
  DEC DI
  ADD DL, 30H
  MOV [DI], DL
  MOV BP, OFFSET TEMP
  MOV BH, 7
  MOV CX, 2
  MOV DH, 16D
  MOV DL, 24D
  MOV AL, 01H
  MOV AH, 13H
  MOV BL, 0EH
  INT 10H

  MOV BP, OFFSET STR7
  MOV BH, 7
  MOV CX, 9
  MOV DH, 16D
  MOV DL, 32D
  MOV AL, 01H
  MOV AH, 13H
  MOV BL, 07H
  INT 10H

  MOV AH, 2CH  ; 获取当前时间
  INT 21H
  MOV HOUR, CH
  MOV MINUTE, CL
  MOV SECOND, DH

;***********显示出打字结束的时间************

  MOV AX, 0
  MOV AL, HOUR
  MOV DI, OFFSET TEMP
  INC DI
  MOV DX, 0
  MOV BX, 10D
  DIV BX
  XCHG AX, DX
  ADD AL, 30H
  MOV [DI], AL
  DEC DI
  ADD DL, 30H
  MOV [DI], DL
  MOV BP, OFFSET TEMP
  MOV BH, 7
  MOV CX, 2
  MOV DH, 16D
  MOV DL, 42D
  MOV AL, 01H
  MOV AH, 13H
  MOV BL, 0EH
  INT 10H
  MOV AL, ':'
  MOV BH, 7D
  MOV CX, 01H
  MOV BL, 0EH
  MOV AH, 09H
  INT 10H
  MOV AX, 0
  MOV AL, MINUTE
  MOV DI, OFFSET TEMP
  INC DI
  MOV DX, 0
  MOV BX, 10D
  DIV BX
  XCHG AX, DX
  ADD AL, 30H
  MOV [DI], AL
  DEC DI
  ADD DL, 30H
  MOV [DI], DL
  MOV BP, OFFSET TEMP
  MOV BH, 7
  MOV CX, 2
  MOV DH, 16D
  MOV DL, 45D
  MOV AL, 01H
  MOV AH, 13H
  MOV BL, 0EH
  INT 10H
  MOV AL, ':'
  MOV BH, 7D
  MOV CX, 01H
  MOV BL, 0EH
  MOV AH, 09H
  INT 10H
  MOV AX, 0
  MOV AL, SECOND
  MOV DI, OFFSET TEMP
  INC DI
  MOV DX, 0
  MOV BX, 10D
  DIV BX
  XCHG AX, DX
  ADD AL, 30H
  MOV [DI], AL
  DEC DI
  ADD DL, 30H
  MOV [DI], DL
  MOV BP, OFFSET TEMP
  MOV BH, 7
  MOV CX, 2
  MOV DH, 16D
  MOV DL, 48D
  MOV AL, 01H
  MOV AH, 13H
  MOV BL, 0EH
  INT 10H

  MOV BP, OFFSET STR6
  MOV BH, 7
  MOV CX, 10D
  MOV DH, 16D
  MOV DL, 60D
  MOV AL, 01H
  MOV AH, 13H
  MOV BL, 07H
  INT 10H

;*******************显示命中******************
  MOV AX, 0
  MOV AL, HITNUMBER
  CMP AL, 200D
  JB HITNEXT
  JMP HITMAX
HITNEXT: MOV BX, 0
  MOV BL, 2  ; 求正确率,因为是200个字母,所以将正确敲击的字母个数除以2
  DIV BL   ; 商在AL余数在AH
  MOV HITNUMBER, AL
  MOV CH, AH  ; 暂存AH
  MOV AX, 0
  MOV AL, HITNUMBER
  MOV HITNUMBER, CH ; 取出余数
  MOV DI, OFFSET TEMP
  INC DI
  MOV DX, 0
  MOV BX, 10D
  DIV BX
  XCHG AX, DX
  ADD AL, 30H
  MOV [DI], AL
  DEC DI
  ADD DL, 30H
  MOV [DI], DL
  MOV BP, OFFSET TEMP
  MOV BH, 7
  MOV CX, 2
  MOV DH, 16D
  MOV DL, 70D
  MOV AL, 01H
  MOV AH, 13H
  MOV BL, 0EH
  INT 10H
  MOV AL, HITNUMBER
  CMP AL, 0
  JNZ DISPNEXT
  JMP NODISP  ; 如果正确的个数为奇数个,则后面加".5"
DISPNEXT: MOV AH, 09H
  MOV CX, 1
  MOV BH, 07H
  MOV BL, 0EH
  MOV AL, '.'
  INT 10H
  
  MOV AH, 02H
  MOV BH, 07H
  MOV DH, 16D
  MOV DL, 73D
  INT 10H

  MOV AH, 09H
  MOV BH, 07H
  MOV CX, 1
  MOV BL, 0EH
  MOV AL, '5'
  INT 10H

NODISP:  MOV AH, 02H
  MOV BH, 07H
  MOV DH, 16D
  MOV DL, 74D
  INT 10H
  MOV DL, '%'
  MOV AH, 02H
  INT 21H
  JMP HITOVER

  
  
HITMAX:  MOV BP, OFFSET MAX
  MOV BH, 07H
  MOV DH, 16D
  MOV DL, 70D
  MOV CX, 5
  MOV AL, 1
  MOV BL, 0EH
  MOV AH, 13H
  INT 10H

HITOVER:  MOV AH, 07H
   INT 21H
   MOV AH, 07H
   INT 21H

;*************结束部分**************

OVER:  POP BX   ; 恢复原始参数
  POP AX
  MOV AH, 0  ; 恢复原始显示模式
  INT 10H
  MOV AH, 4CH
  INT 21H

;****************以下是子程序部分*****************

SETPOS PROC    ; 用来产生字母随机的起始位置
 MOV AH, 2CH   ; 获取系统时间
 INT 21H
 MOV AX, 0
 MOV AL, DL   ; 将时间(1/100秒单位)除以80取余获得随机数
 MOV BL, 80D 
 DIV BL
 MOV POSITION, AH
 RET
SETPOS  ENDP


WHICHONE PROC    ; 用来决定下落哪一个字母
 MOV AH, 2CH
 INT 21H    ; 获取系统时间
 MOV AX, 0
 MOV AL, DL
 MOV BL, 26D   ; 将时间(1/100秒单位)除以26取余获得随机数
 DIV BL
 MOV WHICH, AH
 RET
WHICHONE ENDP


SELECT PROC    ; 难度选择菜单
SELECTLOP1: CMP DIFFICULTYFLAG, 0FFH ; 判定当前选项
  JE SELECTLOP2   
  MOV AH, 06H
  MOV AL, 0
  MOV BH, 07H
  MOV CH, 18D
  MOV CL, 0
  MOV DH, 19D
  MOV DL, 79
  INT 10H

;******NORMAL被选中*********

  MOV AH, 13H
  MOV BL, 9EH
  MOV BH, 0
  MOV BP, OFFSET NORMAL
  MOV AL, 1
  MOV CX, 6
  MOV DH, 18D
  MOV DL, 36D
  INT 10H
  MOV AH, 13H
  MOV BL, 08H
  MOV BH, 0
  MOV BP, OFFSET HARD
  MOV AL, 1
  MOV CX, 6
  MOV DH, 19D
  MOV DL, 36D
  INT 10H
  JMP SELECTNEXT

;********HARD被选中*********

SELECTLOP2: MOV AH, 06H
  MOV AL, 0
  MOV BH, 07H
  MOV CH, 18D
  MOV CL, 0
  MOV DH, 19D
  MOV DL, 79
  INT 10H

  MOV AH, 13H
  MOV BL, 08H
  MOV BH, 0
  MOV BP, OFFSET NORMAL
  MOV AL, 1
  MOV CX, 6
  MOV DH, 18D
  MOV DL, 36D
  INT 10H
  MOV AH, 13H
  MOV BL, 9EH
  MOV BH, 0
  MOV BP, OFFSET HARD
  MOV AL, 1
  MOV CX, 6
  MOV DH, 19D
  MOV DL, 36D
  INT 10H

SELECTNEXT: MOV AH, 00  ; 获取输入
  INT 16H

  CMP AH,48H  ; 上箭头
  JE SELECTRESET  ; 反向
  CMP AH,50H  ; 下箭头
  JE SELECTRESET
  CMP AH,1CH  ; 回车
  JNE SELECTNEXT  ; 输入非法
  RET
SELECTRESET: NOT DIFFICULTYFLAG ; 标志各位取反 
  JMP SELECTLOP1
SELECT ENDP

 

MODESELECT PROC    ; MODE选择菜单
MODESELECTLOP1: CMP MODEFLAG, 0FFH ; 判定当前选项
  JE MODESELECTLOP2   
  MOV AH, 06H
  MOV AL, 0
  MOV BH, 07H
  MOV CH, 12D
  MOV CL, 0
  MOV DH, 13D
  MOV DL, 79
  INT 10H

  MOV AH, 13H
  MOV BL, 9EH
  MOV BH, 0
  MOV BP, OFFSET MODE1
  MOV AL, 1
  MOV CX, 5
  MOV DH, 12D
  MOV DL, 32D
  INT 10H
  MOV AH, 13H
  MOV BL, 08H
  MOV BH, 0
  MOV BP, OFFSET MODE2
  MOV AL, 1
  MOV CX, 5
  MOV DH, 12D
  MOV DL, 41D
  INT 10H
  JMP MODESELECTNEXT

MODESELECTLOP2: MOV AH, 06H
  MOV AL, 0
  MOV BH, 07H
  MOV CH, 18D
  MOV CL, 0
  MOV DH, 19D
  MOV DL, 79
  INT 10H

  MOV AH, 13H
  MOV BL, 08H
  MOV BH, 0
  MOV BP, OFFSET MODE1
  MOV AL, 1
  MOV CX, 5
  MOV DH, 12D
  MOV DL, 32D
  INT 10H
  MOV AH, 13H
  MOV BL, 9EH
  MOV BH, 0
  MOV BP, OFFSET MODE2
  MOV AL, 1
  MOV CX, 5
  MOV DH, 12D
  MOV DL, 41D
  INT 10H

MODESELECTNEXT: MOV AH, 00  ; 获取输入
  INT 16H

  CMP AH,4BH  ; Z箭头
  JE MODESELECTRESET ; 反向
  CMP AH,4DH  ; Y箭头
  JE MODESELECTRESET
  CMP AH,1CH  ; 回车
  JNE MODESELECTNEXT ; 输入非法
  RET
MODESELECTRESET: NOT MODEFLAG ; 标志各位取反 
  JMP MODESELECTLOP1
MODESELECT ENDP

 

DOWN PROC    ; 控制字符下落
  MOV HANGID, 5  ; 从第五行开始下落
DOWNLOP: CALL REFRESH  ; 刷新成绩统计函数  
  MOV AH, 01H  ; 检测键盘是否有按键输入
  INT 16H
  JZ DOWNCONTINUE

  MOV AH, 0  ; 如果有,则读取
  INT 16H
  MOV BX, 0
  MOV BL, 41H  ; A的ASCII码
  MOV BH, 61H  ; a的ASCII码
  ADD BL, WHICH  ; 获取当前字符的ASCII码(BL中为大写,BH中为小写)
  ADD BH, WHICH  
  CMP BL, AL  ; 比较当前读入的ASCII码与下落中的字符是否相同
  JE DOWNNEXT1
  CMP BH, AL
  JE DOWNNEXT1
  CMP AH, 01H  ; 如果按键为ESC,则显示退出菜单
  JNE DOWNCONTINUE
  CALL EXITMENU
  CMP OUTFLAG, 0 
  JE DOWNCONTINUE2

  MOV AH, 13H  ; 结束信息
  MOV BL, 0CH
  MOV BH, 3
  MOV BP, OFFSET THANKS
  MOV AL, 1
  MOV CX, 26D
  MOV DH, 18D
  MOV DL, 45D
  INT 10H
  MOV AH, 13H
  MOV BL, 07H
  MOV BH, 3
  MOV BP, OFFSET JIESHU
  MOV AL, 1
  MOV CX, 25D
  MOV DH, 19D
  MOV DL, 50D
  INT 10H
  MOV AH, 07H
  INT 21H
  JMP OVER

DOWNCONTINUE2: MOV AH, 05H
  MOV AL, 02H
  INT 10H
DOWNCONTINUE: MOV CH, 5D
  MOV CL, 0
  MOV DH, 15D
  MOV DL, 79D
  MOV BX, 0
  MOV AH, 07H
  MOV AL, 01H
  INT 10H
  CALL DELAY
  MOV BL, HANGID  ; 每下落一行HANGID递增1(跟踪字符位置)
  INC BL
  MOV HANGID, BL
  MOV BL, HANGID
  CMP BL, 15D  ; 若下落到15行,调用函数,使字符消失
  JA DOWNNEXT2
  JMP DOWNLOP
DOWNNEXT1: MOV BX, 0
  MOV BL, SCORENUMBER
  INC BL
  INC BL
  MOV SCORENUMBER, BL
  MOV BH, HITNUMBER
  INC BH
  MOV HITNUMBER, BH
  CALL DISPEAR  ; 判定为用户按键消除,则HITNUMBER,SCORENUMBER都增加
  JMP DOWNOVER
DOWNNEXT2: MOV BX, 0
  MOV BL, MISSNUMBER
  INC BL
  MOV MISSNUMBER, BL
  CALL DISPEAR  ; 判定字符到底部被动消除,则MISSNUMBER增加
DOWNOVER: RET
DOWN ENDP


DELAY PROC    ; 延时函数
 MOV AH, 0
 INT 1AH    ; 直接读取时钟计数器
 MOV BX, DX
 MOV AX, 0
 MOV AL, DELAYTIME  ; 加上DELAY间隔
 ADD BX, AX
DELAYLOP: MOV AH, 0
  INT 1AH
  CMP DX, BX
  JE DELAYNEXT
  JMP DELAYLOP
DELAYNEXT: RET
DELAY ENDP


DISPEAR PROC    ; 消除函数
 MOV BP, OFFSET BLANK  ; 实质是在当前字符所在位置写入空格,覆盖原字符
 MOV CX, 1
 MOV BH, 2
 MOV DH, HANGID   ; 当前字符所在行
 MOV DL, POSITION  ; 当前字符所在列
 MOV AL, 3
 MOV AH, 13H
 INT 10H
 RET
DISPEAR ENDP


EXITMENU PROC    ; 退出菜单(3号页面)
  MOV AH, 05H
  MOV AL, 03H
  INT 10H
  
  MOV AH, 02H
  MOV BH, 3
  MOV DH, 10D
  MOV DL, 0
  INT 10H
  MOV AH, 09H
  MOV BH, 3
  MOV CX, 80D
  MOV BL, 02H
  MOV AL, '*'
  INT 10H
  MOV AH, 02H
  MOV BH, 3
  MOV DH, 15D
  MOV DL, 0
  INT 10H
  MOV AH, 09H
  MOV BH, 3
  MOV CX, 80D
  MOV BL, 02H
  MOV AL, '*'
  INT 10H

; ********NOTQUIT被选中*********

EXITLOP1: CMP OUTFLAG, 0FFH ; 判定当前选项
  JE EXITLOP2
  MOV AH, 06H
  MOV AL, 0
  MOV BH, 07H
  MOV CH, 12D
  MOV CL, 0
  MOV DH, 13D
  MOV DL, 79
  INT 10H

  MOV AH, 13H
  MOV BL, 9EH
  MOV BH, 3
  MOV BP, OFFSET NOTQUIT  
  MOV AL, 1
  MOV CX, 18D
  MOV DH, 12D
  MOV DL, 32D
  INT 10H
  MOV AH, 13H
  MOV BL, 08H
  MOV BH, 3
  MOV BP, OFFSET YESQUIT
  MOV AL, 1
  MOV CX, 18D
  MOV DH, 13D
  MOV DL, 32D
  INT 10H
  JMP EXITNEXT

; ********YESQUIT被选中*********

EXITLOP2: MOV AH, 06H  
  MOV AL, 0
  MOV BH, 07H
  MOV CH, 12D
  MOV CL, 0
  MOV DH, 13D
  MOV DL, 79
  INT 10H

  MOV AH, 13H
  MOV BL, 08H
  MOV BH, 3
  MOV BP, OFFSET NOTQUIT  
  MOV AL, 1
  MOV CX, 18D
  MOV DH, 12D
  MOV DL, 32D
  INT 10H
  MOV AH, 13H
  MOV BL, 9EH
  MOV BH, 3
  MOV BP, OFFSET YESQUIT
  MOV AL, 1
  MOV CX, 18D
  MOV DH, 13D
  MOV DL, 32D
  INT 10H

EXITNEXT: MOV AH, 00  ; 获取输入
  INT 16H

  CMP AH,48H  ; 上箭头
  JE EXITRESET  ; 反向
  CMP AH,50H  ; 下箭头
  JE EXITRESET
  CMP AH,1CH  ; 回车
  JNE EXITNEXT  ; 输入非法
  RET
EXITRESET: NOT OUTFLAG  ;标志各位取反 
  JMP EXITLOP1
EXITMENU ENDP


ENDLINE PROC    ; 打印回车换行
 MOV DX, OFFSET ENDL
 MOV AH, 09H
 INT 21H

 MOV DX, OFFSET ENDL
 MOV AH, 09H
 INT 21H
 RET
ENDLINE ENDP

REFRESH PROC    ; 刷新成绩统计
 
;******将各个统计计数(16进制)除10取余转化为10进制数,并存入TEMP中,在相应位置写入TEMP中存储的数字
 
 MOV AX, 0
 MOV AL, HITNUMBER  
 MOV DI, OFFSET TEMP
 INC DI
 MOV DX, 0
 MOV BX, 10D
 DIV BX
 XCHG AX, DX
 ADD AL, 30H
 MOV [DI], AL
 DEC DI
 ADD DL, 30H
 MOV [DI], DL
 MOV BP, OFFSET TEMP
 MOV BH, 02H
 MOV CX, 2
 MOV DH, 1D
 MOV DL, 55D
 MOV AL, 01H
 MOV AH, 13H
 MOV BL, 0EH
 INT 10H
 
 MOV AX, 0
 MOV AL, MISSNUMBER
 MOV DI, OFFSET TEMP
 INC DI
 MOV DX, 0
 MOV BX, 10D
 DIV BX
 XCHG AX, DX
 ADD AL, 30H
 MOV [DI], AL
 DEC DI
 ADD DL, 30H
 MOV [DI], DL
 MOV BP, OFFSET TEMP
 MOV BH, 02H
 MOV CX, 2
 MOV DH, 1D
 MOV DL, 66D
 MOV AL, 01H
 MOV AH, 13H
 MOV BL, 0EH
 INT 10H
 
 MOV AX, 0
 MOV AL, SCORENUMBER
 MOV DI, OFFSET TEMP
 INC DI
 MOV DX, 0
 MOV BX, 10D
 DIV BX
 XCHG AX, DX
 ADD AL, 30H
 MOV [DI], AL
 DEC DI
 ADD DL, 30H
 MOV [DI], DL
 MOV BP, OFFSET TEMP
 MOV BH, 02H
 MOV CX, 2
 MOV DH, 1D
 MOV DL, 77D
 MOV AL, 01H
 MOV AH, 13H
 MOV BL, 0EH
 INT 10H
 RET
REFRESH ENDP


TYPESTART PROC   ; MODE2模式主要工作函数
 MOV AH, 01H
 INT 21H
 CMP AL, 1BH  ; 如果按键为ESC,则直接退出
 JNE NOESC

 MOV AH, 05H
 MOV AL, 06H  ; 6号页面作为MODE2退出画面
 INT 10H
 MOV AH, 13H  ; 结束信息
 MOV BL, 0CH
 MOV BH, 06H
 MOV BP, OFFSET THANKS
 MOV AL, 1
 MOV CX, 26D
 MOV DH, 18D
 MOV DL, 45D
 INT 10H
 MOV AH, 13H
 MOV BL, 07H
 MOV BH, 06H
 MOV BP, OFFSET JIESHU
 MOV AL, 1
 MOV CX, 25D
 MOV DH, 19D
 MOV DL, 50D
 INT 10H
 MOV AH, 07H
 INT 21H
 JMP OVER

NOESC: MOV BL, [SI]
 CMP AL, BL
 JNE TYPEWRONG
 MOV BL, HITNUMBER
 INC BL
 MOV HITNUMBER, BL
TYPEWRONG:  MOV BL, TOTAL
   INC BL
   MOV TOTAL, BL
   CMP BL, 200D
   JNE TYPENEXT
   JMP PINGJIA 
TYPENEXT:  INC SI
   RET
TYPESTART ENDP


CODE ENDS
END BEGIN

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -