题目:设计一个程序完成如下功能:
? 初始状态下假设一个字母A或B从屏幕的左下角斜飞出去(速度为每秒钟移动2个字符的位置)
? 字母在行进期间碰到屏幕的边沿时反弹。
? 使用小键盘对运动中的字母进行控制,小键盘上的按键如下定义:
? 4、2、6、8对应左、下、右、上
? 1、3、9、7对应左下、右下、右上、左上
? 比如:按下9键后字母就向右上方向前进
? 程序在按下'ESC'按键时退出。
? 要求:
? 当字母往前走时必须将前一个字母显示的消除。
? 在程序中必须记住当前字母所在的座标、运行方向。屏幕的座标是:行:0-79,列0-24,运行方向可用一个变量表示,该变量从0-7分别表示左、左下、下、右下、右、右上、上、左上
? 每次向前移时必须判断下一个座标位置,若碰到边界即X、Y是否为(0、79), (0,24)则进行反弹计算,然后改变运行方向变量值。
? 当控制按键按下后除了改变运行方向变量值外还必须判断是否在边界,需要保证下一个字母位置不能有越界的异常情况发生。
DATAS SEGMENT
;此处输入数据段代码
KEY DB 35H
DIR DB 9
X DB 0
Y DB 24
COUNT DB 9
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
;--------------------------------
;Main program
;--------------------------------
main proc far
START:
MOV AX,DATAS
MOV DS,AX
MOV CH,05H
MOV CL,07H
MOV AH,01H
INT 10H
;中断
;保存当前1CH的中断向量,再设置的中断向量
;save old interrupt vector
MOV AL,1CH
MOV AH,35H
INT 21H
PUSH ES
PUSH DX
PUSH DS
;set new interrupt vector
MOV DX,OFFSET DRAW ;DX = OFFSET OF DRAW
MOV AX,SEG DRAW ;AX = SEGMENT OF DRAW
MOV DS,AX ;DS = AX
MOV AL,1CH ;AL = VECTOR#
MOV AH,25H ;TO SET INTERRUPT VECTOR
INT 21H ;CALL DOS
POP DS
IN AL,21H
AND AL,11111110B
OUT 21H,AL
; MOV DI,20000
;DELAY: MOV SI,30000
;DELAY1: DEC SI
; JNZ DELAY1
; DEC DI
; JNZ DELAY
;此处输入代码段代码
LP1:
CMP KEY,27 ;KEY == ESC
JE EXIT ;Y = EXIT
; N
CMP KEY,35H ;KEY == 35H KEY中的值已被取走
JNE DIR_CHECK ;N -> DIR_CHECK KEY已有输入 判断原方向的合法性
; Y
;KEY = 键盘按键
MOV AH,07H
INT 21H