📄 f.asm
字号:
DLY macro opr1,opr2 ;延时子程序
local dl1,dl2
PUSH CX
PUSH DX
MOV DX,opr1
DL1: MOV CX,opr2
DL2: LOOP DL2
DEC DX
JNZ DL1
POP DX
POP CX
endm
PRO_NAM SEGMENT ;数据段
BUFA DB 200
DB ?
DB 200 DUP(0)
BUFB DB 200 DUP(?)
CAR DB 7 ;小汽车的字符图形表
DB 52H,7,0,0
DB 0B1H,7,0,1
DB 0DBH,7,0,1
DB 0DBH,7,0,1
DB 4FH,7,1,0
DB 4FH,7,0,-3
DB 2,7,-2,1
CHAR_CNT DW ?
POINTER DW ?
LINE_ON DB ?
COL_ON DB ?
PRO_NAM ENDS
STACK SEGMENT stack ;堆栈段定义
DB 200 DUP(0) ;200字节空间
STACK ENDS
code segment ;代码段定义
main proc far
ASSUME CS:CODE,DS:PRO_NAM,SS:STACK
start:
;set up stack for return
push ds
sub ax,ax
push ax
;main part of program goes here
mov ah,0
mov al,0dh
int 10h
call line
call ligh
call bus
ret
main endp
;jmp main
;####################################
line proc near
call hori
call vert
ret
;*******************************
hori proc near
push ax
push cx
push dx
mov dx,60
hine:mov cx,0
hdot:
mov al,0bH
mov ah,0ch ; 像素功能
int 10h
inc cx
cmp cx,300
jl hdot
add dx,90 ;行间距
cmp dx,160
jl hine
pop dx
pop cx
pop ax
ret
hori endp
;*************************************
vert proc near
push ax
push cx
push dx
mov cx,100
vline:mov dx,0
vdot: mov al,0bH
mov ah,0ch
int 10h
inc dx
cmp dx,200
jl vdot
add cx,90 ; 列间距
cmp cx,200
jl vline
pop dx
pop cx
pop ax
ret
vert endp
;**********************
line endp
;#################################
ligh proc near
rotate: mov ah,2
mov dh,8
mov dl,22
mov bh,0 ;100
int 10h
Call red
dly 55500,42040
call yellow
dly 55100,42040
call green
DLY 55000,45001
ret
ligh endp
green proc near
mov ah,9
mov al,'*'
mov bh,0
mov bl,02h
mov cx,1
int 10h
ret
green endp
;****************************
yellow proc near
mov ah,9
mov al,'*'
mov bh,0
mov bl,0eh
mov cx,1
int 10h
ret
yellow endp
;********************
red proc near
mov ah,9
mov al,'*'
mov bh,0
mov bl,4h
mov cx,1
int 10h
ret
red endp
;###########################
bus proc near
begin:mov ax,pro_nam
mov ds,ax ;ds段地
CALL QICHE
INT 21
QICHE PROC near ;汽车子程序
PUSH AX
PUSH BX
PUSH CX
PUSH DX
LEA DI,CAR ;DI指向字符图形表
MOV DH,12 ;从第9行9列位置开始显示汽车
MOV DL,0
CALL MOVE_SHAPE
RET
QICHE ENDP
MOVE_SHAPE PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH DI
MOV AH,0FH ;取当前显示方式
INT 10H
SUB CH,CH
MOV CL,[DI] ;CL放字符个数
INC DI ;DI指向字符图形表中的第一个字符
MOV CHAR_CNT,CX
MOV POINTER,DI
MOV LINE_ON,DH
MOV COL_ON,DL
PLOT_NEXT:
ADD DH,[DI+2] ;改变行列坐标
ADD DL,[DI+3]
CMP DL,80 ;出屏否?
JB MOV_CRSR
Pop DI
Pop DX
Pop CX
Pop BX
Pop AX
jmp exit2
MOV_CRSR:
MOV AH,2
INT 10H
MOV AL,[DI] ;取字符值
MOV BL,[DI+1] ;取字符属性
PUSH CX
MOV CX,1
MOV AH,09 ;显示字符
INT 10H
POP CX
ADD DI,4 ;DI指向下一个字符
LOOP PLOT_NEXT
DLY 40000,6801
CALL ERASE
JMP SHORT PLOT_NEXT
exit2: ret
MOVE_SHAPE ENDP
ERASE PROC NEAR ;檫除子程序
MOV CX,CHAR_CNT
MOV DI,POINTER
MOV DH,LINE_ON
MOV DL,COL_ON
ERASE_NEXT:
ADD DH,[DI+2]
ADD DL,[DI+3]
MOV AH,2
INT 10H
MOV AL,[DI]
MOV BL,0
PUSH CX
MOV CX,1
MOV AH,9
INT 10H
POP CX
ADD DI,4
LOOP ERASE_NEXT
MOV CX,CHAR_CNT
MOV DI,POINTER
MOV DH,LINE_ON
INC COL_ON
MOV DL,COL_ON
RET
ERASE ENDP
bus endp
;######################
code ends
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -