📄 graphics.asm
字号:
include macro.lib
public drawline,writepoint
public prepage,scanleng,setprepage
public readpoint,read_line,write_line,read_col,write_col,fill
public getimmage,putimmage
public draw_jiao,drawline_x,drawline_y,box,rectangle
;=================================================
data segment para public 'data'
x1 dw 0
y1 dw 0
x2 dw 0
y2 dw 0
prepage dw 0
scanleng dw 2*800
data ends
;=================================================
code segment public 'code'
assume cs:code,ds:data,es:data
.386
;功能:写点
;入口参数:ax--Y,bx---X ,bp为颜色值,si ,为 1--COPY, 2---AND ,3---OR, 4--XOR
;prepage中为当前页
;出口参数:
writepoint proc far
pusha
push ds
push es
mov cx,data
mov ds,cx
mov cx,0a000h
mov es,cx
cmp bx,800
jb next
sub bx,800
next: shl bx,1
mul scanleng
add ax,bx
adc dx,0
mov di,ax
cmp dx,prepage ;判断是否跨页
je next0
mov prepage,dx
push ax
push bx
mov ax,4f05h ;设置当前页
xor bx,bx
int 10h
pop bx
pop ax
next0: cmp si,P_COPY
jne next1
mov es:[di],bp
jmp last
next1:
cmp si,P_AND
jne next2
and es:[di],bp
jmp last
next2:
cmp si,P_OR
jne next3
or es:[di],bp
jmp last
next3:
cmp si,P_XOR
jne last
xor es:[di],bp
last: pop es
pop ds
popa
ret
writepoint endp
;=================================================
;功能:从显存中读一点,放到di所指的内存中
;入口参数:AX--Y, BX--X
;prepage中为当前页
;出口参数:di后移两个字节
readpoint proc far
push ax
push bx
push cx
push dx
push es
push ds
push si
mov cx,ds
mov es,cx
mov cx,data
mov ds,cx
cmp bx,800
jb next
sub bx,800
next: shl bx,1
mul scanleng
add ax,bx
adc dx,0
mov si,ax
cmp dx,prepage ;判断是否跨页
je next0
mov prepage,dx
mov ax,4f05h ;设置当前页
xor bx,bx
int 10h
next0:
mov cx,0a000h
mov ds,cx
cld
movsw
pop si
pop ds
pop es
pop dx
pop cx
pop bx
pop ax
ret
readpoint endp
;=========================================================
;读水平线
;ax--Y,bx---X 为起始点的坐标,cx为行长
;di为指向缓冲区
;出口参数:DI后移一行
read_line proc far
push ax
push bx
push cx
push dx
push es
push ds
push si
again: call readpoint
inc bx
loop again
pop si
pop ds
pop es
pop dx
pop cx
pop bx
pop ax
ret
read_line endp
;==========================================================
;写水平线
;ax--Y,bx---X 为起始点的坐标;cx为行长,si为写的方式1-P_COPY,2-P_AND,3-P_OR,4-P_XOR
;di指向缓冲区
;出口参数:di后移一行
write_line proc far
push ax
push bx
push cx
push dx
push es
push ds
push si
again: mov bp,[di]
call writepoint
inc bx
inc di
inc di
loop again
pop si
pop ds
pop es
pop dx
pop cx
pop bx
pop ax
ret
write_line endp
;==========================================================
;读垂直线
;入口参数:
;ax--Y,bx---X 为起始点的坐标,cx为行长
;di为指向缓冲区
;出口参数:DI后移一行
read_col proc far
push ax
push bx
push cx
push dx
push es
push ds
push si
again: call readpoint
inc ax
loop again
pop si
pop ds
pop es
pop dx
pop cx
pop bx
pop ax
ret
read_col endp
;=================================================
;写垂直线
;ax--Y,bx---X 为起始点的坐标;cx为行长,si为写的方式1-P_COPY,2-P_AND,3-P_OR,4-P_XOR
;di为指向缓冲区
;出口参数:di后移一行
write_col proc far
push ax
push bx
push cx
push dx
push es
push ds
push si
again: mov bp, [di]
call writepoint
inc ax
inc di
inc di
loop again
pop si
pop ds
pop es
pop dx
pop cx
pop bx
pop ax
ret
write_col endp
;=================================================
;画线
;ax---Y1,bx---- X1,cx--Y2,dx---X2为起始点和结束点的坐标
;bp为颜色值,si为写入方式:P_COPY,P_AND,P_OR,P_XOR
drawline proc far
pusha
push ds
mov di,data
mov ds,di
cmp ax,cx
jne next1
sub dx, bx
inc dx
mov cx, dx
call horizontal ;画水平线
jmp exit
next1: sub cx,ax ;画竖直线
inc cx
lopa: call writepoint
inc ax
loop lopa
exit: pop ds
popa
ret
drawline endp
;================================================
;画水平扫描线
;ax--Y,bx--X,cx---length
;bp 为颜色,si为写入方式:P_COPY,P_AND,P_OR,P_XOR
horizontal proc far
pusha
lopa: call writepoint
inc bx
loop lopa
popa
ret
horizontal endp
;=====================================================
;画垂直扫描线
;ax--Y,bx--X,cx---length
;bp 为颜色,si为写入方式:P_COPY,P_AND,P_OR,P_XOR
vertical proc far
pusha
lopa: call writepoint
inc ax
loop lopa
popa
ret
vertical endp
;=============================================================
;画45度的斜线
; ax--Y,bx--X,cx---length,dx--direction( 1 or 2)
draw_jiao proc far
pusha
cmp dx,1 ;向左斜下
jne next
lop1: call writepoint
dec bx
inc ax
loop lop1
jmp exit
next: cmp dx,2 ;向右斜下
jne exit
lop2: call writepoint
inc bx
inc ax
loop lop2
exit: popa
ret
draw_jiao endp
;==============================================================
;与水平 X 方向成60度角
;ax---y,bx--x,cx---length,bp--color
drawline_x proc far
pusha
mov si, P_COPY
again: call writepoint
inc ax
inc bx
call writepoint
inc ax
loop again
popa
ret
drawline_x endp
;==============================================================
;与垂直 Y 方向成60度角
;ax---y,bx--x,cx---length,bp--color
drawline_y proc far
pusha
dec cx
mov si, P_COPY
again: call writepoint
inc ax
inc bx
call writepoint
inc bx
loop again
call writepoint
popa
ret
drawline_y endp
;==============================================================
;画有倒角的矩形
;ax--y1, bx--x1, cx--y2, dx--x2 ,bp 为颜色
box proc far
pusha
push ds
mov si,data
mov ds,si
mov si,P_COPY
mov x1,bx
mov y1,ax
mov x2,dx
mov y2,cx
add bx,3
sub dx,3
mov ax,y1
mov cx,ax
call drawline
mov cx,y2
mov ax,cx
call drawline
mov bx,x1
mov dx,bx
mov ax,y1
mov cx,y2
add ax, 3
sub cx, 3
call drawline
mov dx,x2
mov bx,dx
call drawline
mov bx,x1
mov ax,y1
add bx,3
mov dx,1
mov cx,3
call draw_jiao
mov ax,y1
mov bx,x2
sub bx,3
mov dx,2
mov cx,3
call draw_jiao
mov bx,x1
mov ax,y2
sub ax,3
mov dx,2
mov cx,3
call draw_jiao
mov bx,x2
mov ax,y2
sub ax,3
mov dx,1
mov cx,3
call draw_jiao
pop ds
popa
ret
box endp
;======================================================
;功能:画矩形框
;入口参数:ax--Y1,bx---X1,cx---Y2,dx---X2
;BP:为颜色,SI:为P_COPY方式
rectangle proc far
pusha
push ds
mov si, data
mov ds, si
mov si, P_COPY
mov x1, bx
mov y1, ax
mov x2, dx
mov y2, cx
sub cx, ax
inc cx
push cx
call vertical
mov bx, x2
mov ax, y1
pop cx
call vertical
mov cx, x2
sub cx, x1
inc cx
push cx
mov ax, y1
mov bx, x1
call horizontal
mov ax, y2
mov bx, x1
pop cx
call horizontal
pop ds
popa
ret
rectangle endp
;====================================================================
;填充一个矩形区域
;ax--Y1,BX--X1,CX--Y2,DX--X2
;BP--填充颜色,SI--填充方式,1--P_COPY,2---P_AND,3---P_OR,4--P_XOR
fill proc far
pusha
sub dx,bx
inc dx
sub cx,ax
inc cx
f_again:
call vertical
inc bx
dec dx
jg f_again
popa
ret
fill endp
;===================================================
;读取屏幕区域
;ax---Y1,bx---X1,cx--Y2,dx---X2为起始点和结束点的坐标
;DI为指向缓冲区的指针
getimmage proc far
pusha
sub cx, ax
inc cx
sub dx, bx
inc dx
xh: call read_col
inc bx
dec dx
jne xh
popa
ret
getimmage endp
;===================================================
;恢复保存区域
;入口参数:
;ax---Y1,bx---X1,cx--Y2,dx---X2为起始点和结束点的坐标
;si为写的方式1-P_COPY,2-P_AND,3-P_OR,4-P_XOR
;di为指向缓冲区
putimmage proc far
pusha
sub cx, ax
inc cx
sub dx, bx
inc dx
xh: call write_col
inc bx
dec dx
jne xh
popa
ret
putimmage endp
;===================================================
;功能:换页
;入口参数:dx,为需要设置的新页
setprepage proc far
pusha
push ds
mov ax,data
mov ds,ax
mov prepage,dx
mov ax,4f05h ;设置当前页
xor bx,bx
int 10h
pop ds
popa
ret
setprepage endp
;====================================================
code ends
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -