Assembly 部件x86-鼠标光标隐藏绘制的像素

Assembly 部件x86-鼠标光标隐藏绘制的像素,assembly,Assembly,我目前正在asm x86中创建类似windows的绘画 我有一个程序,在两点之间创建一条线。输入是鼠标左键单击的位置 问题是,每当我画线时,位于所示光标下方的像素都会被删除 我怎样才能修好它 代码: 旧图形模式的鼠标驱动程序不如当前的先进。他们复制鼠标指针下方的区域,在顶部绘制鼠标,当你移动鼠标时,旧区域被复制回来;然后,对新位置重复该过程。这发生在中断内部,因此您无法确定鼠标何时被重新绘制并且(很快)不可见 解决方法是在访问屏幕(写入或读取)之前隐藏鼠标,并在完成后再次显示。发件人: 您可以自

我目前正在asm x86中创建类似windows的绘画

我有一个程序,在两点之间创建一条线。输入是鼠标左键单击的位置

问题是,每当我画线时,位于所示光标下方的像素都会被删除

我怎样才能修好它

代码:


旧图形模式的鼠标驱动程序不如当前的先进。他们复制鼠标指针下方的区域,在顶部绘制鼠标,当你移动鼠标时,旧区域被复制回来;然后,对新位置重复该过程。这发生在中断内部,因此您无法确定鼠标何时被重新绘制并且(很快)不可见

解决方法是在访问屏幕(写入或读取)之前隐藏鼠标,并在完成后再次显示。发件人:


您可以自己决定何时隐藏和显示鼠标:在调用自己的低级绘图例程之前,或者在每个例程内部。为了安全,你甚至可以同时做这两件事。多次隐藏鼠标指针不是问题,因为它会保留一个计数器,并且在再次绘制鼠标指针之前,您需要相同数量的“显示”调用。

另一种方法是使用自己的PS2鼠标处理程序将自己的鼠标指针自绘制到屏幕上,就像Cutemouse驱动程序一样

下面的IRQhandler需要添加一些指令,以便将移动/点击存储到已知的内存位置,我们的主例程必须绘制鼠标指针并复制屏幕的旧区域,因此我们自己的鼠标指针的形状可以具有所用视频模式的任何大小、形式和颜色(例如,它也可用于32位真彩色视频模式,具有宽屏分辨率,使用线性帧缓冲区和VESA VBE Bios:vbe3.pdf(来自VESA.org)

(使用USB鼠标的提示:在主板bios内启用“USB legacy”,这会将USB鼠标的USB数据重定向到键盘控制器中,因此它可以像PS2鼠标一样使用。)


请分享你的代码。
IDEAL
MODEL small
STACK 100h
DATASEG
input db 6 dup (0)
FirstPointX dw ?
FirstPointY dw ?
CurrentPointX dw ?
CurrentPointY dw ?
LineDown    db  13,10,'$'

CODESEG
y           equ [word bp+16]
x           equ [word bp+14]
StepVal     equ [word bp+12]
deltaY      equ [word bp+10]
deltaX      equ [word bp+8]
x2          equ [word bp+6]
y2          equ [word bp+4]


proc FreePolygon
    push bp
    mov di,1h

        MouseLP:
        mov ax,3h
        int 33h
        and bx,1h
        cmp bx, 1h ; check left mouse click
        jne MouseLP
        WaitForMouseRelease:

        int 33h
        cmp bx,1h
        je WaitForMouseRelease
        shr cx,1 ; adjust cx to range 0-319, to fit screen
        sub dx, 1 ; move one pixel, so the pixel will not be hidden by mouse
        mov bh,0h
        mov al,4
        mov ah,0Ch
        int 10h
        cmp di,1h
        jne notFirstPoint
        mov [FirstPointX],cx
        mov [FirstPointY],dx
        mov [CurrentPointX],cx
        mov [CurrentPointY],dx
        notFirstPoint:
        push cx
        push dx
        dec di

        call Line
        ;mov ax,02h
        ;int 33h
        mov [CurrentPointX],cx
        mov [CurrentPointY],dx
        jmp MouseLP
    EndFreePolygon:
    push cx
    push dx
    mov ax,[FirstPointX]
    mov [CurrentPointX],ax
    mov ax,[FirstPointY]
    mov [CurrentPointY],ax
    call Line
    pop dx
    pop cx
    pop bp
    ret
endp FreePolygon


proc Line

    push bp
    mov bp,sp
    mov ax,[CurrentPointX]
    cmp ax,x2
    jng StartLine
    mov ax,x2
    mov bx,[CurrentPointX]
    mov x2,bx
    mov [CurrentPointX],ax
    mov ax,y2
    mov bx,[CurrentPointY]
    mov [CurrentPointY],ax
    mov y2,bx
    StartLine:
    mov StepVal,0
    mov ax,y2
    sub ax,[CurrentPointY]
    mov deltaY,0
    add deltaY,ax
    mov ax,x2
    sub ax,[CurrentPointX]
    mov deltaX,0
    add deltaX,ax
    cmp ax,deltaY
    jg above
    jmp less
    above:
        mov ax,[CurrentPointY]
        cmp ax,y2
        jng PosAbove
        NegAbove:
            mov ax,[CurrentPointY]
            mov y,ax
            mov ax,[CurrentPointX]
            mov x,ax
            forAboveX:
            mov ax,deltaY
            sub StepVal,ax
            mov ax,StepVal
            cmp ax,deltaX
            jl lessDeltaX
            dec y
            mov ax,deltaX
            sub StepVal,ax
            lessDeltaX:
            xor bl,bl
            push cx
            push dx
            mov cx,x
            mov dx,y
            mov ax,0c04h
            int 10h
            pop dx
            pop cx
            mov ax,x
            cmp ax,x2
            jg endLineNegAbove
            inc x
            jmp forAboveX
            endLineNegAbove:
            pop bp
            ret
        PosAbove:
            mov ax,[CurrentPointY]
            mov y,ax
            mov ax,[CurrentPointX]
            mov x,ax
            forAboveX2:
            mov ax,deltaY
            add StepVal,ax
            mov ax,StepVal
            cmp ax,deltaX
            jl lessDeltaX2
            inc y
            mov ax,deltaX
            sub StepVal,ax
            lessDeltaX2:
            xor bl,bl
            push cx
            push dx
            mov cx,x
            mov dx,y
            mov ax,0c04h
            int 10h
            pop dx
            pop cx
            mov ax,x
            cmp ax,x2
            endLine2:
            jg endLinePosAbove
            inc x
            jmp forAboveX2
            endLinePosAbove:
            pop bp
            ret
    less:
        mov ax,[CurrentPointY]
        cmp ax,y2
        jng PosLess
        NegLess:
            mov ax,[CurrentPointX]
            mov x,ax
            mov ax,[CurrentPointY]
            mov y,ax
            forLessX:
            mov ax,deltaX
            add StepVal,ax
            mov ax,StepVal
            cmp ax,deltaY
            jl lessDeltaY
            inc x
            mov ax,deltaY
            add StepVal,ax
            lessDeltaY2:
            xor bl,bl
            push cx
            push dx
            mov cx,x
            mov dx,y
            mov ax,0c04h
            int 10h
            pop dx
            pop cx
            mov ax,y
            cmp ax,y2
            endLine3:
            jg endLineNegLess
            inc y
            jmp forLessX
            endLineNegLess:
            pop bp
            ret
        PosLess:
            mov ax,[CurrentPointX]
            mov x,ax
            mov ax,[CurrentPointY]
            mov y,ax
            forLessX2:
            mov ax,deltaX
            add StepVal,ax
            mov ax,StepVal
            cmp ax,deltaY
            jl lessDeltaY
            inc x
            mov ax,deltaY
            sub StepVal,ax
            lessDeltaY:
            xor bl,bl
            push cx
            push dx
            mov cx,x
            mov dx,y
            mov ax,0c04h
            int 10h
            pop dx
            pop cx
            mov ax,y
            cmp ax,y2
            jg endLinePosLess
            inc y
            jmp forLessX2
            endLinePosLess:
            pop bp
            ret
endp Line

start:
mov ax, @data
mov ds, ax
mov ax, 13h
int 10h
;Graphic mode

mov ax,0h
int 33h
; Show mouse
mov ax,1h
int 33h




    call FreePolygon


    ;Wait for key press
    mov ah,00h
    int 16h
    ;Return to text mode



    mov ah, 0
    mov al, 2
    int 10h
    ; Return to text mode
exit:
mov ax, 4c00h
int 21h
END start
; Hide mouse:
mov ax, 2
int 33h
.. your line drawing code here ..
; Show mouse:
mov ax, 1
int 33h
checkPS2:
int 11h         ; get equipment list
test    al, 3
jz  noPS2       ; jump if PS/2-Mouse not indicated
mov bh,3
mov     ax, 0C205h
int 15h             ; initialize mouse, bh=datasize
jc noPS2
mov bh,3
mov     ax, 0C203h
int 15h             ; set mouse resolution bh
jc noPS2
mov     ax, cs
mov     es, ax
mov bx, OFFSET PS2dummy
mov     ax, 0C207h
int 15h             ; mouse, es:bx=ptr to handler
jc noPS2
xor     bx, bx
mov     es, bx      ; mouse, es:bx=ptr to handler
mov     ax, 0C207h
int 15h
ret

noPS2:
stc
ret

PS2dummy:
retf
;---------------------------------------------------------
enablePS2:
call disablePS2
mov    ax, cs
mov    es, ax
mov    bx, OFFSET IRQhandler
mov    ax, 0C207h   ; es:bx=ptr to handler
int 15h
mov bh,1        ; set mouse on
mov     ax, 0C200h
int 15h
ret
;-------------------------------
disablePS2:
xor bx, bx      ; set mouse off
mov ax, 0C200h
int 15h
xor     bx, bx
mov     es, bx
mov     ax, 0C207h  ; es:bx=ptr to handler
int 15h
ret
;---------------------------------------------------------------------------
IRQhandler:
    assume  ds:nothing,es:nothing
cld
push   ds
push   es
pusha
mov     ax, cs
mov     ds, ax
mov     bp, sp
mov     al, [bp+24+6] ; buttons
mov     bl, al
shl     al, 3         ; CF=Y sign bit
sbb     ch, ch        ; signed extension 9->16 bit
cbw                   ; extend X sign bit
mov     al, [bp+24+4] ; AX=X movement
mov     cl, [bp+24+2] ; CX=Y movement
xchg    bx, ax
neg     cx            ; reverse Y movement
popa
pop     es
pop     ds
retf