📄 smi.asm
字号:
DATA SEGMENT
STR DB 0dh,0AH,' Thanks for watching,Copyright:Software 0405 No.06 Briant $'
STR1 DB 0DH,0AH,' Would you like to see again(y/n):$'
STR2 DB 0DH,0AH,' What you input is wrong,must be (y) or (n)!$'
SMI DB 1
DB 2,7,0,0
CHAR_CNT DW ?
POINTER DW ?
LINE_ON DB ?
COL_ON DB ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
MAIN PROC FAR
t1: PUSH DS
SUB AX,AX
PUSH AX
MOV AX,DATA
MOV DS,AX
CALL CLEAR_SCREEN
LEA DI,SMI
MOV DH,5
MOV DL,5
CALL MOVE_SHAPE
MOV AH,0
MOV AL,02
INT 10H
LEA DX,STR
MOV AH,9
INT 21H
t3: LEA DX,STR1
MOV AH,9
INT 21H
MOV AH,01H
INT 21H
CMP AL,79H
JE t1
CMP AL,6EH
JE t2
LEA DX,STR2
MOV AH,9
INT 21H
JMP T3
t2: RET
MAIN ENDP
CLEAR_SCREEN PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV AH,6
MOV AL,0
MOV CH,0
MOV CL,0
MOV DH,24
MOV DL,79
MOV BH,7
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
PLOT_NEXT:
ADD DH,[DI+2]
ADD DL,[DI+3]
CMP DL,80
JB MOVE_CRSR
CALL ERASE
POP DI
POP DX
POP CX
POP BX
POP AX
RET
MOVE_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
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
call rand
MOV DH,LINE_ON
INC COL_ON
MOV DL,COL_ON
RET
ERASE ENDP
RAND PROC NEAR
PUSH CX
PUSH DX
PUSH AX
MOV AH,0
INT 1AH
MOV AX,DX
AND Ax,00ffh
MOV DL,3
DIV DL
MOV BL,AH
dec bl
sub line_on,bl
POP AX
POP DX
POP CX
RET
RAND ENDP
DLY_QRTR PROC NEAR
PUSH CX
PUSH DX
MOV DX,10000
DL1: MOV CX,6801
DL2: LOOP DL2
DEC DX
JNZ DL1
POP DX
POP CX
RET
DLY_QRTR ENDP
CODE ENDS
END MAIN
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -