DATA SEGMENT
X DW ?
Y DW ? ;(X,Y用来存储0,25h)
X1 DW 100 ;第100行
Y1 DW 50 ;第50列
R DW 25H
X4 DW ? ;(X4,Y4)在子程序Dian中用来保存传递数据(DX,CX)
Y4 DW ?
N DB ? ;存储像素值
D DW ? ;存储误差更新
M DW ?
X2 DW ?
Y2 DW ? ;(X2,Y2)在子程序Huayuan中用来保存传递数据(DX,CX)
x3 dw ?
y3 dw ? ;(X3,Y3)用来存储传递(X1,Y1)
STRING1 DB 'If you want to quit please Press q$'
STRING2 DB 'press any key to show circles:$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
;------------------------------------------------------------
MAIN PROC FAR
START: MOV AX,DATA
MOV DS,AX
CALL Clear ;清屏子程序
CALL Set_mode ;显示方式
LEA DX,STRING1
MOV AH,09H
INT 21H
MOV DX,0200H ;在下一行显示STRING2
CALL Set_cursor
LEA DX,STRING2
MOV AH,9H
INT 21H
MOV AH,1
INT 21H
CMP AL,'q'
JZ EXIT
CALL Circle
EXIT:
MOV AH,4CH
INT 21H
MAIN ENDP
;--------------------------------------------
Clear PROC NEAR
MOV AX,0600H
MOV BH,8 ;字符显示绿色
MOV CX,0
MOV DX,184fH ;184F正好全屏清屏
INT 10H
RET
Clear ENDP
;------------------------------------------
Set_mode PROC ;320*200,256色图形(VGA)
MOV AH,0
MOV AL,13H
INT 10H
RET
Set_mode ENDP
;-----------------------------------------------
Set_cursor PROC ;置光标,BH页号,DH/HL=行/列
MOV AH,2 ;DH/DL在前面指定
MOV BH,0
INT 10H
RET
Set_cursor ENDP
;--------------------------------------------
Set_color PROC ;写像素,AL颜色值,BH页号,
MOV AH,0CH ;DX/CX像素行/列
MOV AL,N
MOV BH,0
INT 10H
RET
Set_color ENDP
;---------------------------------------------
Circle PROC
MOV SI,X1 ;保存(X1,Y1)后面会用到
MOV X3,SI
MOV SI,Y1
MOV Y3,SI
Yuan1: ;Yuan1的圆心坐标(x1,y1)
MOV N,9H
MOV X,0
MOV Y,25H
CALL Pan_direction
Yuan2: MOV N,7H
MOV X,0
MOV Y,25H
MOV BX,Y
ADD Y1,BX
ADD Y1,BX
SHR BX,1
ADD Y1,BX ;Yuan2的圆心坐标(X1,Y1+2.5R)
CALL Pan_direction
Yuan3: MOV N,29H
MOV X,0
MOV Y,25H
MOV BX,Y
MOV SI,Y3
MOV Y1,SI
ADD Y1,BX
ADD Y1,BX
ADD Y1,BX
ADD Y1,BX
ADD Y1,BX ;Yuan3的圆心坐标(X1,Y1+5R)
CALL Pan_direction
Yuan4: MOV N,6H
MOV X,0
MOV Y,25H
MOV SI,X3
MOV X1,SI
MOV SI,Y3
MOV Y1,SI
MOV BX,Y
ADD X1,BX
ADD Y1,BX
SHR BX,1
SHR BX,1
ADD Y1,BX ;Yuan4的圆心坐标(X1+R,Y1+1.25R)
CALL Pan_direction
Yuan5: MOV N,30H
MOV X,0
MOV Y,25H
MOV SI,Y3
MOV Y1,SI
MOV BX,Y
ADD Y1,BX
ADD Y1,BX
ADD Y1,BX
SHR BX,1
ADD Y1,BX
SHR BX,1
ADD Y1,BX ;Yuan5的圆心坐标(X1+R,Y1+3.75R)
CALL Pan_direction
RET
Circle endp
;---------------------------------------
Pan_direction proc near
MOV SI,1
SUB SI,R
MOV D,SI ;D存储修正值
PAN3:
MOV SI,X
MOV DI,Y
ADD SI,X1
ADD DI,Y1
MOV DX,SI
MOV CX,DI
MOV SI,X
MOV DI,Y
CMP SI,DI ;当X增大到Y时跳出
JG PAN
CALL Huayuan
CMP D,0 ;若D>=0,则修正D=D+2(X-Y)+5
JGE PAN1
MOV SI,2 ;若D<0,则修正D=D+2X+3
MOV AX,SI
IMUL X
ADD D,AX
ADD D,3
PAN2:
INC X
JMP PAN3
PAN1:
MOV SI,2
MOV AX,X
SUB AX,Y
IMUL SI
ADD D,AX
ADD D,5
DEC Y
JMP PAN2
PAN:RET
Pan_direction endp
;-----------------------------------------------
Huayuan PROC
MOV X2,DX
MOV Y2,CX
call dian ;画第一点 (x,y)
MOV X2,DX
MOV Y2,CX
SUB DX,X1
SUB CX,Y1
ADD CX,X1
ADD DX,Y1
XCHG DX,CX
CALL Dian ;画第二点(Y,X)
MOV DX,X4
MOV CX,Y4
SUB DX,X1
MOV AX,X1
SUB AX,DX
MOV DX,AX
CALL Dian ;画第三点(y,-x)
MOV DX,X4
MOV CX,Y4
SUB CX,Y1
MOV AX,Y1
SUB AX,CX
MOV CX,AX
CALL Dian ;画第四点(-y,-x)
MOV DX,X4
MOV CX,Y4
MOV AX,X1
SUB AX,DX
ADD AX,X1
MOV DX,AX
CALL Dian ;画第五点(-Y,X)
MOV DX,X2
MOV CX,Y2
SUB DX,X1
MOV AX,X1
SUB AX,DX
MOV DX,AX
CALL Dian ;画第六点(X,-Y)
MOV DX,X4
MOV CX,Y4
SUB CX,Y1
MOV AX,Y1
SUB AX,CX
MOV CX,AX
CALL Dian ;画第七点(-X,-Y)
MOV DX,X4
MOV CX,Y4
MOV AX,X1
SUB AX,DX
ADD AX,X1
MOV DX,AX
CALL Dian ;画第八点(-X,Y)
CALL Delay
RET
Huayuan ENDP
;----------------------------------------------
Dian PROC
CALL Set_color ;画点,CX,DX的加减是为加深线条
MOV X4,DX
MOV Y4,CX
INC CX
CALL Set_color
SUB CX,2
CALL Set_color
INC DX
CALL Set_color
INC CX
CALL Set_color
INC CX
CALL Set_color
MOV DX,X4
MOV CX,Y4
RET
Dian ENDP
;---------------------------------------
Delay PROC ;画一个圆的延时程序
PUSH CX
PUSH DX
MOV DX,1000
DE1:MOV CX,5000
DE2:LOOP DE2
DEC DX
JNZ DE1
POP DX
POP CX
RET
Delay ENDP
;----------------------------------------
CODE ENDS
END MAIN
X DW ?
Y DW ? ;(X,Y用来存储0,25h)
X1 DW 100 ;第100行
Y1 DW 50 ;第50列
R DW 25H
X4 DW ? ;(X4,Y4)在子程序Dian中用来保存传递数据(DX,CX)
Y4 DW ?
N DB ? ;存储像素值
D DW ? ;存储误差更新
M DW ?
X2 DW ?
Y2 DW ? ;(X2,Y2)在子程序Huayuan中用来保存传递数据(DX,CX)
x3 dw ?
y3 dw ? ;(X3,Y3)用来存储传递(X1,Y1)
STRING1 DB 'If you want to quit please Press q$'
STRING2 DB 'press any key to show circles:$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
;------------------------------------------------------------
MAIN PROC FAR
START: MOV AX,DATA
MOV DS,AX
CALL Clear ;清屏子程序
CALL Set_mode ;显示方式
LEA DX,STRING1
MOV AH,09H
INT 21H
MOV DX,0200H ;在下一行显示STRING2
CALL Set_cursor
LEA DX,STRING2
MOV AH,9H
INT 21H
MOV AH,1
INT 21H
CMP AL,'q'
JZ EXIT
CALL Circle
EXIT:
MOV AH,4CH
INT 21H
MAIN ENDP
;--------------------------------------------
Clear PROC NEAR
MOV AX,0600H
MOV BH,8 ;字符显示绿色
MOV CX,0
MOV DX,184fH ;184F正好全屏清屏
INT 10H
RET
Clear ENDP
;------------------------------------------
Set_mode PROC ;320*200,256色图形(VGA)
MOV AH,0
MOV AL,13H
INT 10H
RET
Set_mode ENDP
;-----------------------------------------------
Set_cursor PROC ;置光标,BH页号,DH/HL=行/列
MOV AH,2 ;DH/DL在前面指定
MOV BH,0
INT 10H
RET
Set_cursor ENDP
;--------------------------------------------
Set_color PROC ;写像素,AL颜色值,BH页号,
MOV AH,0CH ;DX/CX像素行/列
MOV AL,N
MOV BH,0
INT 10H
RET
Set_color ENDP
;---------------------------------------------
Circle PROC
MOV SI,X1 ;保存(X1,Y1)后面会用到
MOV X3,SI
MOV SI,Y1
MOV Y3,SI
Yuan1: ;Yuan1的圆心坐标(x1,y1)
MOV N,9H
MOV X,0
MOV Y,25H
CALL Pan_direction
Yuan2: MOV N,7H
MOV X,0
MOV Y,25H
MOV BX,Y
ADD Y1,BX
ADD Y1,BX
SHR BX,1
ADD Y1,BX ;Yuan2的圆心坐标(X1,Y1+2.5R)
CALL Pan_direction
Yuan3: MOV N,29H
MOV X,0
MOV Y,25H
MOV BX,Y
MOV SI,Y3
MOV Y1,SI
ADD Y1,BX
ADD Y1,BX
ADD Y1,BX
ADD Y1,BX
ADD Y1,BX ;Yuan3的圆心坐标(X1,Y1+5R)
CALL Pan_direction
Yuan4: MOV N,6H
MOV X,0
MOV Y,25H
MOV SI,X3
MOV X1,SI
MOV SI,Y3
MOV Y1,SI
MOV BX,Y
ADD X1,BX
ADD Y1,BX
SHR BX,1
SHR BX,1
ADD Y1,BX ;Yuan4的圆心坐标(X1+R,Y1+1.25R)
CALL Pan_direction
Yuan5: MOV N,30H
MOV X,0
MOV Y,25H
MOV SI,Y3
MOV Y1,SI
MOV BX,Y
ADD Y1,BX
ADD Y1,BX
ADD Y1,BX
SHR BX,1
ADD Y1,BX
SHR BX,1
ADD Y1,BX ;Yuan5的圆心坐标(X1+R,Y1+3.75R)
CALL Pan_direction
RET
Circle endp
;---------------------------------------
Pan_direction proc near
MOV SI,1
SUB SI,R
MOV D,SI ;D存储修正值
PAN3:
MOV SI,X
MOV DI,Y
ADD SI,X1
ADD DI,Y1
MOV DX,SI
MOV CX,DI
MOV SI,X
MOV DI,Y
CMP SI,DI ;当X增大到Y时跳出
JG PAN
CALL Huayuan
CMP D,0 ;若D>=0,则修正D=D+2(X-Y)+5
JGE PAN1
MOV SI,2 ;若D<0,则修正D=D+2X+3
MOV AX,SI
IMUL X
ADD D,AX
ADD D,3
PAN2:
INC X
JMP PAN3
PAN1:
MOV SI,2
MOV AX,X
SUB AX,Y
IMUL SI
ADD D,AX
ADD D,5
DEC Y
JMP PAN2
PAN:RET
Pan_direction endp
;-----------------------------------------------
Huayuan PROC
MOV X2,DX
MOV Y2,CX
call dian ;画第一点 (x,y)
MOV X2,DX
MOV Y2,CX
SUB DX,X1
SUB CX,Y1
ADD CX,X1
ADD DX,Y1
XCHG DX,CX
CALL Dian ;画第二点(Y,X)
MOV DX,X4
MOV CX,Y4
SUB DX,X1
MOV AX,X1
SUB AX,DX
MOV DX,AX
CALL Dian ;画第三点(y,-x)
MOV DX,X4
MOV CX,Y4
SUB CX,Y1
MOV AX,Y1
SUB AX,CX
MOV CX,AX
CALL Dian ;画第四点(-y,-x)
MOV DX,X4
MOV CX,Y4
MOV AX,X1
SUB AX,DX
ADD AX,X1
MOV DX,AX
CALL Dian ;画第五点(-Y,X)
MOV DX,X2
MOV CX,Y2
SUB DX,X1
MOV AX,X1
SUB AX,DX
MOV DX,AX
CALL Dian ;画第六点(X,-Y)
MOV DX,X4
MOV CX,Y4
SUB CX,Y1
MOV AX,Y1
SUB AX,CX
MOV CX,AX
CALL Dian ;画第七点(-X,-Y)
MOV DX,X4
MOV CX,Y4
MOV AX,X1
SUB AX,DX
ADD AX,X1
MOV DX,AX
CALL Dian ;画第八点(-X,Y)
CALL Delay
RET
Huayuan ENDP
;----------------------------------------------
Dian PROC
CALL Set_color ;画点,CX,DX的加减是为加深线条
MOV X4,DX
MOV Y4,CX
INC CX
CALL Set_color
SUB CX,2
CALL Set_color
INC DX
CALL Set_color
INC CX
CALL Set_color
INC CX
CALL Set_color
MOV DX,X4
MOV CX,Y4
RET
Dian ENDP
;---------------------------------------
Delay PROC ;画一个圆的延时程序
PUSH CX
PUSH DX
MOV DX,1000
DE1:MOV CX,5000
DE2:LOOP DE2
DEC DX
JNZ DE1
POP DX
POP CX
RET
Delay ENDP
;----------------------------------------
CODE ENDS
END MAIN