📄 简单动画程序设计终极版.asm
字号:
MAIN_13: CMP AL,1BH
JNE MAIN_8
MOV AH,0 ;还原屏幕设置
MOV AL,2
INT 10H
MOV AX,4C00H ;自动返回DOS
INT 21H
CARTOON PROC NEAR ;动画子程序
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV AH,0 ;读系统时间以确定是否重画
INT 1AH
MOV AX,DX
SUB AX,TIME2
CMP AX,2
JNB CARTOON_0
JMP CARTOON_3
CARTOON_0: MOV TIME2,DX
CMP STATE_PICTURE,0 ;判断是画鸟还是画车
JNE CARTOON_1
MOV DELTA_X,-2
MOV DELTA_Y,1
MOV AREA,0410H
LEA SI,DATA_BIRD
MOV LINES,14
JMP CARTOON_2
CARTOON_1: MOV DELTA_X,2
MOV DELTA_Y,0
MOV AREA,071BH
LEA SI,DATA_CAR
MOV LINES,29
CARTOON_2: CLEAR
MOV AX,DELTA_X
ADD PRESENT_X,AX
MOV AX,DELTA_Y
ADD PRESENT_Y,AX
MOV COUNT,0
CMP STATE_PICTURE,0
JE CARTOON_4
CMP PRESENT_X,0280H
JB CARTOON_5
MOV PRESENT_X,0
JMP CARTOON_5
CARTOON_3: JMP CARTOON_EXIT
CARTOON_4: CMP PRESENT_X,0
JA CARTOON_A
MOV PRESENT_X,0280H
CARTOON_A: CMP PRESENT_Y,0190H
JB CARTOON_5
MOV PRESENT_Y,0
CARTOON_5: MOV AX,LINES
CMP AX,COUNT ;判断是否已画完
JE CARTOON_EXIT
DRAW
ADD SI,0AH
INC COUNT
JMP CARTOON_5
CARTOON_EXIT: POP DX
POP CX
POP BX
POP AX
RET
CARTOON ENDP
LINE PROC NEAR ;画直线子程序
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV CX,[SI+2]
MOV DX,[SI+4]
CMP CX,[SI+6]
JA LINE_1
MOV INCX,1
MOV AX,[SI+6]
SUB AX,CX
MOV XE,AX
JMP LINE_2
LINE_1: MOV INCX,-1
MOV AX,[SI+2]
SUB AX,[SI+6]
MOV XE,AX
LINE_2: CMP DX,[SI+8]
JA LINE_3
MOV INCY,1
MOV AX,[SI+8]
SUB AX,[SI+4]
MOV YE,AX
JMP LINE_4
LINE_3: MOV INCY,-1
MOV AX,[SI+4]
SUB AX,[SI+8]
MOV YE,AX
LINE_4: ADD AX,XE
MOV DISTANCE,AX
MOV T,0
MOV F,0
CMP XE,0
JNE LINE_5
MOV F,-1
LINE_5: POINT ;打印点
MOV AX,T
CMP AX,DISTANCE
JAE LINE_EXIT
CMP F,0
JL LINE_6
ADD CX,INCX
MOV AX,YE
SUB F,AX
JMP LINE_7
LINE_6: ADD DX,INCY
MOV AX,XE
ADD F,AX
LINE_7: INC T
JMP LINE_5
LINE_EXIT: POP DX
POP CX
POP BX
POP AX
RET
LINE ENDP
OUTTIME PROC NEAR
PUSH SI
PUSH AX
PUSH BX
PUSH CX
PUSH DX
LEA SI,TIME
MOV AH,02H
INT 1AH
MOV AX,CX
MOV CX,4
LP: PUSH CX
MOV CH,0
MOV CL,4
ROL AX,CL ;;循环左依次移取小时的十位和个位
MOV BL,AL
AND BL,0FH
OR BL,30H
MOV [SI],BL ;;存放转换后的ASCII在TIME2中
POP CX
INC SI
LOOP LP
MOV AX,[SI-2]
MOV [SI-1],AX
MOV BYTE PTR[SI-2],3AH
OUTSTR 29,47,TIMESTR
POP DX
POP CX
POP BX
POP AX
POP SI
RET
OUTTIME ENDP
ROUND PROC NEAR ;画圆子程序
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV AX,[SI+6]
MUL WORD PTR[SI+6]
MOV DISTANCE,AX
MOV AX,[SI+2]
ADD AX,[SI+6]
MOV XE,AX
MOV AX,[SI+4]
ADD AX,[SI+6]
MOV YE,AX
MOV CX,[SI+2]
SUB CX,[SI+6]
MOV DX,[SI+4]
SUB DX,[SI+6]
ROUND_1: CMP CX,[SI+2]
JB ROUND_2
MOV AX,CX
SUB AX,[SI+2]
JMP ROUND_3
ROUND_2: MOV AX,[SI+2]
SUB AX,CX
ROUND_3: MOV INCX,AX
PUSH DX
MUL INCX
MOV INCX,AX
POP DX
CMP DX,[SI+4]
JB ROUND_4
MOV AX,DX
SUB AX,[SI+4]
JMP ROUND_5
ROUND_4: MOV AX,[SI+4]
SUB AX,DX
ROUND_5: MOV INCY,AX
PUSH DX
MUL INCY
POP DX
ADD AX,INCX
CMP AX,DISTANCE
JAE ROUND_6
POINT ;打印点
ROUND_6: CMP DX,YE
JE ROUND_7
INC DX
JMP ROUND_1
ROUND_7: MOV DX,[SI+4]
SUB DX,[SI+6]
INC CX
CMP CX,XE
JA ROUND_EXIT
JMP ROUND_1
ROUND_EXIT: POP DX
POP CX
POP BX
POP AX
RET
ROUND ENDP
MENU PROC NEAR
CLEARSCREEN 0,0,30,80
OUTSTR 0AH,17H,STR1 ;显示输出字符串
OUTSTR 0CH,1CH,STR2
OUTSTR 0DH,1CH,STR3
OUTSTR 0EH,1CH,STR4
OUTSTR 0FH,1CH,STR5
OUTSTR 10H,1CH,STR6
OUTSTR 11H,1CH,STR2
RET
MENU ENDP
MUSIC PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
CMP STATE_MUSIC,0
JE MUSIC_0
MOV AL,0
OUT 61H,AL
JMP MUSIC_EXIT
MUSIC_0: MOV BX,INCDI
MOV AX,[DI+BX]
CWD
MOV BX,55
DIV BX
MOV BX,AX
MOV AH,0
INT 1AH
MOV AX,DX
SUB AX,TIME1
CMP AX,BX
JB MUSIC_EXIT
MOV TIME1,DX
ADD DI,2
MOV CX,[DI]
CMP CX,-1
JNE MUSIC_1
LEA DI,FREQ
MUSIC_1: MOV AL,0B6H ;设置8253
OUT 43H,AL
MOV DX,8H
MOV AX,3208H
DIV CX
OUT 42H,AL
MOV AL,AH
OUT 42H,AL
IN AL,61H
MOV AH,AL
OR AL,3
OUT 61H,AL
MUSIC_EXIT: POP SI
POP DX
POP CX
POP BX
POP AX
RET
MUSIC ENDP
CODES ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -