在打印像素上移动鼠标时,将删除图形模式中的像素

时间:2016-08-09 21:58:32

标签: assembly pixels

我在图形模式下工作(320X200)。

我写了一个代码,在点击鼠标crusor的地方打印线。

是否打印像素,但是当我移动鼠标时,某些像素会消失。

ParX equ [bp+8]
ParY equ [bp+6]
ParColor equ [bp+4]

proc PrintPixel
    push bp
    mov bp, sp
    push ax
    push bx
    push cx
    push dx
    mov bh, 0
    mov cx, ParX
    mov dx, ParY
    mov al, ParColor
    mov ah, 0ch
    int 10h
    pop dx
    pop cx
    pop bx
    pop ax
    pop bp
    ret 6
endp PrintPixel

;main

    mov ax,0h
    int 33h
    mov ax,1h
    int 33h

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

    push cx
    push dx
    mov al, [color]
    push ax
    call CreateX

1 个答案:

答案 0 :(得分:1)

我不认为它们会消失,像素在320x200模式下不会这样做。我很确定他们在那里。

你所谓的“消失”可能是你将它们设置为你不想要的值,比如零。

要擦除鼠标光标,您应该设置光标WAS的像素,其中像素值来自背景图像,该背景图像应该是“在光标下”。

你可以这样做(伪代码):

drawCursor:  ; draw cursor at x, y
    ; there should be no cursor at screen before calling this
    mov   [oldMouseX],x
    mov   [oldMouseY],y
    copy_memory(to backgroundBuffer, from vram at x,y, cursor size x/y)
    blit_cursor(at x, y, cursor gfx)
    ret

hideCursor: ; before drawing it at new position
    blit_memory(at [oldMouseX], [oldMouseY], from backgroundBuffer, cursor size x/y)
    ret

关于那些复制/ blit ...... 创建一些“精灵”操作例程是很常见的,例如:

blit_transparent_gfx:
  ; params x, y, gfx data ptr, gfx data sizex, gfx data sizey
  ; globals word [ScreenSizeX] = 320, byte [transparent color]

  ; calculate direct address into VRAM into es:di
    push 0a000h
    pop  es      ; es pointing to VRAM
    mov  ax,[ScreenSizeX] ; 320
    mul  word [param y]
    add  ax,[param x]
    mov  di,ax   ; es:di = VRAM address to write pixels
  ; prepare registers for outside line loop
    mov  ah,[transparent color]
    mov  si,[param gfx data ptr]
    mov  dx,[param gfx data sizey]
blit_transparent_line:
  ; outer line loop
    mov  cx,[param gfx data sizex]
    push di
  ; inner loop drawing pixels
blit_transparent_pixel:
    mov  al,[si]
    cmp  al,ah
    jz   blit_transparent_pixel_skip
    mov  [es:di],al
blit_transparent_pixel_skip:
    inc  si
    inc  di
    dec  cx
    jnz  blit_transparent_pixel
  ; move VRAM pointer one line down
    pop  di
    add  di,[ScreenSizeX]
    dec  dx
    jnz  blit_transparent_line
    ret

存储/恢复背景图像的例程可以稍微简单一些,因为它们不必测试透明度,但原理是相同的(将内存从大小为[sizex,sizey]的VRAM复制到某些内部缓冲区) ,或来自gfx数据)。

请勿使用int 10h进行像素绘制,直接绘制到A000:xxxx VRAM在320x200模式下非常简单(您应该在ZX Spectrum上看到VRAM组织,或者更好的是在Atari 2600控制台上看到VRAM组织) (提示:它根本没有VRAM),现在这些并不是微不足道的,但是VGA上的13h模式是直接使用的纯粹乐趣。非常简单,而且速度要快得多,即使是这种天真的未经优化的“blit_transparent_gfx”(写得如此,它应该很容易理解它是如何工作的)与涉及int 10h调用的任何东西相比都会非常快。

PS。我没有调试“blit_transparent_gfx”(显然你首先用真实的代码来修复那些伪[param ...]行,只是为了编译它),所以也许我在那里做了一些bug,随时调试它(虽然我确定它应该按原样运行,但一旦你修复了语法)。