📄 flycar.asm
字号:
;******************************************************
;* 堆栈段
;******************************************************
STACK SEGMENT STACK
STACK_BUF DW 120 dup(?)
TOP EQU $-STACK_BUF
STACK ENDS
;******************************************************
;* 数据段
;******************************************************
DATA SEGMENT PARA
;------------------------------------------------------
; TODO: 数据的定义及存储器的分配
;------------------------------------------------------
car DB 7
DB 52h,70h,0,0
DB 0b1h,70h,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 ?
DATA ENDS
;******************************************************
;* 代码段
;******************************************************
CODE SEGMENT PARA
;------------------------------------------------------
MAIN PROC far
ASSUME cs:CODE,ds:DATA
ASSUME ss:STACK
START:
MOV ax,STACK
MOV ss,ax
MOV sp,TOP
MOV ax,DATA
MOV ds,ax
;------------------------------------------------------
; TODO: 从这里开始您的代码
;------------------------------------------------------
CALL clear_screen
LEA di,car
MOV dh,10
MOV dl,10
CALL MOVe_shape
MOV ax,4C00H
INT 21H
MAIN ENDP
;------------------------------------------------------
clear_screen PROC near
PUSH ax
PUSH bx
PUSH cx
PUSH dx
MOV ah,6
MOV al,0
MOV cx,0
MOV dh,24
MOV dl,79
MOV bh,5
INT 10h
POP dx
POP cx
POP bx
POP ax
RET
clear_screen 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]
INC di
MOV char_cnt,cx
MOV pointer,di
MOV line_on,dh
MOV col_on,dl
;These instructions plot the shape on the screen
plot_next:
ADD dh,[di+2]
ADD dl,[di+3]
CMP dl,80
JB MOV_crsr
CALL erase
POP di
POP dx
POP cx
POP bx
POP ax
RET
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
LOOP plot_next
CALL dly_qrtr
CALL erase
JMP short plot_next
MOVe_shape ENDP
;-------------------------------------------------
;this procedure erases a shape by reploting it
;with attribute=0
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
;-----------------------------------------
;this procedure generate a one_quarter second delay
dly_qrtr PROC near
PUSH cx
PUSH dx
MOV dx,1500
dl1:
MOV cx,2801
dl2:
LOOP dl2
DEC dx
JNZ dl1
POP dx
POP cx
RET
dly_qrtr ENDP
;------------------------------------------------------
CODE ENDS
;******************************************************
END START ;程序结束
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -