FANGX MACRO FANGXIANG,OPR1,OPR2,COL_NUM,ROW_NUM
MOV NUM,FANGXIANG
CALL CLS
CALL READ
OPR1 COL,COL_NUM
OPR2 ROW,ROW_NUM
ENDM
DATAS SEGMENT
str db 'A'
row db 24
col db 0
NUM DB 5
DATAS ENDS
STACKS SEGMENT
db 200 dup (0)
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS: DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
call cls
call DISPLAY
LOOP1:
STI
MOV AH,0BH
INT 21H
INC AL
JNZ MOVE1
FLAG3:
MOV AH,0
INT 16H
PUSH AX
MOV AH,1
INT 16H
JZ FLAG2
POP AX
JMP FLAG3
EXIT1:
JMP EXIT
FLAG2:
POP AX
CMP AL,1BH
JZ EXIT
CMP AH,4BH
JZ K4
CMP AH,50H
JZ K2
CMP AH,4DH
JZ K6
CMP AH,48H
JZ K8
CMP AH,47H
JZ K7
CMP AH,49H
JZ K9
CMP AH,4FH
JZ K1
CMP AH,51H
JZ K3
JMP LOOP1
K4:
FANGX 5,SUB,ADD,1,0
CALL DISPLAY
JMP LOOP1
K2:
FANGX 4,ADD,ADD,0,1
CALL DISPLAY
JMP LOOP1
K6:
FANGX 7,ADD,ADD,1,0
CALL DISPLAY
JMP LOOP1
K8:
FANGX 3,ADD,SUB,0,1
CALL DISPLAY
JMP LOOP1
K7:
FANGX 6,SUB,SUB,1,1
CALL DISPLAY
JMP LOOP1
K9:
FANGX 5,ADD,SUB,1,1
CALL DISPLAY
JMP LOOP1
K1:
FANGX 1,SUB,ADD,1,1
CALL DISPLAY
JMP LOOP1
K3:
FANGX 2,ADD,ADD,1,1
CALL DISPLAY
JMP LOOP1
MOVE1:
CALL SUB_DELAY
CALL MOVE
JMP LOOP1
EXIT:
MOV AX,4C00H
INT 21H ;返回DOS
DISPLAY proc near ;显示字符'A'
MOV BH,0
MOV DH,ROW
MOV DL,COL
MOV AH,2
INT 10H
mov cx,1
mov al,'A'
MOV BL,00001011B
mov ah,9
int 10h
ret
DISPLAY endp
CLS PROC NEAR ;清屏
MOV CX,0
MOV DH,24
MOV DL,79
MOV BH,0
MOV AX,600H
INT 10H
RET
CLS ENDP
MOVE PROC NEAR ;运动
STI
NEXT:
MOV BL,NUM
CMP NUM,5
JZ ROT1
CMP NUM,2
JZ ROT2
CMP NUM,6
JZ ROT3
CMP NUM,1
JZ ROT4
;CALL SUB_DELAY
FANGX BL,ADD,SUB,1,1
CALL DISPLAY
JMP NEXT_MOVE
ROT1: ;右上
CMP ROW,0
JZ ROT2 ;向右下动
CMP COL,79
JZ ROT3 ;向左上动
;CALL SUB_DELAY
FANGX 5,ADD,SUB,1,1
CALL DISPLAY
JMP NEXT_MOVE
ROT2: ;右下
CMP COL,79
JZ ROT4 ;向左下动
CMP ROW,24
JZ ROT1 ;向右上动
;CALL SUB_DELAY
FANGX 2,ADD,ADD,1,1
CALL DISPLAY
JMP NEXT_MOVE
ROT3: ;左上
CMP COL,0
JZ ROT1 ;向右上动
CMP ROW,0
JZ ROT4
;CALL SUB_DELAY
FANGX 6,SUB,SUB,1,1
CALL DISPLAY
JMP NEXT_MOVE
ROT4: ;左下
CMP ROW,24
JZ ROT3
CMP COL,0
JZ ROT2
;CALL SUB_DELAY
FANGX 1,SUB,ADD,1,1
CALL DISPLAY
JMP NEXT_MOVE
NEXT_MOVE:
RET
MOVE ENDP
READ PROC NEAR ;读光标位置,DH=行号,DL=列号
MOV AH,3
MOV BH,0
INT 10H
MOV ROW,DH
MOV COL,DL
RET
READ ENDP
SUB_DELAY PROC NEAR ;延迟一秒
STI
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSHF
MOV AH, 2CH
INT 21H
INC DH ;系统秒数个数加1
MOV BL, DH
CMP BL, 3CH ;如果是60
JNE SUB_TIMER
XOR BL, BL ;BL置0
SUB_TIMER:
MOV AH, 2CH
INT 21H ;获取系统时间
CMP BL, DH ;秒数十位置0,只比较个数
JE SUB_RET ;如果到了下一秒,则返回
JMP SUB_TIMER
SUB_RET: POPF
POP DX
POP CX
POP BX
POP AX
RET
SUB_DELAY ENDP
CODES ENDS
END START