📄 coloursquare.asm
字号:
;0000 0 黑色
;0001 1 蓝色
;0010 2 绿色
;0011 3 青色
;0100 4 红色
;0101 5 品红色
;0110 6 棕色
;0111 7 白色
;1000 8 灰色
;1001 9 淡蓝色
;1010 10 淡绿色
;1011 11 淡青色
;1100 12 淡红色
;;1101 13 淡品色
;1110 14 黄色
DATAS SEGMENT
COLOR DW 02
BKCOLOR DW 15
COLORINFO DB 13,10,'PLEASE INPUT COLOR HEX CODE(0~E):$'
CRLF DB 13,10,'$'
LENINFO DB 13,10,'PLEASE INPUT THE LENGTH:$'
BUFF DB 10,0,10 DUP (0)
POINT DW 200,400,400,200
DW 200,200,300,100
DW 400,200,300,100
DATAS ENDS
STACKS SEGMENT
DW 200 DUP(0)
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START: MOV AX,DATAS
MOV DS,AX
MOV AX,0A000H
MOV ES,AX
CALL INPUTCOLOR
MOV AH,9
MOV DX,OFFSET CRLF
INT 21H
CALL INPUTLEN
MOV AX,0012H
INT 10H ;设置640*480*16图形模式
MOV AL,2
CALL SET_WRITE_MODE
MOV AX,BKCOLOR
CALL CLEAR
MOV CX,4
MOV SI,OFFSET POINT
DDD: PUSH CX
PUSH SI
MOV AX,[SI]
PUSH AX
MOV AX,[SI+2]
PUSH AX
MOV AX,[SI+4]
PUSH AX
MOV AX,[SI+6]
PUSH AX
CALL LINE
POP SI
ADD SI,8
POP CX
LOOP DDD
MOV AH,01H
INT 21H
MOV AX,4C00H
INT 21H
PIXEL:
PUSH BP
PUSH BX
PUSH CX
PUSH DS
MOV BP,SP
MOV AX,80
MOV BX,WORD PTR[BP+12] ;BX<=Y
MUL BX ;(DX:AX)<=80*Y
MOV BX,AX ;
MOV AX,WORD PTR[BP+14] ;AX<--X
MOV CL,8 ; | |
DIV CL ;AL<=商(X/8),AH<=余数(X%8) SP-> | |
MOV CL,AH ;CL<=AH | DS |<-BP
MOV AH,0 ; | CX |<-BP+2
ADD BX,AX ;BX(OFFSET)<=80*Y+X/8 | BX |<-BP+4
MOV AL,80H ; | BP |<-BP+6
SHR AL,CL ;AL(MASK)<=(80H>>CL) |返回地址|<-BP+8
PUSH AX ; | COLOR |<-BP+10
MOV DX,3CEH ; | Y |<-BP+12
MOV AL,8 ; | X |<-BP+14
OUT DX,AL ; | |
MOV DX,3CFH ; PIXEL堆栈结构
POP AX
OUT DX,AL
MOV AL,ES:[BX]
MOV AX,WORD PTR[BP+10] ;AX<=COLOR
MOV BYTE PTR ES:[BX],AL
POP DS
POP CX
POP BX
POP BP
RET 6
LINE:
PUSH BP
MOV BP,SP
SUB SP,16
MOV WORD PTR[BP-6],0 ;X=0
MOV WORD PTR[BP-8],0 ;Y=0
MOV WORD PTR[BP-14],1 ;INCX=1
MOV WORD PTR[BP-16],1 ;INCY=1
MOV AX,WORD PTR[BP+6] ;AX<=X2
SUB AX,WORD PTR[BP+10] ;AX<=X2-X1
JNC L1 ;IF X2>=X1,JMP L1
NEG AX ;IF X2<X1,DELTA_X=-DELTA_X
MOV WORD PTR[BP-14],-1 ;INCX<=-1
L1: CMP AX,0 ;IF DELTA_X!=0,JMP L11
JNE L11 ;
MOV WORD PTR[BP-14],0 ;INCX<=0
L11: MOV WORD PTR[BP-10],AX ;DELTA_X<=AX SP-> | |
MOV AX,WORD PTR[BP+4] ;AX<=Y2 | INCY |
SUB AX,WORD PTR[BP+8] ;AX<=Y2-Y1 | INCX |<-BP-14
JNC L2 ;IF Y2>=Y1,JMP L2 | DELTA_Y|<-BP-12
NEG AX ;IF Y2<Y1,DELTA_Y=-DELTA_Y | DELTA_X|<-BP-10
MOV WORD PTR[BP-16],-1 ;INCY<=-1 | Y |<-BP-8
L2: CMP AX,0 ;IF DELTA_Y!=0,JMP L22 | X |<-BP-6
JNE L22 ; |DISTANCE|<-BP-4
MOV WORD PTR[BP-16],0 ;INCY<=0 | T |<-BP-2
L22: MOV WORD PTR[BP-12],AX ;DELTA_Y<=AX | BP |<-BP
LP4: MOV AX,WORD PTR[BP-10] ;AX<=DELTA_X |返回地址|<-BP+2
CMP AX,WORD PTR[BP-12] ; | Y2 |<-BP+4
JG LP5 ;DELTA_X>DELTA_Y | X2 |<-BP+6
MOV AX,WORD PTR[BP-12] ; | Y1 |<-BP+8
MOV WORD PTR[BP-4],AX ;DISTANCE<=DELTA_Y | X1 |<-BP+10
JMP LP51 ; | |
LP5: MOV AX,WORD PTR[BP-10] ; LINE堆栈结构
MOV WORD PTR[BP-4],AX ;DISTANCE<=DELTA_X
LP51: INC AX
MOV WORD PTR[BP-2],AX
LP6: PUSH WORD PTR[BP+10]
PUSH WORD PTR[BP+8]
PUSH COLOR
CALL PIXEL
MOV AX,WORD PTR[BP-6] ;AX<=X
ADD AX,WORD PTR[BP-10] ;AX<=X+DELTA_X
MOV WORD PTR[BP-6],AX ;X=X+DELTA_X
MOV AX,WORD PTR[BP-8] ;AX<=Y
ADD AX,WORD PTR[BP-12] ;AX<=Y+DELTA_Y
MOV WORD PTR[BP-8],AX ;Y=Y+DELTA_Y
MOV AX,WORD PTR[BP-6] ;AX<=X
CMP AX,WORD PTR[BP-4]
JLE LP7 ;IF X<=DISTANCE,JMP LP7
MOV AX,WORD PTR[BP-6] ;X>DISTANCE
SUB AX,WORD PTR[BP-4] ;AX<=X-DISTANCE
MOV WORD PTR[BP-6],AX ;X=X-DISTANCE
MOV AX,WORD PTR[BP+10] ;AX<=X1
ADD AX,WORD PTR[BP-14] ;AX<=X1+INCX
MOV WORD PTR[BP+10],AX ;X1=X1+INCX
LP7: MOV AX,WORD PTR[BP-8] ;AX<=Y
CMP AX,WORD PTR[BP-4]
JLE LP8 ;IF Y<=DISTANCE,JMP LP8
MOV AX,WORD PTR[BP-8] ;Y>DISTANCE
SUB AX,WORD PTR[BP-4] ;AX<=Y-DISTANCE
MOV WORD PTR[BP-8],AX ;Y=Y-DISTANCE
MOV AX,WORD PTR[BP+8] ;AX<=Y1
ADD AX,WORD PTR[BP-16] ;AX<=Y1+INCY
MOV WORD PTR[BP+8],AX ;Y1=Y1+INCY
LP8: DEC WORD PTR[BP-2] ;IF T!=0,JMP LP6
JZ LP9
JMP LP6
LP9: MOV SP,BP
POP BP
RET 8
SET_WRITE_MODE:
PUSH AX
MOV DX,3CEH
MOV AL,5
OUT DX,AL
MOV DX,3CFH
POP AX
OUT DX,AL
MOV DX,3CEH
MOV AL,8
OUT DX,AL
MOV DX,3CFH
MOV AL,0FFH
OUT DX,AL
RET
CLEAR:
MOV BX,0
CLR1: MOV ES:[BX],AL
INC BX
CMP BX,80*480
JNB CLR2
JMP CLR1
CLR2: RET
INPUTCOLOR:
MOV AH,9
MOV DX,OFFSET COLORINFO
INT 21H
MOV AH,1
INT 21H
CMP AL,30H
JB INPUTCOLOR
CMP AL,39H
JB INPUTOK
CMP AL,61H
JB BIGCHAR
SUB AL,20H
BIGCHAR:CMP AL,'A'
JB INPUTCOLOR
CMP AL,'F'
JNB INPUTCOLOR
INPUTOK:MOV AH,0
MOV [COLOR],AX
RET
INPUTLEN:
MOV AH,9
MOV DX,OFFSET LENINFO
INT 21H
MOV AH,10
MOV DX,OFFSET BUFF
INT 21H
CALL ABC ;AX为长度
CMP AX,50
JA Q1
MOV AX,50;最小50
JMP OK
Q1:
CMP AX,480
JB OK
MOV AX,480
OK:
MOV BX,640
SUB BX,AX
MOV CX,1
SHR BX,CL
MOV SI,OFFSET POINT ;X居中
MOV [SI],BX
MOV BX,480
SUB BX,AX
MOV CX,1;Y居中
SHR BX,CL
MOV CX,480
SUB CX,BX
MOV [SI+2],CX
MOV BX,[SI]
MOV DX,BX;1X
MOV CX,[SI+2];1Y
ADD BX,AX
MOV [SI+4],BX ;2X
MOV [SI+6],CX ;2Y
MOV [SI+8],DX
MOV [SI+10],CX
MOV [SI+16],BX
MOV [SI+18],CX
PUSH AX
PUSH CX
MOV CX,1
SHR AX,CL
POP CX
ADD DX,AX
MOV [SI+12],DX;3X
MOV [SI+20],DX;3X
MOV BX,866;866
POP AX
MUL BX
MOV BX,1000
DIV BX
SUB CX,AX
MOV [SI+14],CX
MOV [SI+22],CX
RET
;POINT DW 200,200,400,200 1P-2P
; DW 200,200,300,100 1P-3P
; DW 400,200,300,100 2P-3P
ABC PROC
MOV CH,0
MOV BX,OFFSET BUFF
MOV CL,[BX+1]
CMP CX,0
JZ ABCD
PUSH CX
ADD BX,2
PUSH BX
L0: SUB [BX],30H
INC BX
LOOP L0
POP BX
MOV AX,0
MOV CH,0
MOV CL,[BX-1]
L111: MOV DL,10
MUL DL
ADD AL,BYTE PTR [BX]
INC BX
LOOP L111
POP CX
ABCD: RET
ABC ENDP
CODES ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -