Assembly 部件x86-鼠标光标隐藏绘制的像素
我目前正在asm x86中创建类似windows的绘画 我有一个程序,在两点之间创建一条线。输入是鼠标左键单击的位置 问题是,每当我画线时,位于所示光标下方的像素都会被删除 我怎样才能修好它 代码:Assembly 部件x86-鼠标光标隐藏绘制的像素,assembly,Assembly,我目前正在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