📄 movecar.asm
字号:
DATA SEGMENT
SET_LINE DW 100 ;车身左上角的行号
SET_ROW DW 100 ;车身左上角的列号
WHEEL_RADIUS DW 10 ;车轮半径
COLOR DW 15 ;车身颜色
BKCOLOR DW 1 ;背景色
WHEEL_FLAG DB 4
FLAG_RADIUS DW 1
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV AX,0A000H
MOV ES,AX
MOV AX,0012H
INT 10H ;设置640*480*16图形模式
MOV AL,2
CALL SET_WRITE_MODE ;将写模式设为写模式2
MOV AX,BKCOLOR
CALL CLEAR ;将背景清成蓝色
CALL CAR_
WAIT_IN:
MOV AH, 08H ;程序暂停,等待键入
INT 21H
SPEAKER:
CMP AL, 53H ;S键喇叭
JNE FORWARD
CALL SOUNDF
FORWARD: ;D 键向前
CMP AL, 44H
JNE BACK
MOV DX, COLOR
MOV BX, BKCOLOR
MOV COLOR, BX
CALL CAR_ ; 将车身颜色与背景色一致,重画车身,达到擦除目的
DEC WHEEL_FLAG ; 控制车轮上圆点的位置
JNZ A
MOV WHEEL_FLAG, 4
A:
ADD SET_ROW, 5 ;每次移位5
MOV COLOR, DX
CALL CAR_
BACK: ;A键向后
CMP AL, 41H
JNE EXIT
MOV DX, COLOR
MOV BX, BKCOLOR
MOV COLOR, BX
CALL CAR_
INC WHEEL_FLAG
CMP WHEEL_FLAG, 4
JBE B
MOV WHEEL_FLAG, 1
B:
SUB SET_ROW, 5
MOV COLOR, DX
CALL CAR_
EXIT:
CMP AL, 51H ;Q 键退出
JNE WAIT_IN
MOV AH, 4CH
INT 21H
;************************汽车子程序***************************
CAR_ PROC NEAR
;***********画车身**********************************************
TOP:
PUSH SET_ROW
PUSH SET_LINE
ADD SET_ROW, 200
PUSH SET_ROW
SUB SET_ROW, 200
PUSH SET_LINE
CALL LINE ;直接调用画线函数
BOTTOM:
ADD SET_LINE, 50
PUSH SET_ROW
PUSH SET_LINE
ADD SET_ROW, 40
PUSH SET_ROW
PUSH SET_LINE
CALL LINE ;直接调用画线函数
ADD SET_ROW, 20
PUSH SET_ROW
PUSH SET_LINE
ADD SET_ROW, 80
PUSH SET_ROW
PUSH SET_LINE
CALL LINE ;直接调用画线函数
ADD SET_ROW, 20
PUSH SET_ROW
PUSH SET_LINE
ADD SET_ROW, 40
PUSH SET_ROW
PUSH SET_LINE
CALL LINE ;直接调用画线函数
SUB SET_LINE, 50
SUB SET_ROW, 200
LEFT:
PUSH SET_ROW
PUSH SET_LINE
PUSH SET_ROW
ADD SET_LINE, 50
PUSH SET_LINE
SUB SET_LINE, 50
CALL LINE ;直接调用画线函数
RIGHT:
ADD SET_ROW, 200
PUSH SET_ROW
PUSH SET_LINE
PUSH SET_ROW
SUB SET_ROW, 200
ADD SET_LINE, 50
PUSH SET_LINE
SUB SET_LINE, 50
CALL LINE ;直接调用画线函数
;********************画车轮***********************************
ADD SET_LINE, 50
ADD SET_ROW, 50
PUSH SET_ROW
PUSH SET_LINE
PUSH WHEEL_RADIUS
CALL CIRCLE
ADD SET_ROW, 100
PUSH SET_ROW
PUSH SET_LINE
PUSH WHEEL_RADIUS
CALL CIRCLE
SUB SET_LINE, 50
SUB SET_ROW, 150
LEFT_SE: ; 画左轮上的四个点,点根据标志依次显示
CMP WHEEL_FLAG, 4
JNE LEFT_SW
ADD SET_ROW, 53
ADD SET_LINE, 54
PUSH SET_ROW
PUSH SET_LINE
PUSH FLAG_RADIUS
SUB SET_ROW, 53
SUB SET_LINE, 54
CALL CIRCLE
JMP RIGHT_SE
LEFT_SW:
CMP WHEEL_FLAG, 3
JNE LEFT_NW
ADD SET_ROW, 47
ADD SET_LINE, 54
PUSH SET_ROW
PUSH SET_LINE
PUSH FLAG_RADIUS
SUB SET_ROW, 47
SUB SET_LINE, 54
CALL CIRCLE
JMP RIGHT_SE
LEFT_NW:
CMP WHEEL_FLAG, 2
JNE LEFT_NE
ADD SET_ROW, 47
ADD SET_LINE, 46
PUSH SET_ROW
PUSH SET_LINE
PUSH FLAG_RADIUS
SUB SET_ROW, 47
SUB SET_LINE, 46
CALL CIRCLE
JMP RIGHT_SE
LEFT_NE:
CMP WHEEL_FLAG, 1
JNE RIGHT_SE
ADD SET_ROW, 53
ADD SET_LINE, 46
PUSH SET_ROW
PUSH SET_LINE
PUSH FLAG_RADIUS
SUB SET_ROW, 53
SUB SET_LINE, 46
CALL CIRCLE
RIGHT_SE: ; 画右轮上的四个点,点根据标志依次显示
CMP WHEEL_FLAG, 4
JNE RIGHT_SW
ADD SET_ROW, 153
ADD SET_LINE, 54
PUSH SET_ROW
PUSH SET_LINE
PUSH FLAG_RADIUS
SUB SET_ROW, 153
SUB SET_LINE, 54
CALL CIRCLE
JMP DOOR_LEFT
RIGHT_SW:
CMP WHEEL_FLAG, 3
JNE RIGHT_NW
ADD SET_ROW, 147
ADD SET_LINE, 54
PUSH SET_ROW
PUSH SET_LINE
PUSH FLAG_RADIUS
SUB SET_ROW, 147
SUB SET_LINE, 54
CALL CIRCLE
JMP DOOR_LEFT
RIGHT_NW:
CMP WHEEL_FLAG, 2
JNE RIGHT_NE
ADD SET_ROW, 147
ADD SET_LINE, 46
PUSH SET_ROW
PUSH SET_LINE
PUSH FLAG_RADIUS
SUB SET_ROW, 147
SUB SET_LINE, 46
CALL CIRCLE
JMP DOOR_LEFT
RIGHT_NE:
CMP WHEEL_FLAG, 1
JNE DOOR_LEFT
ADD SET_ROW, 153
ADD SET_LINE, 46
PUSH SET_ROW
PUSH SET_LINE
PUSH FLAG_RADIUS
SUB SET_ROW, 153
SUB SET_LINE, 46
CALL CIRCLE
;*********************画车门************************************
DOOR_LEFT:
ADD SET_ROW, 165
PUSH SET_ROW
PUSH SET_LINE
PUSH SET_ROW
SUB SET_ROW, 165
ADD SET_LINE, 50
PUSH SET_LINE
SUB SET_LINE, 50
CALL LINE
DOOR_RIGHT:
ADD SET_ROW, 190
PUSH SET_ROW
PUSH SET_LINE
PUSH SET_ROW
SUB SET_ROW, 190
ADD SET_LINE, 50
PUSH SET_LINE
SUB SET_LINE, 50
CALL LINE
;***************************画车窗***********************
PUSH SET_ROW
ADD SET_LINE, 25
PUSH SET_LINE
ADD SET_ROW, 165
PUSH SET_ROW
SUB SET_ROW, 165
PUSH SET_LINE
SUB SET_LINE, 25
CALL LINE
RET
CAR_ ENDP
;*********************************汽车喇叭***********************************
;produces a tone of a specified frequency
SOUNDF proc near
push ax
push bx
push cx
push dx
push di
mov al,0b6h ;write timer mode reg
out 43h,al
mov di, 100
mov dx,12h ;timer divisor
mov ax,348ch ;1193100hz/frzq
div di ;value of frzq
out 42h,al ;write timer2 count low byte
mov al,ah
out 42h,al ;write timer2 count low byte
in al,61h
mov ah,al
or al,3
out 61h,al
mov bx,100
wait1:
mov cx,633
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -