⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 graphics.asm

📁 学分管理系统的分析
💻 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 + -