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

📄 用鼠标取点,画线(最终版).asm

📁 用鼠标取点
💻 ASM
字号:

        DSEG  SEGMENT
     LIDADDR  DD        ?
        MODE  DB        ?
          X1  DW        ?
          Y1  DW        ?
          X2  DW        ?
          Y2  DW        ?
        OLDX  DW        0
        OLDY  DW        0
       BUFFX  DW        ?
       BUFFY  DW        ?
     OLDADDR  DD        ?


        DSEG  ENDS
        CSEG  SEGMENT
              ASSUME    CS:CSEG,DS:DSEG
      START:  MOV       AX,DSEG
              MOV       DS,AX
      
              MOV       AH,0FH      ;取当前的显示模式保存在MODE中
              INT       10H
              MOV       MODE, AL
      
              MOV       AH,0        ;设置成256色640*480的图形显示模式MOD
              MOV       AL,13H
              INT       10H


              CALL      CLSSCR
      
      
      
              MOV       AX,00H
              INT       33H         ;初始化鼠标
              CMP       AX,0
              JZ        LAST
              MOV       AX,01H
              INT       33H




       NEXT:  MOV       AX,03H
              INT       33H
              MOV       X1,CX
              MOV       Y1,DX
              CALL      DISMOUSE
              CMP       BX,1
              JNZ       NEXT
              MOV       AH,0CH
              MOV       BH,0
              MOV       AL,15
              INT       10H         ;显示鼠标按下左键的点


      

      NEXT2:  push ax
              mov al, 11001100B
              call vline
              pop ax
               MOV       AX,03H
              INT       33H
              MOV       X2,CX
              MOV       Y2,DX

              CALL      DISMOUSE
               call vline

              MOV       X2,CX
              MOV       Y2,DX
              CMP       BX,1
              JNZ       NEXT2
              CMP       CX,X1
              JNZ       NEXT3
              CMP       DX,Y1
              JNZ       NEXT3
              JMP       NEXT2
              


      NEXT3:  MOV       AX,02H
              INT       33H
              MOV       AL,00001100B
              CALL      VLINE
              
              mov ah,0
              int 16h
              cmp al,'c'
              jnz next4
              call CLSSCR
              jmp next
next4:   cmp al,1bh

           jz last
           jmp next

       LAST:  MOV       AH,0
              INT       16H
              MOV       AL,MODE
              MOV       AH,0
              INT       10H
              MOV       AX,4C00H
              INT       21H
     
    DISMOUSE  PROC      FAR
              PUSH      AX
              PUSH      BX
              PUSH      CX
              PUSH      DX
              PUSH      DI
              PUSH      SI
              CMP       CX ,OLDX
              JNZ       DISMOUSE1
              CMP       DX,OLDY
              JZ        DISMOUSE2
  DISMOUSE1:  MOV       DI ,CX
              MOV       SI,DX
              MOV       CX,OLDX
              MOV       DX,OLDY
              MOV       BH,0
              MOV       AL,11001100B
              MOV       AH,0CH
              INT       10H

              MOV       CX,DI
              MOV       DX,SI
              MOV       OLDX,CX
              MOV       OLDY,DX


              MOV       BH,0
              MOV       AL,00001001B
              MOV       AH,0CH
              INT       10H
  DISMOUSE2:  POP       SI
              POP       DI
              POP       DX
              POP       CX
              POP       BX
              POP       AX
              RET
    DISMOUSE  ENDP






 ;  画两点之间的直线 (X1,Y1),(X2,Y2)  ,AL=该线的颜色
;   在256色320*200图形显示模式下
;    保护AX,BX,CX,DX ,DI
;   Vline---[vline1 一般情况[vline11  x1<x2 的情况
;           [               [vline12   x1>x2  的情况
;           [
;           [
;           [
;           [vline2  X1=X2的情况
;           [vline3  Y1=Y2的情况
;
       VLINE  PROC
              PUSH      AX
              PUSH      BX
              PUSH      CX
              PUSH      DX
              PUSH      DI

              MOV       BH,0
              MOV       AH,0CH


              MOV       CX,X1
              CMP       CX,X2
              JZ        VLINE2


              MOV       DX,Y1
              CMP       DX,Y2
              JZ        VLINE3

              MOV       CX,X1
              SUB       CX,X2
              CMP       CX,0
              JG        VLINENEXT1
              NEG       CX
 VLINENEXT1:  MOV       DX,Y1
              SUB       DX,Y2
              CMP       DX,0
              JG        VLINENEXT
              NEG       DX
  VLINENEXT:  CMP       CX,DX
              JL        VLINEY




     VLINEX:  MOV       CX,X1
              MOV       DX ,Y1
              CMP       CX,X2
              JA        VLINE12
    VLINE11:  INT       10H         ; x1<x2 的情况
              INC       CX
              CMP       CX,X2
              JG        VLAST
              CALL      YUNSHUAN1
              JMP       VLINE11

    VLINE12:  INT       10H         ;vline12   x1>x2  的情况
              DEC       CX
              CMP       CX,X2
              JL        VLAST
              CALL      YUNSHUAN1
              JMP       VLINE12



     VLINE2:  MOV       DX,Y1       ; 当X1=X2,即斜率不存在
              CMP       DX,Y2
              JA        VLINE22
    VLINE21:  INT       10H
              INC       DX
              CMP       DX,Y2
              JG        VLAST
              JMP       VLINE21
    VLINE22:  INT       10H
              DEC       DX
              CMP       DX,Y2
              JL        VLAST
              JMP       VLINE22




     VLINE3:  MOV       CX,X1       ; 当Y1=Y2,即斜率=0
              CMP       CX,X2
              JA        VLINE32
    VLINE31:  INT       10H
              INC       CX
              CMP       CX,X2
              JA        VLAST
              JMP       VLINE31
    VLINE32:  INT       10H
              DEC       CX
              CMP       CX,Y2
              JB        VLAST
              JMP       VLINE32








     VLINEY:  MOV       CX,X1
              MOV       DX ,Y1
              CMP       DX,Y2
              JA        VLINEY12
   VLINEY11:  INT       10H         ; x1<x2 的情况
              INC       DX
              CMP       DX,Y2
              JG        VLAST
              CALL      YUNSHUAN2
              JMP       VLINEY11

   VLINEY12:  INT       10H         ;vline12   x1>x2  的情况
              DEC       DX
              CMP       DX,Y2
              JL        VLAST
              CALL      YUNSHUAN2
              JMP       VLINEY12







      VLAST:  POP       DI
              POP       DX
              POP       CX
              POP       BX
              POP       AX
              RET
       VLINE  ENDP

 ;入口参数CX,计算出(Y2-Y1)*(CX-X1) /(X2-X1)+Y1
 ;出口参数为DX
   YUNSHUAN1  PROC
              PUSH      AX
              PUSH      BX
              PUSH      CX
              PUSH      DI
              MOV       AX,Y2
              SUB       AX,Y1
              SUB       CX,X1
              XOR       DX,DX
              IMUL      CX
              MOV       BX,X2
              SUB       BX,X1
              IDIV      BX
              ADD       AX,Y1
              MOV       DX,AX
              POP       DI
              POP       CX
              POP       BX
              POP       AX
              RET

   YUNSHUAN1  ENDP


    ;入口参数dx,计算出(X2-X1)*(dx-y1)/(y2-y1) +x1
 ;出口参数为cx
   YUNSHUAN2  PROC
              PUSH      AX
              PUSH      BX
              PUSH      DX
              PUSH      DI
              MOV       AX,X2
              SUB       AX,X1
              SUB       DX,Y1
              MOV       BX,DX
              XOR       DX,DX
              IMUL      BX
              MOV       BX,Y2
              SUB       BX,Y1
              IDIV      BX
              ADD       AX,X1
              MOV       CX,AX
              POP       DI
              POP       DX
              POP       BX
              POP       AX
              RET

   YUNSHUAN2  ENDP



      CLSSCR  PROC
              PUSH      AX
              PUSH      BX
              PUSH      CX
              PUSH      DX
       
              MOV       AX,0600H
              MOV       BH,11001100B
              MOV       CX,0
              MOV       DX,184FH
              INT       10H
              POP       DX
              POP       CX
              POP       BX
              POP       AX
              RET
      CLSSCR  ENDP
         
         
         
         

        CSEG  ENDS
              END       START

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -